dmake: do not set MAKEFLAGS=k
[unleashed/tickless.git] / usr / src / lib / libast / common / man / sfio.3
blobbd805d4ec9e70e9ca03e3fb8e471ca55b7dc73da
1 .fp 5 CW
2 .TH SFIO 3 "01 June 2008"
3 .SH NAME
4 \fBsfio\fR \- safe/fast string/file input/output
5 .SH SYNOPSIS
6 .de Tp
7 .fl
8 .ne 3
9 .TP
11 .de Ss
12 .fl
13 .ne 3
14 .SS "\\$1"
16 .ta 1.0i 2.0i 3.0i 4.0i 5.0i
17 .Ss "LIBRARIES"
18 .nf
19 .ft 5
20 #include      <sfio.h>
22 libsfio.a     -lsfio
23 libstdio.a    -lstdio
24 libsfio-mt.a  -lsfio-mt
25 libstdio-mt.a -lstdio-mt
26 .ft 1
27 .fi
28 .Ss "DATA TYPES"
29 .nf
30 .ft 5
31 Void_t;
32 Sfoff_t;
33 Sflong_t;
34 Sfulong_t;
35 Sfdouble_t;
37 Sfio_t;
39 Sfdisc_t;
40 ssize_t    (*Sfread_f)(Sfio_t*, Void_t*, size_t, Sfdisc_t*);
41 ssize_t    (*Sfwrite_f)(Sfio_t*, const Void_t*, size_t, Sfdisc_t*);
42 Sfoff_t    (*Sfseek_f)(Sfio_t*, Sfoff_t, int, Sfdisc_t*);
43 int        (*Sfexcept_f)(Sfio_t*, int, Void_t*, Sfdisc_t*);
45 Sffmt_t;
46 int        (*Sffmtext_f)(Sfio_t*, Void_t*, Sffmt_t*);
47 int        (*Sffmtevent_f)(Sfio_t*, int, Void_t*, Sffmt_t*);
49 SFIO_VERSION
50 .ft 1
51 .fi
52 .Ss "BIT FLAGS"
53 .nf
54 .ft 5
55 SF_STRING
56 SF_READ
57 SF_WRITE
58 SF_APPENDWR (SF_APPEND)
59 SF_LINE
60 SF_SHARE
61 SF_PUBLIC
62 SF_MALLOC
63 SF_STATIC
64 SF_IOCHECK
65 SF_WHOLE
66 SF_MTSAFE
67 SF_IOINTR
68 .ft 1
69 .fi
70 .Ss "OPENING/CLOSING STREAMS"
71 .nf
72 .ft 5
73 Sfio_t*    sfnew(Sfio_t* f, Void_t* buf, size_t size, int fd, int flags);
74 Sfio_t*    sfopen(Sfio_t* f, const char* string, const char* mode);
75 Sfio_t*    sfpopen(Sfio_t* f, const char* cmd, const char* mode);
76 Sfio_t*    sftmp(size_t size);
77 int        sfclose(Sfio_t* f);
80 .ft 1
81 .fi
82 .Ss "THREAD SAFETY"
83 .nf
84 .ft 5
85 int        sfmutex(Sfio_t* f, int type);
87 SFMTX_LOCK
88 SFMTX_TRYLOCK
89 SFMTX_UNLOCK
90 SFMTX_CLRLOCK
91 .ft 1
92 .fi
93 .Ss "INPUT/OUTPUT OPERATIONS"
94 .nf
95 .ft 5
96 int        sfgetc(Sfio_t* f);
97 int        sfputc(Sfio_t* f, int c);
98 int        sfnputc(Sfio_t* f, int c, int n);
99 int        sfungetc(Sfio_t* f, int c);
101 Sfulong_t  sfgetm(Sfio_t* f, Sfulong_t max);
102 int        sfputm(Sfio_t* f, Sfulong_t v, Sfulong_t max);
103 Sfulong_t  sfgetu(Sfio_t* f);
104 int        sfputu(Sfio_t* f, Sfulong_t v);
105 Sflong_t   sfgetl(Sfio_t* f);
106 int        sfputl(Sfio_t* f, Sflong_t v);
107 Sfdouble_t sfgetd(Sfio_t* f);
108 int        sfputd(Sfio_t* f, Sfdouble_t v);
110 char*      sfgetr(Sfio_t* f, int rsc, int type);
111 ssize_t    sfputr(Sfio_t* f, const char* s, int rsc);
112 Sfoff_t    sfmove(Sfio_t* fr, Sfio_t* fw, Sfoff_t n, int rsc);
114 ssize_t    sfread(Sfio_t* f, Void_t* buf, size_t n);
115 ssize_t    sfwrite(Sfio_t* f, const Void_t* buf, size_t n);
116 Sfoff_t    sfseek(Sfio_t* f, Sfoff_t offset, int type);
117 Void_t*    sfreserve(Sfio_t* f, ssize_t n, int type);
118 .ft 1
120 .Ss "DATA FORMATTING"
122 .ft 5
123 int        sfscanf(Sfio_t* f, const char* format, ...);
124 int        sfsscanf(const char* s, const char* format, ...);
125 int        sfvsscanf(const char* s, const char* format, va_list args);
126 int        sfvscanf(Sfio_t* f, const char* format, va_list args);
128 int        sfprintf(Sfio_t* f, const char* format, ...);
129 char*      sfprints(const char* format, ...);
130 char*      sfvprints(const char* format, va_list args);
131 ssize_t    sfaprints(char** sp, const char* format, ...);
132 ssize_t    sfvaprints(char** sp, const char* format, va_list args);
133 int        sfsprintf(char* s, int n, const char* format, ...);
134 int        sfvsprintf(char* s, int n, const char* format, va_list args);
135 int        sfvprintf(Sfio_t* f, const char* format, va_list args);
137 Sffmt_t;
139 SFFMT_LEFT
140 SFFMT_SIGN
141 SFFMT_BLANK
142 SFFMT_ZERO
143 SFFMT_THOUSAND
144 SFFMT_LONG
145 SFFMT_LLONG
146 SFFMT_SHORT
147 SFFMT_LDOUBLE
148 SFFMT_IFLAG
149 SFFMT_ALTER
150 SFFMT_SKIP
151 SFFMT_ARGPOS
152 SFFMT_VALUE
154 int        (*Sffmtext_f)(Sfio_t* f, Void_t* v, Sffmt_t* fe);
155 int        (*Sffmtevent_f)(Sfio_t* f, int type, Void_t* v, Sffmt_t* fe);
156 void       va_copy(va_list to, va_list fr);
157 long       sffmtversion(Sffmt_t* fe, type);
158 .ft 1
160 .Ss "BUFFERING, SYNCHRONIZATION"
162 .ft 5
163 Void_t*    sfsetbuf(Sfio_t* f, Void_t* buf, size_t size);
164 int        sfsync(Sfio_t* f);
165 int        sfpoll(Sfio_t** flist, int n, int timeout); 
166 Sfio_t*    sfpool(Sfio_t* f, Sfio_t* poolf, int mode);
167 int        sfpurge(Sfio_t* f);
168 .ft 1
170 .Ss "DISCIPLINE, EVENT HANDLING"
172 .ft 5
173 Sfdisc_t*  sfdisc(Sfio_t* f, Sfdisc_t* disc);
174 int        sfraise(Sfio_t* f, int type, Void_t* data);
175 ssize_t    sfrd(Sfio_t* f, Void_t* buf, size_t n, Sfdisc_t* disc);
176 ssize_t    sfwr(Sfio_t* f, const Void_t* buf, size_t n, Sfdisc_t* disc);
177 Sfoff_t    sfsk(Sfio_t* f, Sfoff_t offset, int type, Sfdisc_t* disc);
179 SF_NEW
180 SF_READ
181 SF_WRITE
182 SF_SEEK
183 SF_CLOSING (SF_CLOSE)
184 SF_DPUSH
185 SF_DPOP
186 SF_DPOLL
187 SF_DBUFFER
188 SF_SYNC 
189 SF_PURGE
190 SF_FINAL
191 SF_READY
192 SF_LOCKED
193 SF_ATEXIT
194 SF_EVENT
195 .ft 1
197 .Ss "STREAM CONTROL"
199 .ft 5
200 int        sfresize(Sfio_t* f, Sfoff_t size);
201 int        sfset(Sfio_t* f, int flags, int i);
202 int        sfsetfd(Sfio_t* f, int fd);
203 Sfio_t*    sfstack(Sfio_t* base, Sfio_t* top);
204 Sfio_t*    sfswap(Sfio_t* f1, Sfio_t* f2);
205 .ft 1
207 .Ss "STREAM INFORMATION"
209 .ft 5
210 Sfoff_t    sfsize(Sfio_t* f);
211 Sfoff_t    sftell(Sfio_t* f);
212 ssize_t    sfvalue(Sfio_t* f);
213 int        sffileno(Sfio_t* f);
215 int        sfstacked(Sfio_t* f);
216 int        sfeof(Sfio_t* f);
217 int        sferror(Sfio_t* f);
218 int        sfclrerr(Sfio_t* f);
219 int        sfclrlock(Sfio_t* f);
221 int        sfnotify(void (*notify)(Sfio_t* f, int type, Void_t* data));
223 int        sfwalk(Sfwalk_f walkf, Void_t* data, int type);
224 .ft 1
226 .Ss "MISCELLANEOUS FUNCTIONS"
228 .ft 5
229 ssize_t    sfmaxr(ssize_t maxr, int s);
230 ssize_t    sfslen();
231 int        sfulen(Sfulong_t v);
232 int        sfllen(Sflong_t v);
233 int        sfdlen(Sfdouble_t v);
234 ssize_t    sfpkrd(int fd, Void_t* buf, size_t n,
235                   int rsc, long tm, int action);
236 .ft 1
238 .Ss "FULL STRUCTURE SFIO_T"
240 .ft 5
241 #include   <sfio_t.h>
242 #define    SFNEW(buf,size,file,flags,disc)
243 .ft 1
245 .Ss "EXAMPLE DISCIPLINES"
247 .ft 5
248 #include   <sfdisc.h>
250 int        sfdcdio(Sfio_t* f, size_t bufsize);
251 int        sfdcdos(Sfio_t* f);
252 int        sfdcfilter(Sfio_t* f, const char* cmd);
253 int        sfdcseekable(Sfio_t* f);
254 int        sfdcslow(Sfio_t* f);
255 int        sfdcsubstream(Sfio_t* f, Sfio_t* parent,
256                          Sfoff_t offset, Sfoff_t extent);
257 int        sfdctee(Sfio_t* f, Sfio_t* tee);
258 int        sfdcunion(Sfio_t* f, Sfio_t** array, int n);
259 int        sfdclzw(Sfio_t* f);
260 int        sfdcgzip(Sfio_t* f, int flags);
261 .ft 1
263 .Ss "STDIO-COMPATIBILITY"
265 .ft 5
266 #include   <stdio.h>
267 cc ... -lstdio -lsfio
268 cc ... -lstdio-mt -lsfio-mt
269 .ft 1
271 .SH DESCRIPTION
273 Sfio provides I/O functions to manage buffered streams.
274 Each Sfio stream is a \fIfile stream\fP, representing a file (see \f5open(2)\fP),
275 or a \fIstring stream\fP, representing a memory segment.
276 Beyond the usual I/O operations on streams,
277 Sfio provides I/O disciplines for extended data processing,
278 stream stacks for recursive stream processing, and
279 stream pools for automatic data synchronization.
280 Applications can extend the \f5sfprintf()/sfscanf()\fP functions
281 to define their own conversion patterns as well as redefine existing ones.
283 A discipline defines analogues of 
284 the system calls \f5read(2), write(2)\fP and \f5lseek(2)\fP.
285 Such system calls or their discipline replacements are used to process stream data.
286 Henceforth, ``\fIsystem call\fP'' will refer to either a system call
287 or its discipline replacement.
289 A system call is said to cause an exception if its return value is non-positive.
290 Unless overridden by exception handlers (see \f5sfdisc()\fP),
291 an interrupted system call (\f5errno == EINTR\fP on UNIX systems)
292 will be automatically reinvoked to continue the ongoing operation.
294 The buffer of a stream is typically a memory segment allocated via \f5malloc(3)\fP
295 or supplied by the application.
296 File streams may also use memory mapping (\f5mmap(2)\fP) if that is more efficient.
297 When memory mapping is used,
298 the underlying file should not be truncated while the stream is active.
299 Memory mapping can be turned off using \f5sfsetbuf()\fP.
301 There are three \fIstandard streams\fP:
302 \f5sfstdin\fP for input (file descriptor \f50\fP on UNIX systems),
303 \f5sfstdout\fP for normal output (file descriptor \f51\fP), and
304 \f5sfstderr\fP for error output (file descriptor \f52\fP).
307 .Ss "LIBRARIES"
309 This version of Sfio can be built and used for both uni-threaded and multi-threaded
310 environments. In the former case, streams are not protected from
311 simultaneous accesses by different threads. In the latter case, a stream
312 is typically locked with a mutex during access so that another thread
313 trying to access the same stream will block until the mutex is released.
315 A program that does not use multiple threads can link with \fBlibsfio.a\fP
316 while a program that uses multiple threads should link with \fBlibsfio-mt.a\fP.
317 The libraries \fBlibstdio.a\fP and \fBlibstdio-mt.a\fP provide
318 corresponding Stdio functions to link with code already compiled using the
319 native header \fBstdio.h\fP instead of the one provided by Sfio.
322 .Ss "DATA TYPES"
324 .Ss "  Void_t*"
325 This defines a type suitable to exchange
326 data of unknown types between application and Sfio.
327 \f5Void_t\fP is a macro defined as \f5void\fP for ANSI-C and C++ and
328 \f5char\fP for other compilation environments.
330 .Ss "  Sfoff_t"
331 This defines an integral type suitable to address
332 the largest possible file extent.
334 .Ss "  Sfulong_t, Sflong_t, Sfdouble_t"
335 These are respectively the largest
336 unsigned integer, signed integer, and floating point value types on the local platform.
338 .Ss "  Sfio_t"
339 This defines the type of a stream handle.
341 .Ss "  Sfdisc_t"
342 .Ss "  ssize_t (*Sfread_f)(Sfio_t*, Void_t*, size_t, Sfdisc_t*)"
343 .Ss "  ssize_t (*Sfwrite_f)(Sfio_t*, const Void_t*, size_t, Sfdisc_t*)"
344 .Ss "  Sfoff_t (*Sfseek_f)(Sfio_t*, Sfoff_t, int, Sfdisc_t*)"
345 .Ss "  int (*Sfexcept_f)(Sfio_t*, int, Void_t*, Sfdisc_t*)"
346 \f5Sfdisc_t\fP defines a stream discipline structure.
347 \f5Sfread_f\fP, \f5Sfwrite_f\fP and \f5Sfseek_f\fP are the types
348 of discipline functions to replace the system calls:
349 \f5read(2)\fP, \f5write(2)\fP and \f5lseek(2)\fP.
350 \f5Sfexcept_f\fP is the type of an event-handling function.
351 See \f5sfdisc()\fP for more details.
353 .Ss "  Sffmt_t"
354 .Ss "  int (*Sffmtext_f)(Sfio_t*, Void_t*, Sffmt_t*)"
355 .Ss "  int (*Sffmtevent_f)(Sfio_t*, int, Void_t*, Sffmt_t*)"
356 \f5Sffmt_t\fP defines a formatting environment that can be used
357 to extend scanning and printing in the \f5sfprint()/sfscanf()\fP
358 functions. \f5Sffmtext_f\fP and \f5Sffmtevent_f\fP define the types
359 of extension functions definable in \f5Sffmt_t\fP.
360 See \f5Sffmt_t\fP below for more details.
362 .Ss "  SFIO_VERSION"
363 This is a macro value of type \f5long int\fP that defines
364 the current version number of Sfio. For example, the Sfio2000's
365 version number is \f520000515L\fP
366 (which also indicates its latest version date: 05/15/2000).
368 .Ss "BIT FLAGS"
369 A number of bit flags control stream operations.
370 They are set either at stream initialization or by calling \f5sfset()\fP.
371 Following are the flags:
373 \f5SF_STRING\fP:
374 The stream is memory-based.
376 \f5SF_READ\fP, \f5SF_WRITE\fP, \f5SF_APPENDWR\fP (\f5SF_APPEND\fP):
377 Flags \f5SF_READ\fP and \f5SF_WRITE\fP indicate readability and writability.
378 Flag \f5SF_APPENDWR\fP asserts that the stream is a file opened in append mode
379 (see \f5open(2)\fP and \f5fcntl(2)\fP)
380 so that data is always output at the end of file.
381 On systems without direct support for append mode,
382 Sfio uses \f5lseek(2)\fP or its discipline replacement
383 to approximate this behavior.
385 \f5SF_LINE\fP:
386 The stream is line-oriented.
387 For a \f5SF_WRITE\fP stream,
388 this means that buffered data is flushed
389 whenever a new-line character, \f5\en\fP, is output.
390 For a \f5SF_READ\fP stream, \f5SF_LINE\fP is only
391 significant during calls to functions in the \f5sfscanf()\fP family.
392 \f5SF_LINE\fP is set on initialization of
393 any stream representing a terminal device.
395 \f5SF_SHARE\fP, \f5SF_PUBLIC\fP:
396 Flag \f5SF_SHARE\fP means that the underlying file descriptor
397 is shared by independent entities (for example, multiple processes).
399 For a seekable file stream, \f5SF_SHARE\fP means that
400 the logical stream and the physical file positions will be made the same
401 before a system call to perform physical I/O.
402 There are different possibilities.
403 If \f5SF_PUBLIC\fP is not set,
404 the physical file position is made equal to the logical stream position.
405 If \f5SF_PUBLIC\fP is set, there are two cases.
406 If the physical file position has changed from its last known position,
407 the logical stream position is made equal to the new physical file position.
408 Finally, if the physical file location remains the same as its last known position,
409 the physical file position is made the same as the logical stream position.
411 For an unseekable stream (e.g., pipes or terminal devices), if possible,
412 \f5SF_SHARE\fP means that
413 the block and record I/O operations (\f5sfread()\fP, \f5sfwrite()\fP, \f5sfmove()\fP,
414 \f5sfgetr()\fP, \f5sfputr()\fP, \f5sfreserve()\fP, \f5sfscanf()\fP
415 and \f5sfvprintf()\fP) will ensure:
416 (1) after each writing operation, the stream is synchronized and
417 (2) each reading operation only reads the requested amount.
418 Note, however, that (2) is not always possible
419 without proper OS facilities such as \f5recv(2)\fP or \f5streamio(4)\fP.
421 A standard stream that is seekable will be initialized with \f5SF_SHARE|SF_PUBLIC\fP.
423 \f5SF_MALLOC\fP:
424 The stream buffer was obtained via \f5malloc(3)\fP
425 and can be reallocated or freed.
427 \f5SF_STATIC\fP:
428 The stream structure should not be freed when closed (\f5sfclose()\fP).
429 This flag is used by an applications that allocate their own
430 stream structures. Such applications must use the header file \f5sfio_t.h\fP
431 instead of \f5sfio.h\fP.
433 \f5SF_IOCHECK\fP:
434 If the stream has a discipline exception handler,
435 exceptions will be raised in \f5sfsync()\fP, \f5sfpurge()\fP
436 or before a system call \f5read(2)\fP or \f5write(2)\fP (see \f5sfdisc()\fP).
438 \f5SF_WHOLE\fP:
439 This flag guarantees that data written in any single \f5sfwrite()\fP or
440 \f5sfputr()\fP call will always be output as a whole to the output device.
441 This is useful in certain applications (e.g., networking) where a complex object
442 must be output without being split in different system calls.
443 Note that the respective stream still buffers data as much as the buffer can accomodate.
445 \f5SF_MTSAFE\fP:
446 This flag indicates that the respective stream may be accessed by more than one threads.
447 A mutex lock will be used to ensure that only one thread at a time can access
448 the stream. Note that this flag can only be set at stream opening time
449 (see \f5sfopen()\fP, \f5sfpopen()\fP and \f5sfnew()\fP).
450 Certain fast macro functions such as \f5sfgetc()\fP and \f5sfputc()\fP will
451 no longer behave as macros. Thus, an application that requires such fast macro functions
452 should leave \f5SF_MTSAFE\fP off and performs explicit locking with \f5sfmutex()\fP.
454 \f5SF_IOINTR\fP:
455 This flag indicates that I/O system calls should not be resumed 
456 after being interrupted by signals. It is useful for 
457 aborting I/O operations on such interruptions. Note, however,
458 than certain operating systems (e.g., BSD Unix systems) may automatically
459 resume interrupted system calls outside the scope of the library. On such systems,
460 \f5SF_IOINTR\fP will be ineffective.
463 .Ss "OPENING/CLOSING STREAMS"
465 .Ss "  Sfio_t* sfnew(Sfio_t* f, Void_t* buf, size_t size, int fd, int flags)"
466 This function creates or renews a stream.
467 It returns the new stream on success and \f5NULL\fP on error.
469 \f5f\fP:
470 If \f5f\fP is \f5NULL\fP, a new stream is created.
471 Otherwise, \f5f\fP is reused.
472 In this case, if \f5flags\fP does not have \f5SF_EOF\fP,
473 \f5f\fP shall be closed via \f5sfclose()\fP before being reused.
474 During a stream renewal, buffer, pool and discipline stack are preserved.
475 Note that, except for \f5SF_STATIC\fP streams,
476 renewing a stream already closed will result in undefined behavior.
478 \f5buf\fP, \f5size\fP:
479 These determine a buffering scheme.
480 See \f5sfsetbuf()\fP for more details.
482 \f5fd\fP:
483 If \f5SF_STRING\fP is specified in \f5flags\fP, this is ignored.
484 Otherwise, \f5fd\fP is a file descriptor (e.g., from \f5open(2)\fP)
485 to use for raw data I/O.
486 Note that Sfio supports unseekable file descriptors
487 opened for both read and write, e.g., sockets.
489 \f5flags\fP:
490 This is composed from \f5SF_EOF\fP and
491 bit values defined in the \fBBIT FLAGS\fP section.
492 Note, in particular, that a multi-threaded application should
493 set the bit \f5SF_MTSAFE\fP to protect the new stream from
494 being simultaneously accessed by multiple threads.
496 .Ss "  Sfio_t* sfopen(Sfio_t* f, const char* string, const char* mode)"
498 If \f5string\fP is \f5NULL\fP,
499 \f5f\fP is a file stream and
500 \f5mode\fP does not imply a string stream,
501 \f5sfopen()\fP changes the modes of \f5f\fP according to \f5mode\fP.
502 In this case, \f5sfopen()\fP returns \f5f\fP on success and \f5NULL\fP on error.
503 This somewhat unusual usage of \f5sfopen()\fP is good for
504 resetting certain predefined modes in standard streams including
505 \fItext/binary\fP and \fIappend\fP that are inherited from some parent process.
506 Note also that \f5SF_READ\fP and \f5SF_WRITE\fP can only be reset if the stream
507 is not yet initialized.
509 \f5sfopen()\fP is normally used to create a new stream or renew a stream.
510 In this case, it returns the new stream on success and \f5NULL\fP on error.
511 Below are the meanings of the arguments:
513 \f5f\fP:
514 This is treated as in \f5sfnew()\fP.
516 \f5string\fP:
517 This is a file name or a string to perform I/O on.
518 See above for when this is \f5NULL\fP.
520 \f5mode\fP:
521 This is composed from the set of letters \f5{s, r, w, +, a, b, t, x, m, u}\fP.
522 When conflicting options are present in the same \f5mode\fP string,
523 the last one will take effect.
525 \f5s\fP specifies opening a string stream.
526 \f5string\fP can be a null-terminated string or \f5NULL\fP.
527 Specifying \f5s\fP alone is equivalent to specifying \f5sr\fP.
528 If \f5s\fP is not specified, \f5string\fP defines a file name.
530 \f5r\fP and \f5w\fP specify read and write modes.
531 Write mode creates and/or truncates the given file to make an empty file.
532 The \f5+\fP modifier indicates that the stream is opened for both read and write.
534 \f5a\fP specifies append mode, i.e., data is always output at end of file.
536 \f5b\fP and \f5t\fP specify binary and text modes.
538 \f5x\fP specifies exclusive mode, i.e.,
539 a file opened for writing should not already exist.
541 \f5m\fP specifies that the stream needs to be protected from
542 simultaneous accesses by multiple threads.
543 This turns on the bit flag \f5SF_MTSAFE\fP.
545 \f5u\fP specifies that the stream is guaranteed to be accessed
546 by only one thread at a time. The bit flag \f5SF_MTSAFE\fP is left off.
547 The absence of option \f5m\fP is the same as the presence of option \f5u\fP.
549 .Ss "  Sfio_t* sfpopen(Sfio_t* f, const char* cmd, const char* mode)"
550 This function opens a stream that corresponds to the coprocess \f5cmd\fP.
551 The argument \f5mode\fP should be composed from \f5r\fP, \f5w\fP, and \f5+\fP.
552 The argument \f5f\fP, if not \f5NULL\fP, is a stream to be renewed (see \f5sfnew()\fP).
553 \f5sfpopen()\fP returns the new stream or \f5NULL\fP on error.
555 The standard input/output of \f5cmd\fP
556 is connected to the application via a pipe if the stream is opened for writing/reading.
557 If the stream is opened for both reading and writing,
558 there will be two different associated file descriptors, one for each type of I/O
559 (note the effect on \f5sffileno()\fP).
561 On opening a coprocess for writing (i.e., \f5mode\fP contains \f5w\fP or \f5+\fP),
562 the signal handler for \f5SIGPIPE\fP in the parent application
563 will be set to \f5SIG_IGN\fP if it is \f5SIG_DFL\fP at that time.
564 This protects the parent application from being accidentally killed
565 on writing to a coprocess that closes its reading end.
566 Applications that need to detect such write errors should use
567 disciplines and exception handlers (see \f5sfdisc()\fP).
569 The command \f5cmd\fP
570 is executed by an \fIinterpreter\fP which is either \f5/bin/sh\fP
571 or an executable command defined by the environment variable \f5SHELL\fP.
572 In either case, the interpreter is invoked with 2 arguments, respectively \f5-c\fP
573 and the given command \f5cmd\fP. When the interpreter is \f5/bin/sh\fP or
574 \f5/bin/ksh\fP, \f5sfpopen()\fP may execute the command \f5cmd\fP itself
575 if there are no shell meta-characters in \f5cmd\fP.
577 .Ss "  Sfio_t* sftmp(size_t size)"
578 This function creates a stream for temporary data.
579 It returns the new stream or \f5NULL\fP on error.
581 A stream created by \f5sftmp()\fP can be completely or partially memory-resident.
582 If \f5size\fP is \f5SF_UNBOUND\fP, the stream is a pure string stream.
583 If \f5size\fP is zero, the stream is a pure file stream.
584 Otherwise, the stream is first created as a string stream but when
585 its buffer grows larger than \f5size\fP or on any attempt to change disciplines,
586 a temporary file is created.
587 Two environment variables, \f5TMPPATH\fP and \f5TMPDIR\fP,
588 direct where temporary files are created.
589 \f5TMPPATH\fP, if defined,
590 specifies a colon-separated set of directories to be
591 used in a round-robin fashion to create files.
592 If \f5TMPPATH\fP is undefined,
593 \f5TMPDIR\fP can be used to specify a single directory to create files.
594 If neither of \f5TMPPATH\fP and \f5TMPDIR\fP are defined, \f5/tmp\fP is used.
596 .Ss "  int sfclose(Sfio_t* f)"
597 This function closes the stream \f5f\fP and frees its resources.
598 \f5SF_STATIC\fP should be used if the stream space is to be preserved.
599 If \f5f\fP is the base of a stream stack (see \f5sfstack()\fP),
600 all streams on the stack are closed.
601 If \f5f\fP is a \f5sfpopen\fP-stream,
602 \f5sfclose()\fP waits until the associated command terminates
603 and returns its exit status.
604 \f5sfclose()\fP returns \f5-1\fP for failure and \f50\fP for success.
606 \f5SF_READ|SF_SHARE\fP and \f5SF_WRITE\fP streams
607 are synchronized before closing (see \f5sfsync()\fP).
608 If \f5f\fP has disciplines,
609 their exception handlers will be called twice.
610 The first exception handler call has the \f5type\fP argument as one of
611 \f5SF_CLOSING\fP or \f5SF_NEW\fP (see \f5sfdisc()\fP.)
612 The latter, \f5SF_NEW\fP is used when a stream is being closed via \f5sfnew()\fP
613 so that it can be renewed.
614 The second call uses \f5type\fP as \f5SF_FINAL\fP
615 and is done after all closing operations have succeeded but before
616 the stream itself is deallocated.
617 In either case, if the exception handler returns a negative value,
618 \f5sfclose()\fP will immediately return this value.
619 If the exception handler returns a positive value,
620 \f5sfclose()\fP will immediately return a zero value.
623 .Ss "THREAD SAFETY"
625 The libraries \f5libsfio.a\fP and \f5libstdio.a\fP (providing binary
626 compatibility to Stdio-based code) only support uni-threaded code.
627 Multi-threaded applications should link with
628 \f5libsfio-mt.a\fP and \f5libstdio-mt.a\fP.
629 When this is done, certain platforms may require additional
630 thread libraries for linkage. For example, Linux, Irix and Solaris
631 require \f5-lpthread\fP while HPUX requires \f5-lcma\fP.
632 Aside from linkage differences, the Sfio API remains identical in all cases.
634 Note that unlike Stdio streams which are in thread-safe mode by default.
635 Sfio streams can be opened in either uni-threaded or multi-threaded mode.
636 A uni-threaded stream is more efficient than a multi-threaded one.
637 For example, functions such as \f5sfgetc()\fP and \f5sfputc()\fP
638 remain as macro or inline functions for a uni-threaded stream while
639 they will act as full function calls in a multi-threaded case.
640 The three standard streams \f5sfstdin/sfstdout/sfstderr\fP
641 are in multi-threaded mode by default
642 (however, see \f5sfopen()\fP for how this may be changed).
643 Other Sfio streams are normally opened uni-threaded unless
644 the flag \f5SF_MTSAFE\fP or the option \f5m\fP were specified.
645 Stdio-based code can also make a Stdio stream uni-threaded by
646 using the option \f5u\fP when opening a file.
649 .Ss "int sfmutex(Sfio_t* f, int type)"
650 This function acquires or releases a mutex
651 (mutually exclusive) lock on the stream \f5f\fP.
652 It can be used by a thread to serialize a sequence of I/O operations
653 executed together in some critical section.
654 \f5sfmutex()\fP is implicitly used by
655 all Sfio operations on a stream with the flag \f5SF_MTSAFE\fP to
656 protect it from concurrent accesses via multiple threads.
657 \f5sfmutex()\fP returns \f50\fP on success and some non-zero value on failure.
659 Each stream has a lock count which starts at \f50\fP.
660 When the count is positive, a single thread holds the stream.
661 Only this thread can further lock or unlock the stream.
662 A different thread attempting to acquire such a locked stream will suspend
663 until the lock count returns to \f50\fP.
664 Each successful locking operation increases the lock count
665 while each successful unlocking operation decreases it,
666 thus, allowing nesting of matching lock/unlock operations.
668 The \f5type\fP argument of \f5sfmutex()\fP takes on the below values:
670 \f5SFMTX_LOCK\fP:
671 Locking a stream if it is unlocked or increasing the lock count of the stream
672 if it is already locked by the same thread. This call will block until it is
673 possible to lock the stream.
675 \f5SFMTX_TRYLOCK\fP:
676 This is the non-blocking version of \f5SFMTX_LOCK\fP.
677 If the stream is already locked by a different thread, \f5sfmutex()\fP will
678 immediately return with an error status.
680 \f5SFMTX_UNLOCK\fP:
681 Decreasing the lock count and releasing the stream when the lock count reaches 0.
682 An attempt to unlock a stream without a previously successful lock may
683 result in undefined behavior in certain implementations.
684 The current Sfio implementation returns an error status.
686 \f5SFMTX_CLRLOCK\fP:
687 Resetting the lock count to \f50\fP and releasing the stream.
688 As with \f5SFMTX_LOCK\fP,
689 an attempt to clear the lock count without a previously successful lock
690 may result in undefined behavior.
692 .Ss "INPUT/OUPUT OPERATIONS"
694 .Ss "  int sfgetc(Sfio_t* f)"
695 .Ss "  int sfputc(Sfio_t* f, int c)"
696 These functions read/write a byte  from/to stream \f5f\fP.
697 \f5sfgetc()\fP returns the byte read or \f5-1\fP on error.
698 \f5sfputc()\fP returns \f5c\fP on success and \f5-1\fP on error.
700 .Ss "  ssize_t sfnputc(Sfio_t* f, int c, size_t n)"
701 This function attempts to write the byte \f5c\fP to \f5f\fP \f5n\fP times.
702 It returns the number of bytes actually written or \f5-1\fP on failure.
704 .Ss "  int sfungetc(Sfio_t* f, int c)"
705 This function pushes the byte \f5c\fP back into \f5f\fP.
706 If \f5c\fP matches the byte immediately before the current position in buffered data,
707 the current position is simply backed up (note the effect on \f5sftell()\fP and
708 \f5sfseek()\fP). There is no theoretical limit on the number of bytes that
709 can be pushed back into a stream. Pushed back bytes not part of
710 buffered data will be discarded on any operation that implies
711 buffer synchronization.
712 \f5sfungetc()\fP returns \f5c\fP on success and \f5-1\fP on failure.
714 .Ss "  Sfulong_t sfgetm(Sfio_t* f, Sfulong_t max)"
715 .Ss "  int sfputm(Sfio_t* f, Sfulong_t v, Sfulong_t max)"
716 These functions read and write \f5Sfulong_t\fP values
717 encoded in a portable format given that the values are at most \f5max\fP.
718 Portability across a write architecture and a read architecture
719 requires that the bit order in a byte is the same on both architectures and
720 the written value is storable in an \f5Sfulong_t\fP on the read architecture.
721 \f5sfgetm()\fP returns the value read or \f5-1\fP on error.
722 \f5sfputm()\fP returns the number of bytes written or \f5-1\fP on error.
724 .Ss "  Sfulong_t sfgetu(Sfio_t* f)"
725 .Ss "  int sfputu(Sfio_t* f, Sfulong_t v)"
726 These functions read and write \f5Sfulong_t\fP values
727 in a compact variable-length portable format.
728 Portability across a write architecture and a read architecture
729 requires that the bit order in a byte is the same on both architectures and
730 the written value is storable in an \f5Sfulong_t\fP on the read architecture.
731 \f5sfgetu()\fP returns the value read or \f5-1\fP on error.
732 \f5sfputu()\fP returns the number of bytes written or \f5-1\fP on error.
733 See also \f5sfulen()\fP.
735 .Ss "  Sflong_t sfgetl(Sfio_t* f)"
736 .Ss "  int sfputl(Sfio_t* f, Sflong_t v)"
737 These functions are similar to \f5sfgetu()\fP and \f5sfputu()\fP
738 but for reading and writing (signed) \f5Sflong_t\fP values.
739 See also \f5sfllen()\fP.
741 .Ss "  Sfdouble_t sfgetd(Sfio_t* f)"
742 .Ss "  int sfputd(Sfio_t* f, Sfdouble_t v)"
743 These functions read and write \f5Sfdouble_t\fP values.
744 In this case, portability depends on the input and output architectures
745 having the same floating point value representation.
746 Values are coded and decoded using \f5ldexp(3)\fP and \f5frexp(3)\fP
747 so they are constrained to the sizes supported by these functions.
748 See also \f5sfdlen()\fP.
750 .Ss "  char* sfgetr(Sfio_t* f, int rsc, int type)"
751 This function reads a record of data ending in the record separator \f5rsc\fP.
752 After \f5sfgetr()\fP returns, the length of the record even if it is incomplete
753 can be retrieved with \f5sfvalue()\fP.
754 \f5sfgetr()\fP returns the record on success and \f5NULL\fP on error.
755 See also \f5sfmaxr()\fP for limiting the amount of data read to construct a record.
757 The \f5type\fP argument is composed of some subset of the below bit flags:
759 \f5SF_STRING\fP:
760 A null byte will replace the record separator to make the record into a C string.
761 Otherwise, the record separator is left alone.
763 \f5SF_LOCKR\fP:
764 Upon successfully obtaining a record \f5r\fP,
765 the stream will be locked from further access until it is released with
766 a call \f5sfread(f,r,0)\fP.
768 \f5SF_LASTR\fP:
769 This should be used only after a failed \f5sfgetr()\fP to retrieve
770 the last incomplete record. In this case, \f5rsc\fP is ignored.
772 .Ss "  ssize_t sfputr(Sfio_t* f, const char* s, int rsc)"
773 This function writes the null-terminated string \f5s\fP to \f5f\fP.
774 If \f5rsc\fP is non-negative, \f5(unsigned char)rsc\fP is output after the string.
775 \f5sfputr()\fP returns the number of bytes written or \f5-1\fP on failure.
777 .Ss "  Sfoff_t sfmove(Sfio_t* fr, Sfio_t* fw, Sfoff_t n, int rsc)"
778 This function moves objects
779 from input stream \f5fr\fP to output stream \f5fw\fP.
780 \f5sfmove()\fP returns the number of objects moved or \f5-1\fP on failure.
782 An object can be either a byte if the record separator argument
783 \f5rsc\fP is negative or a record of \f5rsc\fP is non-negative.
784 In the latter case, a record is incomplete if it does not end in \f5rsc\fP. 
785 Generally speaking, a stream can have at most one incomplete record.
786 If \f5n\fP is negative, all complete objects of \f5fr\fP will be moved.
787 Otherwise, \f5n\fP indicates the number of objects to move.
788 If either \f5fr\fP or \f5fw\fP is \f5NULL\fP, it acts
789 as if it is a stream corresponding to \f5/dev/null\fP,
790 the UNIX device that has no read data and throws away any write data.
791 For example, the call \f5sfmove(f,(Sfio_t*)0,(Sfoff_t)(-1),'\en')\fP
792 counts the number of complete lines in stream \f5f\fP.
794 .Ss "  ssize_t sfread(Sfio_t* f, Void_t* buf, size_t n)"
795 This function reads up to \f5n\fP bytes from \f5f\fP into buffer \f5buf\fP.
796 It returns the number of bytes actually read or \f5-1\fP on error.
798 .Ss "  ssize_t sfwrite(Sfio_t* f, const Void_t* buf, size_t n)"
799 This function writes \f5n\fP bytes from \f5buf\fP to \f5f\fP.
800 If \f5f\fP is \f5SF_STRING\fP, and the buffer is not large enough,
801 an \f5SF_WRITE\fP exception shall be raised.
802 \f5sfwrite()\fP returns the number of bytes written or \f5-1\fP on failure.
804 .Ss "  Sfoff_t sfseek(Sfio_t* f, Sfoff_t offset, int type)"
805 This function sets a new I/O position for \f5f\fP.
806 It returns the new position or \f5-1\fP on failure.
808 If the stream is a \f5SF_STRING\fP stream and the new
809 address is beyond the current buffer extent,
810 an \f5SF_SEEK\fP exception will be raised (see \f5sfdisc()\fP).
812 The new position is determined based on \f5offset\fP and
813 \f5type\fP which is composed from the bit flags:
815 \f50\fP or \f5SEEK_SET\fP:
816 \f5offset\fP is the desired position.
818 \f51\fP or \f5SEEK_CUR\fP:
819 \f5offset\fP is relative to the current position (see \f5SF_PUBLIC\fP below).
821 \f52\fP or \f5SEEK_END\fP:
822 \f5offset\fP is relative to the physical end of file.
824 \f5SF_SHARE\fP:
825 The stream is treated as if it has the control bit \f5SF_SHARE\fP on.
826 This implies that a system call seek will be done to ensure that the
827 location seeking to is valid.
829 \f5SF_PUBLIC\fP:
830 The stream is treated as if it has the control bit \f5SF_PUBLIC\fP on.
831 If the physical file position has changed from its last known location,
832 the current position is taken as the new physical position.
833 Otherwise, the current position is the logical stream position.
835 .Ss "  Void_t* sfreserve(Sfio_t* f, ssize_t n, int type)"
836 This function reserves a data block from the stream \f5f\fP.
837 It returns the reserved data block on success and \f5NULL\fP on failure.
839 If \f5f\fP is a \f5SF_READ\fP stream, the data block is a segment of input data.
840 If \f5f\fP is a \f5SF_WRITE\fP stream, the data block is a buffer
841 suitable for writing output data.
842 For consistency, if \f5f\fP is opened with \f5SF_READ|SF_WRITE\fP,
843 it will normally be treated as if it is a \f5SF_READ\fP stream
844 (see \f5sfset()\fP for forcing a particular mode) but the returned
845 buffer can also be written into (more below).
846 However, it is possible to bias to \f5SF_WRITE\fP when the \f5type\fP
847 argument is non-negative by adding the \f5SF_WRITE\fP bit \f5type\fP.
848 In any case, a reserved data block is guaranteed to be valid only until
849 a future access to the stream \f5f\fP.
851 When \f5f\fP is \f5SF_READ\fP, \f5SF_SHARE\fP and unseekable,
852 \f5sfreserve()\fP will attempt to peek at input data without
853 consuming it. This enables separate processes to share in reading
854 input from unseekable file descriptors (e.g., pipes or devices).
855 However, this use of \f5sfreserve()\fP may fail
856 on certain platforms that do not properly support
857 peeking on unseekable file descriptors.
859 After a \f5sfreserve()\fP call, whether or not it succeeds,
860 \f5sfvalue(f)\fP gives the size of the available data block.
861 Any partially reserved data block after a failed \f5sfreserve()\fP
862 call can be obtained in another \f5sfreserve()\fP call with the argument
863 \f5type\fP being \f5SF_LASTR\fP. The second argument \f5n\fP
864 to \f5sfreserve()\fP will be ignored in this case.
866 A \f5sfreserve()\fP call is successful if it can obtain a data block 
867 of size at least the absolute value of \f5n\fP.
868 For a \f5SF_READ\fP atream, the argument \f5n\fP is treated as follows:
870 \f5n < 0\fP:
871 \f5sfreserve()\fP attempts to get \fIat least\fP \f5|n|\fP bytes
872 into the buffer.
874 \f5n == 0\fP:
875 If the argument \f5type\fP is \f50\fP,
876 \f5sfreserve()\fP attempts to get \fIat least\fP \f51\fP byte into the buffer
877 but does not consume it (as consistent with \f5n == 0\fP).
878 If \f5type != 0\fP, no attempt will be made to read data into the buffer.
879 For example, the call \f5sfreserve(f, 0, -1)\fP only returns the buffer status,
880 i.e., size of existing buffered data and pointer to such data, if any.
881 The call \f5sfreserve(f, 0, SF_LOCKR)\fP is similar but also locks the stream.
883 \f5n > 0\fP:
884 \f5sfreserve()\fP will use attempt to get \fIat most\fP \f5n\fP bytes into
885 the buffer. Further, if \f5type == \f5SF_LOCKR\fP (see below), read attempts
886 end on a positive amount.
888 For a successful reservation, the argument \f5type\fP dictates treatment
889 as follows:
891 \f5type == SF_LASTR\fP:
892 After a \f5sfreserve()\fP call with \f5type != SF_LOCKR\fP fails,
893 there may be some left over data not accessible via conventional Sfio calls.
894 Immediately after such a failed call,
895 another call to \f5sfreserve\fP with \f5type == SF_LASTR\fP will return any left over
896 data and also advance the stream I/O position by the amount of returned data.
898 \f5type < 0\fP:
899 If \f5n > 0\fP, the stream I/O position is advanced by \f5n\fP.
900 If \f5n < 0\fP, the stream I/O position is advanced by the amount
901 of available data.
902 For example, a successful \f5sfreserve(f, -1, -1)\fP call will return a
903 buffer of data and simultanously advance the stream I/O position by the amount
904 indicated by \f5sfvalue(f)\fP.
906 \f5type == SF_LOCKR\fP:
907 The stream I/O position remains unchanged.
908 In addition, \f5f\fP will be locked from further access.
909 As appropriate to the stream type (\f5SF_READ\fP, \f5SF_WRITE\fP or both),
910 \f5f\fP can be unlocked later
911 with one of \f5sfread(f,rsrv,size)\fP or \f5sfwrite(f,rsrv,size)\fP
912 where \f5rsrv\fP is the reserved data block and \f5size\fP is the amount of
913 data to be consumed. For example, if \f5f\fP is a locked \f5SF_READ\fP stream,
914 the call \f5sfread(f,rsrv,1)\fP will reopen the stream and simultaneously
915 advance the stream I/O position by \f51\fP.
916 Finally, a stream opened for both reading and writing
917 can release the lock with either call (with associated operational semantics!)
918 For example, the below code reads 10 bytes of data from a stream
919 opened with both \f5SF_READ\fP and \f5SF_WRITE\fP, modifies the data in place,
920 then rewrites the new data back to the stream:
923 .ft 5
924     rsrv = sfreserve(f, 10, 1);
925     for(i = 0; i < 10; ++i)
926         rsrv[i] = toupper(rsrv[i]);
927     sfwrite(f, rsrv, 10);
928 .ft 1
931 .ne 6
933 .Ss "DATA FORMATTING"
935 Data printing and scanning are done via the
936 \f5sfprintf()\fP and \f5sfscanf()\fP family of functions.
937 These functions are similar to their
938 ANSI-C \f5fprintf()\fP and \f5fscanf()\fP counterparts.
939 However, the Sfio versions have been extended for both portability and generality.
940 In particular, a notion of a formatting environment stack is introduced.
941 Each formatting element on the stack
942 defines a separate \fIformatting pair\fP of a format specification string,
943 \f5char* format\fP (the usual second argument in the formatting
944 functions), and an argument list, \f5va_list args\fP (the third argument
945 in functions \f5sfvprintf()\fP and \f5sfvscanf()\fP).
946 A formatting environment element may also specify extension functions
947 to obtain or assign arguments and to provide new semantics for pattern processing.
948 To simplify the description below, whenever we talk
949 about an argument list, unless noted otherwise,
950 it is understood that this means either the true
951 argument list when there is no extension function or the action to be taken
952 by such a function in processing arguments.
953 The manipulation of the formatting environment stack is done
954 via the pattern \f5!\fP discussed below.
956 .Ss "%! and Sffmt_t"
957 The pattern \f5%!\fP manipulates the formatting environment stack to
958 (1) change the top environment to a new environment,
959 (2) stack a new environment on top of the current top,
960 or (3) pop the top environment.
961 The bottom of the environment stack always contains a virtual environment with the
962 original formatting pair and without any extension functions.
964 The top environment of a stack, say \f5fe\fP, is automatically popped whenever
965 its format string is completely processed.
966 In this case, its event-handling function (if any) is called
967 as \f5(*eventf)(f,SF_FINAL,NIL(Void_t*),fe)\fP.
968 The top environment
969 can also be popped by giving an argument \f5NULL\fP to \f5%!\fP
970 or by returning a negative value in an extension function.
971 In these cases, the event-handling function is called
972 as \f5(*eventf)(f,SF_DPOP,form,fe)\fP where \f5form\fP is the remainder
973 of the format string. A negative return value from the event handling function
974 will prevent the environment from being popped.
976 A formatting environment is a structure of type \f5Sffmt_t\fP
977 which contains the following elements:
980 .ft 5
981     Sffmtext_f   extf;   /* extension processor        */
982     Sffmtevent_f eventf; /* event handler              */
984     char*        form;   /* format string to stack     */
985     va_list      args;   /* corresponding arg list     */
986         
987     int          fmt;    /* pattern being processed    */
988     ssize_t      size;   /* object size                */
989     int          flags;  /* formatting control flags   */
990     int          width;  /* width of field             */
991     int          precis; /* precision required         */
992     int          base;   /* conversion base            */
994     char*        t_str;  /* extfdata string            */
995     int          n_str;  /* length of t_str            */
996 .ft 1
999 The first four elements of \f5Sffmt_t\fP must be defined by the application
1000 before the structure is passed to a formatting function.
1001 The two function fields should not be changed during processing.
1002 Other elements of \f5Sffmt_t\fP are set by the respective formatting function
1003 before it calls the extension function \f5Sffmt_t.extf\fP and, subsequently,
1004 can be modified by this function to redirect formatting or scanning.
1005 For example, consider a call from a \f5sfprintf()\fP function to process an
1006 unknown pattern \f5%t\fP (which we may take to mean ``time'') based on a
1007 formatting environment \f5fe\fP.
1008 \f5fe->extf\fP may reset \f5fe->fmt\fP to `\f5d\fP' upon returing
1009 to cause \f5sfprintf()\fP to process the value being formatted as an integer.
1011 Below are the fields of \f5Sffmt_t\fP:
1013 \f5extf\fP:
1014 \f5extf\fP is a function to extend scanning and formatting patterns.
1015 Its usage is discussed below.
1017 \f5eventf\fP:
1018 This is a function to process events as discussed earlier.
1020 \f5form\fP and \f5args\fP:
1021 This is the formatting pair of a specification string and corresponding argument list.
1022 When an environment \f5fe\fP is being inserted into the stack,
1023 if \f5fe->form\fP is \f5NULL\fP, the top environment is changed to \f5fe\fP
1024 and its associated extension functions
1025 but processing of the current formatting pair continues.
1026 On the other hand, if \f5fe->form\fP is not \f5NULL\fP,
1027 the new environment is pushed onto the stack
1028 so that pattern processing will start with the new formatting pair as well as
1029 any associated extension functions.
1030 During processing, whenever \f5extf\fP is called,
1031 \f5form\fP and \f5args\fP will be set to the current values of
1032 the formatting pair in use.
1034 \f5fmt\fP:
1035 This is set to the pattern being processed or one of '.', 'I', '('.
1037 \f5size\fP:
1038 This is the size of the object being processed.
1040 \f5flags\fP:
1041 This is a collection of bits defining the formatting flags specified for the pattern.
1042 The bits are:
1044 \f5SFFMT_LEFT\fP: Flag \f5-\fP in \f5sfprintf()\fP.
1046 \f5SFFMT_SIGN\fP: Flag \f5+\fP in \f5sfprintf()\fP.
1048 \f5SFFMT_BLANK\fP: Flag \fIspace\fP in \f5sfprintf()\fP.
1050 \f5SFFMT_ZERO\fP: Flag \f50\fP in \f5sfprintf()\fP.
1052 \f5SFFMT_THOUSAND\fP: Flag \f5'\fP in \f5sfprintf()\fP.
1054 \f5SFFMT_LONG\fP: Flag \f5l\fP in \f5sfprintf()\fP and \f5sfscanf()\fP.
1056 \f5SFFMT_LLONG\fP: Flag \f5ll\fP in \f5sfprintf()\fP and \f5sfscanf()\fP.
1058 \f5SFFMT_SHORT\fP: Flag \f5h\fP in \f5sfprintf()\fP and \f5sfscanf()\fP.
1060 \f5SFFMT_LDOUBLE\fP: Flag \f5L\fP in \f5sfprintf()\fP and \f5sfscanf()\fP.
1062 \f5SFFMT_IFLAG\fP: flag \f5I\fP in \f5sfprintf()\fP and \f5sfscanf()\fP.
1064 \f5SFFMT_ALTER\fP: Flag \f5#\fP in \f5sfprintf()\fP and \f5sfscanf()\fP.
1066 \f5SFFMT_SKIP\fP: Flag \f5*\fP in \f5sfscanf()\fP.
1068 \f5SFFMT_ARGPOS\fP: This indicates argument processing for \f5pos$\fP.
1070 \f5SFFMT_VALUE\fP: This is set by \f5fe->extf\fP
1071 to indicate that it is returning a value to be formatted or
1072 the address of an object to be assigned.
1075 \f5width\fP:
1076 This is the field width.
1078 \f5precis\fP:
1079 This is the precision.
1081 \f5base\fP:
1082 This is the conversion base.
1084 \f5t_str\fP and \f5n_str\fP:
1085 This is the type string and its size.
1087 .Ss "  int (*Sffmtext_f)(Sfio_t* f, Void_t* v, Sffmt_t* fe)"
1088 This is the type of the extension function \f5fe->extf\fP to process
1089 patterns and arguments.
1090 Arguments are always processed in order and
1091 \f5fe->extf\fP is called exactly once per argument.
1092 Note that, when \f5pos$\fP (below) is not used anywhere in a format string,
1093 each argument is used exactly once per a corresponding pattern.
1094 In that case, \f5fe->extf\fP is called 
1095 as soon as the pattern is recognized and before any scanning or formatting.
1096 On the other hand, when \f5pos$\fP is used in a format string,
1097 an argument may be used multiple times.
1098 In this case, all arguments shall be processed in order
1099 by calling \f5fe->extf\fP exactly once per argument before any pattern processing.
1100 This case is signified by the flag \f5SFFMT_ARGPOS\fP in \f5fe->flags\fP.
1102 In addition to the predefined formatting patterns and other application-defined
1103 patterns, \f5fe->extf\fP may be called with \f5fe->fmt\fP being one
1104 of `\f5(\fP' (left parenthesis), `\f5.\fP' (dot), and `\f5I\fP'.
1106 The left parenthesis requests a string to be used as the \f5extfdata\fP string discussed below.
1107 In this case, upon returning, \f5fe->extf\fP should set the \f5fe->size\fP field
1108 to be the length of the string or a negative value to indicate a null-terminated string.
1110 The `\f5I\fP' requests an integer to define the object size.
1112 The dot requests an integer for width, precision, base, or a separator.
1113 In this case, the \f5fe->size\fP field will indicate how many dots have appeared
1114 in the pattern specification. Note that, if the actual conversion pattern is 'c' or 's',
1115 the value \f5*form\fP will be one of these characters.
1117 \f5f\fP:
1118 This is the input/output stream in the calling formatting function.
1119 During a call to \f5fe->extf\fP, the stream shall be unlocked
1120 so that \f5fe->extf\fP can read from or write to it as appropriate.
1122 \f5v\fP:
1123 For both \f5sfscanf()\fP and \f5sfprintf()\fP functions,
1124 \f5v\fP points to a location suitable for storing any scalars or pointers.
1125 On return, \f5fe->extf\fP treats \f5v\fP as discussed below.
1127 \f5fe\fP:
1128 This is the current formatting environment.
1130 The return value \f5rv\fP of \f5fe->extf\fP directs further processing.
1131 There are two cases.
1132 When \f5pos$\fP is present, a negative return value means to ignore \f5fe\fP
1133 in further argument processing while a non-negative return value is treated
1134 as the case \f5rv == 0\fP below.
1135 When \f5pos$\fP is not present, \f5fe->extf\fP is called per argument
1136 immediately before pattern processing and its return values are treated
1137 as below:
1139 \f5rv < 0:\fP
1140 The environment stack is immediately popped.
1142 \f5rv == 0:\fP
1143 The extension function has not consumed (in a scanning case) or
1144 output (in a printing case) data out of or into the given stream \f5f\fP.
1145 The fields \f5fmt\fP, \f5flags\fP, \f5size\fP,
1146 \f5width\fP, \f5precis\fP and \f5base\fP of \f5fe\fP
1147 shall direct further processing.
1149 For \f5sfprintf()\fP functions, if \f5fe->flags\fP
1150 has the bit \f5SFFMT_VALUE\fP,
1151 \f5fe->extf\fP should have set \f5*v\fP to the value to be processed;
1152 otherwise, a value should be obtained from the argument list.
1153 Likewise, for \f5sfscanf()\fP functions,
1154 \f5SFFMT_VALUE\fP means that
1155 \f5*v\fP should have a suitable address; otherwise,
1156 an address to assign value should be obtained from the argument list.
1158 When \f5pos$\fP is present,
1159 if \f5fe->extf\fP changes \f5fe->fmt\fP, this pattern shall be used regardless of
1160 the pattern defined in the format string. On the other hand, if \f5fe->fmt\fP
1161 is unchanged by \f5fe->extf\fP, the pattern in the format string is used.
1162 In any case, the effective pattern should be one of the standardly defined pattern.
1163 Otherwise, it shall be treated as unmatched.
1165 \f5rv > 0:\fP
1166 The extension function has accessed the stream \f5f\fP
1167 to the extent of \f5rv\fP bytes.
1168 Processing of the current pattern ceases except that,
1169 for scanning functions, if \f5fe->flags\fP does not contain
1170 the bit \f5SFFMT_SKIP\fP, the assignment count shall increase by 1.
1172 .Ss "void va_copy(va_list to, va_list fr)"
1173 This macro function portably copies the argument list \f5fr\fP to
1174 the argument list \f5to\fP. It should be used to set the field \f5Sffmt_t.args\fP.
1176 .Ss "long sffmtversion(Sffmt_t* fe, int type)"
1177 This macro function initializes
1178 the formatting environment \f5fe\fP with a version number if \f5type\fP is
1179 non-zero. Otherwise, it returns the current value of the version number of \f5fe\fP.
1180 This is useful for applications to find out
1181 when the format of the structure \f5Sffmt_t\fP changes.
1182 Note that the version number corresponds to the Sfio version number
1183 which is defined in the macro value \f5SFIO_VERSION\fP.
1185 .Ss "  int sfprintf(Sfio_t* f, const char* format, ...);"
1186 .Ss "  char* sfprints(const char* format, ...);"
1187 .Ss "  char* sfvprints(const char* format, va_list args);"
1188 .Ss "  ssize_t sfaprints(char** sp, const char* format, ...);"
1189 .Ss "  ssize_t sfvaprints(char** sp, const char* format, va_list args);"
1190 .Ss "  int sfsprintf(char* s, int n, const char* format, ...)"
1191 .Ss "  int sfvsprintf(char* s, int n, const char* format, va_list args);"
1192 .Ss "  int sfvprintf(Sfio_t* f, const char* format, va_list args);"
1193 These functions format output data.
1194 \f5sfprintf()\fP and \f5sfvprintf()\fP write to output stream \f5f\fP.
1195 \f5sfsprintf()\fP and \f5sfvsprintf()\fP write to buffer \f5s\fP
1196 which is of size \f5n\fP.
1197 \f5sfprints()\fP and \f5sfvprints()\fP construct data in some Sfio-defined buffer.
1198 \f5sfaprints()\fP and \f5sfvaprints()\fP are similar to \f5sfprints()\fP
1199 and \f5sfvprints()\fP
1200 but they return a string constructed via \f5malloc()\fP in \f5*sp\fP
1201 and expect this string to be freed by the caller when no longer needed.
1202 \f5sfvprintf()\fP is the underlying primitive for the other functions.
1203 Except for \f5sfprints()\fP and \f5sfvprints()\fP
1204 which return a null-terminated string or \f5NULL\fP,
1205 other functions return the number of output bytes or \f5-1\fP on failure.
1207 The length of string constructed by \f5sfprints()\fP, \f5sfsprintf()\fP, or
1208 \f5sfvsprintf()\fP can be retrieved by \f5sfslen()\fP.
1210 The standard patterns are:
1211 \f5n, s, c, %, h, i, d, p, u, o, x, X, g, G, e, E, f\fP and \f5!\fP.
1212 Except for \f5!\fP which shall be described below,
1213 see the ANSI-C specification of \f5fprintf(3)\fP for details on the other patterns.
1214 Let \f5z\fP be some pattern type. A formatting pattern is defined as below:
1217 .ft 5
1218     %[pos$][flag][width][.precision[.base]][(extfdata)]z
1219 .ft 1
1223 \f5pos$\fP:
1224 A pattern can specify which argument in the argument list to use.
1225 This is done via \f5pos$\fP where \f5pos\fP is the argument position.
1226 Arguments are numbered so that the first argument after \f5format\fP is at position 1.
1227 If \f5pos\fP is not specified, the argument following the most recently used one
1228 will be used.
1229 The pattern \f5%!\fP (see below) cannot be used subsequent to a usage of \f5pos$\fP.
1230 Doing so may cause unexpected behaviors.
1232 \f5flag\fP:
1233 The flag characters are
1234 \f5h\fP, \f5hh\fP, \f5l\fP, \f5ll\fP, \f5L\fP, \f5I\fP, \f5j\fP, \f5t\fP, \f5z\fP,
1235 \f5\-\fP, \f5+\fP, \fIspace\fP, \f50\fP, \f5'\fP and \f5#\fP.
1237 Flag \f5I\fP defines the size or type of the object being formatted.
1238 There are two cases: (1) \f5I\fP by itself and (2) \f5I\fP
1239 followed by either a decimal number or `*'.
1241 In the first case, for integer and floating point patterns,
1242 the object type is taken to be the largest appropriate type
1243 (i.e., one of \f5Sflong_t\fP, \f5Sfulong_t\fP or \f5Sfdouble_t\fP).
1244 For conversion specifiers \f5s\fP and \f5c\fP, the flag is ignored.
1246 In the second case, a given decimal value would define a size while
1247 `*' would cause the size to be obtained from the argument list.
1248 Then, if the conversion specifier is \f5s\fP, this size defines the
1249 length of the string or strings being formatted (see the discussion of \f5base\fP below).
1250 For integer and floating point patterns,
1251 the size is used to select a type from one of the below lists as 
1252 indicated by the conversion specifier:
1255 .ft 5
1256     Sflong_t, long, int, short
1257     Sfulong_t, unsigned long, unsigned int, unsigned short
1258     Sfdouble_t, double, float
1259 .ft 1
1262 The selection algorithm always matches types from left to right in any given list.
1263 Although selection is generally based on sizes in bytes,
1264 for compatibility with Microsoft-C, the size 64 
1265 is matched with an appropriate type with the same number of bits, if any.
1266 If the given size does not match any of the listed types,
1267 it shall match one of \f5int\fP, \f5unsigned int\fP, and \f5double\fP
1268 as defined by the formatting pattern.
1270 Below are a few examples of using the \f5I\fP flag.
1271 The first example prints an \f5Sflong_t\fP integer.
1272 This example is actually not portable and
1273 only works on platforms where \f5sizeof(Sflong_t)\fP is 8.
1274 The second example shows how to that portably.
1275 The third example specifies printing a string of length 16.
1276 This length shall be used regardless of whether or not the given string
1277 is shorter or longer than 16.
1278 The last example shows the use of the pattern \f5%n\fP to assign the amount
1279 of data already output into a \f5short\fP integer \f5n_output\fP.
1282 .ft 5
1283     sfprintf(sfstdout,"%I8d", Sflong_obj);
1284     sfprintf(sfstdout,"%I*d", sizeof(Sflong_obj), Sflong_obj);
1285     sfprintf(sfstdout,"%I*s", 16, s);
1286     sfprintf(sfstdout,"%d%I*n", 1001, sizeof(short), &n_output);
1287 .ft 1
1290 Flags \f5h\fP, \f5l\fP, and \f5L\fP are the ANSI-C conventions to
1291 select the types of input objects.
1292 For example, \f5%hd\fP indicates a \f5short int\fP
1293 while \f5%ld\fP indicates a \f5long int\fP.
1295 Flag \f5hh\fP addresses the byte value types, i.e., \f5char\fP and \f5unsigned char\fP.
1297 Flags \f5z\fP, \f5t\fP and \f5j\fP address respectively
1298 the types \f5size_t\fP, \f5ptrdiff_t\fP and \f5Sflong_t\fP.
1300 Flags \f5ll\fP and \f5L\fP address respectively
1301 the largest integer and floating value types, i.e.,
1302 \f5Sfulong_t\fP, \f5Sflong_t\fP, and \f5Sfdouble_t\fP.
1304 Flag \f5-\fP left-justifies data within the field (otherwise, right-justification).
1306 Flag \f5+\fP means that a signed conversion will always begin with a plus or minus sign.
1308 Flag \fIspace\fP is ignored if \f5+\fP is specified; otherwise,
1309 it means that if the first character of a signed conversion
1310 is not a sign or if the result is empty, a space will be prepended.
1312 Flag \f50\fP means padding with zeros on the left.
1314 Flag \f5'\fP outputs thousands-separator used by the current locale.
1315 \f5setlocale(3)\fP should have been used to set the desired locale.
1317 Flag \f5#\fP indicates an alternative format processing.
1318 For \f5%o\fP, the first digit is always a zero.
1319 For \f5%x\fP and \f5%X\fP, a non-zero result will have a prefix
1320 \f50x\fP or \f50X\fP. For \f5%e\fP, \f5%E\fP, \f5%f\fP, \f5%g\fP, and \f5%G\fP,
1321 the result always contains a decimal point. For \f5%g\fP and \f5%G\fP,
1322 trailing zeros will not be removed. For \f5%d\fP, \f5%i\fP and \f5%u\fP,
1323 the form is \fIbase#number\fP where \fIbase\fP is the conversion base
1324 and \fInumber\fP is represented by digits for this \fIbase\fP.
1325 For example, a base \f52\fP conversion with \f5%#..2d\fP for \f510\fP
1326 is \f52#1010\fP instead of \f51010\fP as printed with \f5%..2d\fP.
1327 Finally, for \f5%c\fP, bytes will be printed in the C format.
1328 For example, when the ASCII character set is used,
1329 the byte value 10 will be printed as \f5\\n\fP while 255 is printed
1330 as \f5\\377\fP.
1332 \f5width\fP:
1333 This defines the width of the printing field. A value to be printed will
1334 be justified and padded if necessary to fill out the field width.
1336 \f5precis\fP:
1337 After a first dot appears, an integral value defines a precision.
1338 For floating point value patterns, precision is the number of precision digits.
1339 For \f5%c\fP, precision defines the number of times to repeat the
1340 character being formatted.
1341 For \f5%s\fP, precision defines the maximum number of characters to output.
1343 \f5base\fP:
1344 This is defined after exactly two dots have appeared.
1346 For \f5%i\fP, \f5%d\fP, and \f5%u\fP,
1347 \f5base\fP should be an integer value in the inclusive range \f5[2,64]\fP
1348 and defines a conversion base.
1349 If \f5base\fP is not in this range, it is defined to be \f510\fP.
1350 The digits to represent numbers are:
1353 .ft 5
1354     01234567890
1355     abcdefghijklmnopqrstuvwxyz
1356     ABCDEFGHIJKLMNOPQRSTUVWXYZ @_
1357 .ft 1
1360 For \f5%s\fP and \f5%c\fP, \f5base\fP defines a separator.
1361 Then, for \f5%s\fP, the input argument is taken to be a NULL-terminated array of strings
1362 while, for \f5%c\fP, this is a null-terminated array of characters.
1363 The strings or characters will be formatted one of a time based
1364 on the usual width and precision rules.
1365 After each formatted string or character, except for the last one,
1366 the separator \f5base\fP is output if it is a non-zero.
1368 There are further restrictions on the syntax of \f5%s\fP and \f5%c\fP when
1369 a separator is defined.
1370 Below are the legitimate sequences for \f5%s\fP and \f5%c\fP after the second dot:
1373 \f5    s            c\fP
1374 \f5    *s           *c\fP
1375 \f5    \fP\fIz\fP\f5s           \fP\fIz\fP\f5c\fP
1378 In the first case, no separator is defined so \f5base\fP is set to zero.
1379 In the second case, \f5base\fP is obtained from the argument list.
1380 In the third case, the character \fIz\fP
1381 must be non-alphanumeric and \f5base\fP will be set to this character.
1383 The below example shows both the call and the result
1384 of printing a \f5NULL\fP-terminated array
1385 of three strings \f5apple\fP, \f5orange\fP, and \f5grape\fP:
1388 .ft 5
1389     sfprintf(sfstdout,"|%8..:s|",list);
1390     |   apple:  orange:   grape|
1391 .ft 1
1395 \f5(extfdata)\fP:
1396 This defines a string \f5extfdata\fP
1397 to be passed to the extension function \f5Sffmt_t.extf\fP.
1398 Parentheses shall be balanced.
1399 If \f5extfdata\fP is \f5*\fP, the string is obtained from the argument list.
1402 .Ss "  int sfscanf(Sfio_t* f, const char* format, ...)"
1403 .Ss "  int sfsscanf(const char* s, const char* format, ...)"
1404 .Ss "  int sfvsscanf(const char* s, const char* format, va_list args)"
1405 .Ss "  int sfvscanf(Sfio_t* f, const char* format, va_list args)"
1406 These functions scan data items.
1407 \f5sfscanf()\fP scans from the input stream \f5f\fP
1408 while \f5sfsscanf()\fP and \f5sfvsscanf()\fP
1409 scan from the null-terminated string \f5s\fP.
1410 \f5sfvscanf()\fP is the underlying primitive that performs the actual scanning.
1411 Item types are determined from patterns in string \f5format\fP.
1412 These functions return
1413 the number of items successfully scanned or \f5-1\fP on error.
1415 A white space character (blank, tab, or new-line) in \f5format\fP
1416 normally matches a maximal sequence of input white space characters.
1417 However, if the input stream is in \f5SF_LINE\fP mode (see \f5sfset()\fP),
1418 a new-line character only matches white spaces up to an input new-line character.
1419 This is useful to avoid blocking when scanning typed inputs.
1421 The standard scan patterns are:
1422 \f5i, d, u, o, x, X, p, n, f, e, E, g, G, c, %, s, []\fP and \f5!\fP.
1423 Except for \f5!\fP which shall be described below,
1424 see the ANSI-C specification of \f5fscanf(3)\fP for details on other patterns.
1425 Let \f5z\fP be some pattern type. A formatting pattern is specified as below:
1428 .ft 5
1429     %[*][pos$][width][.width.base][(extfdata)][flag]z
1430 .ft 1
1434 \f5pos$\fP:
1435 A pattern can specify which argument in the argument list to use.
1436 This is done via \f5pos$\fP where \f5pos\fP is the argument position.
1437 Arguments are numbered so that the first argument after \f5format\fP is at position 1.
1438 If \f5pos\fP is not specified, the argument following the most recently used one
1439 will be used.
1440 The pattern \f5%!\fP (see below) cannot be used subsequent to a usage of \f5pos$\fP.
1442 \f5*:\fP
1443 This discards the corresponding scanned item.
1445 \f5width\fP and \f5base\fP:
1446 \f5width\fP defines the maximum number of bytes to scan
1447 and \f5base\fP defines the base of an integral value being scanned.
1448 The `.' (dot) notation also allows specifying a `*' (star) to obtain
1449 the value from the argument list. The below example specifies scanning
1450 4 bytes to obtain the value of an integer in base 10. At the end of scanning,
1451 the variable \f5v\fP should have the value \f51234\fP.
1454 .ft 5
1455     sfsscanf("12345678","%.*.*d", 4, 10, &v);
1456 .ft 1
1460 \f5(extfdata)\fP:
1461 This defines a string \f5extfdata\fP
1462 to be passed to the extension function \f5Sffmt_t.extf\fP.
1463 Parentheses shall be balanced.
1464 If \f5extfdata\fP is \f5*\fP, the string is obtained from the argument list.
1466 \f5flag:\fP
1467 This is \f5#\fP, \f5I\fP, or some sequence of \f5h\fP, \f5l\fP, and \f5L\fP.
1469 Flag \f5#\fP is significant for pattern \f5%i\fP and \f5%[\fP.
1470 For \f5%i\fP, it means that the \f5#\fP symbol does not have its usual
1471 meaning in an input sequence \f5base#value\fP.
1472 For example, the scanning result of \f5%#i\fP on input \f52#1001\fP is \f52\fP
1473 and the next \f5sfgetc()\fP call will return \f5#\fP.
1474 For \f5%[\fP, if the next character in the input stream does not match
1475 the given scan set of characters, \f5#\fP causes a match to a null string
1476 instead of a failure.
1478 Flag \f5I\fP defines the size or type of the object being formatted.
1479 There are two cases: (1) \f5I\fP by itself and (2) \f5I\fP
1480 followed by either a decimal number or `*'.
1482 In the first case, for integer and floating point patterns,
1483 the object type is taken to be the largest appropriate type
1484 (i.e., one of \f5Sflong_t\fP, \f5Sfulong_t\fP or \f5Sfdouble_t\fP).
1485 For string patterns such as \f5%s\fP, the flag is ignored.
1487 In the second case, a given decimal value would define a size while
1488 `*' would cause the size to be obtained from the argument list.
1489 For string patterns such as \f5%s\fP or \f5%[\fP, this size defines the
1490 length of the buffer to store scanned data.
1491 Specifying a buffer size only limits the amount of data copied into the buffer.
1492 Scanned data beyond the buffer limit will be discarded.
1493 For integer and floating point patterns,
1494 the size is used to select a type from one of the below lists as
1495 indicated by the conversion specifier:
1498 .ft 5
1499     Sflong_t, long, int, short
1500     Sfulong_t, unsigned long, unsigned int, unsigned short
1501     Sfdouble_t, double, float
1502 .ft 1
1505 The selection algorithm always matches types from left to right in any given list.
1506 Although selection is generally based on sizes in bytes,
1507 for compatibility with Microsoft-C, the size 64 
1508 is matched with an appropriate type with the same number of bits, if any.
1509 If the given size does not match any of the listed types,
1510 it shall match one of \f5int\fP, \f5unsigned int\fP, and \f5double\fP
1511 as indicated by the formatting pattern.
1513 Below are examples of using the \f5I\fP flag.
1514 The first example scans a 64-bit integer.
1515 The second scans some floating point value
1516 whose size is explicitly computed and given.
1517 The last example scans a string into a buffer with the given size 128.
1518 Note that if the scanned string is longer than 127, only the first 127
1519 bytes shall be copied into the buffer. The rest of the scanned data
1520 shall be discarded.
1523 .ft 5
1524      sfscanf(sfstdin,"%I64d", &int64_obj);
1525      sfscanf(sfstdin,"%I*f", sizeof(float_obj), &float_obj);
1526      sfscanf(sfstdin,"%I*s", 128, buffer);
1527 .ft 1
1530 Flags \f5h\fP, \f5l\fP, and \f5L\fP are the ANSI-C conventions
1531 for indicating the type of a scanned element.
1532 For example, \f5%hd\fP means scanning a \f5short int\fP.
1533 The flags \f5ll\fP and \f5L\fP mean respectively scanning an
1534 integer or a floating point value with largest size
1535 (i.e, \f5Sflong_t\fP or \f5Sfdouble_t\fP).
1537 The \f5%i\fP, \f5%d\fP and \f5%u\fP patterns scan numbers in bases
1538 from \f52\fP to \f564\fP.
1539 \f5%i\fP scans integral values in self-describing formats.
1540 Except for octal, decimal and hexadecimal numbers with the usual formats,
1541 numbers in general bases are assumed to be of the form: \fIbase#value\fP
1542 where \fIbase\fP is a number in base 10 and \fIvalue\fP
1543 is a number in the given base.
1544 For example, \f52#1001\fP is the binary representation of the decimal value \f59\fP.
1545 If \fIbase\fP is \f536\fP or less,
1546 the digits for \fIvalue\fP can be any combination of \f5[0-9], [a-z], [A-Z]\fP
1547 where upper and lower case digits are not distinguishable.
1548 If \fIbase\fP is larger than \f536\fP, the set of digits is:
1551 .ft 5
1552     0123456789
1553     abcdefghijklmnopqrstuvwxyz
1554     ABCDEFGHIJKLMNOPQRSTUVWXYZ @_
1555 .ft 1
1559 .Ss "BUFFERING, SYNCHRONIZATION"
1561 .Ss "  Void_t* sfsetbuf(Sfio_t* f, Void_t* buf, size_t size)"
1562 This function changes the buffering scheme for the stream \f5f\fP.
1563 The stream will be synchronized before any buffer modification.
1564 If a new buffer is successfully set and the old buffer has not been freed,
1565 \f5sfsetbuf()\fP returns the old buffer. Otherwise, it returns \f5NULL\fP.
1566 After a \f5sfsetbuf()\fP call,
1567 \f5sfvalue()\fP returns the size of the returned buffer.
1569 Sfio attempts to read data in blocks likely to be serviced fast by the file system.
1570 This means block sizes being multiples of a suitable alignment value
1571 (e.g., 512, 1024 or 8192). By default, the alignment value
1572 is computed via some internal mechanism depending on the local platform but
1573 it can also be explicitly set via the call \f5sfsetbuf(f, (Void_t*)f, size)\fP.
1575 In invocations of \f5sfsetbuf()\fP other than the above case,
1576 the \f5size\fP argument is treated as follows:
1578 \f5size == SF_UNBOUND\fP:
1579 Sfio will pick a suitable buffer size.
1580 If \f5buf\fP is \f5NULL\fP,
1581 Sfio will also pick a suitable buffering scheme (such as memory mapping.)
1582 If \f5buf\fP is not \f5NULL\fP, its actual value is ignored
1583 but the buffer will be allocated via \f5malloc(3)\fP.
1584 This can be used to avoid memory mapping.
1586 \f5size > 0\fP:
1587 This is the suggested size to use for buffering or memory mapping.
1588 If \f5buf\fP is \f5NULL\fP,
1589 Sfio will pick a suitable buffering scheme as discussed above.
1590 If \f5buf\fP is not \f5NULL\fP, then \f5buf\fP and \f5size\fP determine
1591 a buffer of the given size.
1593 \f5size == 0\fP:
1594 If \f5buf\fP is \f5NULL\fP, the stream will be unbuffered.
1595 If \f5buf\fP is not \f5NULL\fP,
1596 \f5sfsetbuf()\fP simply returns the stream buffer.
1597 In this case, no attempt will be made to synchronize the stream.
1599 .Ss "  int sfsync(Sfio_t* f)"
1600 This function synchronizes the logical and physical views of stream \f5f\fP.
1601 It returns a negative value for failure and \f50\fP for success.
1603 For a \f5SF_WRITE\fP stream, synchronization means to write out any buffered data.
1604 For a seekable \f5SF_READ\fP file stream,
1605 the physical file position is aligned with the logical stream position and,
1606 if \f5SF_SHARE\fP is on, buffered data is discarded.
1607 If \f5f\fP is \f5NULL\fP, all streams are synchronized.
1608 If \f5f\fP is the base of a stream stack (see \f5sfstack()\fP),
1609 all stacked streams are synchronized.
1610 Note that a stacked stream can only be synchronized this way.
1611 If \f5f\fP is in a pool (see \f5sfpool()\fP) but not being the head,
1612 the pool head is synchronized.
1614 If \f5f\fP has flag \f5SF_IOCHECK\fP, the \f5SF_SYNC\fP event is raised
1615 before and after synchronization. See \f5sfdisc()\fP for details.
1617 .Ss "  int sfpoll(Sfio_t** flist, int n, int timeout)"
1618 This function polls a set of streams to see if I/O operations
1619 can be performed on them without blocking.
1620 This is useful for multiplexing I/O over a set of streams.
1621 If a stream has a discipline, the exception function may be called
1622 before and after the stream is polled (see \f5sfdisc()\fP for details).
1623 After a successful \f5sfpoll()\fP call,
1624 for each ready stream \f5f\fP, \f5sfvalue(f)\fP returns
1625 a bit combination of \f5SF_READ\fP and \f5SF_WRITE\fP to tell which I/O
1626 mode is available. If \f5SF_READ\fP is available, an attempt to read
1627 a byte will not block. If \f5SF_WRITE\fP is available,
1628 an attempt to flush will not block.
1629 \f5sfpoll()\fP returns the number of ready streams or \f5-1\fP on failure.
1631 \f5flist\fP and \f5n\fP:
1632 \f5flist\fP is an array of \f5n\fP streams to be polled.
1633 Upon return, ready streams are moved to the front
1634 of \f5flist\fP in the same relative order.
1636 \f5timeout\fP:
1637 This defines an elapse time in milliseconds
1638 to wait to see if any stream is ready for I/O.
1639 If \f5timeout\fP is negative, \f5sfpoll()\fP will block until some stream become ready.
1640 Note that \f5SF_STRING\fP and normal file streams never block
1641 and are always ready for I/O.
1642 If a stream with discipline is being polled and
1643 its readiness is as yet undetermined (e.g., empty buffer,)
1644 the discipline exception function will be called with \f5SF_DPOLL\fP
1645 before querying the operating system.
1647 .Ss "  Sfio_t* sfpool(Sfio_t* f, Sfio_t* poolf, int mode)"
1648 This function manipulates pools of streams.
1649 In a pool, only one stream is at the head and can have buffered data.
1650 All other streams in the pool will be synchronized.
1651 A stream becomes head when it is used for some I/O operation.
1652 \f5sfpool()\fP returns \f5NULL\fP on failure.
1654 \f5f\fP and \f5poolf\fP:
1655 If \f5f\fP is \f5NULL\fP,
1656 \f5sfpool()\fP simply returns the head of the pool containing \f5poolf\fP.
1657 If \f5f\fP is not \f5NULL\fP and \f5poolf\fP is \f5NULL\fP,
1658 \f5f\fP is deleted from its pool.
1659 In this case, if no other stream from the same pool can become head,
1660 \f5sfpool()\fP will return \f5NULL\fP; otherwise, it returns some stream
1661 from the remainder of the pool.
1662 If both \f5f\fP and \f5poolf\fP are not \f5NULL\fP,
1663 \f5f\fP is moved from its current pool (if any)
1664 into the same pool with \f5poolf\fP.
1665 In this case, \f5poolf\fP is returned.
1667 \f5mode\fP:
1668 If \f5poolf\fP is already in a pool, \f5mode\fP is ignored.
1669 Otherwise, \f5mode\fP should be \f50\fP or \f5SF_SHARE\fP.
1670 A \f5SF_SHARE\fP pool contains streams with \f5SF_WRITE\fP mode.
1671 In addition, on change to a new head stream,
1672 buffered write data of the current head
1673 is transferred to the new head.
1675 .Ss "  int sfpurge(Sfio_t* f)"
1676 This function discards all buffered data
1677 unless \f5f\fP is a \f5SF_STRING\fP stream.
1678 Note that if \f5f\fP is a \f5SF_READ\fP stream based on an unseekable device,
1679 purged data will not be recoverable.
1680 If \f5f\fP is a \f5sfpopen\fP-stream opened for both read and write,
1681 data of both the read and write pipe ends will be purged
1682 (see \f5sfset()\fP to selectively turn off read or write mode
1683 if one set of data is to be preserved.)
1684 After purging, if \f5f\fP has flag \f5SF_IOCHECK\fP,
1685 the event \f5SF_PURGE\fP is raised.
1686 \f5sfpurge()\fP returns \f5-1\fP for failure and \f50\fP for success.
1689 .Ss "DISCIPLINE, EVENT-HANDLING"
1691 A file stream uses the system calls \f5read(2)\fP, \f5write(2)\fP
1692 and \f5lseek(2)\fP to read, write and position in the underlying file.
1693 Disciplines enable application-defined I/O methods including exception handling and
1694 data pre/post-processing.
1696 .Ss "  Sfdisc_t* sfdisc(Sfio_t* f, Sfdisc_t* disc)"
1697 Each stream has a discipline stack whose bottom is a virtual discipline
1698 representing the actual system calls.
1699 \f5sfdisc()\fP manipulates the discipline stack of stream \f5f\fP.
1700 \f5f\fP will be synchronized before any discipline stack manipulation.
1701 After a successful discipline stack manipulation,
1702 the stream I/O position (see \f5sfseek()\fP and \f5sftell()\fP)
1703 and extent (see \f5sfsize()\fP) are updated
1704 to reflect that defined by the top discipline.
1705 \f5sfdisc()\fP returns \f5NULL\fP on failure.
1707 If the value of \f5disc\fP is identical to the value of \f5f\fP,
1708 then the top discipline on the discipline
1709 stack is returned without any further action.
1710 An application can then use this feature of \f5sfdisc()\fP
1711 and the field \f5disc\fP (below) of the discipline structure
1712 to traverse the entire discipline stack of a stream \f5f\fP as follows:
1715 .ft 5
1716     for(disc = sfdisc(f, (Sfdisc_t*)f); disc; disc = disc->disc)
1717 .ft 1
1720 If \f5disc\fP is \f5SF_POPDISC\fP or \f5(Sfdisc_t*)0\fP,
1721 the top element of the stack, if any, is popped and its address is returned.
1722 Otherwise, \f5disc\fP is pushed onto the discipline stack.
1723 In this case, if successful, \f5sfdisc()\fP returns
1724 the discipline that was pushed down.
1726 Note that a discipline can be used on only one stream at a time.
1727 An application should take care to allocate different discipline
1728 structures for use with different streams. 
1729 A discipline structure is of the type \f5Sfdisc_t\fP which
1730 contains the following public fields:
1733 .ft 5
1734     Sfread_f   readf;
1735     Sfwrite_f  writef;
1736     Sfseek_f   seekf;
1737     Sfexcept_f exceptf;
1738     Sfdisc_t*   disc;
1739 .ft 1
1743 The first three fields of \f5Sfdisc_t\fP specify alternative I/O functions.
1744 If any of them is \f5NULL\fP, it is inherited
1745 from a discipline pushed earlier on the stack.
1746 Note that a file stream always
1747 has \f5read(2)\fP, \f5write(2)\fP, \f5lseek(2)\fP and \f5NIL(Sfexcept_f)\fP
1748 as the \fIlogical bottom discipline\fP.
1749 Arguments to I/O discipline functions
1750 have the same meaning as that of the
1751 functions \f5sfrd()\fP, \f5sfwr()\fP and \f5sfsk()\fP described below.
1753 The exception function, \f5(*exceptf)()\fP announces exceptional events during
1754 I/O operations.
1755 It is called as \f5(*exceptf)(Sfio_t* f, int type, Void_t* value, Sfdisc_t* disc)\fP.
1756 Unless noted otherwise, the return value of \f5(*exceptf)()\fP is used as follows:
1758 \f5<0\fP:
1759 The on-going operation shall terminate.
1761 \f5>0\fP:
1762 If the event was raised due to an I/O error,
1763 the error has been repaired and the on-going operation shall continue normally.
1764 For some events, e.g., \f5SF_DPOLL\fP, the return value may also have
1765 additional meanings.
1767 \f5=0\fP:
1768 The on-going operation performs default actions with respect to the raised event.
1769 For example, on a reading error or reaching end of file, the top stream of a stack
1770 will be popped and closed and the on-going operation continue with the new top
1771 stream.
1773 The argument \f5type\fP of \f5(*exceptf)()\fP
1774 identifies the particular exceptional event:
1776 \f5SF_LOCKED\fP:
1777 The stream cannot be accessed.
1778 Note that this lock state is not related to the mutex lock
1779 that protects a stream from multiple accesses by different threads
1780 (see section THREAD SAFETY). Rather, the stream was frozen by
1781 certain operations such as \f5sfreserve()\fP or \f5sfstack()\fP.
1782 Thus, a stream can be in this state even if the application is uni-threaded.
1784 \f5SF_READ\fP, \f5SF_WRITE\fP:
1785 These events are raised around reading and writing operations.
1787 If \f5SF_IOCHECK\fP is on, \f5SF_READ\fP and \f5SF_WRITE\fP
1788 are raised immediately before \f5read(2) and write(2)\fP calls.
1789 In this case, \f5*((ssize_t*)value)\fP is the amount of data to be processed.
1790 The return value of \f5(*exceptf)()\fP, if negative,
1791 indicates that the stream is not ready for I/O
1792 and the calling operation will abort with failure.
1793 If it is positive, the stream is ready for I/O
1794 but the amount should be restricted to the amount specified by this value.
1795 If the return value is zero, the I/O operation is carried out normally.
1797 \f5SF_READ\fP and \f5SF_WRITE\fP are also raised on operation failures.
1798 In such a case, \f5*((ssize_t*)value)\fP
1799 is the return value from the failed operation.
1801 \f5SF_SEEK\fP:
1802 This event is raised when a seek operation fails.
1804 \f5SF_NEW\fP, \f5SF_CLOSING\fP (\f5SF_CLOSE\fP), \f5SF_FINAL\fP:
1805 These events are raised during a stream closing.
1806 \f5SF_NEW\fP is raised for a stream about to be closed to be renewed (see \f5sfnew()\fP).
1807 \f5SF_CLOSING\fP is raised for a stream about to be closed.
1808 \f5SF_FINAL\fP is raised after a stream has been closed and before
1809 its space is to be destroyed (see \f5sfclose()\fP).
1810 For these events, a non-zero return value from \f5(*exceptf)()\fP causes
1811 \f5sfclose()\fP to return immediately with the same value.
1813 \f5SF_DPUSH\fP, \f5SF_DPOP\fP, \f5SF_DBUFFER\fP:
1814 Events \f5SF_DPUSH\fP and \f5SF_DPOP\fP are raised when a
1815 discipline is about to be pushed or popped.
1816 \f5(Sfdisc_t*)value\fP is the to-be top discipline, if any.
1818 A stream buffer is always synchronized before pushing or popping a discipline.
1819 If this synchronization fails, \f5SF_DBUFFER\fP will be raised with
1820 \f5*((size_t*)value)\fP being the amount of data still in the buffer.
1821 If the return value of \f5exceptf\fP is non-negative,
1822 the push or pop operation will continue normally;
1823 otherwise, \f5sfdisc()\fP returns failure.
1825 \f5SF_DPOLL\fP:
1826 This event is raised by
1827 \f5sfpoll()\fP to see if the stream is ready for I/O.
1828 \f5*((int*)value)\fP indicates a time-out interval to wait.
1829 A negative return value from the exception function means blocking.
1830 A zero return value means that \f5sfpoll()\fP should
1831 query the underlying file descriptor.
1832 A positive return value means non-blocking. In addition,
1833 this value will be a bit combination of \f5SF_READ\fP and \f5SF_WRITE\fP
1834 to indicate what I/O modes are ready.
1836 \f5SF_READY\fP:
1837 This event is raised by \f5sfpoll()\fP for each ready stream.
1838 The third argument to the event handler is an integer composed with
1839 the two bits \f5SF_READ\fP and \f5SF_WRITE\fP to indicate which
1840 I/O modes are ready.
1842 \f5SF_SYNC\fP, \f5SF_PURGE\fP:
1843 If \f5SF_IOCHECK\fP is set,
1844 these events are raised respectively for a \f5sfsync()\fP or \f5sfpurge()\fP call. 
1845 In each case, the respective event is raised once before the appropriate
1846 operation (synchronization or purging) with \f5((int)value)\fP being \f51\fP
1847 and once after with \f5((int)value)\fP being \f50\fP.
1848 Note that \f5sfsync()\fP is called for each
1849 \f5SF_WRITE\fP or \f5SF_SHARE|SF_READ\fP stream on closing.
1852 \f5SF_ATEXIT\fP:
1853 This event is raised for each open stream before the process exits.
1855 .Ss "  int sfraise(Sfio_t* f, int type, Void_t* data)"
1856 If \f5f\fP is non-\f5NULL\fP, \f5sfraise()\fP calls all exception handlers
1857 of \f5f\fP with the event \f5type\fP and associated \f5data\fP.
1858 If an exception handler returns a non-zero value,
1859 \f5sfraise()\fP immediate returns the same value.
1860 Application-defined events should start from the value \f5SF_EVENT\fP
1861 so as to avoid confusion with system-defined events,
1862 \f5sfraise()\fP returns \f50\fP on success and \f5-1\fP on failure.
1864 If \f5f\fP is \f5NULL\fP, \f5sfraise()\fP iterates over all streams
1865 and raise events as described above. In this case,
1866 \f5sfraise()\fP returns \f50\fP on success and a negative value
1867 on failure. The absolute value of the return value tells how many
1868 streams failed on raising the given event.
1870 .Ss "  ssize_t sfrd(Sfio_t* f, Void_t* buf, size_t n, Sfdisc_t* disc)"
1871 .Ss "  ssize_t sfwr(Sfio_t* f, const Void_t* buf, size_t n, Sfdisc_t* disc)"
1872 .Ss "  Sfoff_t sfsk(Sfio_t* f, Sfoff_t offset, int type, Sfdisc_t* disc)"
1873 These functions provides safe methods for a discipline I/O function to invoke
1874 earlier discipline I/O functions and to properly handle exceptions.
1875 They should not be used in any other context.
1876 \f5sfrd()\fP and \f5sfwr()\fP return the number of bytes read or written.
1877 \f5sfsk()\fP returns the new seek position.
1878 On error, all three functions return a negative value which should be \f5-1\fP
1879 or the value returned by the exception handler.
1882 .Ss "STREAM CONTROL"
1884 .Ss "  int sfresize(Sfio_t* f, Sfoff_t size)"
1885 This function resizes the stream \f5f\P so that its extent is \f5size\fP.
1886 If the stream corresponds to a file, the file size is set to \f5size\fP
1887 via the system call \f5ftruncate()\fP.
1888 When a stream is made larger, the new data space is filled with zero's.
1889 \f5sfresize()\fP returns \f50\fP on success and a negative value on failure.
1891 .Ss "  int sfset(Sfio_t* f, int flags, int set)"
1892 This function sets control flags for the stream \f5f\fP.
1893 It returns the previous set of flags or \f50\fP on error.
1895 Settable flags are:
1896 \f5SF_READ\fP, \f5SF_WRITE\fP, \f5SF_IOCHECK\fP,
1897 \f5SF_LINE\fP, \f5SF_SHARE\fP, \f5SF_PUBLIC\fP, \f5SF_MALLOC\fP and
1898 \f5SF_STATIC\fP.
1899 Note that \f5SF_READ\fP and \f5SF_WRITE\fP can be turned on or off only
1900 if the stream was opened as \f5SF_READ|SF_WRITE\fP.
1901 Turning off one of them means that the stream is to be treated exclusively
1902 in the other mode. It is not possible to turn off both.
1903 If legal, an attempt to turn on either \f5SF_READ\fP or \f5SF_WRITE\fP
1904 will cause the stream to be in the given I/O mode.
1906 \f5set == 0:\fP
1907 If \f5flags\fP is zero, the current set of flags is simply returned.
1908 Note that when a stream is first opened, not
1909 all of its flags are initialized yet (more below). If \f5flags\fP is
1910 non-zero, an attempt is made to turn off the specified flags.
1912 \f5set != 0:\fP
1913 If \f5flags\fP is zero, the stream is initialized if not yet done so.
1914 Then the current set of flags is returned.
1915 If \f5flags\fP is non-zero, an attempt is made to turn on the
1916 specified flags.
1918 .Ss "  int sfsetfd(Sfio_t* f, int fd)"
1919 This function changes the file descriptor of \f5f\fP.
1920 Before a change is realized,
1921 \f5(*notify)(f,SF_SETFD,newfd)\fP (see \f5sfnotify()\fP) is called.
1922 \f5sfsetfd()\fP returns \f5-1\fP on failure and the new file descriptor on success.
1924 \f5fd >= 0\fP:
1925 If the current file descriptor is non-negative,
1926 it will be changed using \f5dup(3)\fP to a value larger or equal to \f5fd\fP.
1927 Upon a successful change, the previous file descriptor will be closed.
1928 If the current file descriptor is negative, it will be set to \f5fd\fP and
1929 the stream will be reinitialized.
1931 \f5fd < 0\fP:
1932 The stream is synchronized (see \f5sfsync()\fP) and its
1933 file descriptor will be set to this value.
1934 Then, except for \f5sfclose()\fP, the stream will be inaccessible
1935 until a future \f5sfsetfd()\fP call resets the file descriptor to a non-negative value.
1936 Thus, \f5sfsetfd(f,-1)\fP can be used to avoid closing the file descriptor
1937 of \f5f\fP when \f5f\fP is closed.
1939 .Ss "  Sfio_t* sfstack(Sfio_t* base, Sfio_t* top)"
1940 This function stacks or unstacks stream.
1941 Every stream stack is identified by a base stream
1942 via which all I/O operations are performed.
1943 However, an I/O operation always takes effect on the top stream.
1944 If the top stream reaches the end of file or
1945 has an unrecoverable error condition,
1946 it is automatically popped and closed
1947 (see also \f5sfdisc()\fP for alternative handling of these conditions).
1949 \f5base\fP:
1950 This is the base stream of the stack.
1951 If it is \f5NULL\fP, \f5sfstack()\fP does nothing and returns \f5top\fP.
1953 \f5top\fP:
1954 If this is \f5SF_POPSTACK\fP or \f5(Sfio_t*)0\fP,
1955 the stack is popped and \f5sfstack()\fP returns the popped stream.
1956 Otherwise, \f5top\fP is pushed on top of the stack identified by \f5base\fP
1957 and \f5sfstack()\fP returns the \f5base\fP stream.
1959 .Ss "  Sfio_t* sfswap(Sfio_t* f1, Sfio_t* f2)"
1960 This function swaps contents of \f5f1\fP and \f5f2\fP.
1961 This fails if either stream is in a stream stack but not being a base stream.
1962 If \f5f2\fP is \f5NULL\fP, a new stream is constructed as a duplicate of \f5f1\fP.
1963 \f5sfswap()\fP returns \f5f2\fP or \f5f1\fP duplicate on success and
1964 \f5NULL\fP on failure.
1967 .Ss "STREAM INFORMATION"
1969 .Ss "  Sfoff_t sfsize(Sfio_t* f)"
1970 This function returns the size of stream \f5f\fP (see \f5sfnew()\fP).
1971 If \f5f\fP is not seekable or if its size is not determinable,
1972 \f5sfsize()\fP returns \f5-1\fP.
1974 .Ss "  Sfoff_t sftell(Sfio_t* f)"
1975 This function returns the current I/O position in stream \f5f\fP.
1976 Note that if \f5f\fP is \f5SF_APPEND\fP
1977 and a writing operation was just performed,
1978 the current I/O position is at the physical end of file.
1979 If \f5f\fP is unseekable, \f5sftell\fP returns the number of bytes
1980 read from or written to \f5f\fP.
1981 See also \f5sfungetc()\fP.
1983 .Ss "  ssize_t sfvalue(Sfio_t* f)"
1984 This function returns the string or buffer length
1985 for \f5sfreserve()\fP, \f5sfsetbuf()\fP, and \f5sfgetr()\fP.
1987 .Ss "  int sffileno(Sfio_t* f)"
1988 This function returns the file descriptor of stream \f5f\fP.
1990 .Ss "  int sfstacked(Sfio_t* f)"
1991 This function returns a non-zero value
1992 if stream \f5f\fP has been stacked.
1994 .Ss "  int sfeof(Sfio_t* f)"
1995 .Ss "  int sferror(Sfio_t* f)"
1996 .Ss "  int sfclrerr(Sfio_t* f)"
1997 \f5sfeof()\fP tells whether or not the stream has an end-of-file condition.
1998 \f5sferror()\fP tells whether or not the stream has an error condition.
1999 \f5sfclrerr()\fP clears both end-of-file and error conditions.
2000 The end-of-file and error conditions are also cleared on an I/O operation.
2002 .Ss "  int sfclrlock(Sfio_t* f)"
2003 This function restores the stream back to a normal state.
2004 This means clearing locks and possibly throwing away unprocessed data.
2005 As such, this operation is unsafe and should be used with care.
2006 For example, it may be used before a long jump (\f5longjmp(3)\fP)
2007 out of some discipline I/O function to restore the internal stream states.
2008 \f5sfclrlock()\fP returns the current set of flags.
2010 .Ss "  int sfnotify((void(*)notify)(Sfio_t*, int, void*) )"
2011 This sets a function \f5(*notify)()\fP to be called
2012 as \f5(*notify)(f, type, data)\fP on various stream events.
2013 Arguments \f5type\fP and \f5data\fP indicate the reason for the call and accompanying data:
2015 \f5SF_NEW\fP:
2016 \f5f\fP is being opened and \f5data\fP is the underlying file descriptor.
2018 \f5SF_CLOSING\fP (\f5SF_CLOSE\fP):
2019 \f5f\fP is the stream being closed and \f5data\fP is the underlying file descriptor.
2021 \f5SF_SETFD\fP:
2022 The file descriptor of \f5f\fP is being changed to the one
2023 defined by \f5data\fP (see \f5sfsetfd()\fP.)
2025 \f5SF_READ\fP:
2026 An attempt to change \f5f\fP to read mode failed.
2027 \f5data\fP is the file descriptor of the stream.
2029 \f5SF_WRITE\fP:
2030 An attempt to change \f5f\fP to write mode failed.
2031 \f5data\fP is the file descriptor of the stream.
2033 \f5SF_MTACCESS\fP:
2034 When a notifying function was registered (see \f5sfnotify()\fP),
2035 every Sfio call on a stream with flag \f5SF_MTSAFE\fP will
2036 invoke the notifying function
2037 once on entry after the stream is locked
2038 as \f5(*notify)(f, SF_MTACCESS, Sfio_t** fp), and
2039 once on return before unlocking as
2040 as \f5(*notify)(f, SF_MTACCESS, (Sfio_t**)0).
2041 In the call entry case,
2042 the notification function could use the argument \f5fp\fP
2043 to set a stream that would be used for performing the actual I/O operation.
2044 In this way, certain global streams such as the standard streams \f5sfstdin\fP,
2045 \f5sfstdout\fP and \f5sfstderr\fP could be made to act differently when used
2046 in different streams.
2048 .Ss "  int sfwalk(Sfwalk_f walkf, Void_t* data, int type)"
2049 This function invokes \f5(*walkf)(f, data)\fP on every open stream \f5f\fP
2050 whose flags as defined by \f5sfset()\fP contains all bit flags given in \f5type\fP.
2051 On such a call, if the return value is negative, \f5sfwalk()\fP will terminate.
2052 \f5sfwalk()\fP returns 0 if no stream was processed.
2053 Otherwise, it returns the return value from the last invocation of \f5walkf()\fP.
2055 As an example, the call \f5sfwalk(walkf, data, SF_READ)\fP will iterate over all streams
2056 opened for reading. Similarly, \f5sfwalk(walkf, data, SF_READ|SF_WRITE)\fP 
2057 iterates over all streams opened for both reading and writing.
2058 Lastly, \f5sfwalk(walkf, data, 0)\fP iterates over all streams.
2061 .Ss "MISCELLANEOUS FUNCTIONS"
2063 .Ss "  ssize_t sfmaxr(ssize_t maxr, int set)"
2064 Certain records may require too much memory for storage, thus, causing
2065 undesirable side effects. Therefore, the library normally bounds the amount
2066 of memory used by \f5sfgetr()\fP. A different memory bound
2067 can be set via \f5sfmaxr()\fP. While a positive \f5maxr\fP hints to \f5sfgetr()\fP
2068 to use only about that much memory to construct a record, a non-positive bound
2069 allows \f5sfgetr()\fP to use as much memory as necessary.
2070 \f5sfmaxr()\fP sets the value only if \f5set\fP is non-zero.
2071 It returns the value before setting or the current value if not setting.
2073 .Ss "  ssize_t sfslen()"
2074 This function returns the length of a string just constructed
2075 by \f5sfsprintf()\fP or \f5sfprints()\fP.  See also \f5sfvalue()\fP.
2077 .Ss "  int sfulen(Sfulong_t v)"
2078 .Ss "  int sfllen(Sflong_t v)"
2079 .Ss "  int sfdlen(Sfdouble_t v)"
2080 These functions return respectively the number of bytes required to code the
2081 \f5Sfulong_t\fP, \f5Sflong_t\fP or \f5Sfdouble_t\fP value \f5v\fP by \f5sfputu()\fP,
2082 \f5sfputl()\fP or \f5sfputd()\fP.
2084 .Ss "  ssize_t sfpkrd(int fd, char* buf, size_t n, int rsc, long tm, int action)"
2085 This function acts directly on the file descriptor \f5fd\fP.
2086 It does a combination of peeking on incoming data and a time-out read.
2087 Upon success, it returns the number of bytes received.
2088 A return value of \f50\fP means that the end-of-file condition has been detected.
2089 A negative value represents an error.
2091 \f5buf\fP, \f5n\fP:
2092 These define a buffer and its size to read data into.
2094 \f5rsc\fP:
2095 If \f5>=0\fP, this defines a record separator.
2096 If the last returned byte is not the record separator, then
2097 the read data did not contain a complete record. Otherwise,
2098 it contains one or more records.
2099 See also \f5action\fP below.
2101 \f5tm\fP:
2102 If \f5>=0\fP, this defines a time interval in milliseconds to wait for incoming data.
2104 \f5action\fP:
2105 If \f5action > 0\fP, \f5sfpkrd()\fP will peek on incoming data but
2106 will not read past it. Therefore, a future \f5sfpkrd()\fP or \f5read(2)\fP will see
2107 the same data again.
2108 If \f5action <= 0\fP, \f5sfpkrd()\fP will not peek and there are two cases.
2109 If \f5rsc < 0\fP, an attempt is made to read \f5n\fP bytes.
2110 If \f5rsc >= 0\fP, an attempt is made to read one record.
2113 .Ss "FULL STRUCTURE SFIO_T"
2115 .Ss "  #include <sfio_t.h>"
2116 Most applications based on Sfio only need to include
2117 the header file \f5sfio.h\fP which defines an abbreviated \f5Sfio_t\fP
2118 structure without certain fields private to Sfio.
2119 However, there are times (e.g., debugging)
2120 when an application may require more details about the full \f5Sfio_t\fP structure.
2121 In such cases, the header file \f5sfio_t.h\fP can be used in place of \f5sfio.h\fP.
2122 Note that an application doing this will become sensitive to changes
2123 in the internal architecture of Sfio.
2125 .Ss "  #define SFNEW(buf,size,file,flags,disc)"
2126 This macro function is defined in \f5sfio_t.h\fP for
2127 use in static initialization of an \f5Sfio_t\fP structure.
2128 It requires five arguments:
2130 \f5buf, size\fP:
2131 These define a buffer and its size.
2133 \f5file\fP:
2134 This defines the underlying file descriptor if any.
2136 \f5flags\fP:
2137 This is composed from bit flags described above.
2139 \f5disc\fP:
2140 This defines a discipline if any.
2143 .Ss "EXAMPLE DISCIPLINES"
2145 The below functions create disciplines and insert them into
2146 the given streams \f5f\fP. These functions return \f50\fP
2147 on success and \f5-1\fP on failure.
2149 .Ss "int sfdcdio(Sfio_t* f, size_t bufsize)"
2150 This creates a discipline that uses the direct IO feature
2151 available on file systems such as SGI's XFS to speed up IO.
2152 The argument \f5bufsize\fP suggests a buffer size to use for data transfer.
2154 .Ss "int sfdcdos(Sfio_t* f)"
2155 This creates a discipline to read DOS text files.
2156 It basically transforms pairs of \er\en to \en.
2158 .Ss "int sfdcfilter(Sfio_t* f, const char* cmd)"
2159 This creates a discipline that sends data from \f5f\fP
2160 to the given command \f5cmd\fP to process, then reads back the processed data.
2162 .Ss "int sfdcseekable(Sfio_t* f)"
2163 This creates a discipline that makes an unseekable reading stream seekable.
2165 .Ss "int sfdcslow(Sfio_t* f)"
2166 This creates a discipline that makes all Sfio operations return immediately
2167 on interrupts. This is useful for dealing with slow devices.
2169 .Ss "int sfdcsubstream(Sfio_t* f, Sfio_t* parent, Sfoff_t offset, Sfoff_t extent)"
2170 This creates a discipline that makes \f5f\fP acts as if it
2171 corresponds exactly to the subsection of \f5parent\fP
2172 starting at \f5offset\fP with size \f5extent\fP.
2174 .Ss "int sfdctee(Sfio_t* f, Sfio_t* tee)"
2175 This creates a discipline that copies to the stream \f5tee\fP
2176 any data written to \f5f\fP.
2178 .Ss "int sfdcunion(Sfio_t* f, Sfio_t** array, int n)"
2179 This creates a discipline that makes \f5f\fP act as if it is
2180 the concatenation of the \f5n\fP streams given in \f5array\fP.
2182 .Ss "int sfdclzw(Sfio_t* f)"
2183 This creates a discipline that would decompress data in \f5f\fP.
2184 The stream \f5f\fP should have data from a source compressed by
2185 the Unix \fBcompress\fP program.
2187 .Ss "int sfdcgzip(Sfio_t* f, int opt)"
2188 This creates a discipline for reading/writing data compressed by zlib.
2189 The argument \f5opt\fP defines the optimization level.
2192 .Ss "STDIO-COMPATIBILITY"
2194 Sfio provides compatibility functions for all various popular
2195 Stdio implementations at source and binary level.
2196 The source Stdio-compatibility interface
2197 provides the header file \f5stdio.h\fP that defines
2198 a set of macros or inlined functions to map Stdio calls to Sfio ones.
2199 This mapping may benignly extend or change the meaning of certain
2200 original Stdio operations. For example, the Sfio's version of
2201 \f5popen()\fP allows a coprocess to be opened for both reading and writing
2202 unlike the original call which only allows a coprocess to be opened for a single mode.
2203 Similarly, the Sfio's \f5fopen()\fP call can be used to create
2204 string streams in addition to file streams.
2206 The standard streams \f5stdin\fP, \f5stdout\fP and \f5stderr\fP
2207 are mapped via \f5#define\fP to \f5sfstdin\fP, \f5sfstdout\fP and \f5sfstderr\fP.
2208 The latter are typically declared of the type \f5Sfio_t*\fP.
2209 Certain older Stdio applications require these to be declared
2210 as addresses of structures so that static initializations of
2211 the sort ``\f5FILE*\ f\ =\ stdin;\fP'' would work.
2212 Such applications should use the compile time flag \f5SF_FILE_STRUCT\fP
2213 to achieve the desired effect.
2215 The binary Stdio-compatibility libraries, \f5libstdio.a\fP and \f5libstdio-mt.a\fP,
2216 provide complete implementations of Stdio functions suitable
2217 for linking applications already compiled with native header \f5stdio.h\fP.
2218 These functions are also slightly altered or extended
2219 as discussed above.
2221 Below are the supported Stdio functions:
2224 .ft 5
2225 FILE*  fopen(const char* file, const char* mode);
2226 FILE*  freopen(const char* file, const char* mode, FILE* stream);
2227 FILE*  fdopen(int filedesc, const char* mode);
2228 FILE*  popen(const char* command, const char* mode);
2229 FILE*  tmpfile();
2230 int    fclose(FILE* stream);
2231 int    pclose(FILE* stream);
2233 void   flockfile(FILE* stream)
2234 int    ftrylockfile(FILE* stream)
2235 void   funlockfile(FILE* stream)
2237 void   setbuf(FILE* stream, char* buf);
2238 int    setvbuf(FILE* stream, char* buf, int mode, size_t size);
2239 void   setbuffer(FILE* stream, char* buf, size_t size);
2240 int    setlinebuf(FILE* stream);
2241 int    fflush(FILE* stream);
2242 int    fpurge(FILE* stream);
2244 int    fseek(FILE* stream, long offset, int whence);
2245 void   rewind(FILE* stream);
2246 int    fgetpos(FILE* stream, fpos_t* pos);
2247 int    fsetpos(FILE* stream, fpos_t* pos);
2248 long   ftell(FILE* stream);
2250 int    getc(FILE* stream);
2251 int    fgetc(FILE* stream);
2252 int    getchar(void);
2253 int    ungetc(int c, FILE* stream);
2254 int    getw(FILE* stream);
2255 char*  gets(char* s);
2256 char*  fgets(char* s, int n, FILE* stream);
2257 size_t fread(Void_t* ptr, size_t size, size_t nelt, FILE* stream);
2259 int    putc(int c, FILE* stream);
2260 int    fputc(int c, FILE* stream);
2261 int    putchar(int c);
2262 int    putw(int w, FILE* stream);
2263 int    puts(const char* s, FILE* stream);
2264 int    fputs(const char* s, FILE* stream);
2265 size_t fwrite(const Void_t* ptr, size_t size, size_t nelt, FILE* stream);
2267 int    fscanf(FILE* stream, const char* format, ...);
2268 int    vfscanf(FILE* stream, const char* format, va_list args);
2269 int    _doscan(FILE* stream, const char* format, va_list args);
2270 int    scanf(const char* format, ...);
2271 int    vscanf(const char* format, va_list args);
2272 int    sscanf(const char* s, const char* format, ...);
2273 int    vsscanf(const char* s, const char* format, va_list args);
2275 int    fprintf(FILE* stream, const char* format, ...);
2276 int    vfprintf(FILE* stream, const char* format, va_list args);
2277 int    _doprnt(FILE* stream, const char* format, va_list args);
2278 int    printf(const char* format, ...);
2279 int    vprintf(const char* format, va_list args);
2280 int    sprintf(const char* s, const char* format, ...);
2281 int    snprintf(const char* s, int n, const char* format, ...);
2282 int    vsprintf(const char* s, const char* format, va_list args);
2283 int    vsnprintf(const char* s, int n, const char* format, va_list args);
2285 int    feof(FILE* stream);
2286 int    ferror(FILE* stream);
2287 int    clearerr(FILE* stream);
2288 .ft 1
2292 .Ss "RECENT CHANGES"
2294 A few exception types have been added. In particular, exception handlers shall
2295 be raised with \f5SF_LOCKED\fP on accessing a stream frozen either by
2296 an ongoing operation or a previous operation (e.g., \f5sfgetr()\fP).
2297 Before a process exits, the event \f5SF_ATEXIT\fP is raised for each open stream.
2299 A number of disciplines were added for various processing functions.
2300 Of interests are disciplines to use the direct I/O feature on IRIX6.2,
2301 read DOS text files, and decompress files compressed by Unix \fIcompress\fP.
2303 Various new stream and function flags have been added. For example,
2304 the third argument of \f5sfgetr()\fP is now a set of bit flags and not
2305 just a three-value object. However, the old semantics of this argument
2306 of \f5sfgetr()\fP is still supported.
2308 The \f5sfopen()\fP call has been extended so that sfopen(f,NULL,mode) can be
2309 used to changed the mode of a file stream before any I/O operations.
2310 This is most useful for changing the modes of the standard streams.
2312 The buffering strategy has been significantly enhanced for streams
2313 that perform many seek operations. Also, the handling of stream and
2314 file positions have been better clarified so that applications that
2315 share file descriptors across streams and/or processes can be sure that
2316 the file states will be consistent.
2318 The strategy for mapping between Sfio and Stdio streams in the binary
2319 compatibility package has been significantly enhanced for efficiency.
2320 For most platforms, the mapping is now constant time per look-up.
2322 The \f5SF_BUFCONST\fP flag was deleted. This is largely unused anyway.
2324 The library can be built for thread-safety. This is based largely on
2325 Posix pthread mutexes except for on UWIN where native Windows APIs
2326 are used.
2328 The functions \f5sfgetm()\fP and \f5sfputm()\fP were added to encode
2329 unsigned integer values with known ranges.
2331 The flag \f5SF_APPEND\fP is identical to \f5SF_APPENDWR\fP.
2332 However it conflicts with a different token of the same name
2333 defined in the system header \f5stat.h\fP of BSDI Unix systems.
2334 On such systems, we shall not define \f5SF_APPEND\fP and this
2335 symbol may be removed in a future release.
2337 Similarly, the exception \f5SF_CLOSE\fP is identical to \f5SF_CLOSING\fP.
2338 However it conflicts with a different token of the same name
2339 defined in the system header \f5socket.h\fP of AIX Unix systems.
2340 On such systems, we shall not define \f5SF_CLOSE\fP and this
2341 symbol may be removed in a future release.
2343 The printing and scanning functions were extended to handle multibyte characters
2344 and to conform to the C99 standard.
2346 The function \f5sfpoll()\fP was rehauled to make it useful
2347 for writing servers that must commnunicate with multiple streams
2348 without blocking.
2350 The formatting pattern \f5%c\fP for \f5sf*printf\fP was extended
2351 to allow the flag \f5#\fP to print unprintable character values
2352 using the C convention. For example, \f5%#c\fP prints the octal value 012
2353 as \f5\\n\fP.
2355 .SH AUTHORS
2356 Kiem-Phong Vo, kpv@research.att.com,
2358 David G. Korn, dgk@research.att.com, and
2360 Glenn S. Fowler, gsf@research.att.com.