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/fio/c1/calio.c 92.0 10/08/98 14:30:10";
00038
00039
00040
00041
00042
00043 #include <stdio.h>
00044 #include <stdlib.h>
00045 #include <string.h>
00046
00047
00048
00049
00050
00051 #define CNT 1
00052 #define EOR 0
00053 #ifndef EOF
00054 #define EOF -1
00055 #endif
00056
00057 #define OK 0
00058 #define IOERR -1
00059
00060
00061
00062
00063
00064 #define PARTIAL 0
00065 #define FULL 1
00066
00067 #define BLANK ((long) ' ')
00068
00069 #define MYRMAX 256
00070
00071
00072
00073
00074
00075 long
00076 cal_rch(fp, uda, chars, mode, status )
00077 FILE *fp;
00078 long *uda, chars, mode, *status;
00079 {
00080
00081 long nc, i, n, c;
00082 char *cp;
00083
00084
00085
00086
00087
00088
00089 if (chars == 0)
00090 {
00091 *status = CNT;
00092 if (mode == FULL )
00093 {
00094 while (1)
00095 {
00096 if (fp->_cnt <= 0)
00097 {
00098 c = _filbuf(fp);
00099
00100 if (c == EOF) return(0);
00101 fp->_cnt++;
00102 fp->_ptr--;
00103 }
00104 cp = memchr(fp->_ptr, '\n', fp->_cnt);
00105 if (cp != NULL)
00106 {
00107 cp++;
00108 fp->_cnt -= cp - (char *)fp->_ptr;
00109 fp->_ptr = (unsigned char *)cp;
00110 return(0);
00111 }
00112 else
00113 fp->_cnt = 0;
00114 }
00115 }
00116 }
00117
00118
00119
00120
00121 n = 0;
00122 while (n < chars)
00123 {
00124 if (fp->_cnt <= 0)
00125 {
00126 c = _filbuf(fp);
00127
00128 if (c == EOF) {
00129 *status = EOF;
00130
00131 (void) _memwset(uda, BLANK, chars - n);
00132 return(0);}
00133 fp->_cnt++;
00134 fp->_ptr--;
00135 }
00136
00137 if ((chars - n) >= fp->_cnt)
00138 {
00139 cp = memchr(fp->_ptr, '\n', fp->_cnt);
00140 if (cp != NULL)
00141 {
00142
00143 nc = cp - (char *)fp->_ptr;
00144 n += nc;
00145 _unpack((char *)fp->_ptr, uda, nc);
00146 (void) _memwset(&uda[nc], BLANK, chars - n);
00147 fp->_cnt -= nc+1;
00148 fp->_ptr = (unsigned char *)++cp;
00149 *status = EOR;
00150 return(n);
00151 }
00152 else
00153 {
00154
00155 nc = fp->_cnt;
00156 _unpack((char *)fp->_ptr, uda, nc);
00157 uda += nc;
00158 fp->_cnt -= nc;
00159 n += nc;
00160 fp->_ptr += nc;
00161
00162 }
00163 }
00164 else
00165 {
00166 cp = memchr(fp->_ptr, '\n', chars - n);
00167 if (cp != NULL)
00168 {
00169
00170 nc = cp - (char *)fp->_ptr;
00171 n += nc;
00172 _unpack((char *)fp->_ptr, uda, nc);
00173 (void) _memwset(&uda[nc], BLANK, chars - n);
00174 fp->_cnt -= nc+1;
00175 fp->_ptr = (unsigned char *)++cp;
00176 *status = EOR;
00177 return(n);
00178 }
00179 else
00180 {
00181 nc = chars - n;
00182 n += nc;
00183 _unpack((char *)fp->_ptr, uda, nc);
00184 (void) _memwset(&uda[nc], BLANK, chars - n);
00185 fp->_cnt -= nc;
00186 fp->_ptr += nc;
00187 uda += nc;
00188 }
00189 }
00190 }
00191
00192
00193
00194
00195 c = getc(fp);
00196 if (c == '\n' ) {
00197 *status = EOR;
00198 return(n);
00199 }
00200 else
00201 *status = CNT;
00202
00203
00204
00205
00206
00207 if (mode == FULL)
00208 while (1)
00209 {
00210 if (fp->_cnt <= 0)
00211 {
00212 c = _filbuf(fp);
00213
00214 if (c == EOF) return(n);
00215 fp->_cnt++;
00216 fp->_ptr--;
00217 }
00218 cp = memchr(fp->_ptr, '\n', fp->_cnt);
00219 if (cp != NULL)
00220 {
00221 cp++;
00222 fp->_cnt -= cp - (char *)fp->_ptr;
00223 fp->_ptr = (unsigned char *)cp;
00224 return(n);
00225 }
00226 else
00227 fp->_cnt = 0;
00228 }
00229 else {
00230 (void) ungetc ((char) c, fp);
00231 }
00232
00233 return(n);
00234
00235 }
00236
00237
00238
00239
00240
00241 long
00242 cal_wch(fp, uda, chars, mode, status )
00243 FILE *fp;
00244 long *uda, chars, mode, *status;
00245 {
00246 int n, c, j, i, tpi, ist;
00247 char tp[MYRMAX+sizeof(long)];
00248
00249 *status = OK;
00250
00251
00252 if (fp->_base == NULL)
00253 c = _findbuf(fp);
00254
00255 j = 0;
00256
00257 if (fp->_flag &(_IONBF | _IOLBF))
00258 {
00259 i = 0;
00260 tpi = 0;
00261 while (j < chars)
00262 {
00263
00264 i = chars - j;
00265 if (chars - j > MYRMAX)
00266 i = MYRMAX;
00267 _pack(&uda[j], &tp[tpi], i, -1);
00268 tpi += i;
00269
00270 if (tpi >= MYRMAX)
00271 {
00272 ist = write(fileno(fp),tp,tpi);
00273 if( ist != tpi)
00274 {
00275 fp->_flag |= _IOERR;
00276 *status = IOERR;
00277 return(EOF);
00278 }
00279 else
00280 {
00281 tpi = 0;
00282 }
00283 }
00284 j += i;
00285 }
00286 if (mode == FULL)
00287 {
00288 tp[tpi++] = '\n';
00289 chars++;
00290 }
00291 ist = write(fileno(fp),tp,tpi);
00292 if( ist != tpi)
00293 {
00294 fp->_flag |= _IOERR;
00295 *status = IOERR;
00296 return(EOF);
00297 }
00298 }
00299 else
00300 {
00301 while (fp->_cnt < chars - j)
00302 {
00303 i = fp->_cnt;
00304 if (i == 0)
00305 {
00306
00307
00308 c = uda[j];
00309 c = putc(c, fp);
00310 i = 1;
00311 }
00312 else
00313 {
00314 _pack(&uda[j], (char *)fp->_ptr, i, -1);
00315 fp->_ptr += i;
00316 fp->_cnt = -1;
00317 }
00318 _xflsbuf(fp);
00319 if (ferror(fp))
00320 {
00321 fp->_flag |= _IOERR;
00322 *status = IOERR;
00323 return(EOF);
00324 }
00325 j += i;
00326 }
00327 if ((chars - j) > 0)
00328 {
00329 _pack(&uda[j], (char *)fp->_ptr, chars - j, -1);
00330 fp->_cnt -= chars - j;
00331 fp->_ptr += chars - j;
00332 }
00333
00334 if (mode == FULL)
00335 {
00336 putc('\n', fp);
00337 chars++;
00338 }
00339 }
00340
00341 return(chars);
00342 }
00343
00344
00345
00346
00347
00348 long
00349 cal_rwd(fp, uda, words, mode, status )
00350 FILE *fp;
00351 long *uda, words, mode, *status;
00352 {
00353 long n, chars, c;
00354
00355
00356
00357
00358
00359
00360 *status = EOR;
00361 if (words == 0)
00362 return(0);
00363
00364 n = fread((char *)uda, sizeof(long), words, fp );
00365
00366 if (n == 0) {
00367 *status = EOF;
00368 return(0);
00369 }
00370
00371 if (n < 0) {
00372 if (n != EOF)
00373 return(IOERR);
00374 *status = EOF;
00375 return(0);
00376 }
00377
00378 return(n);
00379
00380 }
00381
00382
00383
00384
00385
00386 long
00387 cal_wwd(fp, uda, words, mode, status )
00388 FILE *fp;
00389 long *uda, words, mode, *status;
00390 {
00391 long n;
00392
00393
00394
00395
00396 if (words == 0)
00397 return(0);
00398
00399
00400
00401
00402 if (n = fwrite((char *)uda, sizeof(long), words, fp) != words)
00403 return(IOERR);
00404
00405 return(words);
00406
00407 }
00408