|
|
1.1 root 1: ./ ADD NAME=Version.c TIME=706280454
2: static char junk[] = "\n@(#) LIBI77 VERSION pjw,dmg-mods 19 May 1992\n";
3:
4: /*
5: 2.01 $ format added
6: 2.02 Coding bug in open.c repaired
7: 2.03 fixed bugs in lread.c (read * with negative f-format) and lio.c
8: and lio.h (e-format conforming to spec)
9: 2.04 changed open.c and err.c (fopen and freopen respectively) to
10: update to new c-library (append mode)
11: 2.05 added namelist capability
12: 2.06 allow internal list and namelist I/O
13: */
14:
15: /*
16: close.c:
17: allow upper-case STATUS= values
18: endfile.c
19: create fort.nnn if unit nnn not open;
20: else if (file length == 0) use creat() rather than copy;
21: use local copy() rather than forking /bin/cp;
22: rewind, fseek to clear buffer (for no reading past EOF)
23: err.c
24: use neither setbuf nor setvbuf; make stderr buffered
25: fio.h
26: #define _bufend
27: inquire.c
28: upper case responses;
29: omit byfile test from SEQUENTIAL=
30: answer "YES" to DIRECT= for unopened file (open to debate)
31: lio.c
32: flush stderr, stdout at end of each stmt
33: space before character strings in list output only at line start
34: lio.h
35: adjust LEW, LED consistent with old libI77
36: lread.c
37: use atof()
38: allow "nnn*," when reading complex constants
39: open.c
40: try opening for writing when open for read fails, with
41: special uwrt value (2) delaying creat() to first write;
42: set curunit so error messages don't drop core;
43: no file name ==> fort.nnn except for STATUS='SCRATCH'
44: rdfmt.c
45: use atof(); trust EOF == end-of-file (so don't read past
46: end-of-file after endfile stmt)
47: sfe.c
48: flush stderr, stdout at end of each stmt
49: wrtfmt.c:
50: use upper case
51: put wrt_E and wrt_F into wref.c, use sprintf()
52: rather than ecvt() and fcvt() [more accurate on VAX]
53: */
54:
55: /* 16 Oct. 1988: uwrt = 3 after write, rewind, so close won't zap the file. */
56:
57: /* 10 July 1989: change _bufend to buf_end in fio.h, wsfe.c, wrtfmt.c */
58:
59: /* 28 Nov. 1989: corrections for IEEE and Cray arithmetic */
60: /* 29 Nov. 1989: change various int return types to long for f2c */
61: /* 30 Nov. 1989: various types from f2c.h */
62: /* 6 Dec. 1989: types corrected various places */
63: /* 19 Dec. 1989: make iostat= work right for internal I/O */
64: /* 8 Jan. 1990: add rsne, wsne -- routines for handling NAMELIST */
65: /* 28 Jan. 1990: have NAMELIST read treat $ as &, general white
66: space as blank */
67: /* 27 Mar. 1990: change an = to == in rd_L(rdfmt.c) so formatted reads
68: of logical values reject letters other than fFtT;
69: have nowwriting reset cf */
70: /* 14 Aug. 1990: adjust lread.c to treat tabs as spaces in list input */
71: /* 17 Aug. 1990: adjust open.c to recognize blank='Z...' as well as
72: blank='z...' when reopening an open file */
73: /* 30 Aug. 1990: prevent embedded blanks in list output of complex values;
74: omit exponent field in list output of values of
75: magnitude between 10 and 1e8; prevent writing stdin
76: and reading stdout or stderr; don't close stdin, stdout,
77: or stderr when reopening units 5, 6, 0. */
78: /* 18 Sep. 1990: add component udev to unit and consider old == new file
79: iff uinode and udev values agree; use stat rather than
80: access to check existence of file (when STATUS='OLD')*/
81: /* 2 Oct. 1990: adjust rewind.c so two successive rewinds after a write
82: don't clobber the file. */
83: /* 9 Oct. 1990: add #include "fcntl.h" to endfile.c, err.c, open.c;
84: adjust g_char in util.c for segmented memories. */
85: /* 17 Oct. 1990: replace abort() and _cleanup() with calls on
86: sig_die(...,1) (defined in main.c). */
87: /* 5 Nov. 1990: changes to open.c: complain if new= is specified and the
88: file already exists; allow file= to be omitted in open stmts
89: and allow status='replace' (Fortran 90 extensions). */
90: /* 11 Dec. 1990: adjustments for POSIX. */
91: /* 15 Jan. 1991: tweak i_ungetc in rsli.c to allow reading from
92: strings in read-only memory. */
93: /* 25 Apr. 1991: adjust namelist stuff to work with f2c -i2 */
94: /* 26 Apr. 1991: fix some bugs with NAMELIST read of multi-dim. arrays */
95: /* 16 May 1991: increase LEFBL in lio.h to bypass NeXT bug */
96: /* 17 Oct. 1991: change type of length field in sequential unformatted
97: records from int to long (for systems where sizeof(int)
98: can vary, depending on the compiler or compiler options). */
99: /* 14 Nov. 1991: change uint to Uint in fmt.h, rdfmt.c, wrtfmt.c.
100: /* 25 Nov. 1991: change uint to Uint in lwrite.c; change sizeof(int) to
101: sizeof(uioint) in fseeks in sue.c (missed on 17 Oct.). */
102: /* 1 Dec. 1991: uio.c: add test for read failure (seq. unformatted reads);
103: adjust an error return from EOF to off end of record */
104: /* 12 Dec. 1991: rsli.c: fix bug with internal list input that caused
105: the last character of each record to be ignored.
106: iio.c: adjust error message in internal formatted
107: input from "end-of-file" to "off end of record" if
108: the format specifies more characters than the
109: record contains. */
110: /* 17 Jan. 1992: lread.c, rsne.c: in list and namelist input,
111: treat "r* ," and "r*," alike (where r is a
112: positive integer constant), and fix a bug in
113: handling null values following items with repeat
114: counts (e.g., 2*1,,3); for namelist reading
115: of a numeric array, allow a new name-value subsequence
116: to terminate the current one (as though the current
117: one ended with the right number of null values).
118: lio.h, lwrite.c: omit insignificant zeros in
119: list and namelist output. To get the old
120: behavior, compile with -DOld_list_output . */
121: /* 18 Jan. 1992: make list output consistent with F format by
122: printing .1 rather than 0.1 (introduced yesterday). */
123: /* 3 Feb. 1992: rsne.c: fix namelist read bug that caused the
124: character following a comma to be ignored. */
125: /* 19 May 1992: adjust iio.c, ilnw.c, rdfmt.c and rsli.c to make err=
126: work with internal list and formatted I/O. */
127: ./ ADD NAME=backspace.c TIME=708815578
128: #include "f2c.h"
129: #include "fio.h"
130: #ifdef KR_headers
131: integer f_back(a) alist *a;
132: #else
133: integer f_back(alist *a)
134: #endif
135: { unit *b;
136: int n,i;
137: long x;
138: char buf[32];
139: if(a->aunit >= MXUNIT || a->aunit < 0)
140: err(a->aerr,101,"backspace")
141: b= &units[a->aunit];
142: if(b->useek==0) err(a->aerr,106,"backspace")
143: if(b->ufd==NULL) {
144: fk_open(1, 1, a->aunit);
145: return(0);
146: }
147: if(b->uend==1)
148: { b->uend=0;
149: return(0);
150: }
151: if(b->uwrt) {
152: (void) t_runc(a);
153: if (nowreading(b))
154: err(a->aerr,errno,"backspace")
155: }
156: if(b->url>0)
157: { long y;
158: x=ftell(b->ufd);
159: y = x % b->url;
160: if(y == 0) x--;
161: x /= b->url;
162: x *= b->url;
163: (void) fseek(b->ufd,x,SEEK_SET);
164: return(0);
165: }
166:
167: if(b->ufmt==0)
168: { (void) fseek(b->ufd,-(long)sizeof(int),SEEK_CUR);
169: (void) fread((char *)&n,sizeof(int),1,b->ufd);
170: (void) fseek(b->ufd,-(long)n-2*sizeof(int),SEEK_CUR);
171: return(0);
172: }
173: for(;;)
174: { long y;
175: y = x=ftell(b->ufd);
176: if(x<sizeof(buf)) x=0;
177: else x -= sizeof(buf);
178: (void) fseek(b->ufd,x,SEEK_SET);
179: n=fread(buf,1,(int)(y-x), b->ufd);
180: for(i=n-2;i>=0;i--)
181: {
182: if(buf[i]!='\n') continue;
183: (void) fseek(b->ufd,(long)(i+1-n),SEEK_CUR);
184: return(0);
185: }
186: if(x==0)
187: {
188: (void) fseek(b->ufd, 0L, SEEK_SET);
189: return(0);
190: }
191: else if(n<=0) err(a->aerr,(EOF),"backspace")
192: (void) fseek(b->ufd, x, SEEK_SET);
193: }
194: }
195: ./ ADD NAME=close.c TIME=708917753
196: #include "f2c.h"
197: #include "fio.h"
198: #ifdef KR_headers
199: integer f_clos(a) cllist *a;
200: #else
201: #undef abs
202: #include "stdlib.h"
203: #ifdef MSDOS
204: #include "io.h"
205: #else
206: #ifdef __cplusplus
207: extern "C" int unlink(char*);
208: #else
209: extern int unlink(char*);
210: #endif
211: #endif
212:
213: integer f_clos(cllist *a)
214: #endif
215: { unit *b;
216:
217: if(a->cunit >= MXUNIT) return(0);
218: b= &units[a->cunit];
219: if(b->ufd==NULL)
220: goto done;
221: if (!a->csta)
222: if (b->uscrtch == 1)
223: goto Delete;
224: else
225: goto Keep;
226: switch(*a->csta) {
227: default:
228: Keep:
229: case 'k':
230: case 'K':
231: if(b->uwrt == 1)
232: (void) t_runc((alist *)a);
233: if(b->ufnm) {
234: (void) fclose(b->ufd);
235: free(b->ufnm);
236: }
237: break;
238: case 'd':
239: case 'D':
240: Delete:
241: if(b->ufnm) {
242: (void) fclose(b->ufd);
243: (void) unlink(b->ufnm); /*SYSDEP*/
244: free(b->ufnm);
245: }
246: }
247: b->ufd=NULL;
248: done:
249: b->uend=0;
250: b->ufnm=NULL;
251: return(0);
252: }
253: void
254: #ifdef KR_headers
255: f_exit()
256: #else
257: f_exit(void)
258: #endif
259: { int i;
260: static cllist xx;
261: if (!xx.cerr) {
262: xx.cerr=1;
263: xx.csta=NULL;
264: for(i=0;i<MXUNIT;i++)
265: {
266: xx.cunit=i;
267: (void) f_clos(&xx);
268: }
269: }
270: }
271: void
272: #ifdef KR_headers
273: flush_()
274: #else
275: flush_(void)
276: #endif
277: { int i;
278: for(i=0;i<MXUNIT;i++)
279: if(units[i].ufd != NULL) (void) fflush(units[i].ufd);
280: }
281: ./ ADD NAME=dfe.c TIME=708823203
282: #include "f2c.h"
283: #include "fio.h"
284: #include "fmt.h"
285:
286: y_rsk(Void)
287: {
288: if(curunit->uend || curunit->url <= recpos
289: || curunit->url == 1) return 0;
290: do {
291: getc(cf);
292: } while(++recpos < curunit->url);
293: return 0;
294: }
295: y_getc(Void)
296: {
297: int ch;
298: if(curunit->uend) return(-1);
299: if((ch=getc(cf))!=EOF)
300: {
301: recpos++;
302: if(curunit->url>=recpos ||
303: curunit->url==1)
304: return(ch);
305: else return(' ');
306: }
307: if(feof(cf))
308: {
309: curunit->uend=1;
310: errno=0;
311: return(-1);
312: }
313: err(elist->cierr,errno,"readingd");
314: }
315: #ifdef KR_headers
316: y_putc(c)
317: #else
318: y_putc(int c)
319: #endif
320: {
321: recpos++;
322: if(recpos <= curunit->url || curunit->url==1)
323: putc(c,cf);
324: else
325: err(elist->cierr,110,"dout");
326: return(0);
327: }
328: y_rev(Void)
329: { /*what about work done?*/
330: if(curunit->url==1 || recpos==curunit->url)
331: return(0);
332: while(recpos<curunit->url)
333: (*putn)(' ');
334: recpos=0;
335: return(0);
336: }
337: y_err(Void)
338: {
339: err(elist->cierr, 110, "dfe");
340: }
341:
342: y_newrec(Void)
343: {
344: if(curunit->url == 1 || recpos == curunit->url) {
345: hiwater = recpos = cursor = 0;
346: return(1);
347: }
348: if(hiwater > recpos)
349: recpos = hiwater;
350: y_rev();
351: hiwater = cursor = 0;
352: return(1);
353: }
354:
355: #ifdef KR_headers
356: c_dfe(a) cilist *a;
357: #else
358: c_dfe(cilist *a)
359: #endif
360: {
361: sequential=0;
362: formatted=external=1;
363: elist=a;
364: cursor=scale=recpos=0;
365: if(a->ciunit>MXUNIT || a->ciunit<0)
366: err(a->cierr,101,"startchk");
367: curunit = &units[a->ciunit];
368: if(curunit->ufd==NULL && fk_open(DIR,FMT,a->ciunit))
369: err(a->cierr,104,"dfe");
370: cf=curunit->ufd;
371: if(!curunit->ufmt) err(a->cierr,102,"dfe")
372: if(!curunit->useek) err(a->cierr,104,"dfe")
373: fmtbuf=a->cifmt;
374: (void) fseek(cf,(long)curunit->url * (a->cirec-1),SEEK_SET);
375: curunit->uend = 0;
376: return(0);
377: }
378: #ifdef KR_headers
379: integer s_rdfe(a) cilist *a;
380: #else
381: integer s_rdfe(cilist *a)
382: #endif
383: {
384: int n;
385: if(!init) f_init();
386: if(n=c_dfe(a))return(n);
387: reading=1;
388: if(curunit->uwrt && nowreading(curunit))
389: err(a->cierr,errno,"read start");
390: getn = y_getc;
391: doed = rd_ed;
392: doned = rd_ned;
393: dorevert = donewrec = y_err;
394: doend = y_rsk;
395: if(pars_f(fmtbuf)<0)
396: err(a->cierr,100,"read start");
397: fmt_bg();
398: return(0);
399: }
400: #ifdef KR_headers
401: integer s_wdfe(a) cilist *a;
402: #else
403: integer s_wdfe(cilist *a)
404: #endif
405: {
406: int n;
407: if(!init) f_init();
408: if(n=c_dfe(a)) return(n);
409: reading=0;
410: if(curunit->uwrt != 1 && nowwriting(curunit))
411: err(a->cierr,errno,"startwrt");
412: putn = y_putc;
413: doed = w_ed;
414: doned= w_ned;
415: dorevert = y_err;
416: donewrec = y_newrec;
417: doend = y_rev;
418: if(pars_f(fmtbuf)<0)
419: err(a->cierr,100,"startwrt");
420: fmt_bg();
421: return(0);
422: }
423: integer e_rdfe(Void)
424: {
425: (void) en_fio();
426: return(0);
427: }
428: integer e_wdfe(Void)
429: {
430: (void) en_fio();
431: return(0);
432: }
433: ./ ADD NAME=dolio.c TIME=708905794
434: #include "f2c.h"
435:
436: #ifdef __cplusplus
437: extern "C" {
438: #endif
439: #ifdef KR_headers
440: extern int (*lioproc)();
441:
442: integer do_lio(type,number,ptr,len) ftnint *number,*type; char *ptr; ftnlen len;
443: #else
444: extern int (*lioproc)(ftnint*, char*, ftnlen, ftnint);
445:
446: integer do_lio(ftnint *type, ftnint *number, char *ptr, ftnlen len)
447: #endif
448: {
449: return((*lioproc)(number,ptr,len,*type));
450: }
451: #ifdef __cplusplus
452: }
453: #endif
454: ./ ADD NAME=due.c TIME=708866794
455: #include "f2c.h"
456: #include "fio.h"
457:
458: #ifdef KR_headers
459: c_due(a) cilist *a;
460: #else
461: c_due(cilist *a)
462: #endif
463: {
464: if(!init) f_init();
465: if(a->ciunit>=MXUNIT || a->ciunit<0)
466: err(a->cierr,101,"startio");
467: recpos=sequential=formatted=0;
468: external=1;
469: curunit = &units[a->ciunit];
470: elist=a;
471: if(curunit->ufd==NULL && fk_open(DIR,UNF,a->ciunit) ) err(a->cierr,104,"due");
472: cf=curunit->ufd;
473: if(curunit->ufmt) err(a->cierr,102,"cdue")
474: if(!curunit->useek) err(a->cierr,104,"cdue")
475: if(curunit->ufd==NULL) err(a->cierr,114,"cdue")
476: (void) fseek(cf,(long)(a->cirec-1)*curunit->url,SEEK_SET);
477: curunit->uend = 0;
478: return(0);
479: }
480: #ifdef KR_headers
481: integer s_rdue(a) cilist *a;
482: #else
483: integer s_rdue(cilist *a)
484: #endif
485: {
486: int n;
487: if(n=c_due(a)) return(n);
488: reading=1;
489: if(curunit->uwrt && nowreading(curunit))
490: err(a->cierr,errno,"read start");
491: return(0);
492: }
493: #ifdef KR_headers
494: integer s_wdue(a) cilist *a;
495: #else
496: integer s_wdue(cilist *a)
497: #endif
498: {
499: int n;
500: if(n=c_due(a)) return(n);
501: reading=0;
502: if(curunit->uwrt != 1 && nowwriting(curunit))
503: err(a->cierr,errno,"write start");
504: return(0);
505: }
506: integer e_rdue(Void)
507: {
508: if(curunit->url==1 || recpos==curunit->url)
509: return(0);
510: (void) fseek(cf,(long)(curunit->url-recpos),SEEK_CUR);
511: if(ftell(cf)%curunit->url)
512: err(elist->cierr,200,"syserr");
513: return(0);
514: }
515: integer e_wdue(Void)
516: {
517: return(e_rdue());
518: }
519: ./ ADD NAME=endfile.c TIME=708893804
520: #include "f2c.h"
521: #include "fio.h"
522: #include "fcntl.h"
523: #include "rawio.h"
524: #ifndef O_RDONLY
525: #define O_RDONLY 0
526: #endif
527:
528: #ifdef KR_headers
529: extern char *strcpy();
530: #else
531: #undef abs
532: #include "stdlib.h"
533: #include "string.h"
534: #endif
535:
536:
537: #ifdef KR_headers
538: integer f_end(a) alist *a;
539: #else
540: integer f_end(alist *a)
541: #endif
542: {
543: unit *b;
544: if(a->aunit>=MXUNIT || a->aunit<0) err(a->aerr,101,"endfile");
545: b = &units[a->aunit];
546: if(b->ufd==NULL) {
547: char nbuf[10];
548: (void) sprintf(nbuf,"fort.%ld",a->aunit);
549: close(creat(nbuf, 0666));
550: return(0);
551: }
552: b->uend=1;
553: return(b->useek ? t_runc(a) : 0);
554: }
555:
556: static int
557: #ifdef KR_headers
558: copy(from, len, to) char *from, *to; register long len;
559: #else
560: copy(char *from, register long len, char *to)
561: #endif
562: {
563: register int n;
564: int k, rc = 0, tmp;
565: char buf[BUFSIZ];
566:
567: if ((k = open(from, O_RDONLY)) < 0)
568: return 1;
569: if ((tmp = creat(to,0666)) < 0)
570: return 1;
571: while((n = read(k, buf, len > BUFSIZ ? BUFSIZ : (int)len)) > 0) {
572: if (write(tmp, buf, n) != n)
573: { rc = 1; break; }
574: if ((len -= n) <= 0)
575: break;
576: }
577: close(k);
578: close(tmp);
579: return n < 0 ? 1 : rc;
580: }
581:
582: int
583: #ifdef KR_headers
584: t_runc(a) alist *a;
585: #else
586: t_runc(alist *a)
587: #endif
588: {
589: char nm[16];
590: long loc, len;
591: unit *b;
592: int rc = 0;
593:
594: b = &units[a->aunit];
595: if(b->url) return(0); /*don't truncate direct files*/
596: loc=ftell(b->ufd);
597: (void) fseek(b->ufd,0L,SEEK_END);
598: len=ftell(b->ufd);
599: if (loc >= len || b->useek == 0 || b->ufnm == NULL)
600: return(0);
601: rewind(b->ufd); /* empty buffer */
602: if (!loc) {
603: if (close(creat(b->ufnm,0666)))
604: { rc = 1; goto done; }
605: if (b->uwrt)
606: b->uwrt = 1;
607: return 0;
608: }
609: (void) strcpy(nm,"tmp.FXXXXXX");
610: (void) mktemp(nm);
611: if (copy(b->ufnm, loc, nm)
612: || copy(nm, loc, b->ufnm))
613: rc = 1;
614: unlink(nm);
615: done:
616: fseek(b->ufd, loc, SEEK_SET);
617: if (rc)
618: err(a->aerr,111,"endfile");
619: return 0;
620: }
621: ./ ADD NAME=err.c TIME=708894334
622: #include "sys/types.h"
623: #ifndef MSDOS
624: #include "sys/stat.h"
625: #endif
626: #include "f2c.h"
627: #include "fio.h"
628: #include "fcntl.h"
629: #include "rawio.h"
630: #ifdef NON_UNIX_STDIO
631: #ifdef KR_headers
632: extern char *malloc();
633: #else
634: #undef abs
635: #include "stdlib.h"
636: #endif
637: #endif
638: #ifndef O_WRONLY
639: #define O_WRONLY 1
640: #endif
641:
642: /*global definitions*/
643: unit units[MXUNIT]; /*unit table*/
644: flag init; /*0 on entry, 1 after initializations*/
645: cilist *elist; /*active external io list*/
646: flag reading; /*1 if reading, 0 if writing*/
647: flag cplus,cblank;
648: char *fmtbuf;
649: flag external; /*1 if external io, 0 if internal */
650: #ifdef KR_headers
651: int (*doed)(),(*doned)();
652: int (*doend)(),(*donewrec)(),(*dorevert)();
653: int (*getn)(),(*putn)(); /*for formatted io*/
654: #else
655: int (*getn)(void),(*putn)(int); /*for formatted io*/
656: int (*doed)(struct syl*, char*, ftnlen),(*doned)(struct syl*);
657: int (*dorevert)(void),(*donewrec)(void),(*doend)(void);
658: #endif
659: flag sequential; /*1 if sequential io, 0 if direct*/
660: flag formatted; /*1 if formatted io, 0 if unformatted*/
661: FILE *cf; /*current file*/
662: unit *curunit; /*current unit*/
663: int recpos; /*place in current record*/
664: int cursor,scale;
665:
666: /*error messages*/
667: char *F_err[] =
668: {
669: "error in format", /* 100 */
670: "illegal unit number", /* 101 */
671: "formatted io not allowed", /* 102 */
672: "unformatted io not allowed", /* 103 */
673: "direct io not allowed", /* 104 */
674: "sequential io not allowed", /* 105 */
675: "can't backspace file", /* 106 */
676: "null file name", /* 107 */
677: "can't stat file", /* 108 */
678: "unit not connected", /* 109 */
679: "off end of record", /* 110 */
680: "truncation failed in endfile", /* 111 */
681: "incomprehensible list input", /* 112 */
682: "out of free space", /* 113 */
683: "unit not connected", /* 114 */
684: "read unexpected character", /* 115 */
685: "bad logical input field", /* 116 */
686: "bad variable type", /* 117 */
687: "bad namelist name", /* 118 */
688: "variable not in namelist", /* 119 */
689: "no end record", /* 120 */
690: "variable count incorrect", /* 121 */
691: "subscript for scalar variable", /* 122 */
692: "invalid array section", /* 123 */
693: "substring out of bounds", /* 124 */
694: "subscript out of bounds", /* 125 */
695: "can't read file", /* 126 */
696: "can't write file", /* 127 */
697: "'new' file exists" /* 128 */
698: };
699: #define MAXERR (sizeof(F_err)/sizeof(char *)+100)
700:
701: #ifdef KR_headers
702: canseek(f) FILE *f; /*SYSDEP*/
703: #else
704: canseek(FILE *f) /*SYSDEP*/
705: #endif
706: {
707: #ifdef MSDOS
708: return !isatty(fileno(f));
709: #else
710: struct stat x;
711:
712: if (fstat(fileno(f),&x) < 0)
713: return(0);
714: #ifdef S_IFMT
715: switch(x.st_mode & S_IFMT) {
716: case S_IFDIR:
717: case S_IFREG:
718: if(x.st_nlink > 0) /* !pipe */
719: return(1);
720: else
721: return(0);
722: case S_IFCHR:
723: if(isatty(fileno(f)))
724: return(0);
725: return(1);
726: #ifdef S_IFBLK
727: case S_IFBLK:
728: return(1);
729: #endif
730: }
731: #else
732: #ifdef S_ISDIR
733: /* POSIX version */
734: if (S_ISREG(x.st_mode) || S_ISDIR(x.st_mode)) {
735: if(x.st_nlink > 0) /* !pipe */
736: return(1);
737: else
738: return(0);
739: }
740: if (S_ISCHR(x.st_mode)) {
741: if(isatty(fileno(f)))
742: return(0);
743: return(1);
744: }
745: if (S_ISBLK(x.st_mode))
746: return(1);
747: #else
748: Help! How does fstat work on this system?
749: #endif
750: #endif
751: return(0); /* who knows what it is? */
752: #endif
753: }
754:
755: void
756: #ifdef KR_headers
757: fatal(n,s) char *s;
758: #else
759: fatal(int n, char *s)
760: #endif
761: {
762: if(n<100 && n>=0) perror(s); /*SYSDEP*/
763: else if(n >= (int)MAXERR || n < -1)
764: { fprintf(stderr,"%s: illegal error number %d\n",s,n);
765: }
766: else if(n == -1) fprintf(stderr,"%s: end of file\n",s);
767: else
768: fprintf(stderr,"%s: %s\n",s,F_err[n-100]);
769: if (curunit) {
770: fprintf(stderr,"apparent state: unit %d ",curunit-units);
771: fprintf(stderr, curunit->ufnm ? "named %s\n" : "(unnamed)\n",
772: curunit->ufnm);
773: }
774: else
775: fprintf(stderr,"apparent state: internal I/O\n");
776: if (fmtbuf)
777: fprintf(stderr,"last format: %s\n",fmtbuf);
778: fprintf(stderr,"lately %s %s %s %s",reading?"reading":"writing",
779: sequential?"sequential":"direct",formatted?"formatted":"unformatted",
780: external?"external":"internal");
781: sig_die(" IO", 1);
782: }
783: /*initialization routine*/
784: VOID
785: f_init(Void)
786: { unit *p;
787:
788: init=1;
789: p= &units[0];
790: p->ufd=stderr;
791: p->useek=canseek(stderr);
792: #ifdef COMMENTED_OUT
793: if(isatty(fileno(stderr))) {
794: extern char *malloc();
795: setbuf(stderr, malloc(BUFSIZ));
796: /* setvbuf(stderr, _IOLBF, 0, 0); */
797: } /* wastes space, but win for debugging in windows */
798: #endif
799: #ifdef NON_UNIX_STDIO
800: setbuf(stderr, malloc(BUFSIZ));
801: #else
802: stderr->_flag &= ~_IONBF;
803: #endif
804: p->ufmt=1;
805: p->uwrt=1;
806: p = &units[5];
807: p->ufd=stdin;
808: p->useek=canseek(stdin);
809: p->ufmt=1;
810: p->uwrt=0;
811: p= &units[6];
812: p->ufd=stdout;
813: p->useek=canseek(stdout);
814: /* IOLBUF and setvbuf only in system 5+ */
815: #ifdef COMMENTED_OUT
816: if(isatty(fileno(stdout))) {
817: extern char _sobuf[];
818: setbuf(stdout, _sobuf);
819: /* setvbuf(stdout, _IOLBF, 0, 0); /* the buf arg in setvbuf? */
820: p->useek = 1; /* only within a record no bigger than BUFSIZ */
821: }
822: #endif
823: p->ufmt=1;
824: p->uwrt=1;
825: }
826: #ifdef KR_headers
827: nowreading(x) unit *x;
828: #else
829: nowreading(unit *x)
830: #endif
831: {
832: long loc;
833: extern char *r_mode[];
834: if (!x->ufnm)
835: goto cantread;
836: loc=ftell(x->ufd);
837: if(freopen(x->ufnm,r_mode[x->ufmt],x->ufd) == NULL) {
838: cantread:
839: errno = 126;
840: return(1);
841: }
842: x->uwrt=0;
843: (void) fseek(x->ufd,loc,SEEK_SET);
844: return(0);
845: }
846: #ifdef KR_headers
847: nowwriting(x) unit *x;
848: #else
849: nowwriting(unit *x)
850: #endif
851: {
852: long loc;
853: int k;
854: extern char *w_mode[];
855:
856: if (!x->ufnm)
857: goto cantwrite;
858: if (x->uwrt == 3) { /* just did write, rewind */
859: if (close(creat(x->ufnm,0666)))
860: goto cantwrite;
861: }
862: else {
863: loc=ftell(x->ufd);
864: if (fclose(x->ufd) < 0
865: || (k = x->uwrt == 2 ? creat(x->ufnm,0666)
866: : open(x->ufnm,O_WRONLY)) < 0
867: || (cf = x->ufd = fdopen(k,w_mode[x->ufmt])) == NULL) {
868: x->ufd = NULL;
869: cantwrite:
870: errno = 127;
871: return(1);
872: }
873: (void) fseek(x->ufd,loc,SEEK_SET);
874: }
875: x->uwrt = 1;
876: return(0);
877: }
878: ./ ADD NAME=f2c.h TIME=708964532
879: /* f2c.h -- Standard Fortran to C header file */
880:
881: /** barf [ba:rf] 2. "He suggested using FORTRAN, and everybody barfed."
882:
883: - From The Shogakukan DICTIONARY OF NEW ENGLISH (Second edition) */
884:
885: #ifndef F2C_INCLUDE
886: #define F2C_INCLUDE
887:
888: typedef long int integer;
889: typedef char *address;
890: typedef short int shortint;
891: typedef float real;
892: typedef double doublereal;
893: typedef struct { real r, i; } complex;
894: typedef struct { doublereal r, i; } doublecomplex;
895: typedef long int logical;
896: typedef short int shortlogical;
897:
898: #define TRUE_ (1)
899: #define FALSE_ (0)
900:
901: /* Extern is for use with -E */
902: #ifndef Extern
903: #define Extern extern
904: #endif
905:
906: /* I/O stuff */
907:
908: #ifdef f2c_i2
909: /* for -i2 */
910: typedef short flag;
911: typedef short ftnlen;
912: typedef short ftnint;
913: #else
914: typedef long flag;
915: typedef long ftnlen;
916: typedef long ftnint;
917: #endif
918:
919: /*external read, write*/
920: typedef struct
921: { flag cierr;
922: ftnint ciunit;
923: flag ciend;
924: char *cifmt;
925: ftnint cirec;
926: } cilist;
927:
928: /*internal read, write*/
929: typedef struct
930: { flag icierr;
931: char *iciunit;
932: flag iciend;
933: char *icifmt;
934: ftnint icirlen;
935: ftnint icirnum;
936: } icilist;
937:
938: /*open*/
939: typedef struct
940: { flag oerr;
941: ftnint ounit;
942: char *ofnm;
943: ftnlen ofnmlen;
944: char *osta;
945: char *oacc;
946: char *ofm;
947: ftnint orl;
948: char *oblnk;
949: } olist;
950:
951: /*close*/
952: typedef struct
953: { flag cerr;
954: ftnint cunit;
955: char *csta;
956: } cllist;
957:
958: /*rewind, backspace, endfile*/
959: typedef struct
960: { flag aerr;
961: ftnint aunit;
962: } alist;
963:
964: /* inquire */
965: typedef struct
966: { flag inerr;
967: ftnint inunit;
968: char *infile;
969: ftnlen infilen;
970: ftnint *inex; /*parameters in standard's order*/
971: ftnint *inopen;
972: ftnint *innum;
973: ftnint *innamed;
974: char *inname;
975: ftnlen innamlen;
976: char *inacc;
977: ftnlen inacclen;
978: char *inseq;
979: ftnlen inseqlen;
980: char *indir;
981: ftnlen indirlen;
982: char *infmt;
983: ftnlen infmtlen;
984: char *inform;
985: ftnint informlen;
986: char *inunf;
987: ftnlen inunflen;
988: ftnint *inrecl;
989: ftnint *innrec;
990: char *inblank;
991: ftnlen inblanklen;
992: } inlist;
993:
994: #define VOID void
995:
996: union Multitype { /* for multiple entry points */
997: shortint h;
998: integer i;
999: real r;
1000: doublereal d;
1001: complex c;
1002: doublecomplex z;
1003: };
1004:
1005: typedef union Multitype Multitype;
1006:
1007: typedef long Long; /* No longer used; formerly in Namelist */
1008:
1009: struct Vardesc { /* for Namelist */
1010: char *name;
1011: char *addr;
1012: ftnlen *dims;
1013: int type;
1014: };
1015: typedef struct Vardesc Vardesc;
1016:
1017: struct Namelist {
1018: char *name;
1019: Vardesc **vars;
1020: int nvars;
1021: };
1022: typedef struct Namelist Namelist;
1023:
1024: #define abs(x) ((x) >= 0 ? (x) : -(x))
1025: #define dabs(x) (doublereal)abs(x)
1026: #define min(a,b) ((a) <= (b) ? (a) : (b))
1027: #define max(a,b) ((a) >= (b) ? (a) : (b))
1028: #define dmin(a,b) (doublereal)min(a,b)
1029: #define dmax(a,b) (doublereal)max(a,b)
1030:
1031: /* procedure parameter types for -A and -C++ */
1032:
1033: #define F2C_proc_par_types 1
1034: #ifdef __cplusplus
1035: typedef int /* Unknown procedure type */ (*U_fp)(...);
1036: typedef shortint (*J_fp)(...);
1037: typedef integer (*I_fp)(...);
1038: typedef real (*R_fp)(...);
1039: typedef doublereal (*D_fp)(...), (*E_fp)(...);
1040: typedef /* Complex */ VOID (*C_fp)(...);
1041: typedef /* Double Complex */ VOID (*Z_fp)(...);
1042: typedef logical (*L_fp)(...);
1043: typedef shortlogical (*K_fp)(...);
1044: typedef /* Character */ VOID (*H_fp)(...);
1045: typedef /* Subroutine */ int (*S_fp)(...);
1046: #else
1047: #ifndef __LCC__
1048: typedef int /* Unknown procedure type */ (*U_fp)();
1049: typedef shortint (*J_fp)();
1050: typedef integer (*I_fp)();
1051: typedef real (*R_fp)();
1052: typedef doublereal (*D_fp)(), (*E_fp)();
1053: typedef /* Complex */ VOID (*C_fp)();
1054: typedef /* Double Complex */ VOID (*Z_fp)();
1055: typedef logical (*L_fp)();
1056: typedef shortlogical (*K_fp)();
1057: typedef /* Character */ VOID (*H_fp)();
1058: typedef /* Subroutine */ int (*S_fp)();
1059: #endif
1060: #endif
1061: /* E_fp is for real functions when -R is not specified */
1062: typedef VOID C_f; /* complex function */
1063: typedef VOID H_f; /* character function */
1064: typedef VOID Z_f; /* double complex function */
1065: typedef doublereal E_f; /* real function with -R not specified */
1066:
1067: /* undef any lower-case symbols that your C compiler predefines, e.g.: */
1068:
1069: #ifndef Skip_f2c_Undefs
1070: #undef mips
1071: #undef sgi
1072: #undef unix
1073: #endif
1074: #endif
1075:
1076: #ifdef __cplusplus
1077: extern "C" {
1078: extern void abort_(void);
1079: extern double c_abs(complex *);
1080: extern void c_cos(complex *, complex *);
1081: extern void c_div(complex *, complex *, complex *);
1082: extern void c_exp(complex *, complex *);
1083: extern void c_log(complex *, complex *);
1084: extern void c_sin(complex *, complex *);
1085: extern void c_sqrt(complex *, complex *);
1086: extern double d_abs(double *);
1087: extern double d_acos(double *);
1088: extern double d_asin(double *);
1089: extern double d_atan(double *);
1090: extern double d_atn2(double *, double *);
1091: extern void d_cnjg(doublecomplex *, doublecomplex *);
1092: extern double d_cos(double *);
1093: extern double d_cosh(double *);
1094: extern double d_dim(double *, double *);
1095: extern double d_exp(double *);
1096: extern double d_imag(doublecomplex *);
1097: extern double d_int(double *);
1098: extern double d_lg10(double *);
1099: extern double d_log(double *);
1100: extern double d_mod(double *, double *);
1101: extern double d_nint(double *);
1102: extern double d_prod(float *, float *);
1103: extern double d_sign(double *, double *);
1104: extern double d_sin(double *);
1105: extern double d_sinh(double *);
1106: extern double d_sqrt(double *);
1107: extern double d_tan(double *);
1108: extern double d_tanh(double *);
1109: extern double derf_(double *);
1110: extern double derfc_(double *);
1111: extern void ef1asc_(long int *, long int *, long int *, long int *);
1112: extern long int ef1cmc_(long int *, long int *, long int *, long int *);
1113: extern double erf(double);
1114: extern double erf_(float *);
1115: extern double erfc(double);
1116: extern double erfc_(float *);
1117: extern void getarg_(long int *, char *, long int);
1118: extern void getenv_(char *, char *, long int, long int);
1119: extern int getpid(void);
1120: extern short h_abs(short *);
1121: extern short h_dim(short *, short *);
1122: extern short h_dnnt(double *);
1123: extern short h_indx(char *, char *, long int, long int);
1124: extern short h_len(char *, long int);
1125: extern short h_mod(short *, short *);
1126: extern short h_nint(float *);
1127: extern short h_sign(short *, short *);
1128: extern short hl_ge(char *, char *, long int, long int);
1129: extern short hl_gt(char *, char *, long int, long int);
1130: extern short hl_le(char *, char *, long int, long int);
1131: extern short hl_lt(char *, char *, long int, long int);
1132: extern long int i_abs(long int *);
1133: extern long int i_dim(long int *, long int *);
1134: extern long int i_dnnt(double *);
1135: extern long int i_indx(char *, char *, long int, long int);
1136: extern long int i_len(char *, long int);
1137: extern long int i_mod(long int *, long int *);
1138: extern long int i_nint(float *);
1139: extern long int i_sign(long int *, long int *);
1140: extern long int iargc_(void);
1141: extern long int l_ge(char *, char *, long int, long int);
1142: extern long int l_gt(char *, char *, long int, long int);
1143: extern long int l_le(char *, char *, long int, long int);
1144: extern long int l_lt(char *, char *, long int, long int);
1145: extern int main(int, char **);
1146: extern int pause(void);
1147: extern void pow_ci(complex *, complex *, long int *);
1148: extern double pow_dd(double *, double *);
1149: extern double pow_di(double *, long int *);
1150: extern short pow_hh(short *, short *);
1151: extern long int pow_ii(long int *, long int *);
1152: extern double pow_ri(float *, long int *);
1153: extern void pow_zi(doublecomplex *, doublecomplex *, long int *);
1154: extern void pow_zz(doublecomplex *, doublecomplex *, doublecomplex *);
1155: extern double r_abs(float *);
1156: extern double r_acos(float *);
1157: extern double r_asin(float *);
1158: extern double r_atan(float *);
1159: extern double r_atn2(float *, float *);
1160: extern void r_cnjg(complex *, complex *);
1161: extern double r_cos(float *);
1162: extern double r_cosh(float *);
1163: extern double r_dim(float *, float *);
1164: extern double r_exp(float *);
1165: extern double r_imag(complex *);
1166: extern double r_int(float *);
1167: extern double r_lg10(float *);
1168: extern double r_log(float *);
1169: extern double r_mod(float *, float *);
1170: extern double r_nint(float *);
1171: extern double r_sign(float *, float *);
1172: extern double r_sin(float *);
1173: extern double r_sinh(float *);
1174: extern double r_sqrt(float *);
1175: extern double r_tan(float *);
1176: extern double r_tanh(float *);
1177: extern void s_cat(char *, char **, long int *, long int *, long int);
1178: extern long int s_cmp(char *, char *, long int, long int);
1179: extern void s_copy(char *, char *, long int, long int);
1180: extern void s_paus(char *, long int);
1181: extern void s_rnge(char *, long int, char *, long int);
1182: extern void s_stop(char *, long int);
1183: extern void sig_die(char *, int);
1184: extern long int signal_(long int *, void *);
1185: extern int system_(char *, long int);
1186: extern double z_abs(doublecomplex *);
1187: extern void z_cos(doublecomplex *, doublecomplex *);
1188: extern void z_div(doublecomplex *, doublecomplex *, doublecomplex *);
1189: extern void z_exp(doublecomplex *, doublecomplex *);
1190: extern void z_log(doublecomplex *, doublecomplex *);
1191: extern void z_sin(doublecomplex *, doublecomplex *);
1192: extern void z_sqrt(doublecomplex *, doublecomplex *);
1193: }
1194: #endif
1195: ./ ADD NAME=fio.h TIME=708907413
1196: #include "stdio.h"
1197: #ifndef NULL
1198: /* ANSI C */
1199: #include "stddef.h"
1200: #endif
1201:
1202: #ifndef SEEK_SET
1203: #define SEEK_SET 0
1204: #define SEEK_CUR 1
1205: #define SEEK_END 2
1206: #endif
1207:
1208: #ifdef MSDOS
1209: #ifndef NON_UNIX_STDIO
1210: #define NON_UNIX_STDIO
1211: #endif
1212: #endif
1213:
1214: #ifdef UIOLEN_int
1215: typedef int uiolen;
1216: #else
1217: typedef long uiolen;
1218: #endif
1219:
1220: /*units*/
1221: typedef struct
1222: { FILE *ufd; /*0=unconnected*/
1223: char *ufnm;
1224: #ifndef MSDOS
1225: long uinode;
1226: int udev;
1227: #endif
1228: int url; /*0=sequential*/
1229: flag useek; /*true=can backspace, use dir, ...*/
1230: flag ufmt;
1231: flag uprnt;
1232: flag ublnk;
1233: flag uend;
1234: flag uwrt; /*last io was write*/
1235: flag uscrtch;
1236: } unit;
1237:
1238: extern int errno;
1239: extern flag init;
1240: extern cilist *elist; /*active external io list*/
1241: extern flag reading,external,sequential,formatted;
1242: #ifdef KR_headers
1243: #define Void /*void*/
1244: extern int (*getn)(),(*putn)(); /*for formatted io*/
1245: extern long inode();
1246: extern VOID sig_die();
1247: extern int (*donewrec)(), t_putc(), x_wSL();
1248: extern int c_sfe();
1249: #else
1250: #define Void void
1251: #ifdef __cplusplus
1252: extern "C" {
1253: #endif
1254: extern int (*getn)(void),(*putn)(int); /*for formatted io*/
1255: extern long inode(char*,int*);
1256: extern void sig_die(char*,int);
1257: extern void fatal(int,char*);
1258: extern int t_runc(alist*);
1259: extern int nowreading(unit*), nowwriting(unit*);
1260: extern int fk_open(int,int,ftnint);
1261: extern int en_fio(void);
1262: extern void f_init(void);
1263: extern int (*donewrec)(void), t_putc(int), x_wSL(void);
1264: extern void b_char(char*,char*,ftnlen), g_char(char*,ftnlen,char*);
1265: extern int c_sfe(cilist*), z_rnew(void);
1266: extern int isatty(int);
1267: #ifdef __cplusplus
1268: }
1269: #endif
1270: #endif
1271: extern FILE *cf; /*current file*/
1272: extern unit *curunit; /*current unit*/
1273: extern unit units[];
1274: #define err(f,m,s) {if(f) errno= m; else fatal(m,s); return(m);}
1275:
1276: /*Table sizes*/
1277: #define MXUNIT 100
1278:
1279: extern int recpos; /*position in current record*/
1280: extern int cursor; /* offset to move to */
1281: extern int hiwater; /* so TL doesn't confuse us */
1282:
1283: #define WRITE 1
1284: #define READ 2
1285: #define SEQ 3
1286: #define DIR 4
1287: #define FMT 5
1288: #define UNF 6
1289: #define EXT 7
1290: #define INT 8
1291:
1292: #define buf_end(x) (x->_flag & _IONBF ? x->_ptr : x->_base + BUFSIZ)
1293: #ifdef __cplusplus
1294: extern "C" {
1295: extern long int f_back(alist *);
1296: extern long int f_clos(cllist *);
1297: extern void f_exit(void);
1298: extern void flush_(void);
1299: extern int y_rsk(void);
1300: extern int y_getc(void);
1301: extern int y_putc(int);
1302: extern int y_rev(void);
1303: extern int y_err(void);
1304: extern int y_newrec(void);
1305: extern int c_dfe(cilist *);
1306: extern long int s_rdfe(cilist *);
1307: extern long int s_wdfe(cilist *);
1308: extern long int e_rdfe(void);
1309: extern long int e_wdfe(void);
1310: extern long int do_lio(long int *, long int *, char *, long int);
1311: extern int c_due(cilist *);
1312: extern long int s_rdue(cilist *);
1313: extern long int s_wdue(cilist *);
1314: extern long int e_rdue(void);
1315: extern long int e_wdue(void);
1316: extern long int f_end(alist *);
1317: extern int canseek(struct _iobuf *);
1318: extern char *ap_end(char *);
1319: extern int op_gen(int, int, int, int);
1320: extern char *gt_num(char *, int *);
1321: extern char *f_s(char *, int);
1322: extern int ne_d(char *, char **);
1323: extern int e_d(char *, char **);
1324: extern char *i_tem(char *);
1325: extern char *f_list(char *);
1326: extern int pars_f(char *);
1327: extern int type_f(int);
1328: extern long int do_fio(long int *, char *, long int);
1329: extern void fmt_bg(void);
1330: extern char *icvt(long int, int *, int *, int);
1331: extern int z_getc(void);
1332: extern int z_putc(int);
1333: extern int c_si(icilist *);
1334: extern int y_ierr(void);
1335: extern long int s_rsfi(icilist *);
1336: extern int z_wnew(void);
1337: extern long int s_wsfi(icilist *);
1338: extern long int e_rsfi(void);
1339: extern long int e_wsfi(void);
1340: extern void c_liw(icilist *);
1341: extern int s_wsni(icilist *);
1342: extern long int s_wsli(icilist *);
1343: extern long int e_wsli(void);
1344: extern long int f_inqu(inlist *);
1345: extern int t_getc(void);
1346: extern long int e_rsle(void);
1347: extern int l_R(int);
1348: extern int l_C(void);
1349: extern int l_L(void);
1350: extern int l_CHAR(void);
1351: extern int c_le(cilist *);
1352: extern int l_read(long int *, char *, long int, long int);
1353: extern long int s_rsle(cilist *);
1354: extern int l_write(long int *, char *, long int, long int);
1355: extern char *mktemp(char *);
1356: extern int isdev(char *);
1357: extern long int f_open(olist *);
1358: extern long int f_rew(alist *);
1359: extern int xrd_SL(void);
1360: extern int x_getc(void);
1361: extern int x_endp(void);
1362: extern int x_rev(void);
1363: extern long int s_rsfe(cilist *);
1364: extern int i_getc(void);
1365: extern int i_ungetc(int, struct _iobuf *);
1366: extern long int s_rsli(icilist *);
1367: extern long int e_rsli(void);
1368: extern int s_rsni(icilist *);
1369: extern int x_rsne(cilist *);
1370: extern long int s_rsne(cilist *);
1371: extern long int e_rsfe(void);
1372: extern long int e_wsfe(void);
1373: extern int c_sue(cilist *);
1374: extern long int s_rsue(cilist *);
1375: extern long int s_wsue(cilist *);
1376: extern long int e_wsue(void);
1377: extern long int e_rsue(void);
1378: extern int do_us(long int *, char *, long int);
1379: extern long int do_ud(long int *, char *, long int);
1380: extern long int do_uio(long int *, char *, long int);
1381: extern long int inode(char *, int *);
1382: extern void mvgbt(int, int, char *, char *);
1383: extern int mv_cur(void);
1384: extern int x_putc(int);
1385: extern int xw_end(void);
1386: extern int xw_rev(void);
1387: extern long int s_wsfe(cilist *);
1388: extern long int s_wsle(cilist *);
1389: extern long int e_wsle(void);
1390: extern long int s_wsne(cilist *);
1391: extern void x_wsne(cilist *);
1392: }
1393: #endif
1394: ./ ADD NAME=fmt.c TIME=708822446
1395: #include "f2c.h"
1396: #include "fio.h"
1397: #include "fmt.h"
1398: #define skip(s) while(*s==' ') s++
1399: #ifdef interdata
1400: #define SYLMX 300
1401: #endif
1402: #ifdef pdp11
1403: #define SYLMX 300
1404: #endif
1405: #ifdef vax
1406: #define SYLMX 300
1407: #endif
1408: #ifndef SYLMX
1409: #define SYLMX 300
1410: #endif
1411: #define GLITCH '\2'
1412: /* special quote character for stu */
1413: extern int cursor,scale;
1414: extern flag cblank,cplus; /*blanks in I and compulsory plus*/
1415: struct syl syl[SYLMX];
1416: int parenlvl,pc,revloc;
1417:
1418: #ifdef KR_headers
1419: char *ap_end(s) char *s;
1420: #else
1421: char *ap_end(char *s)
1422: #endif
1423: { char quote;
1424: quote= *s++;
1425: for(;*s;s++)
1426: { if(*s!=quote) continue;
1427: if(*++s!=quote) return(s);
1428: }
1429: if(elist->cierr) {
1430: errno = 100;
1431: return(NULL);
1432: }
1433: fatal(100, "bad string");
1434: /*NOTREACHED*/ return 0;
1435: }
1436: #ifdef KR_headers
1437: op_gen(a,b,c,d)
1438: #else
1439: op_gen(int a, int b, int c, int d)
1440: #endif
1441: { struct syl *p= &syl[pc];
1442: if(pc>=SYLMX)
1443: { fprintf(stderr,"format too complicated:\n");
1444: sig_die(fmtbuf, 1);
1445: }
1446: p->op=a;
1447: p->p1=b;
1448: p->p2=c;
1449: p->p3=d;
1450: return(pc++);
1451: }
1452: #ifdef KR_headers
1453: char *f_list();
1454: char *gt_num(s,n) char *s; int *n;
1455: #else
1456: char *f_list(char*);
1457: char *gt_num(char *s, int *n)
1458: #endif
1459: { int m=0,cnt=0;
1460: char c;
1461: for(c= *s;;c = *s)
1462: { if(c==' ')
1463: { s++;
1464: continue;
1465: }
1466: if(c>'9' || c<'0') break;
1467: m=10*m+c-'0';
1468: cnt++;
1469: s++;
1470: }
1471: if(cnt==0) *n=1;
1472: else *n=m;
1473: return(s);
1474: }
1475: #ifdef KR_headers
1476: char *f_s(s,curloc) char *s;
1477: #else
1478: char *f_s(char *s, int curloc)
1479: #endif
1480: {
1481: skip(s);
1482: if(*s++!='(')
1483: {
1484: return(NULL);
1485: }
1486: if(parenlvl++ ==1) revloc=curloc;
1487: if(op_gen(RET,curloc,0,0)<0 ||
1488: (s=f_list(s))==NULL)
1489: {
1490: return(NULL);
1491: }
1492: skip(s);
1493: return(s);
1494: }
1495: #ifdef KR_headers
1496: ne_d(s,p) char *s,**p;
1497: #else
1498: ne_d(char *s, char **p)
1499: #endif
1500: { int n,x,sign=0;
1501: struct syl *sp;
1502: switch(*s)
1503: {
1504: default:
1505: return(0);
1506: case ':': (void) op_gen(COLON,0,0,0); break;
1507: case '$':
1508: (void) op_gen(NONL, 0, 0, 0); break;
1509: case 'B':
1510: case 'b':
1511: if(*++s=='z' || *s == 'Z') (void) op_gen(BZ,0,0,0);
1512: else (void) op_gen(BN,0,0,0);
1513: break;
1514: case 'S':
1515: case 's':
1516: if(*(s+1)=='s' || *(s+1) == 'S')
1517: { x=SS;
1518: s++;
1519: }
1520: else if(*(s+1)=='p' || *(s+1) == 'P')
1521: { x=SP;
1522: s++;
1523: }
1524: else x=S;
1525: (void) op_gen(x,0,0,0);
1526: break;
1527: case '/': (void) op_gen(SLASH,0,0,0); break;
1528: case '-': sign=1;
1529: case '+': s++; /*OUTRAGEOUS CODING TRICK*/
1530: case '0': case '1': case '2': case '3': case '4':
1531: case '5': case '6': case '7': case '8': case '9':
1532: s=gt_num(s,&n);
1533: switch(*s)
1534: {
1535: default:
1536: return(0);
1537: case 'P':
1538: case 'p': if(sign) n= -n; (void) op_gen(P,n,0,0); break;
1539: case 'X':
1540: case 'x': (void) op_gen(X,n,0,0); break;
1541: case 'H':
1542: case 'h':
1543: sp = &syl[op_gen(H,n,0,0)];
1544: *(char **)&sp->p2 = s + 1;
1545: s+=n;
1546: break;
1547: }
1548: break;
1549: case GLITCH:
1550: case '"':
1551: case '\'':
1552: sp = &syl[op_gen(APOS,0,0,0)];
1553: *(char **)&sp->p2 = s;
1554: if((*p = ap_end(s)) == NULL)
1555: return(0);
1556: return(1);
1557: case 'T':
1558: case 't':
1559: if(*(s+1)=='l' || *(s+1) == 'L')
1560: { x=TL;
1561: s++;
1562: }
1563: else if(*(s+1)=='r'|| *(s+1) == 'R')
1564: { x=TR;
1565: s++;
1566: }
1567: else x=T;
1568: s=gt_num(s+1,&n);
1569: s--;
1570: (void) op_gen(x,n,0,0);
1571: break;
1572: case 'X':
1573: case 'x': (void) op_gen(X,1,0,0); break;
1574: case 'P':
1575: case 'p': (void) op_gen(P,1,0,0); break;
1576: }
1577: s++;
1578: *p=s;
1579: return(1);
1580: }
1581: #ifdef KR_headers
1582: e_d(s,p) char *s,**p;
1583: #else
1584: e_d(char *s, char **p)
1585: #endif
1586: { int n,w,d,e,found=0,x=0;
1587: char *sv=s;
1588: s=gt_num(s,&n);
1589: (void) op_gen(STACK,n,0,0);
1590: switch(*s++)
1591: {
1592: default: break;
1593: case 'E':
1594: case 'e': x=1;
1595: case 'G':
1596: case 'g':
1597: found=1;
1598: s=gt_num(s,&w);
1599: if(w==0) break;
1600: if(*s=='.')
1601: { s++;
1602: s=gt_num(s,&d);
1603: }
1604: else d=0;
1605: if(*s!='E' && *s != 'e')
1606: (void) op_gen(x==1?E:G,w,d,0); /* default is Ew.dE2 */
1607: else
1608: { s++;
1609: s=gt_num(s,&e);
1610: (void) op_gen(x==1?EE:GE,w,d,e);
1611: }
1612: break;
1613: case 'O':
1614: case 'o':
1615: found = 1;
1616: s = gt_num(s, &w);
1617: if(w==0) break;
1618: (void) op_gen(O, w, 0, 0);
1619: break;
1620: case 'L':
1621: case 'l':
1622: found=1;
1623: s=gt_num(s,&w);
1624: if(w==0) break;
1625: (void) op_gen(L,w,0,0);
1626: break;
1627: case 'A':
1628: case 'a':
1629: found=1;
1630: skip(s);
1631: if(*s>='0' && *s<='9')
1632: { s=gt_num(s,&w);
1633: if(w==0) break;
1634: (void) op_gen(AW,w,0,0);
1635: break;
1636: }
1637: (void) op_gen(A,0,0,0);
1638: break;
1639: case 'F':
1640: case 'f':
1641: found=1;
1642: s=gt_num(s,&w);
1643: if(w==0) break;
1644: if(*s=='.')
1645: { s++;
1646: s=gt_num(s,&d);
1647: }
1648: else d=0;
1649: (void) op_gen(F,w,d,0);
1650: break;
1651: case 'D':
1652: case 'd':
1653: found=1;
1654: s=gt_num(s,&w);
1655: if(w==0) break;
1656: if(*s=='.')
1657: { s++;
1658: s=gt_num(s,&d);
1659: }
1660: else d=0;
1661: (void) op_gen(D,w,d,0);
1662: break;
1663: case 'I':
1664: case 'i':
1665: found=1;
1666: s=gt_num(s,&w);
1667: if(w==0) break;
1668: if(*s!='.')
1669: { (void) op_gen(I,w,0,0);
1670: break;
1671: }
1672: s++;
1673: s=gt_num(s,&d);
1674: (void) op_gen(IM,w,d,0);
1675: break;
1676: }
1677: if(found==0)
1678: { pc--; /*unSTACK*/
1679: *p=sv;
1680: return(0);
1681: }
1682: *p=s;
1683: return(1);
1684: }
1685: #ifdef KR_headers
1686: char *i_tem(s) char *s;
1687: #else
1688: char *i_tem(char *s)
1689: #endif
1690: { char *t;
1691: int n,curloc;
1692: if(*s==')') return(s);
1693: if(ne_d(s,&t)) return(t);
1694: if(e_d(s,&t)) return(t);
1695: s=gt_num(s,&n);
1696: if((curloc=op_gen(STACK,n,0,0))<0) return(NULL);
1697: return(f_s(s,curloc));
1698: }
1699: #ifdef KR_headers
1700: char *f_list(s) char *s;
1701: #else
1702: char *f_list(char *s)
1703: #endif
1704: {
1705: for(;*s!=0;)
1706: { skip(s);
1707: if((s=i_tem(s))==NULL) return(NULL);
1708: skip(s);
1709: if(*s==',') s++;
1710: else if(*s==')')
1711: { if(--parenlvl==0)
1712: {
1713: (void) op_gen(REVERT,revloc,0,0);
1714: return(++s);
1715: }
1716: (void) op_gen(GOTO,0,0,0);
1717: return(++s);
1718: }
1719: }
1720: return(NULL);
1721: }
1722:
1723: #ifdef KR_headers
1724: pars_f(s) char *s;
1725: #else
1726: pars_f(char *s)
1727: #endif
1728: {
1729: parenlvl=revloc=pc=0;
1730: if(f_s(s,0) == NULL)
1731: {
1732: return(-1);
1733: }
1734: return(0);
1735: }
1736: #define STKSZ 10
1737: int cnt[STKSZ],ret[STKSZ],cp,rp;
1738: flag workdone, nonl;
1739:
1740: #ifdef KR_headers
1741: type_f(n)
1742: #else
1743: type_f(int n)
1744: #endif
1745: {
1746: switch(n)
1747: {
1748: default:
1749: return(n);
1750: case RET:
1751: return(RET);
1752: case REVERT: return(REVERT);
1753: case GOTO: return(GOTO);
1754: case STACK: return(STACK);
1755: case X:
1756: case SLASH:
1757: case APOS: case H:
1758: case T: case TL: case TR:
1759: return(NED);
1760: case F:
1761: case I:
1762: case IM:
1763: case A: case AW:
1764: case O:
1765: case L:
1766: case E: case EE: case D:
1767: case G: case GE:
1768: return(ED);
1769: }
1770: }
1771: #ifdef KR_headers
1772: integer do_fio(number,ptr,len) ftnint *number; ftnlen len; char *ptr;
1773: #else
1774: integer do_fio(ftnint *number, char *ptr, ftnlen len)
1775: #endif
1776: { struct syl *p;
1777: int n,i;
1778: for(i=0;i<*number;i++,ptr+=len)
1779: {
1780: loop: switch(type_f((p= &syl[pc])->op))
1781: {
1782: default:
1783: fprintf(stderr,"unknown code in do_fio: %d\n%s\n",
1784: p->op,fmtbuf);
1785: err(elist->cierr,100,"do_fio");
1786: case NED:
1787: if((*doned)(p))
1788: { pc++;
1789: goto loop;
1790: }
1791: pc++;
1792: continue;
1793: case ED:
1794: if(cnt[cp]<=0)
1795: { cp--;
1796: pc++;
1797: goto loop;
1798: }
1799: if(ptr==NULL)
1800: return((*doend)());
1801: cnt[cp]--;
1802: workdone=1;
1803: if((n=(*doed)(p,ptr,len))>0) err(elist->cierr,errno,"fmt");
1804: if(n<0) err(elist->ciend,(EOF),"fmt");
1805: continue;
1806: case STACK:
1807: cnt[++cp]=p->p1;
1808: pc++;
1809: goto loop;
1810: case RET:
1811: ret[++rp]=p->p1;
1812: pc++;
1813: goto loop;
1814: case GOTO:
1815: if(--cnt[cp]<=0)
1816: { cp--;
1817: rp--;
1818: pc++;
1819: goto loop;
1820: }
1821: pc=1+ret[rp--];
1822: goto loop;
1823: case REVERT:
1824: rp=cp=0;
1825: pc = p->p1;
1826: if(ptr==NULL)
1827: return((*doend)());
1828: if(!workdone) return(0);
1829: if((n=(*dorevert)()) != 0) return(n);
1830: goto loop;
1831: case COLON:
1832: if(ptr==NULL)
1833: return((*doend)());
1834: pc++;
1835: goto loop;
1836: case NONL:
1837: nonl = 1;
1838: pc++;
1839: goto loop;
1840: case S:
1841: case SS:
1842: cplus=0;
1843: pc++;
1844: goto loop;
1845: case SP:
1846: cplus = 1;
1847: pc++;
1848: goto loop;
1849: case P: scale=p->p1;
1850: pc++;
1851: goto loop;
1852: case BN:
1853: cblank=0;
1854: pc++;
1855: goto loop;
1856: case BZ:
1857: cblank=1;
1858: pc++;
1859: goto loop;
1860: }
1861: }
1862: return(0);
1863: }
1864: en_fio(Void)
1865: { ftnint one=1;
1866: return(do_fio(&one,(char *)NULL,(ftnint)0));
1867: }
1868: VOID
1869: fmt_bg(Void)
1870: {
1871: workdone=cp=rp=pc=cursor=0;
1872: cnt[0]=ret[0]=0;
1873: }
1874: ./ ADD NAME=fmt.h TIME=708906700
1875: struct syl
1876: { int op,p1,p2,p3;
1877: };
1878: #define RET 1
1879: #define REVERT 2
1880: #define GOTO 3
1881: #define X 4
1882: #define SLASH 5
1883: #define STACK 6
1884: #define I 7
1885: #define ED 8
1886: #define NED 9
1887: #define IM 10
1888: #define APOS 11
1889: #define H 12
1890: #define TL 13
1891: #define TR 14
1892: #define T 15
1893: #define COLON 16
1894: #define S 17
1895: #define SP 18
1896: #define SS 19
1897: #define P 20
1898: #define BN 21
1899: #define BZ 22
1900: #define F 23
1901: #define E 24
1902: #define EE 25
1903: #define D 26
1904: #define G 27
1905: #define GE 28
1906: #define L 29
1907: #define A 30
1908: #define AW 31
1909: #define O 32
1910: #define NONL 33
1911: extern struct syl syl[];
1912: extern int pc,parenlvl,revloc;
1913: typedef union
1914: { real pf;
1915: doublereal pd;
1916: } ufloat;
1917: typedef union
1918: { short is;
1919: char ic;
1920: long il;
1921: } Uint;
1922: #ifdef KR_headers
1923: extern int (*doed)(),(*doned)();
1924: extern int (*dorevert)(), (*doend)();
1925: extern int rd_ed(),rd_ned();
1926: extern int w_ed(),w_ned();
1927: #else
1928: #ifdef __cplusplus
1929: extern "C" {
1930: #endif
1931: extern int (*doed)(struct syl*, char*, ftnlen),(*doned)(struct syl*);
1932: extern int (*dorevert)(void), (*doend)(void);
1933: extern void fmt_bg(void);
1934: extern int pars_f(char*);
1935: extern int rd_ed(struct syl*, char*, ftnlen),rd_ned(struct syl*);
1936: extern int w_ed(struct syl*, char*, ftnlen),w_ned(struct syl*);
1937: extern int wrt_E(ufloat*, int, int, int, ftnlen);
1938: extern int wrt_F(ufloat*, int, int, ftnlen);
1939: extern int wrt_L(Uint*, int, ftnlen);
1940: #ifdef __cplusplus
1941: }
1942: #endif
1943: #endif
1944: extern flag cblank,cplus,workdone, nonl;
1945: extern char *fmtbuf;
1946: extern int scale;
1947: #define GET(x) if((x=(*getn)())<0) return(x)
1948: #define VAL(x) (x!='\n'?x:' ')
1949: #define PUT(x) (*putn)(x)
1950: extern int cursor;
1951: ./ ADD NAME=fmtlib.c TIME=708905846
1952: /* @(#)fmtlib.c 1.2 */
1953: #define MAXINTLENGTH 23
1954: #ifdef __cplusplus
1955: extern "C" {
1956: #endif
1957: #ifdef KR_headers
1958: char *icvt(value,ndigit,sign, base) long value; int *ndigit,*sign;
1959: register int base;
1960: #else
1961: char *icvt(long value, int *ndigit, int *sign, int base)
1962: #endif
1963: { static char buf[MAXINTLENGTH+1];
1964: register int i;
1965: if(value>0) *sign=0;
1966: else if(value<0)
1967: { value = -value;
1968: *sign= 1;
1969: }
1970: else
1971: { *sign=0;
1972: *ndigit=1;
1973: buf[MAXINTLENGTH]='0';
1974: return(&buf[MAXINTLENGTH]);
1975: }
1976: for(i=MAXINTLENGTH-1;value>0;i--)
1977: { *(buf+i)=(int)(value%base)+'0';
1978: value /= base;
1979: }
1980: *ndigit=MAXINTLENGTH-1-i;
1981: return(&buf[i+1]);
1982: }
1983: #ifdef __cplusplus
1984: }
1985: #endif
1986: ./ ADD NAME=fp.h TIME=580998005
1987: #define FMAX 40
1988: #define EXPMAXDIGS 8
1989: #define EXPMAX 99999999
1990: /* FMAX = max number of nonzero digits passed to atof() */
1991: /* EXPMAX = 10^EXPMAXDIGS - 1 = largest allowed exponent absolute value */
1992:
1993: #include "local.h"
1994:
1995: /* MAXFRACDIGS and MAXINTDIGS are for wrt_F -- bounds (not necessarily
1996: tight) on the maximum number of digits to the right and left of
1997: * the decimal point.
1998: */
1999:
2000: #ifdef VAX
2001: #define MAXFRACDIGS 56
2002: #define MAXINTDIGS 38
2003: #else
2004: #ifdef CRAY
2005: #define MAXFRACDIGS 9880
2006: #define MAXINTDIGS 9864
2007: #else
2008: /* values that suffice for IEEE double */
2009: #define MAXFRACDIGS 344
2010: #define MAXINTDIGS 308
2011: #endif
2012: #endif
2013: ./ ADD NAME=iio.c TIME=708823315
2014: #include "f2c.h"
2015: #include "fio.h"
2016: #include "fmt.h"
2017: extern char *icptr;
2018: char *icend;
2019: extern icilist *svic;
2020: int icnum;
2021: extern int hiwater;
2022: z_getc(Void)
2023: {
2024: if(recpos++ < svic->icirlen) {
2025: if(icptr >= icend) err(svic->iciend,(EOF),"endfile");
2026: return(*icptr++);
2027: }
2028: err(svic->icierr,110,"recend");
2029: }
2030: #ifdef KR_headers
2031: z_putc(c)
2032: #else
2033: z_putc(int c)
2034: #endif
2035: {
2036: if(icptr >= icend) err(svic->icierr,110,"inwrite");
2037: if(recpos++ < svic->icirlen)
2038: *icptr++ = c;
2039: else err(svic->icierr,110,"recend");
2040: return 0;
2041: }
2042: z_rnew(Void)
2043: {
2044: icptr = svic->iciunit + (++icnum)*svic->icirlen;
2045: recpos = 0;
2046: cursor = 0;
2047: hiwater = 0;
2048: return 1;
2049: }
2050:
2051: static int
2052: z_endp(Void)
2053: {
2054: (*donewrec)();
2055: return 0;
2056: }
2057:
2058: #ifdef KR_headers
2059: c_si(a) icilist *a;
2060: #else
2061: c_si(icilist *a)
2062: #endif
2063: {
2064: elist = (cilist *)a;
2065: fmtbuf=a->icifmt;
2066: if(pars_f(fmtbuf)<0)
2067: err(a->icierr,100,"startint");
2068: fmt_bg();
2069: sequential=formatted=1;
2070: external=0;
2071: cblank=cplus=scale=0;
2072: svic=a;
2073: icnum=recpos=0;
2074: cursor = 0;
2075: hiwater = 0;
2076: icptr = a->iciunit;
2077: icend = icptr + a->icirlen*a->icirnum;
2078: curunit = 0;
2079: cf = 0;
2080: return(0);
2081: }
2082: y_ierr(Void)
2083: {
2084: err(elist->cierr, 110, "iio");
2085: }
2086: #ifdef KR_headers
2087: integer s_rsfi(a) icilist *a;
2088: #else
2089: integer s_rsfi(icilist *a)
2090: #endif
2091: { int n;
2092: if(n=c_si(a)) return(n);
2093: reading=1;
2094: doed=rd_ed;
2095: doned=rd_ned;
2096: getn=z_getc;
2097: dorevert = y_ierr;
2098: donewrec = z_rnew;
2099: doend = z_endp;
2100: return(0);
2101: }
2102:
2103: z_wnew(Void)
2104: {
2105: while(recpos++ < svic->icirlen)
2106: *icptr++ = ' ';
2107: recpos = 0;
2108: cursor = 0;
2109: hiwater = 0;
2110: icnum++;
2111: return 1;
2112: }
2113: #ifdef KR_headers
2114: integer s_wsfi(a) icilist *a;
2115: #else
2116: integer s_wsfi(icilist *a)
2117: #endif
2118: { int n;
2119: if(n=c_si(a)) return(n);
2120: reading=0;
2121: doed=w_ed;
2122: doned=w_ned;
2123: putn=z_putc;
2124: dorevert = y_ierr;
2125: donewrec = z_wnew;
2126: doend = z_endp;
2127: return(0);
2128: }
2129: integer e_rsfi(Void)
2130: { int n;
2131: n = en_fio();
2132: fmtbuf = NULL;
2133: return(n);
2134: }
2135: integer e_wsfi(Void)
2136: {
2137: int n;
2138: n = en_fio();
2139: fmtbuf = NULL;
2140: if(icnum >= svic->icirnum)
2141: return(n);
2142: while(recpos++ < svic->icirlen)
2143: *icptr++ = ' ';
2144: return(n);
2145: }
2146: ./ ADD NAME=ilnw.c TIME=708907683
2147: #include "f2c.h"
2148: #include "fio.h"
2149: #include "lio.h"
2150: extern char *icptr;
2151: extern char *icend;
2152: extern icilist *svic;
2153: extern int icnum;
2154: #ifdef KR_headers
2155: extern int z_putc();
2156: #else
2157: extern int z_putc(int);
2158: #endif
2159:
2160: static int
2161: z_wSL(Void)
2162: {
2163: while(recpos < svic->icirlen)
2164: z_putc(' ');
2165: return z_rnew();
2166: }
2167:
2168: VOID
2169: #ifdef KR_headers
2170: c_liw(a) icilist *a;
2171: #else
2172: c_liw(icilist *a)
2173: #endif
2174: {
2175: reading = 0;
2176: external = 0;
2177: formatted = 1;
2178: putn = z_putc;
2179: L_len = a->icirlen;
2180: donewrec = z_wSL;
2181: svic = a;
2182: icnum = recpos = 0;
2183: cursor = 0;
2184: cf = 0;
2185: curunit = 0;
2186: icptr = a->iciunit;
2187: icend = icptr + a->icirlen*a->icirnum;
2188: elist = (cilist *)a;
2189: }
2190:
2191: #ifdef KR_headers
2192: s_wsni(a) icilist *a;
2193: #else
2194: s_wsni(icilist *a)
2195: #endif
2196: {
2197: cilist ca;
2198:
2199: c_liw(a);
2200: ca.cifmt = a->icifmt;
2201: x_wsne(&ca);
2202: z_wSL();
2203: return 0;
2204: }
2205:
2206: #ifdef KR_headers
2207: integer s_wsli(a) icilist *a;
2208: #else
2209: integer s_wsli(icilist *a)
2210: #endif
2211: {
2212: lioproc = l_write;
2213: c_liw(a);
2214: return(0);
2215: }
2216:
2217: integer e_wsli(Void)
2218: {
2219: z_wSL();
2220: return(0);
2221: }
2222: ./ ADD NAME=inquire.c TIME=708896213
2223: #include "f2c.h"
2224: #include "fio.h"
2225: #ifdef KR_headers
2226: integer f_inqu(a) inlist *a;
2227: #else
2228: #ifdef MSDOS
2229: #undef abs
2230: #include "string.h"
2231: #include "io.h"
2232: #endif
2233: integer f_inqu(inlist *a)
2234: #endif
2235: { flag byfile;
2236: int i, n;
2237: unit *p;
2238: char buf[256];
2239: long x;
2240: if(a->infile!=NULL)
2241: { byfile=1;
2242: g_char(a->infile,a->infilen,buf);
2243: #ifdef MSDOS
2244: x = access(buf,0) ? -1 : 0;
2245: for(i=0,p=NULL;i<MXUNIT;i++)
2246: if(units[i].ufd != NULL
2247: && units[i].ufnm != NULL
2248: && !strcmp(units[i].ufnm,buf)) {
2249: p = &units[i];
2250: break;
2251: }
2252: #else
2253: x=inode(buf, &n);
2254: for(i=0,p=NULL;i<MXUNIT;i++)
2255: if(units[i].uinode==x
2256: && units[i].ufd!=NULL
2257: && units[i].udev == n) {
2258: p = &units[i];
2259: break;
2260: }
2261: #endif
2262: }
2263: else
2264: {
2265: byfile=0;
2266: if(a->inunit<MXUNIT && a->inunit>=0)
2267: {
2268: p= &units[a->inunit];
2269: }
2270: else
2271: {
2272: p=NULL;
2273: }
2274: }
2275: if(a->inex!=NULL)
2276: if(byfile && x != -1 || !byfile && p!=NULL)
2277: *a->inex=1;
2278: else *a->inex=0;
2279: if(a->inopen!=NULL)
2280: if(byfile) *a->inopen=(p!=NULL);
2281: else *a->inopen=(p!=NULL && p->ufd!=NULL);
2282: if(a->innum!=NULL) *a->innum= p-units;
2283: if(a->innamed!=NULL)
2284: if(byfile || p!=NULL && p->ufnm!=NULL)
2285: *a->innamed=1;
2286: else *a->innamed=0;
2287: if(a->inname!=NULL)
2288: if(byfile)
2289: b_char(buf,a->inname,a->innamlen);
2290: else if(p!=NULL && p->ufnm!=NULL)
2291: b_char(p->ufnm,a->inname,a->innamlen);
2292: if(a->inacc!=NULL && p!=NULL && p->ufd!=NULL)
2293: if(p->url)
2294: b_char("DIRECT",a->inacc,a->inacclen);
2295: else b_char("SEQUENTIAL",a->inacc,a->inacclen);
2296: if(a->inseq!=NULL)
2297: if(p!=NULL && p->url)
2298: b_char("NO",a->inseq,a->inseqlen);
2299: else b_char("YES",a->inseq,a->inseqlen);
2300: if(a->indir!=NULL)
2301: if(p==NULL || p->url)
2302: b_char("YES",a->indir,a->indirlen);
2303: else b_char("NO",a->indir,a->indirlen);
2304: if(a->infmt!=NULL)
2305: if(p!=NULL && p->ufmt==0)
2306: b_char("UNFORMATTED",a->infmt,a->infmtlen);
2307: else b_char("FORMATTED",a->infmt,a->infmtlen);
2308: if(a->inform!=NULL)
2309: if(p!=NULL && p->ufmt==0)
2310: b_char("NO",a->inform,a->informlen);
2311: else b_char("YES",a->inform,a->informlen);
2312: if(a->inunf)
2313: if(p!=NULL && p->ufmt==0)
2314: b_char("YES",a->inunf,a->inunflen);
2315: else if (p!=NULL) b_char("NO",a->inunf,a->inunflen);
2316: else b_char("UNKNOWN",a->inunf,a->inunflen);
2317: if(a->inrecl!=NULL && p!=NULL)
2318: *a->inrecl=p->url;
2319: if(a->innrec!=NULL && p!=NULL && p->url>0)
2320: *a->innrec=ftell(p->ufd)/p->url+1;
2321: if(a->inblank && p!=NULL && p->ufmt)
2322: if(p->ublnk)
2323: b_char("ZERO",a->inblank,a->inblanklen);
2324: else b_char("NULL",a->inblank,a->inblanklen);
2325: return(0);
2326: }
2327: ./ ADD NAME=lio.h TIME=708907526
2328: /* copy of ftypes from the compiler */
2329: /* variable types
2330: * numeric assumptions:
2331: * int < reals < complexes
2332: * TYDREAL-TYREAL = TYDCOMPLEX-TYCOMPLEX
2333: */
2334:
2335: #define TYUNKNOWN 0
2336: #define TYADDR 1
2337: #define TYSHORT 2
2338: #define TYLONG 3
2339: #define TYREAL 4
2340: #define TYDREAL 5
2341: #define TYCOMPLEX 6
2342: #define TYDCOMPLEX 7
2343: #define TYLOGICAL 8
2344: #define TYCHAR 9
2345: #define TYSUBR 10
2346: #define TYERROR 11
2347:
2348: #define NTYPES (TYERROR+1)
2349:
2350: #define LINTW 12
2351: #define LINE 80
2352: #define LLOGW 2
2353: #ifdef Old_list_output
2354: #define LLOW 1.0
2355: #define LHIGH 1.e9
2356: #define LEFMT " %# .8E"
2357: #define LFFMT " %# .9g"
2358: #else
2359: #define LGFMT "%.9G"
2360: #endif
2361: /* LEFBL 20 should suffice; 24 overcomes a NeXT bug. */
2362: #define LEFBL 24
2363:
2364: typedef union
2365: { short flshort;
2366: ftnint flint;
2367: real flreal;
2368: doublereal fldouble;
2369: } flex;
2370: extern int scale;
2371: #ifdef KR_headers
2372: extern int (*lioproc)(), (*l_getc)(), (*l_ungetc)();
2373: extern int l_read();
2374: #else
2375: #ifdef __cplusplus
2376: extern "C" {
2377: #endif
2378: extern int (*lioproc)(ftnint*, char*, ftnlen, ftnint);
2379: extern int l_write(ftnint*, char*, ftnlen, ftnint);
2380: extern void x_wsne(cilist*);
2381: extern int c_le(cilist*), (*l_getc)(void), (*l_ungetc)(int,FILE*);
2382: extern int l_read(ftnint*,char*,ftnlen,ftnint);
2383: extern integer e_rsle(void);
2384: extern int z_rnew(void);
2385: #ifdef __cplusplus
2386: }
2387: #endif
2388: #endif
2389: extern int L_len;
2390: ./ ADD NAME=local.h TIME=705213589
2391: ./ ADD NAME=lread.c TIME=708826270
2392: #include "f2c.h"
2393: #include "fio.h"
2394: #include "fmt.h"
2395: #include "lio.h"
2396: #include "ctype.h"
2397: #include "fp.h"
2398:
2399: extern char *fmtbuf;
2400: #ifdef KR_headers
2401: extern double atof();
2402: extern char *malloc(), *realloc();
2403: int (*lioproc)(), (*l_getc)(), (*l_ungetc)();
2404: #else
2405: #undef abs
2406: #include "stdlib.h"
2407: int (*lioproc)(ftnint*, char*, ftnlen, ftnint), (*l_getc)(void),
2408: (*l_ungetc)(int,FILE*);
2409: #endif
2410: int l_eof;
2411:
2412: #define isblnk(x) (ltab[x+1]&B)
2413: #define issep(x) (ltab[x+1]&SX)
2414: #define isapos(x) (ltab[x+1]&AX)
2415: #define isexp(x) (ltab[x+1]&EX)
2416: #define issign(x) (ltab[x+1]&SG)
2417: #define iswhit(x) (ltab[x+1]&WH)
2418: #define SX 1
2419: #define B 2
2420: #define AX 4
2421: #define EX 8
2422: #define SG 16
2423: #define WH 32
2424: char ltab[128+1] = { /* offset one for EOF */
2425: 0,
2426: 0,0,AX,0,0,0,0,0,0,WH|B,SX|WH,0,0,0,0,0,
2427: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2428: SX|B|WH,0,AX,0,0,0,0,AX,0,0,0,SG,SX,SG,0,SX,
2429: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2430: 0,0,0,0,EX,EX,0,0,0,0,0,0,0,0,0,0,
2431: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2432: AX,0,0,0,EX,EX,0,0,0,0,0,0,0,0,0,0,
2433: 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
2434: };
2435:
2436: #ifdef ungetc
2437: static int
2438: #ifdef KR_headers
2439: un_getc(x,cf) int x; FILE *cf;
2440: #else
2441: un_getc(int x, FILE *cf)
2442: #endif
2443: { return ungetc(x,cf); }
2444: #else
2445: #define un_getc ungetc
2446: #ifdef KR_headers
2447: extern int ungetc();
2448: #endif
2449: #endif
2450:
2451: t_getc(Void)
2452: { int ch;
2453: if(curunit->uend) return(EOF);
2454: if((ch=getc(cf))!=EOF) return(ch);
2455: if(feof(cf))
2456: l_eof = curunit->uend = 1;
2457: return(EOF);
2458: }
2459: integer e_rsle(Void)
2460: {
2461: int ch;
2462: if(curunit->uend) return(0);
2463: while((ch=t_getc())!='\n' && ch!=EOF);
2464: return(0);
2465: }
2466:
2467: flag lquit;
2468: int lcount,ltype,nml_read;
2469: char *lchar;
2470: double lx,ly;
2471: #define ERR(x) if(n=(x)) return(n)
2472: #define GETC(x) (x=(*l_getc)())
2473: #define Ungetc(x,y) (*l_ungetc)(x,y)
2474:
2475: #ifdef KR_headers
2476: l_R(poststar) int poststar;
2477: #else
2478: l_R(int poststar)
2479: #endif
2480: {
2481: char s[FMAX+EXPMAXDIGS+4];
2482: register int ch;
2483: register char *sp, *spe, *sp1;
2484: long e, exp;
2485: int havenum, havestar, se;
2486:
2487: if (!poststar) {
2488: if (lcount > 0)
2489: return(0);
2490: lcount = 1;
2491: }
2492: ltype = 0;
2493: exp = 0;
2494: havestar = 0;
2495: retry:
2496: sp1 = sp = s;
2497: spe = sp + FMAX;
2498: havenum = 0;
2499:
2500: switch(GETC(ch)) {
2501: case '-': *sp++ = ch; sp1++; spe++;
2502: case '+':
2503: GETC(ch);
2504: }
2505: while(ch == '0') {
2506: ++havenum;
2507: GETC(ch);
2508: }
2509: while(isdigit(ch)) {
2510: if (sp < spe) *sp++ = ch;
2511: else ++exp;
2512: GETC(ch);
2513: }
2514: if (ch == '*' && !poststar) {
2515: if (sp == sp1 || exp || *s == '-') {
2516: err(elist->cierr,112,"bad repetition count")
2517: }
2518: poststar = havestar = 1;
2519: *sp = 0;
2520: lcount = atoi(s);
2521: goto retry;
2522: }
2523: if (ch == '.') {
2524: GETC(ch);
2525: if (sp == sp1)
2526: while(ch == '0') {
2527: ++havenum;
2528: --exp;
2529: GETC(ch);
2530: }
2531: while(isdigit(ch)) {
2532: if (sp < spe)
2533: { *sp++ = ch; --exp; }
2534: GETC(ch);
2535: }
2536: }
2537: se = 0;
2538: if (issign(ch))
2539: goto signonly;
2540: if (isexp(ch)) {
2541: GETC(ch);
2542: if (issign(ch)) {
2543: signonly:
2544: if (ch == '-') se = 1;
2545: GETC(ch);
2546: }
2547: if (!isdigit(ch)) {
2548: bad:
2549: err(elist->cierr,112,"exponent field")
2550: }
2551:
2552: e = ch - '0';
2553: while(isdigit(GETC(ch))) {
2554: e = 10*e + ch - '0';
2555: if (e > EXPMAX)
2556: goto bad;
2557: }
2558: if (se)
2559: exp -= e;
2560: else
2561: exp += e;
2562: }
2563: (void) Ungetc(ch, cf);
2564: if (sp > sp1) {
2565: ++havenum;
2566: while(*--sp == '0')
2567: ++exp;
2568: if (exp)
2569: sprintf(sp+1, "e%ld", exp);
2570: else
2571: sp[1] = 0;
2572: lx = atof(s);
2573: }
2574: else
2575: lx = 0.;
2576: if (havenum)
2577: ltype = TYLONG;
2578: else
2579: switch(ch) {
2580: case ',':
2581: case '/':
2582: break;
2583: default:
2584: if (havestar && ( ch == ' '
2585: ||ch == '\t'
2586: ||ch == '\n'))
2587: break;
2588: if (nml_read > 1) {
2589: lquit = 2;
2590: return 0;
2591: }
2592: err(elist->cierr,112,"invalid number")
2593: }
2594: return 0;
2595: }
2596:
2597: static int
2598: #ifdef KR_headers
2599: rd_count(ch) register int ch;
2600: #else
2601: rd_count(register int ch)
2602: #endif
2603: {
2604: if (ch < '0' || ch > '9')
2605: return 1;
2606: lcount = ch - '0';
2607: while(GETC(ch) >= '0' && ch <= '9')
2608: lcount = 10*lcount + ch - '0';
2609: Ungetc(ch,cf);
2610: return lcount <= 0;
2611: }
2612:
2613: l_C(Void)
2614: { int ch, nml_save;
2615: double lz;
2616: if(lcount>0) return(0);
2617: ltype=0;
2618: GETC(ch);
2619: if(ch!='(')
2620: {
2621: if (nml_read > 1 && (ch < '0' || ch > '9')) {
2622: Ungetc(ch,cf);
2623: lquit = 2;
2624: return 0;
2625: }
2626: if (rd_count(ch))
2627: if(!cf || !feof(cf))
2628: err(elist->cierr,112,"complex format")
2629: else
2630: err(elist->cierr,(EOF),"lread");
2631: if(GETC(ch)!='*')
2632: {
2633: if(!cf || !feof(cf))
2634: err(elist->cierr,112,"no star")
2635: else
2636: err(elist->cierr,(EOF),"lread");
2637: }
2638: if(GETC(ch)!='(')
2639: { Ungetc(ch,cf);
2640: return(0);
2641: }
2642: }
2643: else
2644: lcount = 1;
2645: while(iswhit(GETC(ch)));
2646: Ungetc(ch,cf);
2647: nml_save = nml_read;
2648: nml_read = 0;
2649: if (ch = l_R(1))
2650: return ch;
2651: if (!ltype)
2652: err(elist->cierr,112,"no real part");
2653: lz = lx;
2654: while(iswhit(GETC(ch)));
2655: if(ch!=',')
2656: { (void) Ungetc(ch,cf);
2657: err(elist->cierr,112,"no comma");
2658: }
2659: while(iswhit(GETC(ch)));
2660: (void) Ungetc(ch,cf);
2661: if (ch = l_R(1))
2662: return ch;
2663: if (!ltype)
2664: err(elist->cierr,112,"no imaginary part");
2665: while(iswhit(GETC(ch)));
2666: if(ch!=')') err(elist->cierr,112,"no )");
2667: ly = lx;
2668: lx = lz;
2669: nml_read = nml_save;
2670: return(0);
2671: }
2672: l_L(Void)
2673: {
2674: int ch;
2675: if(lcount>0) return(0);
2676: ltype=0;
2677: GETC(ch);
2678: if(isdigit(ch))
2679: {
2680: rd_count(ch);
2681: if(GETC(ch)!='*')
2682: if(!cf || !feof(cf))
2683: err(elist->cierr,112,"no star")
2684: else
2685: err(elist->cierr,(EOF),"lread");
2686: GETC(ch);
2687: }
2688: if(ch == '.') GETC(ch);
2689: switch(ch)
2690: {
2691: case 't':
2692: case 'T':
2693: lx=1;
2694: break;
2695: case 'f':
2696: case 'F':
2697: lx=0;
2698: break;
2699: default:
2700: if(isblnk(ch) || issep(ch) || ch==EOF)
2701: { (void) Ungetc(ch,cf);
2702: return(0);
2703: }
2704: else err(elist->cierr,112,"logical");
2705: }
2706: ltype=TYLONG;
2707: lcount = 1;
2708: while(!issep(GETC(ch)) && ch!=EOF);
2709: (void) Ungetc(ch, cf);
2710: return(0);
2711: }
2712: #define BUFSIZE 128
2713: l_CHAR(Void)
2714: { int ch,size,i;
2715: char quote,*p;
2716: if(lcount>0) return(0);
2717: ltype=0;
2718: if(lchar!=NULL) free(lchar);
2719: size=BUFSIZE;
2720: p=lchar=malloc((unsigned int)size);
2721: if(lchar==NULL) err(elist->cierr,113,"no space");
2722:
2723: GETC(ch);
2724: if(isdigit(ch)) {
2725: /* allow Fortran 8x-style unquoted string... */
2726: /* either find a repetition count or the string */
2727: lcount = ch - '0';
2728: *p++ = ch;
2729: for(i = 1;;) {
2730: switch(GETC(ch)) {
2731: case '*':
2732: if (lcount == 0) {
2733: lcount = 1;
2734: goto noquote;
2735: }
2736: p = lchar;
2737: goto have_lcount;
2738: case ',':
2739: case ' ':
2740: case '\t':
2741: case '\n':
2742: case '/':
2743: Ungetc(ch,cf);
2744: /* no break */
2745: case EOF:
2746: lcount = 1;
2747: ltype = TYCHAR;
2748: return *p = 0;
2749: }
2750: if (!isdigit(ch)) {
2751: lcount = 1;
2752: goto noquote;
2753: }
2754: *p++ = ch;
2755: lcount = 10*lcount + ch - '0';
2756: if (++i == size) {
2757: lchar = realloc(lchar,
2758: (unsigned int)(size += BUFSIZE));
2759: p = lchar + i;
2760: }
2761: }
2762: }
2763: else (void) Ungetc(ch,cf);
2764: have_lcount:
2765: if(GETC(ch)=='\'' || ch=='"') quote=ch;
2766: else if(isblnk(ch) || (issep(ch) && ch != '\n') || ch==EOF)
2767: { (void) Ungetc(ch,cf);
2768: return(0);
2769: }
2770: else {
2771: /* Fortran 8x-style unquoted string */
2772: *p++ = ch;
2773: for(i = 1;;) {
2774: switch(GETC(ch)) {
2775: case ',':
2776: case ' ':
2777: case '\t':
2778: case '\n':
2779: case '/':
2780: Ungetc(ch,cf);
2781: /* no break */
2782: case EOF:
2783: ltype = TYCHAR;
2784: return *p = 0;
2785: }
2786: noquote:
2787: *p++ = ch;
2788: if (++i == size) {
2789: lchar = realloc(lchar,
2790: (unsigned int)(size += BUFSIZE));
2791: p = lchar + i;
2792: }
2793: }
2794: }
2795: ltype=TYCHAR;
2796: for(i=0;;)
2797: { while(GETC(ch)!=quote && ch!='\n'
2798: && ch!=EOF && ++i<size) *p++ = ch;
2799: if(i==size)
2800: {
2801: newone:
2802: lchar= realloc(lchar, (unsigned int)(size += BUFSIZE));
2803: p=lchar+i-1;
2804: *p++ = ch;
2805: }
2806: else if(ch==EOF) return(EOF);
2807: else if(ch=='\n')
2808: { if(*(p-1) != '\\') continue;
2809: i--;
2810: p--;
2811: if(++i<size) *p++ = ch;
2812: else goto newone;
2813: }
2814: else if(GETC(ch)==quote)
2815: { if(++i<size) *p++ = ch;
2816: else goto newone;
2817: }
2818: else
2819: { (void) Ungetc(ch,cf);
2820: *p = 0;
2821: return(0);
2822: }
2823: }
2824: }
2825: #ifdef KR_headers
2826: c_le(a) cilist *a;
2827: #else
2828: c_le(cilist *a)
2829: #endif
2830: {
2831: fmtbuf="list io";
2832: if(a->ciunit>=MXUNIT || a->ciunit<0)
2833: err(a->cierr,101,"stler");
2834: scale=recpos=0;
2835: elist=a;
2836: curunit = &units[a->ciunit];
2837: if(curunit->ufd==NULL && fk_open(SEQ,FMT,a->ciunit))
2838: err(a->cierr,102,"lio");
2839: cf=curunit->ufd;
2840: if(!curunit->ufmt) err(a->cierr,103,"lio")
2841: return(0);
2842: }
2843: #ifdef KR_headers
2844: l_read(number,ptr,len,type) ftnint *number,type; char *ptr; ftnlen len;
2845: #else
2846: l_read(ftnint *number, char *ptr, ftnlen len, ftnint type)
2847: #endif
2848: {
2849: #define Ptr ((flex *)ptr)
2850: int i,n,ch;
2851: doublereal *yy;
2852: real *xx;
2853: for(i=0;i<*number;i++)
2854: {
2855: if(lquit) return(0);
2856: if(l_eof)
2857: err(elist->ciend, EOF, "list in")
2858: if(lcount == 0) {
2859: ltype = 0;
2860: for(;;) {
2861: GETC(ch);
2862: switch(ch) {
2863: case EOF:
2864: goto loopend;
2865: case ' ':
2866: case '\t':
2867: case '\n':
2868: continue;
2869: case '/':
2870: lquit = 1;
2871: goto loopend;
2872: case ',':
2873: lcount = 1;
2874: goto loopend;
2875: default:
2876: (void) Ungetc(ch, cf);
2877: goto rddata;
2878: }
2879: }
2880: }
2881: rddata:
2882: switch((int)type)
2883: {
2884: case TYSHORT:
2885: case TYLONG:
2886: case TYREAL:
2887: case TYDREAL:
2888: ERR(l_R(0));
2889: break;
2890: case TYCOMPLEX:
2891: case TYDCOMPLEX:
2892: ERR(l_C());
2893: break;
2894: case TYLOGICAL:
2895: ERR(l_L());
2896: break;
2897: case TYCHAR:
2898: ERR(l_CHAR());
2899: break;
2900: }
2901: while (GETC(ch) == ' ' || ch == '\t');
2902: if (ch != ',' || lcount > 1)
2903: Ungetc(ch,cf);
2904: loopend:
2905: if(lquit) return(0);
2906: if(cf) {
2907: if (feof(cf))
2908: err(elist->ciend,(EOF),"list in")
2909: else if(ferror(cf)) {
2910: clearerr(cf);
2911: err(elist->cierr,errno,"list in")
2912: }
2913: }
2914: if(ltype==0) goto bump;
2915: switch((int)type)
2916: {
2917: case TYSHORT:
2918: Ptr->flshort=lx;
2919: break;
2920: case TYLOGICAL:
2921: case TYLONG:
2922: Ptr->flint=lx;
2923: break;
2924: case TYREAL:
2925: Ptr->flreal=lx;
2926: break;
2927: case TYDREAL:
2928: Ptr->fldouble=lx;
2929: break;
2930: case TYCOMPLEX:
2931: xx=(real *)ptr;
2932: *xx++ = lx;
2933: *xx = ly;
2934: break;
2935: case TYDCOMPLEX:
2936: yy=(doublereal *)ptr;
2937: *yy++ = lx;
2938: *yy = ly;
2939: break;
2940: case TYCHAR:
2941: b_char(lchar,ptr,len);
2942: break;
2943: }
2944: bump:
2945: if(lcount>0) lcount--;
2946: ptr += len;
2947: if (nml_read)
2948: nml_read++;
2949: }
2950: return(0);
2951: #undef Ptr
2952: }
2953: #ifdef KR_headers
2954: integer s_rsle(a) cilist *a;
2955: #else
2956: integer s_rsle(cilist *a)
2957: #endif
2958: {
2959: int n;
2960:
2961: if(!init) f_init();
2962: if(n=c_le(a)) return(n);
2963: reading=1;
2964: external=1;
2965: formatted=1;
2966: lioproc = l_read;
2967: lquit = 0;
2968: lcount = 0;
2969: l_eof = 0;
2970: if(curunit->uwrt && nowreading(curunit))
2971: err(a->cierr,errno,"read start");
2972: l_getc = t_getc;
2973: l_ungetc = un_getc;
2974: return(0);
2975: }
2976: ./ ADD NAME=lwrite.c TIME=708868720
2977: #include "f2c.h"
2978: #include "fio.h"
2979: #include "fmt.h"
2980: #include "lio.h"
2981: int L_len;
2982:
2983: #ifdef KR_headers
2984: t_putc(c)
2985: #else
2986: t_putc(int c)
2987: #endif
2988: {
2989: recpos++;
2990: putc(c,cf);
2991: return(0);
2992: }
2993: static VOID
2994: #ifdef KR_headers
2995: lwrt_I(n) ftnint n;
2996: #else
2997: lwrt_I(ftnint n)
2998: #endif
2999: {
3000: char buf[LINTW],*p;
3001: #ifdef USE_STRLEN
3002: (void) sprintf(buf," %ld",(long)n);
3003: if(recpos+strlen(buf)>=L_len)
3004: #else
3005: if(recpos + sprintf(buf," %ld",(long)n) >= L_len)
3006: #endif
3007: (*donewrec)();
3008: for(p=buf;*p;PUT(*p++));
3009: }
3010: static VOID
3011: #ifdef KR_headers
3012: lwrt_L(n, len) ftnint n; ftnlen len;
3013: #else
3014: lwrt_L(ftnint n, ftnlen len)
3015: #endif
3016: {
3017: if(recpos+LLOGW>=L_len)
3018: (*donewrec)();
3019: wrt_L((Uint *)&n,LLOGW, len);
3020: }
3021: static VOID
3022: #ifdef KR_headers
3023: lwrt_A(p,len) char *p; ftnlen len;
3024: #else
3025: lwrt_A(char *p, ftnlen len)
3026: #endif
3027: {
3028: int i;
3029: if(recpos+len>=L_len)
3030: (*donewrec)();
3031: if (!recpos)
3032: { PUT(' '); ++recpos; }
3033: for(i=0;i<len;i++) PUT(*p++);
3034: }
3035:
3036: static int
3037: #ifdef KR_headers
3038: l_g(buf, n) char *buf; double n;
3039: #else
3040: l_g(char *buf, double n)
3041: #endif
3042: {
3043: #ifdef Old_list_output
3044: doublereal absn;
3045: char *fmt;
3046:
3047: absn = n;
3048: if (absn < 0)
3049: absn = -absn;
3050: fmt = LLOW <= absn && absn < LHIGH ? LFFMT : LEFMT;
3051: #ifdef USE_STRLEN
3052: sprintf(buf, fmt, n);
3053: return strlen(buf);
3054: #else
3055: return sprintf(buf, fmt, n);
3056: #endif
3057:
3058: #else
3059: register char *b, c, c1;
3060:
3061: b = buf;
3062: *b++ = ' ';
3063: if (n < 0) {
3064: *b++ = '-';
3065: n = -n;
3066: }
3067: else
3068: *b++ = ' ';
3069: if (n == 0) {
3070: *b++ = '0';
3071: *b++ = '.';
3072: *b = 0;
3073: goto ret;
3074: }
3075: sprintf(b, LGFMT, n);
3076: if (*b == '0') {
3077: while(b[0] = b[1])
3078: b++;
3079: }
3080: /* Fortran 77 insists on having a decimal point... */
3081: else for(;; b++)
3082: switch(*b) {
3083: case 0:
3084: *b++ = '.';
3085: *b = 0;
3086: goto ret;
3087: case '.':
3088: while(*++b);
3089: goto ret;
3090: case 'E':
3091: for(c1 = '.', c = 'E'; *b = c1;
3092: c1 = c, c = *++b);
3093: goto ret;
3094: }
3095: ret:
3096: return b - buf;
3097: #endif
3098: }
3099:
3100: static VOID
3101: #ifdef KR_headers
3102: l_put(s) register char *s;
3103: #else
3104: l_put(register char *s)
3105: #endif
3106: {
3107: #ifdef KR_headers
3108: register int c, (*pn)() = putn;
3109: #else
3110: register int c, (*pn)(int) = putn;
3111: #endif
3112: while(c = *s++)
3113: (*pn)(c);
3114: }
3115:
3116: static VOID
3117: #ifdef KR_headers
3118: lwrt_F(n) double n;
3119: #else
3120: lwrt_F(double n)
3121: #endif
3122: {
3123: char buf[LEFBL];
3124:
3125: if(recpos + l_g(buf,n) >= L_len)
3126: (*donewrec)();
3127: l_put(buf);
3128: }
3129: static VOID
3130: #ifdef KR_headers
3131: lwrt_C(a,b) double a,b;
3132: #else
3133: lwrt_C(double a, double b)
3134: #endif
3135: {
3136: char *ba, *bb, bufa[LEFBL], bufb[LEFBL];
3137: int al, bl;
3138:
3139: al = l_g(bufa, a);
3140: for(ba = bufa; *ba == ' '; ba++)
3141: --al;
3142: bl = l_g(bufb, b) + 1; /* intentionally high by 1 */
3143: for(bb = bufb; *bb == ' '; bb++)
3144: --bl;
3145: if(recpos + al + bl + 3 >= L_len && recpos)
3146: (*donewrec)();
3147: PUT(' ');
3148: PUT('(');
3149: l_put(ba);
3150: PUT(',');
3151: if (recpos + bl >= L_len) {
3152: (*donewrec)();
3153: PUT(' ');
3154: }
3155: l_put(bb);
3156: PUT(')');
3157: }
3158: #ifdef KR_headers
3159: l_write(number,ptr,len,type) ftnint *number,type; char *ptr; ftnlen len;
3160: #else
3161: l_write(ftnint *number, char *ptr, ftnlen len, ftnint type)
3162: #endif
3163: {
3164: #define Ptr ((flex *)ptr)
3165: int i;
3166: ftnint x;
3167: double y,z;
3168: real *xx;
3169: doublereal *yy;
3170: for(i=0;i< *number; i++)
3171: {
3172: switch((int)type)
3173: {
3174: default: fatal(204,"unknown type in lio");
3175: case TYSHORT:
3176: x=Ptr->flshort;
3177: goto xint;
3178: case TYLONG:
3179: x=Ptr->flint;
3180: xint: lwrt_I(x);
3181: break;
3182: case TYREAL:
3183: y=Ptr->flreal;
3184: goto xfloat;
3185: case TYDREAL:
3186: y=Ptr->fldouble;
3187: xfloat: lwrt_F(y);
3188: break;
3189: case TYCOMPLEX:
3190: xx= &Ptr->flreal;
3191: y = *xx++;
3192: z = *xx;
3193: goto xcomplex;
3194: case TYDCOMPLEX:
3195: yy = &Ptr->fldouble;
3196: y= *yy++;
3197: z = *yy;
3198: xcomplex:
3199: lwrt_C(y,z);
3200: break;
3201: case TYLOGICAL:
3202: lwrt_L(Ptr->flint, len);
3203: break;
3204: case TYCHAR:
3205: lwrt_A(ptr,len);
3206: break;
3207: }
3208: ptr += len;
3209: }
3210: return(0);
3211: }
3212: ./ ADD NAME=mktemp.c TIME=708905875
3213: /* for Zortech */
3214:
3215: #ifdef __cplusplus
3216: extern "C" {
3217: #endif
3218: char *
3219: mktemp(char *s0)
3220: {
3221: static int n;
3222: char *s = s0;
3223:
3224: while(*s != 'X')
3225: s++;
3226: *s++ = '0' + n/10;
3227: *s++ = '0' + n % 10;
3228: *s = 0;
3229: n++;
3230: return s0;
3231: }
3232: #ifdef __cplusplus
3233: }
3234: #endif
3235: ./ ADD NAME=open.c TIME=708894835
3236: #ifdef MSDOS
3237: #include "types.h"
3238: #include "stat.h"
3239: #else
3240: #include "sys/types.h"
3241: #include "sys/stat.h"
3242: #endif
3243: #include "f2c.h"
3244: #include "fio.h"
3245: #include "string.h"
3246: #include "fcntl.h"
3247: #include "rawio.h"
3248: #ifndef O_WRONLY
3249: #define O_RDONLY 0
3250: #define O_WRONLY 1
3251: #endif
3252:
3253: #ifdef KR_headers
3254: extern char *malloc(), *mktemp();
3255: extern FILE *fdopen();
3256: extern integer f_clos();
3257: #else
3258: #undef abs
3259: #include "stdlib.h"
3260: extern int canseek(FILE*);
3261: extern integer f_clos(cllist*);
3262: #endif
3263:
3264: #ifdef NON_ANSI_RW_MODES
3265: char *r_mode[2] = {"r", "r"};
3266: char *w_mode[2] = {"w", "w"};
3267: #else
3268: char *r_mode[2] = {"rb", "r"};
3269: char *w_mode[2] = {"wb", "w"};
3270: #endif
3271:
3272: #ifdef KR_headers
3273: isdev(s) char *s;
3274: #else
3275: isdev(char *s)
3276: #endif
3277: {
3278: #ifdef MSDOS
3279: int i, j;
3280:
3281: i = open(s,O_RDONLY);
3282: if (i == -1)
3283: return 0;
3284: j = isatty(i);
3285: close(i);
3286: return j;
3287: #else
3288: struct stat x;
3289:
3290: if(stat(s, &x) == -1) return(0);
3291: #ifdef S_IFMT
3292: switch(x.st_mode&S_IFMT) {
3293: case S_IFREG:
3294: case S_IFDIR:
3295: return(0);
3296: }
3297: #else
3298: #ifdef S_ISREG
3299: /* POSIX version */
3300: if(S_ISREG(x.st_mode) || S_ISDIR(x.st_mode))
3301: return(0);
3302: else
3303: #else
3304: Help! How does stat work on this system?
3305: #endif
3306: #endif
3307: return(1);
3308: #endif
3309: }
3310: #ifdef KR_headers
3311: integer f_open(a) olist *a;
3312: #else
3313: integer f_open(olist *a)
3314: #endif
3315: { unit *b;
3316: int n;
3317: char buf[256];
3318: cllist x;
3319: #ifndef MSDOS
3320: struct stat stb;
3321: #endif
3322: if(a->ounit>=MXUNIT || a->ounit<0)
3323: err(a->oerr,101,"open")
3324: curunit = b = &units[a->ounit];
3325: if(b->ufd) {
3326: if(a->ofnm==0)
3327: {
3328: same: if (a->oblnk)
3329: b->ublnk = *a->oblnk == 'z' || *a->oblnk == 'Z';
3330: return(0);
3331: }
3332: #ifdef MSDOS
3333: if (b->ufnm
3334: && strlen(b->ufnm) == a->ofnmlen
3335: && !strncmp(b->ufnm, b->ufnm, (unsigned)a->ofnmlen))
3336: goto same;
3337: #else
3338: g_char(a->ofnm,a->ofnmlen,buf);
3339: if (inode(buf,&n) == b->uinode && n == b->udev)
3340: goto same;
3341: #endif
3342: x.cunit=a->ounit;
3343: x.csta=0;
3344: x.cerr=a->oerr;
3345: if((n=f_clos(&x))!=0) return(n);
3346: }
3347: b->url=a->orl;
3348: b->ublnk = a->oblnk && (*a->oblnk == 'z' || *a->oblnk == 'Z');
3349: if(a->ofm==0)
3350: { if(b->url>0) b->ufmt=0;
3351: else b->ufmt=1;
3352: }
3353: else if(*a->ofm=='f' || *a->ofm == 'F') b->ufmt=1;
3354: else b->ufmt=0;
3355: #ifdef url_Adjust
3356: if (b->url && !b->ufmt)
3357: url_Adjust(b->url);
3358: #endif
3359: if (a->ofnm) {
3360: g_char(a->ofnm,a->ofnmlen,buf);
3361: if (!buf[0])
3362: err(a->oerr,107,"open")
3363: }
3364: else
3365: sprintf(buf, "fort.%ld", a->ounit);
3366: b->uscrtch = 0;
3367: switch(a->osta ? *a->osta : 'u')
3368: {
3369: case 'o':
3370: case 'O':
3371: #ifdef MSDOS
3372: if(access(buf,0))
3373: #else
3374: if(stat(buf,&stb))
3375: #endif
3376: err(a->oerr,errno,"open")
3377: break;
3378: case 's':
3379: case 'S':
3380: b->uscrtch=1;
3381: (void) strcpy(buf,"tmp.FXXXXXX");
3382: (void) mktemp(buf);
3383: (void) close(creat(buf, 0666));
3384: break;
3385: case 'n':
3386: case 'N':
3387: #ifdef MSDOS
3388: if(!access(buf,0))
3389: #else
3390: if(!stat(buf,&stb))
3391: #endif
3392: err(a->oerr,128,"open")
3393: /* no break */
3394: case 'r': /* Fortran 90 replace option */
3395: case 'R':
3396: (void) close(creat(buf, 0666));
3397: break;
3398: }
3399:
3400: b->ufnm=(char *) malloc((unsigned int)(strlen(buf)+1));
3401: if(b->ufnm==NULL) err(a->oerr,113,"no space");
3402: (void) strcpy(b->ufnm,buf);
3403: b->uend=0;
3404: b->uwrt = 0;
3405: if(isdev(buf))
3406: { b->ufd = fopen(buf,r_mode[b->ufmt]);
3407: if(b->ufd==NULL) err(a->oerr,errno,buf)
3408: }
3409: else {
3410: if((b->ufd = fopen(buf, r_mode[b->ufmt])) == NULL) {
3411: if ((n = open(buf,O_WRONLY)) >= 0) {
3412: b->uwrt = 2;
3413: }
3414: else {
3415: n = creat(buf, 0666);
3416: b->uwrt = 1;
3417: }
3418: if (n < 0
3419: || (b->ufd = fdopen(n, w_mode[b->ufmt])) == NULL)
3420: err(a->oerr, errno, "open");
3421: }
3422: }
3423: b->useek=canseek(b->ufd);
3424: #ifndef MSDOS
3425: if((b->uinode=inode(buf,&b->udev))==-1)
3426: err(a->oerr,108,"open")
3427: #endif
3428: if(a->orl && b->useek) rewind(b->ufd);
3429: return(0);
3430: }
3431: #ifdef KR_headers
3432: fk_open(seq,fmt,n) ftnint n;
3433: #else
3434: fk_open(int seq, int fmt, ftnint n)
3435: #endif
3436: { char nbuf[10];
3437: olist a;
3438: (void) sprintf(nbuf,"fort.%ld",n);
3439: a.oerr=1;
3440: a.ounit=n;
3441: a.ofnm=nbuf;
3442: a.ofnmlen=strlen(nbuf);
3443: a.osta=NULL;
3444: a.oacc= seq==SEQ?"s":"d";
3445: a.ofm = fmt==FMT?"f":"u";
3446: a.orl = seq==DIR?1:0;
3447: a.oblnk=NULL;
3448: return(f_open(&a));
3449: }
3450: ./ ADD NAME=rawio.h TIME=708896068
3451: #ifndef KR_headers
3452: #ifdef MSDOS
3453: #include "io.h"
3454: #define close _close
3455: #define creat _creat
3456: #define open _open
3457: #define read _read
3458: #define write _write
3459: #endif
3460: #ifdef __cplusplus
3461: extern "C" {
3462: #endif
3463: #ifndef MSDOS
3464: #ifndef NO_OPEN_DECL
3465: extern int creat(const char*,int), open(const char*,int);
3466: #endif
3467: extern int close(int);
3468: extern int read(int,void*,size_t), write(int,void*,size_t);
3469: extern int unlink(const char*);
3470: extern FILE *fdopen(int, const char*);
3471: #endif
3472:
3473: extern char *mktemp(char*);
3474:
3475: #ifdef __cplusplus
3476: }
3477: #endif
3478: #endif
3479: ./ ADD NAME=rdfmt.c TIME=708870801
3480: #include "f2c.h"
3481: #include "fio.h"
3482: #include "fmt.h"
3483: #include "fp.h"
3484:
3485: extern int cursor;
3486: #ifdef KR_headers
3487: extern double atof();
3488: #else
3489: #undef abs
3490: #include "stdlib.h"
3491: #endif
3492:
3493: static int
3494: #ifdef KR_headers
3495: rd_I(n,w,len, base) ftnlen len; Uint *n; register int base;
3496: #else
3497: rd_I(Uint *n, int w, ftnlen len, register int base)
3498: #endif
3499: { long x;
3500: int sign,ch;
3501: char s[84], *ps;
3502: ps=s; x=0;
3503: while (w)
3504: {
3505: GET(ch);
3506: if (ch==',' || ch=='\n') break;
3507: *ps=ch; ps++; w--;
3508: }
3509: *ps='\0';
3510: ps=s;
3511: while (*ps==' ') ps++;
3512: if (*ps=='-') { sign=1; ps++; }
3513: else { sign=0; if (*ps=='+') ps++; }
3514: loop: while (*ps>='0' && *ps<='9') { x=x*base+(*ps-'0'); ps++; }
3515: if (*ps==' ') {if (cblank) x *= base; ps++; goto loop;}
3516: if(sign) x = -x;
3517: if(len==sizeof(integer)) n->il=x;
3518: else if(len == sizeof(char)) n->ic = x;
3519: else n->is=x;
3520: if (*ps) return(errno=115); else return(0);
3521: }
3522: static int
3523: #ifdef KR_headers
3524: rd_L(n,w) ftnint *n;
3525: #else
3526: rd_L(ftnint *n, int w)
3527: #endif
3528: { int ch;
3529: char s[84], *ps;
3530: ps=s;
3531: while (w) {
3532: GET(ch);
3533: if (ch==','||ch=='\n') break;
3534: *ps=ch;
3535: ps++; w--;
3536: }
3537: *ps='\0';
3538: ps=s; while (*ps==' ') ps++;
3539: if (*ps=='.') ps++;
3540: if (*ps=='t' || *ps == 'T') { *n=1; return(0); }
3541: else if (*ps == 'f' || *ps == 'F') { *n=0; return(0); }
3542: else return(errno=116);
3543: }
3544:
3545: #include "ctype.h"
3546:
3547: static int
3548: #ifdef KR_headers
3549: rd_F(p, w, d, len) ufloat *p; ftnlen len;
3550: #else
3551: rd_F(ufloat *p, int w, int d, ftnlen len)
3552: #endif
3553: {
3554: char s[FMAX+EXPMAXDIGS+4];
3555: register int ch;
3556: register char *sp, *spe, *sp1;
3557: double x;
3558: int scale1, se;
3559: long e, exp;
3560:
3561: sp1 = sp = s;
3562: spe = sp + FMAX;
3563: exp = -d;
3564: x = 0.;
3565:
3566: do {
3567: GET(ch);
3568: w--;
3569: } while (ch == ' ' && w);
3570: switch(ch) {
3571: case '-': *sp++ = ch; sp1++; spe++;
3572: case '+':
3573: if (!w) goto zero;
3574: --w;
3575: GET(ch);
3576: }
3577: while(ch == ' ') {
3578: blankdrop:
3579: if (!w--) goto zero; GET(ch); }
3580: while(ch == '0')
3581: { if (!w--) goto zero; GET(ch); }
3582: if (ch == ' ' && cblank)
3583: goto blankdrop;
3584: scale1 = scale;
3585: while(isdigit(ch)) {
3586: digloop1:
3587: if (sp < spe) *sp++ = ch;
3588: else ++exp;
3589: digloop1e:
3590: if (!w--) goto done;
3591: GET(ch);
3592: }
3593: if (ch == ' ') {
3594: if (cblank)
3595: { ch = '0'; goto digloop1; }
3596: goto digloop1e;
3597: }
3598: if (ch == '.') {
3599: exp += d;
3600: if (!w--) goto done;
3601: GET(ch);
3602: if (sp == sp1) { /* no digits yet */
3603: while(ch == '0') {
3604: skip01:
3605: --exp;
3606: skip0:
3607: if (!w--) goto done;
3608: GET(ch);
3609: }
3610: if (ch == ' ') {
3611: if (cblank) goto skip01;
3612: goto skip0;
3613: }
3614: }
3615: while(isdigit(ch)) {
3616: digloop2:
3617: if (sp < spe)
3618: { *sp++ = ch; --exp; }
3619: digloop2e:
3620: if (!w--) goto done;
3621: GET(ch);
3622: }
3623: if (ch == ' ') {
3624: if (cblank)
3625: { ch = '0'; goto digloop2; }
3626: goto digloop2e;
3627: }
3628: }
3629: switch(ch) {
3630: default:
3631: break;
3632: case '-': se = 1; goto signonly;
3633: case '+': se = 0; goto signonly;
3634: case 'e':
3635: case 'E':
3636: case 'd':
3637: case 'D':
3638: if (!w--)
3639: goto bad;
3640: GET(ch);
3641: while(ch == ' ') {
3642: if (!w--)
3643: goto bad;
3644: GET(ch);
3645: }
3646: se = 0;
3647: switch(ch) {
3648: case '-': se = 1;
3649: case '+':
3650: signonly:
3651: if (!w--)
3652: goto bad;
3653: GET(ch);
3654: }
3655: while(ch == ' ') {
3656: if (!w--)
3657: goto bad;
3658: GET(ch);
3659: }
3660: if (!isdigit(ch))
3661: goto bad;
3662:
3663: e = ch - '0';
3664: for(;;) {
3665: if (!w--)
3666: { ch = '\n'; break; }
3667: GET(ch);
3668: if (!isdigit(ch)) {
3669: if (ch == ' ') {
3670: if (cblank)
3671: ch = '0';
3672: else continue;
3673: }
3674: else
3675: break;
3676: }
3677: e = 10*e + ch - '0';
3678: if (e > EXPMAX && sp > sp1)
3679: goto bad;
3680: }
3681: if (se)
3682: exp -= e;
3683: else
3684: exp += e;
3685: scale1 = 0;
3686: }
3687: switch(ch) {
3688: case '\n':
3689: case ',':
3690: break;
3691: default:
3692: bad:
3693: return (errno = 115);
3694: }
3695: done:
3696: if (sp > sp1) {
3697: while(*--sp == '0')
3698: ++exp;
3699: if (exp -= scale1)
3700: sprintf(sp+1, "e%ld", exp);
3701: else
3702: sp[1] = 0;
3703: x = atof(s);
3704: }
3705: zero:
3706: if (len == sizeof(real))
3707: p->pf = x;
3708: else
3709: p->pd = x;
3710: return(0);
3711: }
3712:
3713:
3714: static int
3715: #ifdef KR_headers
3716: rd_A(p,len) char *p; ftnlen len;
3717: #else
3718: rd_A(char *p, ftnlen len)
3719: #endif
3720: { int i,ch;
3721: for(i=0;i<len;i++)
3722: { GET(ch);
3723: *p++=VAL(ch);
3724: }
3725: return(0);
3726: }
3727: static int
3728: #ifdef KR_headers
3729: rd_AW(p,w,len) char *p; ftnlen len;
3730: #else
3731: rd_AW(char *p, int w, ftnlen len)
3732: #endif
3733: { int i,ch;
3734: if(w>=len)
3735: { for(i=0;i<w-len;i++)
3736: GET(ch);
3737: for(i=0;i<len;i++)
3738: { GET(ch);
3739: *p++=VAL(ch);
3740: }
3741: return(0);
3742: }
3743: for(i=0;i<w;i++)
3744: { GET(ch);
3745: *p++=VAL(ch);
3746: }
3747: for(i=0;i<len-w;i++) *p++=' ';
3748: return(0);
3749: }
3750: static int
3751: #ifdef KR_headers
3752: rd_H(n,s) char *s;
3753: #else
3754: rd_H(int n, char *s)
3755: #endif
3756: { int i,ch;
3757: for(i=0;i<n;i++)
3758: if((ch=(*getn)())<0) return(ch);
3759: else *s++ = ch=='\n'?' ':ch;
3760: return(1);
3761: }
3762: static int
3763: #ifdef KR_headers
3764: rd_POS(s) char *s;
3765: #else
3766: rd_POS(char *s)
3767: #endif
3768: { char quote;
3769: int ch;
3770: quote= *s++;
3771: for(;*s;s++)
3772: if(*s==quote && *(s+1)!=quote) break;
3773: else if((ch=(*getn)())<0) return(ch);
3774: else *s = ch=='\n'?' ':ch;
3775: return(1);
3776: }
3777: #ifdef KR_headers
3778: rd_ed(p,ptr,len) struct syl *p; char *ptr; ftnlen len;
3779: #else
3780: rd_ed(struct syl *p, char *ptr, ftnlen len)
3781: #endif
3782: { int ch;
3783: for(;cursor>0;cursor--) if((ch=(*getn)())<0) return(ch);
3784: if(cursor<0)
3785: { if(recpos+cursor < 0) /*err(elist->cierr,110,"fmt")*/
3786: cursor = -recpos; /* is this in the standard? */
3787: if(external == 0) {
3788: extern char *icptr;
3789: icptr += cursor;
3790: }
3791: else if(curunit && curunit->useek)
3792: (void) fseek(cf,(long) cursor,SEEK_CUR);
3793: else
3794: err(elist->cierr,106,"fmt");
3795: recpos += cursor;
3796: cursor=0;
3797: }
3798: switch(p->op)
3799: {
3800: default: fprintf(stderr,"rd_ed, unexpected code: %d\n", p->op);
3801: sig_die(fmtbuf, 1);
3802: case I: ch = (rd_I((Uint *)ptr,p->p1,len, 10));
3803: break;
3804: case IM: ch = (rd_I((Uint *)ptr,p->p1,len, 10));
3805: break;
3806: case O: ch = (rd_I((Uint *)ptr, p->p1, len, 8));
3807: break;
3808: case L: ch = (rd_L((ftnint *)ptr,p->p1));
3809: break;
3810: case A: ch = (rd_A(ptr,len));
3811: break;
3812: case AW:
3813: ch = (rd_AW(ptr,p->p1,len));
3814: break;
3815: case E: case EE:
3816: case D:
3817: case G:
3818: case GE:
3819: case F: ch = (rd_F((ufloat *)ptr,p->p1,p->p2,len));
3820: break;
3821: }
3822: if(ch == 0) return(ch);
3823: else if(ch == EOF) return(EOF);
3824: if (cf)
3825: clearerr(cf);
3826: return(errno);
3827: }
3828: #ifdef KR_headers
3829: rd_ned(p) struct syl *p;
3830: #else
3831: rd_ned(struct syl *p)
3832: #endif
3833: {
3834: switch(p->op)
3835: {
3836: default: fprintf(stderr,"rd_ned, unexpected code: %d\n", p->op);
3837: sig_die(fmtbuf, 1);
3838: case APOS:
3839: return(rd_POS(*(char **)&p->p2));
3840: case H: return(rd_H(p->p1,*(char **)&p->p2));
3841: case SLASH: return((*donewrec)());
3842: case TR:
3843: case X: cursor += p->p1;
3844: return(1);
3845: case T: cursor=p->p1-recpos - 1;
3846: return(1);
3847: case TL: cursor -= p->p1;
3848: if(cursor < -recpos) /* TL1000, 1X */
3849: cursor = -recpos;
3850: return(1);
3851: }
3852: }
3853: ./ ADD NAME=rewind.c TIME=708863391
3854: #include "f2c.h"
3855: #include "fio.h"
3856: #ifdef KR_headers
3857: integer f_rew(a) alist *a;
3858: #else
3859: integer f_rew(alist *a)
3860: #endif
3861: {
3862: unit *b;
3863: if(a->aunit>=MXUNIT || a->aunit<0)
3864: err(a->aerr,101,"rewind");
3865: b = &units[a->aunit];
3866: if(b->ufd == NULL || b->uwrt == 3)
3867: return(0);
3868: if(!b->useek)
3869: err(a->aerr,106,"rewind")
3870: if(b->uwrt) {
3871: (void) t_runc(a);
3872: b->uwrt = 3;
3873: }
3874: rewind(b->ufd);
3875: b->uend=0;
3876: return(0);
3877: }
3878: ./ ADD NAME=rsfe.c TIME=708863550
3879: /* read sequential formatted external */
3880: #include "f2c.h"
3881: #include "fio.h"
3882: #include "fmt.h"
3883:
3884: xrd_SL(Void)
3885: { int ch;
3886: if(!curunit->uend)
3887: while((ch=getc(cf))!='\n' && ch!=EOF);
3888: cursor=recpos=0;
3889: return(1);
3890: }
3891: x_getc(Void)
3892: { int ch;
3893: if(curunit->uend) return(EOF);
3894: ch = getc(cf);
3895: if(ch!=EOF && ch!='\n')
3896: { recpos++;
3897: return(ch);
3898: }
3899: if(ch=='\n')
3900: { (void) ungetc(ch,cf);
3901: return(ch);
3902: }
3903: if(curunit->uend || feof(cf))
3904: { errno=0;
3905: curunit->uend=1;
3906: return(-1);
3907: }
3908: return(-1);
3909: }
3910: x_endp(Void)
3911: {
3912: (void) xrd_SL();
3913: return(0);
3914: }
3915: x_rev(Void)
3916: {
3917: (void) xrd_SL();
3918: return(0);
3919: }
3920: #ifdef KR_headers
3921: integer s_rsfe(a) cilist *a; /* start */
3922: #else
3923: integer s_rsfe(cilist *a) /* start */
3924: #endif
3925: { int n;
3926: if(!init) f_init();
3927: if(n=c_sfe(a)) return(n);
3928: reading=1;
3929: sequential=1;
3930: formatted=1;
3931: external=1;
3932: elist=a;
3933: cursor=recpos=0;
3934: scale=0;
3935: fmtbuf=a->cifmt;
3936: curunit= &units[a->ciunit];
3937: cf=curunit->ufd;
3938: if(pars_f(fmtbuf)<0) err(a->cierr,100,"startio");
3939: getn= x_getc;
3940: doed= rd_ed;
3941: doned= rd_ned;
3942: fmt_bg();
3943: doend=x_endp;
3944: donewrec=xrd_SL;
3945: dorevert=x_rev;
3946: cblank=curunit->ublnk;
3947: cplus=0;
3948: if(curunit->uwrt && nowreading(curunit))
3949: err(a->cierr,errno,"read start");
3950: return(0);
3951: }
3952: ./ ADD NAME=rsli.c TIME=708864284
3953: #include "f2c.h"
3954: #include "fio.h"
3955: #include "lio.h"
3956:
3957: extern flag lquit;
3958: extern int lcount;
3959: extern char *icptr;
3960: extern char *icend;
3961: extern icilist *svic;
3962: extern int icnum, recpos;
3963:
3964: int i_getc(Void)
3965: {
3966: if(recpos >= svic->icirlen) {
3967: if (recpos++ == svic->icirlen)
3968: return '\n';
3969: z_rnew();
3970: }
3971: recpos++;
3972: if(icptr >= icend) err(svic->iciend,(EOF),"endfile");
3973: return(*icptr++);
3974: }
3975:
3976: #ifdef KR_headers
3977: int i_ungetc(ch, f) int ch; FILE *f;
3978: #else
3979: int i_ungetc(int ch, FILE *f)
3980: #endif
3981: {
3982: if (--recpos == svic->icirlen)
3983: return '\n';
3984: if (recpos < -1)
3985: err(svic->icierr,110,"recend");
3986: /* *--icptr == ch, and icptr may point to read-only memory */
3987: return *--icptr /* = ch */;
3988: }
3989:
3990: static void
3991: #ifdef KR_headers
3992: c_lir(a) icilist *a;
3993: #else
3994: c_lir(icilist *a)
3995: #endif
3996: {
3997: extern int l_eof;
3998: reading = 1;
3999: external = 0;
4000: formatted = 1;
4001: svic = a;
4002: L_len = a->icirlen;
4003: recpos = -1;
4004: icnum = recpos = 0;
4005: cursor = 0;
4006: l_getc = i_getc;
4007: l_ungetc = i_ungetc;
4008: l_eof = 0;
4009: icptr = a->iciunit;
4010: icend = icptr + a->icirlen*a->icirnum;
4011: cf = 0;
4012: curunit = 0;
4013: elist = (cilist *)a;
4014: }
4015:
4016:
4017: #ifdef KR_headers
4018: integer s_rsli(a) icilist *a;
4019: #else
4020: integer s_rsli(icilist *a)
4021: #endif
4022: {
4023: lioproc = l_read;
4024: lquit = 0;
4025: lcount = 0;
4026: c_lir(a);
4027: return(0);
4028: }
4029:
4030: integer e_rsli(Void)
4031: { return 0; }
4032:
4033: #ifdef KR_headers
4034: s_rsni(a) icilist *a;
4035: #else
4036: extern int x_rsne(cilist*);
4037:
4038: s_rsni(icilist *a)
4039: #endif
4040: {
4041: cilist ca;
4042: ca.ciend = a->iciend;
4043: ca.cierr = a->icierr;
4044: ca.cifmt = a->icifmt;
4045: c_lir(a);
4046: return x_rsne(&ca);
4047: }
4048: ./ ADD NAME=rsne.c TIME=708907688
4049: #include "f2c.h"
4050: #include "fio.h"
4051: #include "lio.h"
4052:
4053: #define MAX_NL_CACHE 3 /* maximum number of namelist hash tables to cache */
4054: #define MAXDIM 20 /* maximum number of subscripts */
4055:
4056: struct dimen {
4057: ftnlen extent;
4058: ftnlen curval;
4059: ftnlen delta;
4060: ftnlen stride;
4061: };
4062: typedef struct dimen dimen;
4063:
4064: struct hashentry {
4065: struct hashentry *next;
4066: char *name;
4067: Vardesc *vd;
4068: };
4069: typedef struct hashentry hashentry;
4070:
4071: struct hashtab {
4072: struct hashtab *next;
4073: Namelist *nl;
4074: int htsize;
4075: hashentry *tab[1];
4076: };
4077: typedef struct hashtab hashtab;
4078:
4079: static hashtab *nl_cache;
4080: static n_nlcache;
4081: static hashentry **zot;
4082: extern ftnlen typesize[];
4083:
4084: extern flag lquit;
4085: extern int lcount, nml_read;
4086: extern t_getc(Void);
4087:
4088: #ifdef KR_headers
4089: extern char *malloc(), *memset();
4090:
4091: #ifdef ungetc
4092: static int
4093: un_getc(x,cf) int x; FILE *cf;
4094: { return ungetc(x,cf); }
4095: #else
4096: #define un_getc ungetc
4097: extern int ungetc();
4098: #endif
4099:
4100: #else
4101: #undef abs
4102: #include "stdlib.h"
4103: #include "string.h"
4104:
4105: #ifdef ungetc
4106: static int
4107: un_getc(int x, FILE *cf)
4108: { return ungetc(x,cf); }
4109: #else
4110: #define un_getc ungetc
4111: #endif
4112: #endif
4113:
4114: static Vardesc *
4115: #ifdef KR_headers
4116: hash(ht, s) hashtab *ht; register char *s;
4117: #else
4118: hash(hashtab *ht, register char *s)
4119: #endif
4120: {
4121: register int c, x;
4122: register hashentry *h;
4123: char *s0 = s;
4124:
4125: for(x = 0; c = *s++; x = x & 0x4000 ? ((x << 1) & 0x7fff) + 1 : x << 1)
4126: x += c;
4127: for(h = *(zot = ht->tab + x % ht->htsize); h; h = h->next)
4128: if (!strcmp(s0, h->name))
4129: return h->vd;
4130: return 0;
4131: }
4132:
4133: hashtab *
4134: #ifdef KR_headers
4135: mk_hashtab(nl) Namelist *nl;
4136: #else
4137: mk_hashtab(Namelist *nl)
4138: #endif
4139: {
4140: int nht, nv;
4141: hashtab *ht;
4142: Vardesc *v, **vd, **vde;
4143: hashentry *he;
4144:
4145: hashtab **x, **x0, *y;
4146: for(x = &nl_cache; y = *x; x0 = x, x = &y->next)
4147: if (nl == y->nl)
4148: return y;
4149: if (n_nlcache >= MAX_NL_CACHE) {
4150: /* discard least recently used namelist hash table */
4151: y = *x0;
4152: free((char *)y->next);
4153: y->next = 0;
4154: }
4155: else
4156: n_nlcache++;
4157: nv = nl->nvars;
4158: if (nv >= 0x4000)
4159: nht = 0x7fff;
4160: else {
4161: for(nht = 1; nht < nv; nht <<= 1);
4162: nht += nht - 1;
4163: }
4164: ht = (hashtab *)malloc(sizeof(hashtab) + (nht-1)*sizeof(hashentry *)
4165: + nv*sizeof(hashentry));
4166: if (!ht)
4167: return 0;
4168: he = (hashentry *)&ht->tab[nht];
4169: ht->nl = nl;
4170: ht->htsize = nht;
4171: ht->next = nl_cache;
4172: nl_cache = ht;
4173: memset((char *)ht->tab, 0, nht*sizeof(hashentry *));
4174: vd = nl->vars;
4175: vde = vd + nv;
4176: while(vd < vde) {
4177: v = *vd++;
4178: if (!hash(ht, v->name)) {
4179: he->next = *zot;
4180: *zot = he;
4181: he->name = v->name;
4182: he->vd = v;
4183: he++;
4184: }
4185: }
4186: return ht;
4187: }
4188:
4189: static char Alpha[256], Alphanum[256];
4190:
4191: static VOID
4192: nl_init(Void) {
4193: register char *s;
4194: register int c;
4195:
4196: if(!init)
4197: f_init();
4198: for(s = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; c = *s++; )
4199: Alpha[c]
4200: = Alphanum[c]
4201: = Alpha[c + 'a' - 'A']
4202: = Alphanum[c + 'a' - 'A']
4203: = c;
4204: for(s = "0123456789_"; c = *s++; )
4205: Alphanum[c] = c;
4206: }
4207:
4208: #define GETC(x) (x=(*l_getc)())
4209: #define Ungetc(x,y) (*l_ungetc)(x,y)
4210:
4211: static int
4212: #ifdef KR_headers
4213: getname(s, slen) register char *s; int slen;
4214: #else
4215: getname(register char *s, int slen)
4216: #endif
4217: {
4218: register char *se = s + slen - 1;
4219: register int ch;
4220:
4221: GETC(ch);
4222: if (!(*s++ = Alpha[ch & 0xff])) {
4223: if (ch != EOF)
4224: ch = 115;
4225: err(elist->cierr, ch, "namelist read");
4226: }
4227: while(*s = Alphanum[GETC(ch) & 0xff])
4228: if (s < se)
4229: s++;
4230: if (ch == EOF)
4231: err(elist->cierr, EOF, "namelist read");
4232: if (ch > ' ')
4233: Ungetc(ch,cf);
4234: return *s = 0;
4235: }
4236:
4237: static int
4238: getnum(int *chp, ftnlen *val)
4239: {
4240: register int ch, sign;
4241: register ftnlen x;
4242:
4243: while(GETC(ch) <= ' ' && ch >= 0);
4244: if (ch == '-') {
4245: sign = 1;
4246: GETC(ch);
4247: }
4248: else {
4249: sign = 0;
4250: if (ch == '+')
4251: GETC(ch);
4252: }
4253: x = ch - '0';
4254: if (x < 0 || x > 9)
4255: return 115;
4256: while(GETC(ch) >= '0' && ch <= '9')
4257: x = 10*x + ch - '0';
4258: while(ch <= ' ' && ch >= 0)
4259: GETC(ch);
4260: if (ch == EOF)
4261: return EOF;
4262: *val = sign ? -x : x;
4263: *chp = ch;
4264: return 0;
4265: }
4266:
4267: static int
4268: #ifdef KR_headers
4269: getdimen(chp, d, delta, extent, x1)
4270: int *chp; dimen *d; ftnlen delta, extent, *x1;
4271: #else
4272: getdimen(int *chp, dimen *d, ftnlen delta, ftnlen extent, ftnlen *x1)
4273: #endif
4274: {
4275: register int k;
4276: ftnlen x2, x3;
4277:
4278: if (k = getnum(chp, x1))
4279: return k;
4280: x3 = 1;
4281: if (*chp == ':') {
4282: if (k = getnum(chp, &x2))
4283: return k;
4284: x2 -= *x1;
4285: if (*chp == ':') {
4286: if (k = getnum(chp, &x3))
4287: return k;
4288: if (!x3)
4289: return 123;
4290: x2 /= x3;
4291: }
4292: if (x2 < 0 || x2 >= extent)
4293: return 123;
4294: d->extent = x2 + 1;
4295: }
4296: else
4297: d->extent = 1;
4298: d->curval = 0;
4299: d->delta = delta;
4300: d->stride = x3;
4301: return 0;
4302: }
4303:
4304: static char where0[] = "namelist read start ";
4305:
4306: #ifdef KR_headers
4307: x_rsne(a) cilist *a;
4308: #else
4309: x_rsne(cilist *a)
4310: #endif
4311: {
4312: int ch, got1, k, n, nd;
4313: Namelist *nl;
4314: static char where[] = "namelist read";
4315: char buf[64];
4316: hashtab *ht;
4317: Vardesc *v;
4318: dimen *dn, *dn0, *dn1;
4319: ftnlen *dims, *dims1;
4320: ftnlen b, b0, b1, ex, no, no1, nomax, size, span;
4321: ftnint type;
4322: char *vaddr;
4323: long iva, ivae;
4324: dimen dimens[MAXDIM], substr;
4325:
4326: if (!Alpha['a'])
4327: nl_init();
4328: reading=1;
4329: formatted=1;
4330: got1 = 0;
4331: for(;;) switch(GETC(ch)) {
4332: case EOF:
4333: err(a->ciend,(EOF),where0);
4334: case '&':
4335: case '$':
4336: goto have_amp;
4337: default:
4338: if (ch <= ' ' && ch >= 0)
4339: continue;
4340: err(a->cierr, 115, where0);
4341: }
4342: have_amp:
4343: if (ch = getname(buf,sizeof(buf)))
4344: return ch;
4345: nl = (Namelist *)a->cifmt;
4346: if (strcmp(buf, nl->name))
4347: err(a->cierr, 118, where0);
4348: ht = mk_hashtab(nl);
4349: if (!ht)
4350: err(elist->cierr, 113, where0);
4351: for(;;) {
4352: for(;;) switch(GETC(ch)) {
4353: case EOF:
4354: if (got1)
4355: return 0;
4356: err(a->ciend,(EOF),where0);
4357: case '/':
4358: case '$':
4359: return 0;
4360: default:
4361: if (ch <= ' ' && ch >= 0 || ch == ',')
4362: continue;
4363: Ungetc(ch,cf);
4364: if (ch = getname(buf,sizeof(buf)))
4365: return ch;
4366: goto havename;
4367: }
4368: havename:
4369: v = hash(ht,buf);
4370: if (!v)
4371: err(a->cierr, 119, where);
4372: while(GETC(ch) <= ' ' && ch >= 0);
4373: vaddr = v->addr;
4374: type = v->type;
4375: if (type < 0) {
4376: size = -type;
4377: type = TYCHAR;
4378: }
4379: else
4380: size = typesize[type];
4381: ivae = size;
4382: iva = 0;
4383: if (ch == '(' /*)*/ ) {
4384: dn = dimens;
4385: if (!(dims = v->dims)) {
4386: if (type != TYCHAR)
4387: err(a->cierr, 122, where);
4388: if (k = getdimen(&ch, dn, (ftnlen)size,
4389: (ftnlen)size, &b))
4390: err(a->cierr, k, where);
4391: if (ch != ')')
4392: err(a->cierr, 115, where);
4393: b1 = dn->extent;
4394: if (--b < 0 || b + b1 > size)
4395: return 124;
4396: iva += b;
4397: size = b1;
4398: while(GETC(ch) <= ' ' && ch >= 0);
4399: goto scalar;
4400: }
4401: nd = dims[0];
4402: nomax = span = dims[1];
4403: ivae = iva + size*nomax;
4404: if (k = getdimen(&ch, dn, size, nomax, &b))
4405: err(a->cierr, k, where);
4406: no = dn->extent;
4407: b0 = dims[2];
4408: dims1 = dims += 3;
4409: ex = 1;
4410: for(n = 1; n++ < nd; dims++) {
4411: if (ch != ',')
4412: err(a->cierr, 115, where);
4413: dn1 = dn + 1;
4414: span /= *dims;
4415: if (k = getdimen(&ch, dn1, dn->delta**dims,
4416: span, &b1))
4417: err(a->cierr, k, where);
4418: ex *= *dims;
4419: b += b1*ex;
4420: no *= dn1->extent;
4421: dn = dn1;
4422: }
4423: if (ch != ')')
4424: err(a->cierr, 115, where);
4425: b -= b0;
4426: if (b < 0 || b >= nomax)
4427: err(a->cierr, 125, where);
4428: iva += size * b;
4429: dims = dims1;
4430: while(GETC(ch) <= ' ' && ch >= 0);
4431: no1 = 1;
4432: dn0 = dimens;
4433: if (type == TYCHAR && ch == '(' /*)*/) {
4434: if (k = getdimen(&ch, &substr, size, size, &b))
4435: err(a->cierr, k, where);
4436: if (ch != ')')
4437: err(a->cierr, 115, where);
4438: b1 = substr.extent;
4439: if (--b < 0 || b + b1 > size)
4440: return 124;
4441: iva += b;
4442: b0 = size;
4443: size = b1;
4444: while(GETC(ch) <= ' ' && ch >= 0);
4445: if (b1 < b0)
4446: goto delta_adj;
4447: }
4448: for(; dn0 < dn; dn0++) {
4449: if (dn0->extent != *dims++ || dn0->stride != 1)
4450: break;
4451: no1 *= dn0->extent;
4452: }
4453: if (dn0 == dimens && dimens[0].stride == 1) {
4454: no1 = dimens[0].extent;
4455: dn0++;
4456: }
4457: delta_adj:
4458: ex = 0;
4459: for(dn1 = dn0; dn1 <= dn; dn1++)
4460: ex += (dn1->extent-1)
4461: * (dn1->delta *= dn1->stride);
4462: for(dn1 = dn; dn1 > dn0; dn1--) {
4463: ex -= (dn1->extent - 1) * dn1->delta;
4464: dn1->delta -= ex;
4465: }
4466: }
4467: else if (dims = v->dims) {
4468: no = no1 = dims[1];
4469: ivae = iva + no*size;
4470: }
4471: else
4472: scalar:
4473: no = no1 = 1;
4474: if (ch != '=')
4475: err(a->cierr, 115, where);
4476: got1 = nml_read = 1;
4477: lcount = 0;
4478: readloop:
4479: for(;;) {
4480: if (iva >= ivae || iva < 0) {
4481: lquit = 1;
4482: goto mustend;
4483: }
4484: else if (iva + no1*size > ivae)
4485: no1 = (ivae - iva)/size;
4486: lquit = 0;
4487: l_read(&no1, vaddr + iva, size, type);
4488: if (lquit == 1)
4489: return 0;
4490: mustend:
4491: if (GETC(ch) == '/' || ch == '$') {
4492: lquit = 1;
4493: return 0;
4494: }
4495: else if (lquit) {
4496: while(ch <= ' ' && ch >= 0)
4497: GETC(ch);
4498: Ungetc(ch,cf);
4499: if (!Alpha[ch & 0xff] && ch >= 0)
4500: err(a->cierr, 125, where);
4501: break;
4502: }
4503: Ungetc(ch,cf);
4504: if ((no -= no1) <= 0)
4505: break;
4506: for(dn1 = dn0; dn1 <= dn; dn1++) {
4507: if (++dn1->curval < dn1->extent) {
4508: iva += dn1->delta;
4509: goto readloop;
4510: }
4511: dn1->curval = 0;
4512: }
4513: break;
4514: }
4515: }
4516: }
4517:
4518: integer
4519: #ifdef KR_headers
4520: s_rsne(a) cilist *a;
4521: #else
4522: s_rsne(cilist *a)
4523: #endif
4524: {
4525: int n;
4526: external=1;
4527: if(n = c_le(a))
4528: return n;
4529: if(curunit->uwrt && nowreading(curunit))
4530: err(a->cierr,errno,where0);
4531: l_getc = t_getc;
4532: l_ungetc = un_getc;
4533: if (n = x_rsne(a))
4534: return n;
4535: return e_rsle();
4536: }
4537: ./ ADD NAME=sfe.c TIME=708865458
4538: /* sequential formatted external common routines*/
4539: #include "f2c.h"
4540: #include "fio.h"
4541:
4542: extern char *fmtbuf;
4543:
4544: integer e_rsfe(Void)
4545: { int n;
4546: n=en_fio();
4547: if (cf == stdout)
4548: fflush(stdout);
4549: else if (cf == stderr)
4550: fflush(stderr);
4551: fmtbuf=NULL;
4552: return(n);
4553: }
4554: #ifdef KR_headers
4555: c_sfe(a) cilist *a; /* check */
4556: #else
4557: c_sfe(cilist *a) /* check */
4558: #endif
4559: { unit *p;
4560: if(a->ciunit >= MXUNIT || a->ciunit<0)
4561: err(a->cierr,101,"startio");
4562: p = &units[a->ciunit];
4563: if(p->ufd==NULL && fk_open(SEQ,FMT,a->ciunit)) err(a->cierr,114,"sfe")
4564: if(!p->ufmt) err(a->cierr,102,"sfe")
4565: return(0);
4566: }
4567: integer e_wsfe(Void)
4568: { return(e_rsfe());
4569: }
4570: ./ ADD NAME=sig_die.c TIME=708905928
4571: #include "stdio.h"
4572: #include "signal.h"
4573:
4574: #ifndef SIGIOT
4575: #define SIGIOT SIGABRT
4576: #endif
4577:
4578: #ifdef __cplusplus
4579: extern "C" {
4580: #endif
4581: #ifdef KR_headers
4582: void sig_die(s, kill) register char *s; int kill;
4583: #else
4584: #include "stdlib.h"
4585: extern void f_exit(void);
4586:
4587: void sig_die(register char *s, int kill)
4588: #endif
4589: {
4590: /* print error message, then clear buffers */
4591: fprintf(stderr, "%s\n", s);
4592: fflush(stderr);
4593: f_exit();
4594: fflush(stderr);
4595:
4596: if(kill)
4597: {
4598: /* now get a core */
4599: signal(SIGIOT, SIG_DFL);
4600: abort();
4601: }
4602: else
4603: exit(1);
4604: }
4605: #ifdef __cplusplus
4606: }
4607: #endif
4608: ./ ADD NAME=sue.c TIME=708865914
4609: #include "f2c.h"
4610: #include "fio.h"
4611: extern uiolen reclen;
4612: long recloc;
4613:
4614: #ifdef KR_headers
4615: c_sue(a) cilist *a;
4616: #else
4617: c_sue(cilist *a)
4618: #endif
4619: {
4620: if(a->ciunit >= MXUNIT || a->ciunit < 0)
4621: err(a->cierr,101,"startio");
4622: external=sequential=1;
4623: formatted=0;
4624: curunit = &units[a->ciunit];
4625: elist=a;
4626: if(curunit->ufd==NULL && fk_open(SEQ,UNF,a->ciunit))
4627: err(a->cierr,114,"sue");
4628: cf=curunit->ufd;
4629: if(curunit->ufmt) err(a->cierr,103,"sue")
4630: if(!curunit->useek) err(a->cierr,103,"sue")
4631: return(0);
4632: }
4633: #ifdef KR_headers
4634: integer s_rsue(a) cilist *a;
4635: #else
4636: integer s_rsue(cilist *a)
4637: #endif
4638: {
4639: int n;
4640: if(!init) f_init();
4641: reading=1;
4642: if(n=c_sue(a)) return(n);
4643: recpos=0;
4644: if(curunit->uwrt && nowreading(curunit))
4645: err(a->cierr, errno, "read start");
4646: if(fread((char *)&reclen,sizeof(uiolen),1,cf)
4647: != 1)
4648: { if(feof(cf))
4649: { curunit->uend = 1;
4650: err(a->ciend, EOF, "start");
4651: }
4652: clearerr(cf);
4653: err(a->cierr, errno, "start");
4654: }
4655: return(0);
4656: }
4657: #ifdef KR_headers
4658: integer s_wsue(a) cilist *a;
4659: #else
4660: integer s_wsue(cilist *a)
4661: #endif
4662: {
4663: int n;
4664: if(!init) f_init();
4665: if(n=c_sue(a)) return(n);
4666: reading=0;
4667: reclen=0;
4668: if(curunit->uwrt != 1 && nowwriting(curunit))
4669: err(a->cierr, errno, "write start");
4670: recloc=ftell(cf);
4671: (void) fseek(cf,(long)sizeof(uiolen),SEEK_CUR);
4672: return(0);
4673: }
4674: integer e_wsue(Void)
4675: { long loc;
4676: (void) fwrite((char *)&reclen,sizeof(uiolen),1,cf);
4677: loc=ftell(cf);
4678: (void) fseek(cf,recloc,SEEK_SET);
4679: (void) fwrite((char *)&reclen,sizeof(uiolen),1,cf);
4680: (void) fseek(cf,loc,SEEK_SET);
4681: return(0);
4682: }
4683: integer e_rsue(Void)
4684: {
4685: (void) fseek(cf,(long)(reclen-recpos+sizeof(uiolen)),SEEK_CUR);
4686: return(0);
4687: }
4688: ./ ADD NAME=typesize.c TIME=640009768
4689: #include "f2c.h"
4690:
4691: ftnlen typesize[] = { 0, 0, sizeof(shortint), sizeof(integer),
4692: sizeof(real), sizeof(doublereal),
4693: sizeof(complex), sizeof(doublecomplex),
4694: sizeof(logical), sizeof(char) };
4695: ./ ADD NAME=uio.c TIME=708866134
4696: #include "f2c.h"
4697: #include "fio.h"
4698: uiolen reclen;
4699:
4700: #ifdef KR_headers
4701: do_us(number,ptr,len) ftnint *number; char *ptr; ftnlen len;
4702: #else
4703: do_us(ftnint *number, char *ptr, ftnlen len)
4704: #endif
4705: {
4706: if(reading)
4707: {
4708: recpos += *number * len;
4709: if(recpos>reclen)
4710: err(elist->ciend, 110, "do_us");
4711: if (fread(ptr,(int)len,(int)(*number),cf) != *number)
4712: err(elist->ciend, EOF, "do_us");
4713: return(0);
4714: }
4715: else
4716: {
4717: reclen += *number * len;
4718: (void) fwrite(ptr,(int)len,(int)(*number),cf);
4719: return(0);
4720: }
4721: }
4722: #ifdef KR_headers
4723: integer do_ud(number,ptr,len) ftnint *number; char *ptr; ftnlen len;
4724: #else
4725: integer do_ud(ftnint *number, char *ptr, ftnlen len)
4726: #endif
4727: {
4728: recpos += *number * len;
4729: if(recpos > curunit->url && curunit->url!=1)
4730: err(elist->cierr,110,"do_ud");
4731: if(reading)
4732: {
4733: if(fread(ptr,(int)len,(int)(*number),cf) != *number)
4734: err(elist->cierr,EOF,"do_ud")
4735: else return(0);
4736: }
4737: (void) fwrite(ptr,(int)len,(int)(*number),cf);
4738: return(0);
4739: }
4740: #ifdef KR_headers
4741: integer do_uio(number,ptr,len) ftnint *number; char *ptr; ftnlen len;
4742: #else
4743: integer do_uio(ftnint *number, char *ptr, ftnlen len)
4744: #endif
4745: {
4746: if(sequential)
4747: return(do_us(number,ptr,len));
4748: else return(do_ud(number,ptr,len));
4749: }
4750: ./ ADD NAME=util.c TIME=708907661
4751: #ifndef MSDOS
4752: #include "sys/types.h"
4753: #include "sys/stat.h"
4754: #endif
4755: #include "f2c.h"
4756: #include "fio.h"
4757:
4758: VOID
4759: #ifdef KR_headers
4760: g_char(a,alen,b) char *a,*b; ftnlen alen;
4761: #else
4762: g_char(char *a, ftnlen alen, char *b)
4763: #endif
4764: {
4765: char *x = a + alen, *y = b + alen;
4766:
4767: for(;; y--) {
4768: if (x <= a) {
4769: *b = 0;
4770: return;
4771: }
4772: if (*--x != ' ')
4773: break;
4774: }
4775: *y-- = 0;
4776: do *y-- = *x;
4777: while(x-- > a);
4778: }
4779:
4780: VOID
4781: #ifdef KR_headers
4782: b_char(a,b,blen) char *a,*b; ftnlen blen;
4783: #else
4784: b_char(char *a, char *b, ftnlen blen)
4785: #endif
4786: { int i;
4787: for(i=0;i<blen && *a!=0;i++) *b++= *a++;
4788: for(;i<blen;i++) *b++=' ';
4789: }
4790: #ifndef MSDOS
4791: #ifdef KR_headers
4792: long inode(a, dev) char *a; int *dev;
4793: #else
4794: long inode(char *a, int *dev)
4795: #endif
4796: { struct stat x;
4797: if(stat(a,&x)<0) return(-1);
4798: *dev = x.st_dev;
4799: return(x.st_ino);
4800: }
4801: #endif
4802:
4803: #define INTBOUND sizeof(int)-1
4804: VOID
4805: #ifdef KR_headers
4806: mvgbt(n,len,a,b) char *a,*b;
4807: #else
4808: mvgbt(int n, int len, char *a, char *b)
4809: #endif
4810: { register int num=n*len;
4811: if( ((int)a&INTBOUND)==0 && ((int)b&INTBOUND)==0 && (num&INTBOUND)==0 )
4812: { register int *x=(int *)a,*y=(int *)b;
4813: num /= sizeof(int);
4814: if(x>y) for(;num>0;num--) *y++= *x++;
4815: else for(num--;num>=0;num--) *(y+num)= *(x+num);
4816: }
4817: else
4818: { register char *x=a,*y=b;
4819: if(x>y) for(;num>0;num--) *y++= *x++;
4820: else for(num--;num>=0;num--) *(y+num)= *(x+num);
4821: }
4822: }
4823: ./ ADD NAME=wref.c TIME=708866396
4824: #include "f2c.h"
4825: #include "fio.h"
4826: #include "fmt.h"
4827: #include "fp.h"
4828: #ifndef VAX
4829: #include "ctype.h"
4830: #endif
4831:
4832: #ifndef KR_headers
4833: #undef abs
4834: #include "stdlib.h"
4835: #include "string.h"
4836: #endif
4837:
4838: #ifdef KR_headers
4839: wrt_E(p,w,d,e,len) ufloat *p; ftnlen len;
4840: #else
4841: wrt_E(ufloat *p, int w, int d, int e, ftnlen len)
4842: #endif
4843: {
4844: char buf[FMAX+EXPMAXDIGS+4], *s, *se;
4845: int d1, delta, e1, i, sign, signspace;
4846: double dd;
4847: #ifndef VAX
4848: int e0 = e;
4849: #endif
4850:
4851: if(e <= 0)
4852: e = 2;
4853: if(scale) {
4854: if(scale >= d + 2 || scale <= -d)
4855: goto nogood;
4856: }
4857: if(scale <= 0)
4858: --d;
4859: if (len == sizeof(real))
4860: dd = p->pf;
4861: else
4862: dd = p->pd;
4863: if (dd >= 0.) {
4864: sign = 0;
4865: signspace = cplus;
4866: #ifndef VAX
4867: if (!dd)
4868: dd = 0.; /* avoid -0 */
4869: #endif
4870: }
4871: else {
4872: signspace = sign = 1;
4873: dd = -dd;
4874: }
4875: delta = w - (2 /* for the . and the d adjustment above */
4876: + 2 /* for the E+ */ + signspace + d + e);
4877: if (delta < 0) {
4878: nogood:
4879: while(--w >= 0)
4880: PUT('*');
4881: return(0);
4882: }
4883: if (scale < 0)
4884: d += scale;
4885: if (d > FMAX) {
4886: d1 = d - FMAX;
4887: d = FMAX;
4888: }
4889: else
4890: d1 = 0;
4891: sprintf(buf,"%#.*E", d, dd);
4892: #ifndef VAX
4893: /* check for NaN, Infinity */
4894: if (!isdigit(buf[0])) {
4895: delta = w - strlen(buf) - signspace;
4896: if (delta < 0)
4897: goto nogood;
4898: while(--delta >= 0)
4899: PUT(' ');
4900: if (signspace)
4901: PUT(sign ? '-' : '+');
4902: for(s = buf; *s; s++)
4903: PUT(*s);
4904: return 0;
4905: }
4906: #endif
4907: se = buf + d + 3;
4908: if (scale != 1 && dd)
4909: sprintf(se, "%+.2d", atoi(se) + 1 - scale);
4910: s = ++se;
4911: if (e < 2) {
4912: if (*s != '0')
4913: goto nogood;
4914: }
4915: #ifndef VAX
4916: /* accommodate 3 significant digits in exponent */
4917: if (s[2]) {
4918: #ifdef Pedantic
4919: if (!e0 && !s[3])
4920: for(s -= 2, e1 = 2; s[0] = s[1]; s++);
4921:
4922: /* Pedantic gives the behavior that Fortran 77 specifies, */
4923: /* i.e., requires that E be specified for exponent fields */
4924: /* of more than 3 digits. With Pedantic undefined, we get */
4925: /* the behavior that Cray displays -- you get a bigger */
4926: /* exponent field if it fits. */
4927: #else
4928: if (!e0) {
4929: for(s -= 2, e1 = 2; s[0] = s[1]; s++)
4930: #ifdef CRAY
4931: delta--;
4932: if ((delta += 4) < 0)
4933: goto nogood
4934: #endif
4935: ;
4936: }
4937: #endif
4938: else if (e0 >= 0)
4939: goto shift;
4940: else
4941: e1 = e;
4942: }
4943: else
4944: shift:
4945: #endif
4946: for(s += 2, e1 = 2; *s; ++e1, ++s)
4947: if (e1 >= e)
4948: goto nogood;
4949: while(--delta >= 0)
4950: PUT(' ');
4951: if (signspace)
4952: PUT(sign ? '-' : '+');
4953: s = buf;
4954: i = scale;
4955: if (scale <= 0) {
4956: PUT('.');
4957: for(; i < 0; ++i)
4958: PUT('0');
4959: PUT(*s);
4960: s += 2;
4961: }
4962: else if (scale > 1) {
4963: PUT(*s);
4964: s += 2;
4965: while(--i > 0)
4966: PUT(*s++);
4967: PUT('.');
4968: }
4969: if (d1) {
4970: se -= 2;
4971: while(s < se) PUT(*s++);
4972: se += 2;
4973: do PUT('0'); while(--d1 > 0);
4974: }
4975: while(s < se)
4976: PUT(*s++);
4977: if (e < 2)
4978: PUT(s[1]);
4979: else {
4980: while(++e1 <= e)
4981: PUT('0');
4982: while(*s)
4983: PUT(*s++);
4984: }
4985: return 0;
4986: }
4987:
4988: #ifdef KR_headers
4989: wrt_F(p,w,d,len) ufloat *p; ftnlen len;
4990: #else
4991: wrt_F(ufloat *p, int w, int d, ftnlen len)
4992: #endif
4993: {
4994: int d1, sign, n;
4995: double x;
4996: char *b, buf[MAXINTDIGS+MAXFRACDIGS+4], *s;
4997:
4998: x= (len==sizeof(real)?p->pf:p->pd);
4999: if (d < MAXFRACDIGS)
5000: d1 = 0;
5001: else {
5002: d1 = d - MAXFRACDIGS;
5003: d = MAXFRACDIGS;
5004: }
5005: if (x < 0.)
5006: { x = -x; sign = 1; }
5007: else {
5008: sign = 0;
5009: #ifndef VAX
5010: if (!x)
5011: x = 0.;
5012: #endif
5013: }
5014:
5015: if (n = scale)
5016: if (n > 0)
5017: do x *= 10.; while(--n > 0);
5018: else
5019: do x *= 0.1; while(++n < 0);
5020:
5021: #ifdef USE_STRLEN
5022: sprintf(b = buf, "%#.*f", d, x);
5023: n = strlen(b) + d1;
5024: #else
5025: n = sprintf(b = buf, "%#.*f", d, x) + d1;
5026: #endif
5027:
5028: if (buf[0] == '0' && d)
5029: { ++b; --n; }
5030: if (sign) {
5031: /* check for all zeros */
5032: for(s = b;;) {
5033: while(*s == '0') s++;
5034: switch(*s) {
5035: case '.':
5036: s++; continue;
5037: case 0:
5038: sign = 0;
5039: }
5040: break;
5041: }
5042: }
5043: if (sign || cplus)
5044: ++n;
5045: if (n > w) {
5046: while(--w >= 0)
5047: PUT('*');
5048: return 0;
5049: }
5050: for(w -= n; --w >= 0; )
5051: PUT(' ');
5052: if (sign)
5053: PUT('-');
5054: else if (cplus)
5055: PUT('+');
5056: while(n = *b++)
5057: PUT(n);
5058: while(--d1 >= 0)
5059: PUT('0');
5060: return 0;
5061: }
5062: ./ ADD NAME=wrtfmt.c TIME=708868978
5063: #include "f2c.h"
5064: #include "fio.h"
5065: #include "fmt.h"
5066: extern int cursor;
5067: #ifdef KR_headers
5068: extern char *icvt();
5069: #else
5070: extern char *icvt(long, int*, int*, int);
5071: #endif
5072: int hiwater;
5073: icilist *svic;
5074: char *icptr;
5075: mv_cur(Void) /* shouldn't use fseek because it insists on calling fflush */
5076: /* instead we know too much about stdio */
5077: {
5078: if(external == 0) {
5079: if(cursor < 0) {
5080: if(hiwater < recpos)
5081: hiwater = recpos;
5082: recpos += cursor;
5083: icptr += cursor;
5084: cursor = 0;
5085: if(recpos < 0)
5086: err(elist->cierr, 110, "left off");
5087: }
5088: else if(cursor > 0) {
5089: if(recpos + cursor >= svic->icirlen)
5090: err(elist->cierr, 110, "recend");
5091: if(hiwater <= recpos)
5092: for(; cursor > 0; cursor--)
5093: (*putn)(' ');
5094: else if(hiwater <= recpos + cursor) {
5095: cursor -= hiwater - recpos;
5096: icptr += hiwater - recpos;
5097: recpos = hiwater;
5098: for(; cursor > 0; cursor--)
5099: (*putn)(' ');
5100: }
5101: else {
5102: icptr += cursor;
5103: recpos += cursor;
5104: }
5105: cursor = 0;
5106: }
5107: return(0);
5108: }
5109: if(cursor > 0) {
5110: if(hiwater <= recpos)
5111: for(;cursor>0;cursor--) (*putn)(' ');
5112: else if(hiwater <= recpos + cursor) {
5113: #ifndef NON_UNIX_STDIO
5114: if(cf->_ptr + hiwater - recpos < buf_end(cf))
5115: cf->_ptr += hiwater - recpos;
5116: else
5117: #endif
5118: (void) fseek(cf, (long) (hiwater - recpos), SEEK_CUR);
5119: cursor -= hiwater - recpos;
5120: recpos = hiwater;
5121: for(; cursor > 0; cursor--)
5122: (*putn)(' ');
5123: }
5124: else {
5125: #ifndef NON_UNIX_STDIO
5126: if(cf->_ptr + cursor < buf_end(cf))
5127: cf->_ptr += cursor;
5128: else
5129: #endif
5130: (void) fseek(cf, (long)cursor, SEEK_CUR);
5131: recpos += cursor;
5132: }
5133: }
5134: if(cursor<0)
5135: {
5136: if(cursor+recpos<0) err(elist->cierr,110,"left off");
5137: #ifndef NON_UNIX_STDIO
5138: if(cf->_ptr + cursor >= cf->_base)
5139: cf->_ptr += cursor;
5140: else
5141: #endif
5142: if(curunit && curunit->useek)
5143: (void) fseek(cf,(long)cursor,SEEK_CUR);
5144: else
5145: err(elist->cierr,106,"fmt");
5146: if(hiwater < recpos)
5147: hiwater = recpos;
5148: recpos += cursor;
5149: cursor=0;
5150: }
5151: return(0);
5152: }
5153: static int
5154: #ifdef KR_headers
5155: wrt_I(n,w,len, base) Uint *n; ftnlen len; register int base;
5156: #else
5157: wrt_I(Uint *n, int w, ftnlen len, register int base)
5158: #endif
5159: { int ndigit,sign,spare,i;
5160: long x;
5161: char *ans;
5162: if(len==sizeof(integer)) x=n->il;
5163: else if(len == sizeof(char)) x = n->ic;
5164: else x=n->is;
5165: ans=icvt(x,&ndigit,&sign, base);
5166: spare=w-ndigit;
5167: if(sign || cplus) spare--;
5168: if(spare<0)
5169: for(i=0;i<w;i++) (*putn)('*');
5170: else
5171: { for(i=0;i<spare;i++) (*putn)(' ');
5172: if(sign) (*putn)('-');
5173: else if(cplus) (*putn)('+');
5174: for(i=0;i<ndigit;i++) (*putn)(*ans++);
5175: }
5176: return(0);
5177: }
5178: static int
5179: #ifdef KR_headers
5180: wrt_IM(n,w,m,len) Uint *n; ftnlen len;
5181: #else
5182: wrt_IM(Uint *n, int w, int m, ftnlen len)
5183: #endif
5184: { int ndigit,sign,spare,i,xsign;
5185: long x;
5186: char *ans;
5187: if(sizeof(integer)==len) x=n->il;
5188: else if(len == sizeof(char)) x = n->ic;
5189: else x=n->is;
5190: ans=icvt(x,&ndigit,&sign, 10);
5191: if(sign || cplus) xsign=1;
5192: else xsign=0;
5193: if(ndigit+xsign>w || m+xsign>w)
5194: { for(i=0;i<w;i++) (*putn)('*');
5195: return(0);
5196: }
5197: if(x==0 && m==0)
5198: { for(i=0;i<w;i++) (*putn)(' ');
5199: return(0);
5200: }
5201: if(ndigit>=m)
5202: spare=w-ndigit-xsign;
5203: else
5204: spare=w-m-xsign;
5205: for(i=0;i<spare;i++) (*putn)(' ');
5206: if(sign) (*putn)('-');
5207: else if(cplus) (*putn)('+');
5208: for(i=0;i<m-ndigit;i++) (*putn)('0');
5209: for(i=0;i<ndigit;i++) (*putn)(*ans++);
5210: return(0);
5211: }
5212: static int
5213: #ifdef KR_headers
5214: wrt_AP(s) char *s;
5215: #else
5216: wrt_AP(char *s)
5217: #endif
5218: { char quote;
5219: if(cursor && mv_cur()) return(mv_cur());
5220: quote = *s++;
5221: for(;*s;s++)
5222: { if(*s!=quote) (*putn)(*s);
5223: else if(*++s==quote) (*putn)(*s);
5224: else return(1);
5225: }
5226: return(1);
5227: }
5228: static int
5229: #ifdef KR_headers
5230: wrt_H(a,s) char *s;
5231: #else
5232: wrt_H(int a, char *s)
5233: #endif
5234: {
5235: if(cursor && mv_cur()) return(mv_cur());
5236: while(a--) (*putn)(*s++);
5237: return(1);
5238: }
5239: #ifdef KR_headers
5240: wrt_L(n,len, sz) Uint *n; ftnlen sz;
5241: #else
5242: wrt_L(Uint *n, int len, ftnlen sz)
5243: #endif
5244: { int i;
5245: long x;
5246: if(sizeof(integer)==sz) x=n->il;
5247: else if(sz == sizeof(char)) x = n->ic;
5248: else x=n->is;
5249: for(i=0;i<len-1;i++)
5250: (*putn)(' ');
5251: if(x) (*putn)('T');
5252: else (*putn)('F');
5253: return(0);
5254: }
5255: static int
5256: #ifdef KR_headers
5257: wrt_A(p,len) char *p; ftnlen len;
5258: #else
5259: wrt_A(char *p, ftnlen len)
5260: #endif
5261: {
5262: while(len-- > 0) (*putn)(*p++);
5263: return(0);
5264: }
5265: static int
5266: #ifdef KR_headers
5267: wrt_AW(p,w,len) char * p; ftnlen len;
5268: #else
5269: wrt_AW(char * p, int w, ftnlen len)
5270: #endif
5271: {
5272: while(w>len)
5273: { w--;
5274: (*putn)(' ');
5275: }
5276: while(w-- > 0)
5277: (*putn)(*p++);
5278: return(0);
5279: }
5280:
5281: static int
5282: #ifdef KR_headers
5283: wrt_G(p,w,d,e,len) ufloat *p; ftnlen len;
5284: #else
5285: wrt_G(ufloat *p, int w, int d, int e, ftnlen len)
5286: #endif
5287: { double up = 1,x;
5288: int i,oldscale=scale,n,j;
5289: x= len==sizeof(real)?p->pf:p->pd;
5290: if(x < 0 ) x = -x;
5291: if(x<.1) return(wrt_E(p,w,d,e,len));
5292: for(i=0;i<=d;i++,up*=10)
5293: { if(x>=up) continue;
5294: scale=0;
5295: if(e==0) n=4;
5296: else n=e+2;
5297: i=wrt_F(p,w-n,d-i,len);
5298: for(j=0;j<n;j++) (*putn)(' ');
5299: scale=oldscale;
5300: return(i);
5301: }
5302: return(wrt_E(p,w,d,e,len));
5303: }
5304: #ifdef KR_headers
5305: w_ed(p,ptr,len) struct syl *p; char *ptr; ftnlen len;
5306: #else
5307: w_ed(struct syl *p, char *ptr, ftnlen len)
5308: #endif
5309: {
5310: if(cursor && mv_cur()) return(mv_cur());
5311: switch(p->op)
5312: {
5313: default:
5314: fprintf(stderr,"w_ed, unexpected code: %d\n", p->op);
5315: sig_die(fmtbuf, 1);
5316: case I: return(wrt_I((Uint *)ptr,p->p1,len, 10));
5317: case IM:
5318: return(wrt_IM((Uint *)ptr,p->p1,p->p2,len));
5319: case O: return(wrt_I((Uint *)ptr, p->p1, len, 8));
5320: case L: return(wrt_L((Uint *)ptr,p->p1, len));
5321: case A: return(wrt_A(ptr,len));
5322: case AW:
5323: return(wrt_AW(ptr,p->p1,len));
5324: case D:
5325: case E:
5326: case EE:
5327: return(wrt_E((ufloat *)ptr,p->p1,p->p2,p->p3,len));
5328: case G:
5329: case GE:
5330: return(wrt_G((ufloat *)ptr,p->p1,p->p2,p->p3,len));
5331: case F: return(wrt_F((ufloat *)ptr,p->p1,p->p2,len));
5332: }
5333: }
5334: #ifdef KR_headers
5335: w_ned(p) struct syl *p;
5336: #else
5337: w_ned(struct syl *p)
5338: #endif
5339: {
5340: switch(p->op)
5341: {
5342: default: fprintf(stderr,"w_ned, unexpected code: %d\n", p->op);
5343: sig_die(fmtbuf, 1);
5344: case SLASH:
5345: return((*donewrec)());
5346: case T: cursor = p->p1-recpos - 1;
5347: return(1);
5348: case TL: cursor -= p->p1;
5349: if(cursor < -recpos) /* TL1000, 1X */
5350: cursor = -recpos;
5351: return(1);
5352: case TR:
5353: case X:
5354: cursor += p->p1;
5355: return(1);
5356: case APOS:
5357: return(wrt_AP(*(char **)&p->p2));
5358: case H:
5359: return(wrt_H(p->p1,*(char **)&p->p2));
5360: }
5361: }
5362: ./ ADD NAME=wsfe.c TIME=708863158
5363: /*write sequential formatted external*/
5364: #include "f2c.h"
5365: #include "fio.h"
5366: #include "fmt.h"
5367: extern int hiwater;
5368:
5369: #ifdef KR_headers
5370: x_putc(c)
5371: #else
5372: x_putc(int c)
5373: #endif
5374: {
5375: /* this uses \n as an indicator of record-end */
5376: if(c == '\n' && recpos < hiwater) { /* fseek calls fflush, a loss */
5377: #ifndef NON_UNIX_STDIO
5378: if(cf->_ptr + hiwater - recpos < buf_end(cf))
5379: cf->_ptr += hiwater - recpos;
5380: else
5381: #endif
5382: (void) fseek(cf, (long)(hiwater - recpos), SEEK_CUR);
5383: }
5384: recpos++;
5385: return putc(c,cf);
5386: }
5387: x_wSL(Void)
5388: {
5389: (*putn)('\n');
5390: recpos=0;
5391: cursor = 0;
5392: hiwater = 0;
5393: return(1);
5394: }
5395: xw_end(Void)
5396: {
5397: if(nonl == 0)
5398: (*putn)('\n');
5399: hiwater = recpos = cursor = 0;
5400: return(0);
5401: }
5402: xw_rev(Void)
5403: {
5404: if(workdone) (*putn)('\n');
5405: hiwater = recpos = cursor = 0;
5406: return(workdone=0);
5407: }
5408:
5409: #ifdef KR_headers
5410: integer s_wsfe(a) cilist *a; /*start*/
5411: #else
5412: integer s_wsfe(cilist *a) /*start*/
5413: #endif
5414: { int n;
5415: if(!init) f_init();
5416: if(n=c_sfe(a)) return(n);
5417: reading=0;
5418: sequential=1;
5419: formatted=1;
5420: external=1;
5421: elist=a;
5422: hiwater = cursor=recpos=0;
5423: nonl = 0;
5424: scale=0;
5425: fmtbuf=a->cifmt;
5426: curunit = &units[a->ciunit];
5427: cf=curunit->ufd;
5428: if(pars_f(fmtbuf)<0) err(a->cierr,100,"startio");
5429: putn= x_putc;
5430: doed= w_ed;
5431: doned= w_ned;
5432: doend=xw_end;
5433: dorevert=xw_rev;
5434: donewrec=x_wSL;
5435: fmt_bg();
5436: cplus=0;
5437: cblank=curunit->ublnk;
5438: if(curunit->uwrt != 1 && nowwriting(curunit))
5439: err(a->cierr,errno,"write start");
5440: return(0);
5441: }
5442: ./ ADD NAME=wsle.c TIME=708862784
5443: #include "f2c.h"
5444: #include "fio.h"
5445: #include "fmt.h"
5446: #include "lio.h"
5447:
5448: #ifdef KR_headers
5449: integer s_wsle(a) cilist *a;
5450: #else
5451: integer s_wsle(cilist *a)
5452: #endif
5453: {
5454: int n;
5455: if(!init) f_init();
5456: if(n=c_le(a)) return(n);
5457: reading=0;
5458: external=1;
5459: formatted=1;
5460: putn = t_putc;
5461: lioproc = l_write;
5462: L_len = LINE;
5463: donewrec = x_wSL;
5464: if(curunit->uwrt != 1 && nowwriting(curunit))
5465: err(a->cierr, errno, "list output start");
5466: return(0);
5467: }
5468:
5469: integer e_wsle(Void)
5470: {
5471: t_putc('\n');
5472: recpos=0;
5473: if (cf == stdout)
5474: fflush(stdout);
5475: else if (cf == stderr)
5476: fflush(stderr);
5477: return(0);
5478: }
5479: ./ ADD NAME=wsne.c TIME=708862700
5480: #include "f2c.h"
5481: #include "fio.h"
5482: #include "lio.h"
5483:
5484: integer
5485: #ifdef KR_headers
5486: s_wsne(a) cilist *a;
5487: #else
5488: s_wsne(cilist *a)
5489: #endif
5490: {
5491: int n;
5492: extern integer e_wsle(Void);
5493:
5494: if(!init)
5495: f_init();
5496: if(n=c_le(a))
5497: return(n);
5498: reading=0;
5499: external=1;
5500: formatted=1;
5501: putn = t_putc;
5502: L_len = LINE;
5503: donewrec = x_wSL;
5504: if(curunit->uwrt != 1 && nowwriting(curunit))
5505: err(a->cierr, errno, "namelist output start");
5506: x_wsne(a);
5507: return e_wsle();
5508: }
5509: ./ ADD NAME=xwsne.c TIME=708824981
5510: #include "f2c.h"
5511: #include "fio.h"
5512: #include "lio.h"
5513: #include "fmt.h"
5514:
5515: #ifdef KR_headers
5516: x_wsne(a) cilist *a;
5517: #else
5518: #include "string.h"
5519:
5520: VOID
5521: x_wsne(cilist *a)
5522: #endif
5523: {
5524: Namelist *nl;
5525: char *s;
5526: Vardesc *v, **vd, **vde;
5527: ftnint *number, type;
5528: ftnlen *dims;
5529: ftnlen size;
5530: static ftnint one = 1;
5531: extern ftnlen typesize[];
5532:
5533: nl = (Namelist *)a->cifmt;
5534: PUT('&');
5535: for(s = nl->name; *s; s++)
5536: PUT(*s);
5537: PUT(' ');
5538: vd = nl->vars;
5539: vde = vd + nl->nvars;
5540: while(vd < vde) {
5541: v = *vd++;
5542: s = v->name;
5543: if (recpos+strlen(s)+2 >= L_len)
5544: (*donewrec)();
5545: while(*s)
5546: PUT(*s++);
5547: PUT(' ');
5548: PUT('=');
5549: number = (dims = v->dims) ? dims + 1 : &one;
5550: type = v->type;
5551: if (type < 0) {
5552: size = -type;
5553: type = TYCHAR;
5554: }
5555: else
5556: size = typesize[type];
5557: l_write(number, v->addr, size, type);
5558: if (vd < vde) {
5559: if (recpos+2 >= L_len)
5560: (*donewrec)();
5561: PUT(',');
5562: PUT(' ');
5563: }
5564: else if (recpos+1 >= L_len)
5565: (*donewrec)();
5566: }
5567: PUT('/');
5568: }
5569: ./ ENDUP
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.