da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/***********************************************************************
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* This software is part of the ast package *
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner* Copyright (c) 1985-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* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* A copy of the License is available at *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* http://www.opensource.org/licenses/cpl1.0.txt *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Information and Software Systems Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* AT&T Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Florham Park NJ *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Glenn Fowler <gsf@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* David Korn <dgk@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Phong Vo <kpv@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin***********************************************************************/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#pragma prototyped
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include "stdhdr.h"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern char*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin_stdgets(Sfio_t* f, char* us, int n, int isgets)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int p;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin unsigned char* is;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin unsigned char* ps;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(n <= 0 || !us || (f->mode != SF_READ && _sfmode(f,SF_READ,0) < 0))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return NIL(char*);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin SFLOCK(f,0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n -= 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin is = (uchar*)us;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while(n)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { /* peek the read buffer for data */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if((p = f->endb - (ps = f->next)) <= 0 )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { f->getr = '\n';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin f->mode |= SF_RC;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(SFRPEEK(f,ps,p) <= 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(p > n)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin p = n;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _lib_memccpy
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if((ps = (uchar*)memccpy((char*)is,(char*)ps,'\n',p)) != NIL(uchar*))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin p = ps-is;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin is += p;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ps = f->next+p;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!(f->flags&(SF_BOTH|SF_MALLOC)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { while(p-- && (*is++ = *ps++) != '\n')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin p = ps-f->next;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { reg int c = ps[p-1];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(c != '\n')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ps[p-1] = '\n';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while((*is++ = *ps++) != '\n')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(c != '\n')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { f->next[p-1] = c;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if((ps-f->next) >= p)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin is[-1] = c;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* gobble up read data and continue */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin f->next = ps;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(is[-1] == '\n')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if(n > 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n -= p;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if((_Sfi = is - ((uchar*)us)) <= 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin us = NIL(char*);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if(isgets && is[-1] == '\n')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { is[-1] = '\0';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin _Sfi -= 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else *is = '\0';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin SFOPEN(f,0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return us;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinchar*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfgets(char* s, int n, Sfio_t* f)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin STDIO_PTR(f, "fgets", char*, (char*, int, Sfio_t*), (s, n, f))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return _stdgets(f, s, n, 0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinchar*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chingets(char* s)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return _stdgets(sfstdin, s, BUFSIZ, 1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}