110898Sroland.mainz@nrubsig.org /***********************************************************************
210898Sroland.mainz@nrubsig.org * *
310898Sroland.mainz@nrubsig.org * This software is part of the ast package *
4*12068SRoger.Faulkner@Oracle.COM * Copyright (c) 1985-2010 AT&T Intellectual Property *
510898Sroland.mainz@nrubsig.org * and is licensed under the *
610898Sroland.mainz@nrubsig.org * Common Public License, Version 1.0 *
710898Sroland.mainz@nrubsig.org * by AT&T Intellectual Property *
810898Sroland.mainz@nrubsig.org * *
910898Sroland.mainz@nrubsig.org * A copy of the License is available at *
1010898Sroland.mainz@nrubsig.org * http://www.opensource.org/licenses/cpl1.0.txt *
1110898Sroland.mainz@nrubsig.org * (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
1210898Sroland.mainz@nrubsig.org * *
1310898Sroland.mainz@nrubsig.org * Information and Software Systems Research *
1410898Sroland.mainz@nrubsig.org * AT&T Research *
1510898Sroland.mainz@nrubsig.org * Florham Park NJ *
1610898Sroland.mainz@nrubsig.org * *
1710898Sroland.mainz@nrubsig.org * Glenn Fowler <gsf@research.att.com> *
1810898Sroland.mainz@nrubsig.org * David Korn <dgk@research.att.com> *
1910898Sroland.mainz@nrubsig.org * Phong Vo <kpv@research.att.com> *
2010898Sroland.mainz@nrubsig.org * *
2110898Sroland.mainz@nrubsig.org ***********************************************************************/
2210898Sroland.mainz@nrubsig.org #pragma prototyped
2310898Sroland.mainz@nrubsig.org
2410898Sroland.mainz@nrubsig.org #include "stdhdr.h"
2510898Sroland.mainz@nrubsig.org
2610898Sroland.mainz@nrubsig.org ssize_t
getdelim(char ** sp,size_t * np,int delim,Sfio_t * f)2710898Sroland.mainz@nrubsig.org getdelim(char** sp, size_t* np, int delim, Sfio_t* f)
2810898Sroland.mainz@nrubsig.org {
2910898Sroland.mainz@nrubsig.org ssize_t m;
3010898Sroland.mainz@nrubsig.org ssize_t n;
3110898Sroland.mainz@nrubsig.org ssize_t k;
3210898Sroland.mainz@nrubsig.org ssize_t p;
3310898Sroland.mainz@nrubsig.org uchar* s;
3410898Sroland.mainz@nrubsig.org uchar* ps;
3510898Sroland.mainz@nrubsig.org SFMTXDECL(f);
3610898Sroland.mainz@nrubsig.org
3710898Sroland.mainz@nrubsig.org STDIO_INT(f, "getdelim", ssize_t, (char**, size_t*, int, Sfio_t*), (sp, np, delim, f))
3810898Sroland.mainz@nrubsig.org
3910898Sroland.mainz@nrubsig.org SFMTXENTER(f, -1);
4010898Sroland.mainz@nrubsig.org
4110898Sroland.mainz@nrubsig.org if(delim < 0 || delim > 255 || !sp || !np) /* bad parameters */
4210898Sroland.mainz@nrubsig.org SFMTXRETURN(f, -1);
4310898Sroland.mainz@nrubsig.org
4410898Sroland.mainz@nrubsig.org if(f->mode != SF_READ && _sfmode(f,SF_READ,0) < 0)
4510898Sroland.mainz@nrubsig.org SFMTXRETURN(f, -1);
4610898Sroland.mainz@nrubsig.org
4710898Sroland.mainz@nrubsig.org SFLOCK(f,0);
4810898Sroland.mainz@nrubsig.org
4910898Sroland.mainz@nrubsig.org if(!(s = (uchar*)(*sp)) || (n = *np) < 0)
5010898Sroland.mainz@nrubsig.org { s = NIL(uchar*); n = 0; }
5110898Sroland.mainz@nrubsig.org for(m = 0;; )
5210898Sroland.mainz@nrubsig.org { /* read new data */
5310898Sroland.mainz@nrubsig.org if((p = f->endb - (ps = f->next)) <= 0 )
5410898Sroland.mainz@nrubsig.org { f->getr = delim;
5510898Sroland.mainz@nrubsig.org f->mode |= SF_RC;
5610898Sroland.mainz@nrubsig.org if(SFRPEEK(f,ps,p) <= 0)
5710898Sroland.mainz@nrubsig.org { m = -1;
5810898Sroland.mainz@nrubsig.org break;
5910898Sroland.mainz@nrubsig.org }
6010898Sroland.mainz@nrubsig.org }
6110898Sroland.mainz@nrubsig.org
6210898Sroland.mainz@nrubsig.org for(k = 0; k < p; ++k) /* find the delimiter */
6310898Sroland.mainz@nrubsig.org { if(ps[k] == delim)
6410898Sroland.mainz@nrubsig.org { k += 1; /* include delim in copying */
6510898Sroland.mainz@nrubsig.org break;
6610898Sroland.mainz@nrubsig.org }
6710898Sroland.mainz@nrubsig.org }
6810898Sroland.mainz@nrubsig.org
6910898Sroland.mainz@nrubsig.org if((m+k+1) >= n ) /* make sure there is space */
7010898Sroland.mainz@nrubsig.org { n = ((m+k+15)/8)*8;
7110898Sroland.mainz@nrubsig.org if(!(s = (uchar*)realloc(s, n)) )
7210898Sroland.mainz@nrubsig.org { *sp = 0; *np = 0;
7310898Sroland.mainz@nrubsig.org m = -1;
7410898Sroland.mainz@nrubsig.org break;
7510898Sroland.mainz@nrubsig.org }
7610898Sroland.mainz@nrubsig.org *sp = (char*)s; *np = n;
7710898Sroland.mainz@nrubsig.org }
7810898Sroland.mainz@nrubsig.org
7910898Sroland.mainz@nrubsig.org memcpy(s+m, ps, k); m += k;
8010898Sroland.mainz@nrubsig.org f->next = ps+k; /* skip copied data in buffer */
8110898Sroland.mainz@nrubsig.org
8210898Sroland.mainz@nrubsig.org if(s[m-1] == delim)
8310898Sroland.mainz@nrubsig.org { s[m] = 0; /* 0-terminated */
8410898Sroland.mainz@nrubsig.org break;
8510898Sroland.mainz@nrubsig.org }
8610898Sroland.mainz@nrubsig.org }
8710898Sroland.mainz@nrubsig.org
8810898Sroland.mainz@nrubsig.org SFOPEN(f,0);
8910898Sroland.mainz@nrubsig.org SFMTXRETURN(f,m);
9010898Sroland.mainz@nrubsig.org }
9110898Sroland.mainz@nrubsig.org
9210898Sroland.mainz@nrubsig.org ssize_t
__getdelim(char ** sp,size_t * np,int delim,Sfio_t * f)9310898Sroland.mainz@nrubsig.org __getdelim(char** sp, size_t* np, int delim, Sfio_t* f)
9410898Sroland.mainz@nrubsig.org {
9510898Sroland.mainz@nrubsig.org return getdelim(sp, np, delim, f);
9610898Sroland.mainz@nrubsig.org }
97