14887Schin /*********************************************************************** 24887Schin * * 34887Schin * This software is part of the ast package * 4*12068SRoger.Faulkner@Oracle.COM * Copyright (c) 1985-2010 AT&T Intellectual Property * 54887Schin * and is licensed under the * 64887Schin * Common Public License, Version 1.0 * 78462SApril.Chin@Sun.COM * by AT&T Intellectual Property * 84887Schin * * 94887Schin * A copy of the License is available at * 104887Schin * http://www.opensource.org/licenses/cpl1.0.txt * 114887Schin * (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * 124887Schin * * 134887Schin * Information and Software Systems Research * 144887Schin * AT&T Research * 154887Schin * Florham Park NJ * 164887Schin * * 174887Schin * Glenn Fowler <gsf@research.att.com> * 184887Schin * David Korn <dgk@research.att.com> * 194887Schin * Phong Vo <kpv@research.att.com> * 204887Schin * * 214887Schin ***********************************************************************/ 224887Schin #ifndef _SFIO_T_H 234887Schin #define _SFIO_T_H 1 244887Schin 254887Schin /* This header file is for library writers who need to know certain 264887Schin ** internal info concerning the full Sfio_t structure. Including this 274887Schin ** file means that you agree to track closely with sfio development 284887Schin ** in case its internal architecture is changed. 294887Schin ** 304887Schin ** Written by Kiem-Phong Vo 314887Schin */ 324887Schin 334887Schin /* the parts of Sfio_t private to sfio functions */ 344887Schin #define _SFIO_PRIVATE \ 354887Schin Sfoff_t extent; /* current file size */ \ 364887Schin Sfoff_t here; /* current physical location */ \ 374887Schin unsigned char getr; /* the last sfgetr separator */ \ 384887Schin unsigned char tiny[1];/* for unbuffered read stream */ \ 394887Schin unsigned short bits; /* private flags */ \ 404887Schin unsigned int mode; /* current io mode */ \ 414887Schin struct _sfdisc_s* disc; /* discipline */ \ 424887Schin struct _sfpool_s* pool; /* the pool containing this */ \ 434887Schin struct _sfrsrv_s* rsrv; /* reserved buffer */ \ 444887Schin struct _sfproc_s* proc; /* coprocess id, etc. */ \ 454887Schin Void_t* mutex; /* mutex for thread-safety */ \ 464887Schin Void_t* stdio; /* stdio FILE if any */ \ 474887Schin Sfoff_t lpos; /* last seek position */ \ 484887Schin size_t iosz; /* preferred size for I/O */ \ 494887Schin size_t blksz; /* preferred block size */ \ 504887Schin Void_t* fill[1];/* modest expansion */ 514887Schin 524887Schin #include "sfio.h" 534887Schin 544887Schin /* mode bit to indicate that the structure hasn't been initialized */ 554887Schin #define SF_INIT 0000004 564887Schin #define SF_DCDOWN 00010000 574887Schin 584887Schin /* short-hand for common stream types */ 594887Schin #define SF_RDWR (SF_READ|SF_WRITE) 604887Schin #define SF_RDSTR (SF_READ|SF_STRING) 614887Schin #define SF_WRSTR (SF_WRITE|SF_STRING) 624887Schin #define SF_RDWRSTR (SF_RDWR|SF_STRING) 634887Schin 644887Schin /* for static initialization of an Sfio_t structure */ 654887Schin #define SFNEW(data,size,file,type,disc,mutex) \ 664887Schin { (unsigned char*)(data), /* next */ \ 674887Schin (unsigned char*)(data), /* endw */ \ 684887Schin (unsigned char*)(data), /* endr */ \ 694887Schin (unsigned char*)(data), /* endb */ \ 704887Schin (Sfio_t*)0, /* push */ \ 714887Schin (unsigned short)((type)&SF_FLAGS), /* flags */ \ 724887Schin (short)(file), /* file */ \ 734887Schin (unsigned char*)(data), /* data */ \ 744887Schin (ssize_t)(size), /* size */ \ 754887Schin (ssize_t)(-1), /* val */ \ 764887Schin (Sfoff_t)0, /* extent */ \ 774887Schin (Sfoff_t)0, /* here */ \ 784887Schin 0, /* getr */ \ 794887Schin {0}, /* tiny */ \ 804887Schin 0, /* bits */ \ 814887Schin (unsigned int)(((type)&(SF_RDWR))|SF_INIT), /* mode */ \ 824887Schin (struct _sfdisc_s*)(disc), /* disc */ \ 834887Schin (struct _sfpool_s*)0, /* pool */ \ 844887Schin (struct _sfrsrv_s*)0, /* rsrv */ \ 854887Schin (struct _sfproc_s*)0, /* proc */ \ 864887Schin (mutex), /* mutex */ \ 874887Schin (Void_t*)0, /* stdio */ \ 884887Schin (Sfoff_t)0, /* lpos */ \ 894887Schin (size_t)0 /* iosz */ \ 904887Schin } 914887Schin 924887Schin /* function to clear an Sfio_t structure */ 934887Schin #define SFCLEAR(f,mtx) \ 944887Schin ( (f)->next = (unsigned char*)0, /* next */ \ 954887Schin (f)->endw = (unsigned char*)0, /* endw */ \ 964887Schin (f)->endr = (unsigned char*)0, /* endr */ \ 974887Schin (f)->endb = (unsigned char*)0, /* endb */ \ 984887Schin (f)->push = (Sfio_t*)0, /* push */ \ 994887Schin (f)->flags = (unsigned short)0, /* flags */ \ 1004887Schin (f)->file = -1, /* file */ \ 1014887Schin (f)->data = (unsigned char*)0, /* data */ \ 1024887Schin (f)->size = (ssize_t)(-1), /* size */ \ 1034887Schin (f)->val = (ssize_t)(-1), /* val */ \ 1044887Schin (f)->extent = (Sfoff_t)(-1), /* extent */ \ 1054887Schin (f)->here = (Sfoff_t)0, /* here */ \ 1064887Schin (f)->getr = 0, /* getr */ \ 1074887Schin (f)->tiny[0] = 0, /* tiny */ \ 1084887Schin (f)->bits = 0, /* bits */ \ 1094887Schin (f)->mode = 0, /* mode */ \ 1104887Schin (f)->disc = (struct _sfdisc_s*)0, /* disc */ \ 1114887Schin (f)->pool = (struct _sfpool_s*)0, /* pool */ \ 1124887Schin (f)->rsrv = (struct _sfrsrv_s*)0, /* rsrv */ \ 1134887Schin (f)->proc = (struct _sfproc_s*)0, /* proc */ \ 1144887Schin (f)->mutex = (mtx), /* mutex */ \ 1154887Schin (f)->stdio = (Void_t*)0, /* stdio */ \ 1164887Schin (f)->lpos = (Sfoff_t)0, /* lpos */ \ 1174887Schin (f)->iosz = (size_t)0 /* iosz */ \ 1184887Schin ) 1194887Schin 1204887Schin /* expose next stream inside discipline function; state saved in int f */ 1214887Schin #define SFDCNEXT(sp,f) (((f)=(sp)->bits&SF_DCDOWN),(sp)->bits|=SF_DCDOWN) 1224887Schin 1234887Schin /* restore SFDCNEXT() state from int f */ 1244887Schin #define SFDCPREV(sp,f) ((f)?(0):((sp)->bits&=~SF_DCDOWN)) 1254887Schin 1264887Schin #endif /* _SFIO_T_H */ 127