00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 static char USMID[] = "@(#) libf/tape/c1/settp.c 92.0 10/08/98 14:30:10";
00038
00039 #include <errno.h>
00040 #include <ffio.h>
00041 #include <liberrno.h>
00042 #include "fio.h"
00043
00044 #define ERET(err) \
00045 { \
00046 *istat = err; \
00047 goto done; \
00048 }
00049
00050
00051
00052
00053
00054 void
00055 SETTP(
00056 _f_int *unump,
00057 _f_int *nbs,
00058 _f_int8 *nb,
00059 _f_int *nvs,
00060 _f_int *nv,
00061 _f_int8 *vi,
00062 _f_int *synch,
00063 _f_int *istat)
00064 {
00065 register int n;
00066 int ss;
00067 _f_int8 adjustnb;
00068 unit *cup;
00069 struct ffp_settp_s pos;
00070 _f_int unum;
00071 #define NBS_SHFT ((sizeof(*nbs)-sizeof(char))*8)
00072 #define NVS_SHFT ((sizeof(*nvs)-sizeof(char))*8)
00073 STMT_BEGIN(*unump, 0, T_TAPE, NULL, NULL, cup);
00074
00075
00076
00077 unum = *unump;
00078 if (cup == NULL) {
00079 cup = _implicit_open(SEQ, UNF, unum, 1, &ss);
00080 if (cup == NULL)
00081 ERET(ss);
00082 }
00083
00084 if (*nb != 0 ) {
00085 if (*nb < 0 ){
00086 ERET(FETAPNBN);
00087 }
00088 if ((char)(*nbs>>NBS_SHFT) == '-' ) {
00089 if ( (*nv != 0 ) || (*vi != 0 )) {
00090 ERET(FETAPCMB);
00091 }
00092 } else if ((char)(*nbs>>NBS_SHFT) == '+' ) {
00093 if ( ( *nv != 0 ) || ( *vi != 0 )) {
00094 ERET(FETAPCMB);
00095 }
00096 } else if ( (char)(*nbs>>NBS_SHFT) != ' ' ) {
00097 ERET(FETAPNBS);
00098 }
00099 }
00100
00101 if ( *nv != 0 ) {
00102 if ( *vi != 0 ){
00103 ERET(FETAPCMB);
00104 }
00105 if (*nv < 0) {
00106 ERET(FETAPNVY);
00107 }
00108 if ((char) (*nvs>>NVS_SHFT) == ' ')
00109 pos.ffp_nvs_p = FP_TPOS_ABS;
00110 else if ((char) (*nvs>>NVS_SHFT) == '+')
00111 pos.ffp_nvs_p = FP_TPOS_FORW;
00112 else if ((char) (*nvs>>NVS_SHFT) == '-')
00113 pos.ffp_nvs_p = FP_TPOS_BACK;
00114 else
00115 ERET(FETAPNVS);
00116 }
00117 else {
00118 pos.ffp_nvs_p = FP_TPOS_ABS;
00119 }
00120 adjustnb = *nb;
00121 if ((char)(*nbs>>NBS_SHFT) == ' ')
00122 pos.ffp_nbs_p = FP_TPOS_ABS;
00123 else if ((char) (*nbs>>NBS_SHFT) == '+')
00124 pos.ffp_nbs_p = FP_TPOS_FORW;
00125 else if ((char) (*nbs>>NBS_SHFT) == '-')
00126 pos.ffp_nbs_p = FP_TPOS_BACK;
00127 else if (*nb == 0)
00128 pos.ffp_nbs_p = FP_TPOS_ABS;
00129 else
00130 ERET(FETAPCMB);
00131
00132 cup->uwrt = 0;
00133
00134 *istat = 0;
00135 switch(cup->ufs) {
00136 case FS_FDC:
00137 if ((cup->uend == LOGICAL_ENDFILE) &&
00138 (cup->uspcproc == 0)){
00139 if (*nb > 0 &&
00140 (char) (*nbs>>NBS_SHFT) == '-'){
00141 adjustnb--;
00142 }
00143 }
00144 cup->uend = BEFORE_ENDFILE;
00145 pos.ffp_nb = adjustnb;
00146 pos.ffp_vi = *vi;
00147 pos.ffp_nv = *nv;
00148 n = XRCALL(cup->ufp.fdc, posrtn) cup->ufp.fdc, FP_SETTP,
00149 &pos, 0, &cup->uffsw);
00150 if (n < 0)
00151 *istat = cup->uffsw.sw_error;
00152 break;
00153 default:
00154 *istat = FECONNTP;
00155 }
00156
00157 done:
00158 STMT_END(cup, T_TAPE, NULL, NULL);
00159 return;
00160 }