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
00038 #pragma ident "@(#) libf/fio/getpos.c 92.1 06/21/99 10:37:21"
00039
00040 #include <errno.h>
00041 #include <foreign.h>
00042 #include <liberrno.h>
00043 #include "fio.h"
00044 #include "fstats.h"
00045
00046 #define ERET(val) { \
00047 errn = val; \
00048 ret = -1; \
00049 goto getpos_done; \
00050 }
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078 #pragma _CRI duplicate _GETPOS_ as GETPOS
00079 #pragma _CRI duplicate _GETPOS_ as $GETPOS
00080 #ifdef _CRAYMPP
00081 #pragma _CRI duplicate _GETPOS_ as _GETPOS
00082 #endif
00083 long
00084 _GETPOS_(
00085 _f_int *unump,
00086 _f_int *arg2,
00087 _f_int *arg3,
00088 _f_int *arg4)
00089 {
00090 register int errn;
00091 register int narg;
00092 long fp_arg[32];
00093 long len;
00094 long pos;
00095 long ret;
00096 _f_int *pa;
00097 _f_int *stat = NULL;
00098 register unum_t unum;
00099 unit *cup;
00100 struct fiostate cfs;
00101
00102 unum = *unump;
00103
00104 STMT_BEGIN(unum, 0, T_GETPOS, NULL, &cfs, cup);
00105
00106
00107
00108 if (cup == NULL)
00109 cup = _imp_open(&cfs, SEQ, UNF, unum, 0, NULL);
00110
00111 if (cup->useq == 0)
00112 _ferr(&cfs, FEBIONDA, "GETPOS");
00113
00114 narg = _numargs();
00115
00116 switch (narg) {
00117
00118 case 1:
00119 len = 0;
00120 pa = NULL;
00121 break;
00122
00123 case 2:
00124 len = 1;
00125 pa = arg2;
00126 break;
00127
00128 case 3:
00129 len = *arg2;
00130 pa = arg3;
00131 break;
00132
00133 case 4:
00134 len = *arg2;
00135 pa = arg3;
00136 stat = arg4;
00137 break;
00138
00139 default:
00140 _ferr(&cfs, FEARGCNT, "GETPOS", narg, "1, 2, 3 or 4");
00141 }
00142
00143
00144
00145
00146
00147
00148 errn = 0;
00149
00150 if (narg != 1 && len <= 0) {
00151 ERET(FEBIOSNT);
00152 }
00153
00154 switch ( cup->ufs ) {
00155
00156 case FS_TEXT:
00157 case STD:
00158 pos = ftell(cup->ufp.std);
00159
00160
00161
00162
00163
00164
00165 if ( cup->ufmt == NO )
00166 pos = pos >> 3;
00167
00168 if ( pa != NULL )
00169 *pa = pos;
00170 ret = pos;
00171 break;
00172
00173 case FS_FDC:
00174
00175
00176
00177 WAITIO(cup, ERET(cup->uffsw.sw_error));
00178
00179
00180
00181
00182
00183 if ((cup->uflagword & FFC_SEEKA) != 0)
00184 {
00185 fp_arg[0] = 0;
00186 fp_arg[1] = 1;
00187 ret = XRCALL(cup->ufp.fdc, posrtn)
00188 cup->ufp.fdc, FP_BSEEK, fp_arg, 2, &cup->uffsw);
00189 if (ret < 0)
00190 ERET(cup->uffsw.sw_error);
00191
00192
00193
00194
00195
00196
00197
00198 if ( cup->ufmt == NO )
00199 ret = _dshiftr(ret, ret, 6);
00200 else
00201 ret = _dshiftr(ret, ret, 3);
00202 if ( pa != NULL && len > 0)
00203 pa[0] = ret;
00204 }
00205 else
00206 {
00207 ret = XRCALL(cup->ufp.fdc, posrtn)
00208 cup->ufp.fdc, FP_GETPOS, pa, len, &cup->uffsw);
00209 if (ret < 0)
00210 ERET(cup->uffsw.sw_error);
00211 }
00212
00213 break;
00214
00215 case FS_AUX:
00216 _ferr(&cfs, FEMIXAUX);
00217 break;
00218 default:
00219 _ferr(&cfs, FEINTFST);
00220
00221 }
00222
00223 getpos_done:
00224 if (stat != NULL)
00225 *stat = errn;
00226 else if (errn != 0)
00227 _ferr(&cfs, errn);
00228
00229 STMT_END(cup, T_GETPOS, NULL, &cfs);
00230
00231 return(ret);
00232 }