|
|
1.1 root 1: #ifndef _SFIO_H /* protect against multiple #includes */
2: #define _SFIO_H
3:
4: #if __STDC__ || __cplusplus || c_plusplus
5: #define _SFA_(x) x
6: #else
7: #define _SFA_(x) ()
8: #endif
9:
10: #ifndef NULL
11: #define NULL 0
12: #endif
13: #ifndef EOF
14: #define EOF (-1)
15: #endif
16: #ifndef SEEK_SET
17: #define SEEK_SET 0
18: #define SEEK_CUR 1
19: #define SEEK_END 2
20: #endif
21:
22: typedef struct _sfdc_ Sfdisc_t;
23: typedef struct _sfio_ Sfile_t, SFIO;
24:
25: /* discipline structure */
26: struct _sfdc_
27: {
28: int (*readf) _SFA_((Sfile_t*, unsigned char*, int, char*));
29: int (*writef) _SFA_((Sfile_t*, const unsigned char*, int, char*));
30: long (*seekf) _SFA_((Sfile_t*, long, int, char*));
31: int (*exceptf) _SFA_((Sfile_t*, int, char*));
32: char *handle; /* to store any state information */
33: };
34:
35: /* a file structure */
36: struct _sfio_
37: {
38: unsigned char *next; /* next position to read/write from */
39: unsigned char *endw; /* end of write buffer */
40: unsigned char *endr; /* end of read buffer */
41: unsigned char *endb; /* end of buffer */
42: struct _sfio_ *push; /* the stream that was pushed on */
43: short flags; /* type of stream */
44: short file; /* file descriptor */
45: long orig; /* where we start in the file */
46: #ifdef _SFIO_PRIVATE
47: _SFIO_PRIVATE
48: #endif
49: };
50:
51: /* bits for various types of files */
52: #define SF_READ 000001 /* open for reading */
53: #define SF_WRITE 000002 /* open for writing */
54: #define SF_STRING 000004 /* a string stream */
55: #define SF_APPEND 000010 /* associated file is in append mode */
56: #define SF_RELATIVE 000020 /* file pos is relative to starting pos */
57: #define SF_MALLOC 000040 /* buffered space malloc-ed */
58: #define SF_LINE 000100 /* line buffering */
59: #define SF_KEEPFD 000200 /* keep file opened when closing stream */
60: #define SF_SHARE 000400 /* file stream that is shared */
61: #define SF_REUSE 001000 /* keep stream space after closing */
62: #define SF_FLAGS 000777 /* PUBLIC FLAGS PASSABLE TO SFNEW() */
63: #define SF_SETS 001743 /* flags passable to sfset() */
64:
65: #define SF_EOF 002000 /* eof was detected */
66: #define SF_ERROR 004000 /* an error happened */
67:
68: #define SF_BUFSIZE 8192 /* suggested default buffer size */
69: #define SF_UNBOUND (-1) /* unbounded buffer size */
70:
71: #define sfstdin (&_Sfstdin) /* standard input stream */
72: #define sfstdout (&_Sfstdout) /* standard output stream */
73: #define sfstderr (&_Sfstderr) /* standard error stream */
74:
75: #if __cplusplus
76: extern "C"
77: {
78: #endif
79:
80: extern int _Sfi;
81: extern Sfile_t _Sfstdin, _Sfstdout, _Sfstderr;
82:
83: extern Sfile_t *sfnew _SFA_((Sfile_t*, unsigned char*, int, int, int));
84: extern Sfile_t *sfopen _SFA_((Sfile_t*, const char*, const char*));
85: extern Sfile_t *sfdopen _SFA_((int, const char*));
86: extern Sfile_t *sfpopen _SFA_((const char*, const char*, Sfile_t**));
87: extern Sfile_t *sfstack _SFA_((Sfile_t*, Sfile_t*));
88: extern Sfile_t *_sftmpfile _SFA_((int));
89: extern int _sfflsbuf _SFA_((Sfile_t*, int));
90: extern int _sffilbuf _SFA_((Sfile_t*, int));
91: extern int _sfsync _SFA_((Sfile_t*));
92: extern int _sfpeek _SFA_((Sfile_t*, unsigned char**));
93: extern int sfclrlock _SFA_((Sfile_t*));
94: extern unsigned char* sfsetbuf _SFA_((Sfile_t*, unsigned char*, int));
95: extern Sfdisc_t* sfsetdisc _SFA_((Sfile_t*,Sfdisc_t*));
96: extern int sfnotice _SFA_((void(*)(Sfile_t*, int)));
97: extern int sfset _SFA_((Sfile_t*, int, int));
98: extern int sfpool _SFA_((Sfile_t*, Sfile_t*, int));
99: extern int sfread _SFA_((Sfile_t*, unsigned char*, int));
100: extern int sfwrite _SFA_((Sfile_t*, const unsigned char*, int));
101: extern int sfmove _SFA_((Sfile_t*, Sfile_t*, long, const char*));
102: extern int sfclose _SFA_((Sfile_t*));
103: extern long sftell _SFA_((Sfile_t*));
104: extern long sfseek _SFA_((Sfile_t*, long, int));
105: extern int sfllen _SFA_((long));
106: extern int sfdlen _SFA_((double));
107: extern int sfputs _SFA_((Sfile_t*, const char*, int));
108: extern char *sfgets _SFA_((Sfile_t*, char*, int));
109: extern int sfnputc _SFA_((Sfile_t*, unsigned char, int));
110: extern int _sfputu _SFA_((Sfile_t*, unsigned long));
111: extern int _sfputl _SFA_((Sfile_t*, long));
112: extern long _sfgetl _SFA_((Sfile_t*));
113: extern unsigned long _sfgetu _SFA_((Sfile_t*));
114: extern long _sfgetl _SFA_((Sfile_t*));
115: extern int _sfputd _SFA_((Sfile_t*, double));
116: extern double sfgetd _SFA_((Sfile_t*));
117: extern int sfungetc _SFA_((Sfile_t*, int));
118: extern char *_sfcvt _SFA_((double, int, int*, int*, int));
119: extern int sfprintf _SFA_((Sfile_t*, const char*, ...));
120: extern int sfsprintf _SFA_((char*, int, const char*, ...));
121: extern int sfscanf _SFA_((Sfile_t*, const char*, ...));
122: extern int sfsscanf _SFA_((const char*, const char*, ...));
123:
124: #if __STDC__ || __cplusplus
125: #include <stdarg.h>
126: #endif
127: extern int sfvprintf _SFA_((Sfile_t*, const char*, va_list));
128: extern int sfvscanf _SFA_((Sfile_t*, const char*, va_list));
129:
130: /* function analogues of fast in-line functions */
131: extern int sfgetc _SFA_((Sfile_t*));
132: extern long sfgetl _SFA_((Sfile_t*));
133: extern unsigned long sfgetu _SFA_((Sfile_t*));
134: extern int sfputc _SFA_((Sfile_t*,int));
135: extern int sfputd _SFA_((Sfile_t*,double));
136: extern int sfputl _SFA_((Sfile_t*,long));
137: extern int sfputu _SFA_((Sfile_t*,unsigned long));
138: extern int sfpeek _SFA_((Sfile_t*, unsigned char**));
139: extern int sfsync _SFA_((Sfile_t*));
140: extern Sfile_t* sfpushed _SFA_((Sfile_t*));
141: extern Sfile_t* sftmp _SFA_((int));
142: extern int sfslen _SFA_((void));
143: extern int sfulen _SFA_((unsigned long));
144: extern long sforigin _SFA_((Sfile_t*));
145: extern int sfclearerr _SFA_((Sfile_t*));
146: extern int sfeof _SFA_((Sfile_t*));
147: extern int sferror _SFA_((Sfile_t*));
148: extern int sffileno _SFA_((Sfile_t*));
149: extern char* sfecvt _SFA_((double,int,int*,int*));
150: extern char* sffcvt _SFA_((double,int,int*,int*));
151:
152: #if __cplusplus
153: }
154: #endif
155:
156: /* fast in-line functions */
157: #define sfputc(f,c) ((f)->next >= (f)->endw ? \
158: _sfflsbuf(f,(int)((unsigned char)(c))) : \
159: (int)(*(f)->next++ = (unsigned char)(c)))
160: #define sfgetc(f) ((f)->next >= (f)->endr ? _sffilbuf(f,1) : (int)(*(f)->next++))
161: #define sfslen() (_Sfi)
162: #define sffileno(f) ((f)->file)
163: #define sforigin(f) (((f)->flags&SF_STRING) ? 0L : (f)->orig)
164: #define sfeof(f) (((f)->flags&(SF_EOF|SF_STRING)) && (f)->next >= (f)->endb)
165: #define sferror(f) ((f)->flags&SF_ERROR)
166: #define sfclearerr(f) ((f)->flags &= ~(SF_ERROR|SF_EOF))
167: #define sfpushed(f) ((f)->push)
168: #define sftmp(n) ((n) >= 0 ? _sftmpfile(n) : \
169: sfnew((Sfile_t*)0,(unsigned char*)0,-1,-1, \
170: SF_READ|SF_WRITE|SF_STRING))
171:
172: #define sfpeek(f,bufp) (((bufp) || \
173: ((f)->flags&(SF_READ|SF_WRITE|SF_STRING)) == \
174: (SF_READ|SF_WRITE|SF_STRING)) ? _sfpeek(f,bufp) : \
175: ((f)->endb - (f)->next))
176: #define sfsync(f) (((f) && (((Sfile_t*)(f))->flags&SF_STRING)) ? 0 : _sfsync(f))
177:
178: /* coding long integers in a portable and compact fashion */
179: #define SF_SBITS 6
180: #define SF_UBITS 7
181: #define SF_SIGN (1 << SF_SBITS)
182: #define SF_MORE (1 << SF_UBITS)
183: #define SF_U1 SF_MORE
184: #define SF_U2 (SF_U1*SF_U1)
185: #define SF_U3 (SF_U2*SF_U1)
186: #define SF_U4 (SF_U3*SF_U1)
187: #define sfulen(v) ((v) < SF_U1 ? 1 : (v) < SF_U2 ? 2 : \
188: (v) < SF_U3 ? 3 : (v) < SF_U4 ? 4 : 5)
189: #define sfgetu(f) ((_Sfi = sfgetc(f)) < 0 ? -1 : \
190: ((_Sfi&SF_MORE) ? _sfgetu(f) : (unsigned long)_Sfi))
191: #define sfgetl(f) ((_Sfi = sfgetc(f)) < 0 ? -1 : \
192: ((_Sfi&(SF_MORE|SF_SIGN)) ? _sfgetl(f) : (long)_Sfi))
193: #define sfputu(f,v) _sfputu((f),(unsigned long)(v))
194: #define sfputl(f,v) _sfputl((f),(long)(v))
195: #define sfputd(f,v) _sfputd((f),(double)(v))
196:
197: #define sfecvt(v,n,d,s) _sfcvt((v),(n),(d),(s),1)
198: #define sffcvt(v,n,d,s) _sfcvt((v),(n),(d),(s),0)
199:
200: #endif /* _SFIO_H */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.