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 #include "sfhdr.h"
234887Schin
244887Schin /* External variables and functions used only by Sfio
254887Schin ** Written by Kiem-Phong Vo
264887Schin */
274887Schin
284887Schin /* code to initialize mutexes */
294887Schin static Vtmutex_t Sfmutex;
304887Schin static Vtonce_t Sfonce = VTONCE_INITDATA;
_sfoncef()314887Schin static void _sfoncef()
324887Schin { (void)vtmtxopen(_Sfmutex, VT_INIT);
334887Schin (void)vtmtxopen(&_Sfpool.mutex, VT_INIT);
344887Schin (void)vtmtxopen(sfstdin->mutex, VT_INIT);
354887Schin (void)vtmtxopen(sfstdout->mutex, VT_INIT);
364887Schin (void)vtmtxopen(sfstderr->mutex, VT_INIT);
374887Schin _Sfdone = 1;
384887Schin }
394887Schin
404887Schin /* global variables used internally to the package */
414887Schin Sfextern_t _Sfextern =
424887Schin { 0, /* _Sfpage */
434887Schin { NIL(Sfpool_t*), 0, 0, 0, NIL(Sfio_t**) }, /* _Sfpool */
444887Schin NIL(int(*)_ARG_((Sfio_t*,int))), /* _Sfpmove */
454887Schin NIL(Sfio_t*(*)_ARG_((Sfio_t*, Sfio_t*))), /* _Sfstack */
468462SApril.Chin@Sun.COM NIL(void(*)_ARG_((Sfio_t*, int, void*))), /* _Sfnotify */
474887Schin NIL(int(*)_ARG_((Sfio_t*))), /* _Sfstdsync */
484887Schin { NIL(Sfread_f), /* _Sfudisc */
494887Schin NIL(Sfwrite_f),
504887Schin NIL(Sfseek_f),
514887Schin NIL(Sfexcept_f),
524887Schin NIL(Sfdisc_t*)
534887Schin },
544887Schin NIL(void(*)_ARG_((void)) ), /* _Sfcleanup */
554887Schin 0, /* _Sfexiting */
564887Schin 0, /* _Sfdone */
574887Schin &Sfonce, /* _Sfonce */
584887Schin _sfoncef, /* _Sfoncef */
594887Schin &Sfmutex /* _Sfmutex */
604887Schin };
614887Schin
624887Schin ssize_t _Sfi = -1; /* value for a few fast macro functions */
638462SApril.Chin@Sun.COM #ifdef _ast_int8_t
648462SApril.Chin@Sun.COM ssize_t _Sfmaxr = 256*1024; /* default maximum size for a record */
654887Schin #else
664887Schin ssize_t _Sfmaxr = 16*1024; /* default maximum size for a record */
674887Schin #endif
684887Schin
694887Schin #if vt_threaded
704887Schin static Vtmutex_t _Sfmtxin, _Sfmtxout, _Sfmtxerr;
714887Schin #define SFMTXIN (&_Sfmtxin)
724887Schin #define SFMTXOUT (&_Sfmtxout)
734887Schin #define SFMTXERR (&_Sfmtxerr)
748462SApril.Chin@Sun.COM #define SF_STDSAFE SF_MTSAFE
754887Schin #else
764887Schin #define SFMTXIN (0)
774887Schin #define SFMTXOUT (0)
784887Schin #define SFMTXERR (0)
798462SApril.Chin@Sun.COM #define SF_STDSAFE (0)
804887Schin #endif
814887Schin
824887Schin Sfio_t _Sfstdin = SFNEW(NIL(char*),-1,0,
838462SApril.Chin@Sun.COM (SF_READ |SF_STATIC|SF_STDSAFE),NIL(Sfdisc_t*),SFMTXIN);
844887Schin Sfio_t _Sfstdout = SFNEW(NIL(char*),-1,1,
858462SApril.Chin@Sun.COM (SF_WRITE|SF_STATIC|SF_STDSAFE),NIL(Sfdisc_t*),SFMTXOUT);
864887Schin Sfio_t _Sfstderr = SFNEW(NIL(char*),-1,2,
878462SApril.Chin@Sun.COM (SF_WRITE|SF_STATIC|SF_STDSAFE),NIL(Sfdisc_t*),SFMTXERR);
884887Schin
894887Schin #undef sfstdin
904887Schin #undef sfstdout
914887Schin #undef sfstderr
924887Schin
934887Schin Sfio_t* sfstdin = &_Sfstdin;
944887Schin Sfio_t* sfstdout = &_Sfstdout;
954887Schin Sfio_t* sfstderr = &_Sfstderr;
964887Schin
974887Schin __EXTERN__(ssize_t,_Sfi);
984887Schin __EXTERN__(Sfio_t,_Sfstdin);
994887Schin __EXTERN__(Sfio_t,_Sfstdout);
1004887Schin __EXTERN__(Sfio_t,_Sfstderr);
1014887Schin __EXTERN__(Sfio_t*,sfstdin);
1024887Schin __EXTERN__(Sfio_t*,sfstdout);
1034887Schin __EXTERN__(Sfio_t*,sfstderr);
104