1 /* 2 * BEGIN illumos section 3 * This is an unstable interface; changes may be made 4 * without notice. 5 * END illumos section 6 */ 7 /*********************************************************************** 8 * * 9 * This software is part of the ast package * 10 * Copyright (c) 1985-2012 AT&T Intellectual Property * 11 * and is licensed under the * 12 * Eclipse Public License, Version 1.0 * 13 * by AT&T Intellectual Property * 14 * * 15 * A copy of the License is available at * 16 * http://www.eclipse.org/org/documents/epl-v10.html * 17 * (with md5 checksum b35adb5213ca9657e911e9befb180842) * 18 * * 19 * Information and Software Systems Research * 20 * AT&T Research * 21 * Florham Park NJ * 22 * * 23 * Glenn Fowler <gsf@research.att.com> * 24 * David Korn <dgk@research.att.com> * 25 * Phong Vo <kpv@research.att.com> * 26 * * 27 ***********************************************************************/ 28 #ifndef _SFIO_H 29 #define _SFIO_H 1 30 31 #define SFIO_VERSION 20090915L 32 33 /* Public header file for the sfio library 34 ** 35 ** Written by Kiem-Phong Vo 36 */ 37 38 typedef struct _sfio_s Sfio_t; 39 typedef struct _sfdisc_s Sfdisc_t; 40 41 #if defined(_AST_STD_H) || defined(_PACKAGE_ast) && defined(_SFIO_PRIVATE) 42 #include <ast_std.h> 43 #else 44 #include <ast_common.h> 45 #endif /* _PACKAGE_ast */ 46 47 /* Sfoff_t should be large enough for largest file address */ 48 #define Sfoff_t intmax_t 49 #define Sflong_t intmax_t 50 #define Sfulong_t uintmax_t 51 #define Sfdouble_t _ast_fltmax_t 52 53 typedef ssize_t (*Sfread_f)_ARG_((Sfio_t*, Void_t*, size_t, Sfdisc_t*)); 54 typedef ssize_t (*Sfwrite_f)_ARG_((Sfio_t*, const Void_t*, size_t, Sfdisc_t*)); 55 typedef Sfoff_t (*Sfseek_f)_ARG_((Sfio_t*, Sfoff_t, int, Sfdisc_t*)); 56 typedef int (*Sfexcept_f)_ARG_((Sfio_t*, int, Void_t*, Sfdisc_t*)); 57 typedef int (*Sfwalk_f)_ARG_((Sfio_t*, Void_t*)); 58 59 /* discipline structure */ 60 struct _sfdisc_s 61 { Sfread_f readf; /* read function */ 62 Sfwrite_f writef; /* write function */ 63 Sfseek_f seekf; /* seek function */ 64 Sfexcept_f exceptf; /* to handle exceptions */ 65 Sfdisc_t* disc; /* the continuing discipline */ 66 }; 67 68 #include <sfio_s.h> 69 70 /* formatting environment */ 71 typedef struct _sffmt_s Sffmt_t; 72 typedef int (*Sffmtext_f)_ARG_((Sfio_t*, Void_t*, Sffmt_t*)); 73 typedef int (*Sffmtevent_f)_ARG_((Sfio_t*, int, Void_t*, Sffmt_t*)); 74 struct _sffmt_s 75 { long version;/* version of this structure */ 76 Sffmtext_f extf; /* function to process arguments */ 77 Sffmtevent_f eventf; /* process events */ 78 79 char* form; /* format string to stack */ 80 va_list args; /* corresponding arg list */ 81 82 int fmt; /* format character */ 83 ssize_t size; /* object size */ 84 int flags; /* formatting flags */ 85 int width; /* width of field */ 86 int precis; /* precision required */ 87 int base; /* conversion base */ 88 89 char* t_str; /* type string */ 90 ssize_t n_str; /* length of t_str */ 91 92 Void_t* mbs; /* multibyte state for format string */ 93 94 Void_t* none; /* unused for now */ 95 }; 96 #define sffmtversion(fe,type) \ 97 ((type) ? ((fe)->version = SFIO_VERSION) : (fe)->version) 98 99 #define SFFMT_SSHORT 000000010 /* 'hh' flag, char */ 100 #define SFFMT_TFLAG 000000020 /* 't' flag, ptrdiff_t */ 101 #define SFFMT_ZFLAG 000000040 /* 'z' flag, size_t */ 102 103 #define SFFMT_LEFT 000000100 /* left-justification */ 104 #define SFFMT_SIGN 000000200 /* must have a sign */ 105 #define SFFMT_BLANK 000000400 /* if not signed, prepend a blank */ 106 #define SFFMT_ZERO 000001000 /* zero-padding on the left */ 107 #define SFFMT_ALTER 000002000 /* alternate formatting */ 108 #define SFFMT_THOUSAND 000004000 /* thousand grouping */ 109 #define SFFMT_SKIP 000010000 /* skip assignment in scanf() */ 110 #define SFFMT_SHORT 000020000 /* 'h' flag */ 111 #define SFFMT_LONG 000040000 /* 'l' flag */ 112 #define SFFMT_LLONG 000100000 /* 'll' flag */ 113 #define SFFMT_LDOUBLE 000200000 /* 'L' flag */ 114 #define SFFMT_VALUE 000400000 /* value is returned */ 115 #define SFFMT_ARGPOS 001000000 /* getting arg for $ patterns */ 116 #define SFFMT_IFLAG 002000000 /* 'I' flag */ 117 #define SFFMT_JFLAG 004000000 /* 'j' flag, intmax_t */ 118 #define SFFMT_CENTER 010000000 /* '=' flag, center justification */ 119 #define SFFMT_CHOP 020000000 /* chop long string values from left */ 120 #define SFFMT_SET 037777770 /* flags settable on calling extf */ 121 122 /* for sfmutex() call */ 123 #define SFMTX_LOCK 0 /* up mutex count */ 124 #define SFMTX_TRYLOCK 1 /* try to up mutex count */ 125 #define SFMTX_UNLOCK 2 /* down mutex count */ 126 #define SFMTX_CLRLOCK 3 /* clear mutex count */ 127 128 /* various constants */ 129 #ifndef NULL 130 #define NULL 0 131 #endif 132 #ifndef EOF 133 #define EOF (-1) 134 #endif 135 #ifndef SEEK_SET 136 #define SEEK_SET 0 137 #define SEEK_CUR 1 138 #define SEEK_END 2 139 #endif 140 141 /* bits for various types of files */ 142 #define SF_READ 0000001 /* open for reading */ 143 #define SF_WRITE 0000002 /* open for writing */ 144 #define SF_STRING 0000004 /* a string stream */ 145 #define SF_APPENDWR 0000010 /* file is in append mode only */ 146 #define SF_MALLOC 0000020 /* buffer is malloc-ed */ 147 #define SF_LINE 0000040 /* line buffering */ 148 #define SF_SHARE 0000100 /* stream with shared file descriptor */ 149 #define SF_EOF 0000200 /* eof was detected */ 150 #define SF_ERROR 0000400 /* an error happened */ 151 #define SF_STATIC 0001000 /* a stream that cannot be freed */ 152 #define SF_IOCHECK 0002000 /* call exceptf before doing IO */ 153 #define SF_PUBLIC 0004000 /* SF_SHARE and follow physical seek */ 154 #define SF_MTSAFE 0010000 /* need thread safety */ 155 #define SF_WHOLE 0020000 /* preserve wholeness of sfwrite/sfputr */ 156 #define SF_IOINTR 0040000 /* return on interrupts */ 157 #define SF_WCWIDTH 0100000 /* wcwidth display stream */ 158 159 #define SF_FLAGS 0177177 /* PUBLIC FLAGS PASSABLE TO SFNEW() */ 160 #define SF_SETS 0177163 /* flags passable to sfset() */ 161 162 #ifndef _SF_NO_OBSOLETE 163 #define SF_BUFCONST 0400000 /* unused flag - for compatibility only */ 164 #endif 165 166 /* for sfgetr/sfreserve to hold a record */ 167 #define SF_LOCKR 0000010 /* lock record, stop access to stream */ 168 #define SF_LASTR 0000020 /* get the last incomplete record */ 169 170 /* exception events: SF_NEW(0), SF_READ(1), SF_WRITE(2) and the below */ 171 #define SF_SEEK 3 /* seek error */ 172 #define SF_CLOSING 4 /* when stream is about to be closed */ 173 #define SF_DPUSH 5 /* when discipline is being pushed */ 174 #define SF_DPOP 6 /* when discipline is being popped */ 175 #define SF_DPOLL 7 /* see if stream is ready for I/O */ 176 #define SF_DBUFFER 8 /* buffer not empty during push or pop */ 177 #define SF_SYNC 9 /* announcing start/end synchronization */ 178 #define SF_PURGE 10 /* a sfpurge() call was issued */ 179 #define SF_FINAL 11 /* closing is done except stream free */ 180 #define SF_READY 12 /* a polled stream is ready */ 181 #define SF_LOCKED 13 /* stream is in a locked state */ 182 #define SF_ATEXIT 14 /* process is exiting */ 183 #define SF_EVENT 100 /* start of user-defined events */ 184 185 /* for stack and disciplines */ 186 #define SF_POPSTACK ((Sfio_t*)0) /* pop the stream stack */ 187 #define SF_POPDISC ((Sfdisc_t*)0) /* pop the discipline stack */ 188 189 /* for the notify function and discipline exception */ 190 #define SF_NEW 0 /* new stream */ 191 #define SF_SETFD (-1) /* about to set the file descriptor */ 192 #define SF_MTACCESS (-2) /* starting a multi-threaded stream */ 193 194 #define SF_BUFSIZE 8192 /* default buffer size */ 195 #define SF_UNBOUND (-1) /* unbounded buffer size */ 196 197 /* namespace incursion workarounds -- migrate to the new names */ 198 #if !_mac_SF_APPEND 199 #define SF_APPEND SF_APPENDWR /* BSDI sys/stat.h */ 200 #endif 201 #if !_mac_SF_CLOSE 202 #define SF_CLOSE SF_CLOSING /* AIX sys/socket.h */ 203 #endif 204 205 _BEGIN_EXTERNS_ 206 207 #if _BLD_sfio && defined(__EXPORT__) 208 #define extern extern __EXPORT__ 209 #endif 210 #if !_BLD_sfio && defined(__IMPORT__) 211 #define extern extern __IMPORT__ 212 #endif 213 214 extern ssize_t _Sfi; 215 extern ssize_t _Sfmaxr; 216 217 /* standard in/out/err streams */ 218 extern Sfio_t* sfstdin; 219 extern Sfio_t* sfstdout; 220 extern Sfio_t* sfstderr; 221 222 #if _UWIN 223 #undef extern 224 #endif 225 226 extern Sfio_t _Sfstdin; 227 extern Sfio_t _Sfstdout; 228 extern Sfio_t _Sfstderr; 229 230 #undef extern 231 232 #if _BLD_sfio && defined(__EXPORT__) 233 #define extern __EXPORT__ 234 #endif 235 236 extern Sfio_t* sfnew _ARG_((Sfio_t*, Void_t*, size_t, int, int)); 237 extern Sfio_t* sfopen _ARG_((Sfio_t*, const char*, const char*)); 238 extern Sfio_t* sfpopen _ARG_((Sfio_t*, const char*, const char*)); 239 extern Sfio_t* sfstack _ARG_((Sfio_t*, Sfio_t*)); 240 extern Sfio_t* sfswap _ARG_((Sfio_t*, Sfio_t*)); 241 extern Sfio_t* sftmp _ARG_((size_t)); 242 extern int sfwalk _ARG_((Sfwalk_f, Void_t*, int)); 243 extern int sfpurge _ARG_((Sfio_t*)); 244 extern int sfpoll _ARG_((Sfio_t**, int, int)); 245 extern Void_t* sfreserve _ARG_((Sfio_t*, ssize_t, int)); 246 extern int sfresize _ARG_((Sfio_t*, Sfoff_t)); 247 extern int sfsync _ARG_((Sfio_t*)); 248 extern int sfclrlock _ARG_((Sfio_t*)); 249 extern Void_t* sfsetbuf _ARG_((Sfio_t*, Void_t*, size_t)); 250 extern Sfdisc_t* sfdisc _ARG_((Sfio_t*,Sfdisc_t*)); 251 extern int sfraise _ARG_((Sfio_t*, int, Void_t*)); 252 extern int sfnotify _ARG_((void(*)(Sfio_t*, int, void*))); 253 extern int sfset _ARG_((Sfio_t*, int, int)); 254 extern int sfsetfd _ARG_((Sfio_t*, int)); 255 extern Sfio_t* sfpool _ARG_((Sfio_t*, Sfio_t*, int)); 256 extern ssize_t sfread _ARG_((Sfio_t*, Void_t*, size_t)); 257 extern ssize_t sfwrite _ARG_((Sfio_t*, const Void_t*, size_t)); 258 extern Sfoff_t sfmove _ARG_((Sfio_t*, Sfio_t*, Sfoff_t, int)); 259 extern int sfclose _ARG_((Sfio_t*)); 260 extern Sfoff_t sftell _ARG_((Sfio_t*)); 261 extern Sfoff_t sfseek _ARG_((Sfio_t*, Sfoff_t, int)); 262 extern ssize_t sfputr _ARG_((Sfio_t*, const char*, int)); 263 extern char* sfgetr _ARG_((Sfio_t*, int, int)); 264 extern ssize_t sfnputc _ARG_((Sfio_t*, int, size_t)); 265 extern int sfungetc _ARG_((Sfio_t*, int)); 266 extern int sfprintf _ARG_((Sfio_t*, const char*, ...)); 267 extern char* sfprints _ARG_((const char*, ...)); 268 extern ssize_t sfaprints _ARG_((char**, const char*, ...)); 269 extern ssize_t sfsprintf _ARG_((char*, size_t, const char*, ...)); 270 extern ssize_t sfvsprintf _ARG_((char*, size_t, const char*, va_list)); 271 extern ssize_t sfvasprints _ARG_((char**, const char*, va_list)); 272 extern int sfvprintf _ARG_((Sfio_t*, const char*, va_list)); 273 extern int sfscanf _ARG_((Sfio_t*, const char*, ...)); 274 extern int sfsscanf _ARG_((const char*, const char*, ...)); 275 extern int sfvsscanf _ARG_((const char*, const char*, va_list)); 276 extern int sfvscanf _ARG_((Sfio_t*, const char*, va_list)); 277 278 /* mutex locking for thread-safety */ 279 extern int sfmutex _ARG_((Sfio_t*, int)); 280 281 /* io functions with discipline continuation */ 282 extern ssize_t sfrd _ARG_((Sfio_t*, Void_t*, size_t, Sfdisc_t*)); 283 extern ssize_t sfwr _ARG_((Sfio_t*, const Void_t*, size_t, Sfdisc_t*)); 284 extern Sfoff_t sfsk _ARG_((Sfio_t*, Sfoff_t, int, Sfdisc_t*)); 285 extern ssize_t sfpkrd _ARG_((int, Void_t*, size_t, int, long, int)); 286 287 /* portable handling of primitive types */ 288 extern int sfdlen _ARG_((Sfdouble_t)); 289 extern int sfllen _ARG_((Sflong_t)); 290 extern int sfulen _ARG_((Sfulong_t)); 291 292 extern int sfputd _ARG_((Sfio_t*, Sfdouble_t)); 293 extern int sfputl _ARG_((Sfio_t*, Sflong_t)); 294 extern int sfputu _ARG_((Sfio_t*, Sfulong_t)); 295 extern int sfputm _ARG_((Sfio_t*, Sfulong_t, Sfulong_t)); 296 extern int sfputc _ARG_((Sfio_t*, int)); 297 298 extern Sfdouble_t sfgetd _ARG_((Sfio_t*)); 299 extern Sflong_t sfgetl _ARG_((Sfio_t*)); 300 extern Sfulong_t sfgetu _ARG_((Sfio_t*)); 301 extern Sfulong_t sfgetm _ARG_((Sfio_t*, Sfulong_t)); 302 extern int sfgetc _ARG_((Sfio_t*)); 303 304 extern int _sfputd _ARG_((Sfio_t*, Sfdouble_t)); 305 extern int _sfputl _ARG_((Sfio_t*, Sflong_t)); 306 extern int _sfputu _ARG_((Sfio_t*, Sfulong_t)); 307 extern int _sfputm _ARG_((Sfio_t*, Sfulong_t, Sfulong_t)); 308 extern int _sfflsbuf _ARG_((Sfio_t*, int)); 309 310 extern int _sffilbuf _ARG_((Sfio_t*, int)); 311 312 extern int _sfdlen _ARG_((Sfdouble_t)); 313 extern int _sfllen _ARG_((Sflong_t)); 314 extern int _sfulen _ARG_((Sfulong_t)); 315 316 /* miscellaneous function analogues of fast in-line functions */ 317 extern Sfoff_t sfsize _ARG_((Sfio_t*)); 318 extern int sfclrerr _ARG_((Sfio_t*)); 319 extern int sfeof _ARG_((Sfio_t*)); 320 extern int sferror _ARG_((Sfio_t*)); 321 extern int sffileno _ARG_((Sfio_t*)); 322 extern int sfstacked _ARG_((Sfio_t*)); 323 extern ssize_t sfvalue _ARG_((Sfio_t*)); 324 extern ssize_t sfslen _ARG_((void)); 325 extern ssize_t sfmaxr _ARG_((ssize_t, int)); 326 327 #undef extern 328 _END_EXTERNS_ 329 330 /* coding long integers in a portable and compact fashion */ 331 #define SF_SBITS 6 332 #define SF_UBITS 7 333 #define SF_BBITS 8 334 #define SF_SIGN (1 << SF_SBITS) 335 #define SF_MORE (1 << SF_UBITS) 336 #define SF_BYTE (1 << SF_BBITS) 337 #define SF_U1 SF_MORE 338 #define SF_U2 (SF_U1*SF_U1) 339 #define SF_U3 (SF_U2*SF_U1) 340 #define SF_U4 (SF_U3*SF_U1) 341 342 #if __cplusplus 343 #define _SF_(f) (f) 344 #else 345 #define _SF_(f) ((Sfio_t*)(f)) 346 #endif 347 348 #define __sf_putd(f,v) (_sfputd(_SF_(f),(Sfdouble_t)(v))) 349 #define __sf_putl(f,v) (_sfputl(_SF_(f),(Sflong_t)(v))) 350 #define __sf_putu(f,v) (_sfputu(_SF_(f),(Sfulong_t)(v))) 351 #define __sf_putm(f,v,m) (_sfputm(_SF_(f),(Sfulong_t)(v),(Sfulong_t)(m))) 352 353 #define __sf_putc(f,c) (_SF_(f)->_next >= _SF_(f)->_endw ? \ 354 _sfflsbuf(_SF_(f),(int)((unsigned char)(c))) : \ 355 (int)(*_SF_(f)->_next++ = (unsigned char)(c)) ) 356 #define __sf_getc(f) (_SF_(f)->_next >= _SF_(f)->_endr ? _sffilbuf(_SF_(f),0) : \ 357 (int)(*_SF_(f)->_next++) ) 358 359 #define __sf_dlen(v) (_sfdlen((Sfdouble_t)(v)) ) 360 #define __sf_llen(v) (_sfllen((Sflong_t)(v)) ) 361 #define __sf_ulen(v) ((Sfulong_t)(v) < SF_U1 ? 1 : (Sfulong_t)(v) < SF_U2 ? 2 : \ 362 (Sfulong_t)(v) < SF_U3 ? 3 : (Sfulong_t)(v) < SF_U4 ? 4 : 5) 363 364 #define __sf_fileno(f) (_SF_(f)->_file) 365 #define __sf_eof(f) (_SF_(f)->_flags&SF_EOF) 366 #define __sf_error(f) (_SF_(f)->_flags&SF_ERROR) 367 #define __sf_clrerr(f) (_SF_(f)->_flags &= ~(SF_ERROR|SF_EOF)) 368 #define __sf_stacked(f) (_SF_(f)->_push != (Sfio_t*)0) 369 #define __sf_value(f) (_SF_(f)->_val) 370 #define __sf_slen() (_Sfi) 371 #define __sf_maxr(n,s) ((s)?((_Sfi=_Sfmaxr),(_Sfmaxr=(n)),_Sfi):_Sfmaxr) 372 373 #if defined(__INLINE__) && !_BLD_sfio 374 375 __INLINE__ int sfputd(Sfio_t* f, Sfdouble_t v) { return __sf_putd(f,v); } 376 __INLINE__ int sfputl(Sfio_t* f, Sflong_t v) { return __sf_putl(f,v); } 377 __INLINE__ int sfputu(Sfio_t* f, Sfulong_t v) { return __sf_putu(f,v); } 378 __INLINE__ int sfputm(Sfio_t* f, Sfulong_t v, Sfulong_t m) 379 { return __sf_putm(f,v,m); } 380 381 __INLINE__ int sfputc(Sfio_t* f, int c) { return __sf_putc(f,c); } 382 __INLINE__ int sfgetc(Sfio_t* f) { return __sf_getc(f); } 383 384 __INLINE__ int sfdlen(Sfdouble_t v) { return __sf_dlen(v); } 385 __INLINE__ int sfllen(Sflong_t v) { return __sf_llen(v); } 386 __INLINE__ int sfulen(Sfulong_t v) { return __sf_ulen(v); } 387 388 __INLINE__ int sffileno(Sfio_t* f) { return __sf_fileno(f); } 389 __INLINE__ int sfeof(Sfio_t* f) { return __sf_eof(f); } 390 __INLINE__ int sferror(Sfio_t* f) { return __sf_error(f); } 391 __INLINE__ int sfclrerr(Sfio_t* f) { return __sf_clrerr(f); } 392 __INLINE__ int sfstacked(Sfio_t* f) { return __sf_stacked(f); } 393 __INLINE__ ssize_t sfvalue(Sfio_t* f) { return __sf_value(f); } 394 __INLINE__ ssize_t sfslen() { return __sf_slen(); } 395 __INLINE__ ssize_t sfmaxr(ssize_t n, int s) { return __sf_maxr(n,s); } 396 397 #else 398 399 #define sfputd(f,v) ( __sf_putd((f),(v)) ) 400 #define sfputl(f,v) ( __sf_putl((f),(v)) ) 401 #define sfputu(f,v) ( __sf_putu((f),(v)) ) 402 #define sfputm(f,v,m) ( __sf_putm((f),(v),(m)) ) 403 404 #define sfputc(f,c) ( __sf_putc((f),(c)) ) 405 #define sfgetc(f) ( __sf_getc(f) ) 406 407 #define sfdlen(v) ( __sf_dlen(v) ) 408 #define sfllen(v) ( __sf_llen(v) ) 409 #define sfulen(v) ( __sf_ulen(v) ) 410 411 #define sffileno(f) ( __sf_fileno(f) ) 412 #define sfeof(f) ( __sf_eof(f) ) 413 #define sferror(f) ( __sf_error(f) ) 414 #define sfclrerr(f) ( __sf_clrerr(f) ) 415 #define sfstacked(f) ( __sf_stacked(f) ) 416 #define sfvalue(f) ( __sf_value(f) ) 417 #define sfslen() ( __sf_slen() ) 418 #define sfmaxr(n,s) ( __sf_maxr(n,s) ) 419 420 #endif /*__INLINE__*/ 421 422 #ifndef _SFSTR_H /* GSF's string manipulation stuff */ 423 #define _SFSTR_H 1 424 425 #define sfstropen() sfnew(0, 0, -1, -1, SF_READ|SF_WRITE|SF_STRING) 426 #define sfstrclose(f) sfclose(f) 427 428 #define sfstrseek(f,p,m) \ 429 ( (m) == SEEK_SET ? \ 430 (((p) < 0 || (p) > (f)->_size) ? (char*)0 : \ 431 (char*)((f)->_next = (f)->_data+(p)) ) \ 432 : (m) == SEEK_CUR ? \ 433 ((f)->_next += (p), \ 434 (((f)->_next < (f)->_data || (f)->_next > (f)->_data+(f)->_size) ? \ 435 ((f)->_next -= (p), (char*)0) : (char*)(f)->_next ) ) \ 436 : (m) == SEEK_END ? \ 437 ( ((p) > 0 || (f)->_size < -(p)) ? (char*)0 : \ 438 (char*)((f)->_next = (f)->_data+(f)->_size+(p)) ) \ 439 : (char*)0 \ 440 ) 441 442 #define sfstrsize(f) ((f)->_size) 443 #define sfstrtell(f) ((f)->_next - (f)->_data) 444 #define sfstrpend(f) ((f)->_size - sfstrtell()) 445 #define sfstrbase(f) ((char*)(f)->_data) 446 447 #define sfstruse(f) \ 448 (sfputc((f),0) < 0 ? (char*)0 : (char*)((f)->_next = (f)->_data) \ 449 ) 450 451 #define sfstrrsrv(f,n) \ 452 (sfreserve((f),(n),SF_WRITE|SF_LOCKR), sfwrite((f),(f)->_next,0), \ 453 ((f)->_next+(n) <= (f)->_data+(f)->_size ? (char*)(f)->_next : (char*)0) \ 454 ) 455 456 #define sfstrbuf(f,b,n,m) \ 457 (sfsetbuf((f),(b),(n)), ((f)->_flags |= (m) ? SF_MALLOC : 0), \ 458 ((f)->_data == (unsigned char*)(b) ? 0 : -1) \ 459 ) 460 461 #endif /* _SFSTR_H */ 462 463 #endif /* _SFIO_H */ 464