da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/***********************************************************************
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* This software is part of the ast package *
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner* Copyright (c) 1982-2010 AT&T Intellectual Property *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* and is licensed under the *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Common Public License, Version 1.0 *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* by AT&T Intellectual Property *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* A copy of the License is available at *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Information and Software Systems Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* AT&T Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Florham Park NJ *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* David Korn <dgk@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin***********************************************************************/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * Routines to implement fast character input
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * David Korn
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * AT&T Labs
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * open stream <f> for fast character input
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int n;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin _Fcin.fclast = (_Fcin.fcptr=_Fcin.fcbuff=(unsigned char*)buff)+n;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(sffileno(f) >= 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(n);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * With _Fcin.fcptr>_Fcin.fcbuff, the stream pointer is advanced and
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * If _Fcin.fclast!=0, performs an sfreserve() for the next buffer.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * If a notify function has been set, it is called
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * If last is non-zero, and the stream is a file, 0 is returned when
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * the previous character is a 0 byte.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int n;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register Sfio_t *f;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register unsigned char *last=_Fcin.fclast, *ptr=_Fcin.fcptr;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* see whether pointer has passed null byte */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(0);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin (*_Fcin.fcfun)(f,(const char*)_Fcin.fcbuff,n,_Fcin.context);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if(fcfopen(f) < 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * Synchronize and close the current stream
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * Set the notify function that is called for each fcfill()
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinvoid fcnotify(void (*fun)(Sfio_t*,const char*,int,void*),void* context)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define extern __EXPORT__
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int i, c, n;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin _Fcin.fcptr = (unsigned char*)fcfirst() - _Fcin.fcleft;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if(c==0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(c);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(_Fcin._fcfile && (n=(_Fcin.fclast-_Fcin.fcptr)) < MB_LEN_MAX)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for(i=n; i < MB_LEN_MAX+n; i++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* fall through */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(c);