1*10898Sroland.mainz@nrubsig.org /***********************************************************************
2*10898Sroland.mainz@nrubsig.org *                                                                      *
3*10898Sroland.mainz@nrubsig.org *               This software is part of the ast package               *
4*10898Sroland.mainz@nrubsig.org *          Copyright (c) 1985-2009 AT&T Intellectual Property          *
5*10898Sroland.mainz@nrubsig.org *                      and is licensed under the                       *
6*10898Sroland.mainz@nrubsig.org *                  Common Public License, Version 1.0                  *
7*10898Sroland.mainz@nrubsig.org *                    by AT&T Intellectual Property                     *
8*10898Sroland.mainz@nrubsig.org *                                                                      *
9*10898Sroland.mainz@nrubsig.org *                A copy of the License is available at                 *
10*10898Sroland.mainz@nrubsig.org *            http://www.opensource.org/licenses/cpl1.0.txt             *
11*10898Sroland.mainz@nrubsig.org *         (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9)         *
12*10898Sroland.mainz@nrubsig.org *                                                                      *
13*10898Sroland.mainz@nrubsig.org *              Information and Software Systems Research               *
14*10898Sroland.mainz@nrubsig.org *                            AT&T Research                             *
15*10898Sroland.mainz@nrubsig.org *                           Florham Park NJ                            *
16*10898Sroland.mainz@nrubsig.org *                                                                      *
17*10898Sroland.mainz@nrubsig.org *                 Glenn Fowler <gsf@research.att.com>                  *
18*10898Sroland.mainz@nrubsig.org *                  David Korn <dgk@research.att.com>                   *
19*10898Sroland.mainz@nrubsig.org *                   Phong Vo <kpv@research.att.com>                    *
20*10898Sroland.mainz@nrubsig.org *                                                                      *
21*10898Sroland.mainz@nrubsig.org ***********************************************************************/
22*10898Sroland.mainz@nrubsig.org #pragma prototyped
23*10898Sroland.mainz@nrubsig.org 
24*10898Sroland.mainz@nrubsig.org #include "stdhdr.h"
25*10898Sroland.mainz@nrubsig.org 
26*10898Sroland.mainz@nrubsig.org ssize_t
27*10898Sroland.mainz@nrubsig.org getdelim(char** sp, size_t* np, int delim, Sfio_t* f)
28*10898Sroland.mainz@nrubsig.org {
29*10898Sroland.mainz@nrubsig.org 	ssize_t		m;
30*10898Sroland.mainz@nrubsig.org 	ssize_t		n;
31*10898Sroland.mainz@nrubsig.org 	ssize_t		k;
32*10898Sroland.mainz@nrubsig.org 	ssize_t		p;
33*10898Sroland.mainz@nrubsig.org 	uchar*		s;
34*10898Sroland.mainz@nrubsig.org 	uchar*		ps;
35*10898Sroland.mainz@nrubsig.org 	SFMTXDECL(f);
36*10898Sroland.mainz@nrubsig.org 
37*10898Sroland.mainz@nrubsig.org 	STDIO_INT(f, "getdelim", ssize_t, (char**, size_t*, int, Sfio_t*), (sp, np, delim, f))
38*10898Sroland.mainz@nrubsig.org 
39*10898Sroland.mainz@nrubsig.org 	SFMTXENTER(f, -1);
40*10898Sroland.mainz@nrubsig.org 
41*10898Sroland.mainz@nrubsig.org 	if(delim < 0 || delim > 255 || !sp || !np) /* bad parameters */
42*10898Sroland.mainz@nrubsig.org 		SFMTXRETURN(f, -1);
43*10898Sroland.mainz@nrubsig.org 
44*10898Sroland.mainz@nrubsig.org 	if(f->mode != SF_READ && _sfmode(f,SF_READ,0) < 0)
45*10898Sroland.mainz@nrubsig.org 		SFMTXRETURN(f, -1);
46*10898Sroland.mainz@nrubsig.org 
47*10898Sroland.mainz@nrubsig.org 	SFLOCK(f,0);
48*10898Sroland.mainz@nrubsig.org 
49*10898Sroland.mainz@nrubsig.org 	if(!(s = (uchar*)(*sp)) || (n = *np) < 0)
50*10898Sroland.mainz@nrubsig.org 		{ s = NIL(uchar*); n = 0; }
51*10898Sroland.mainz@nrubsig.org 	for(m = 0;; )
52*10898Sroland.mainz@nrubsig.org 	{	/* read new data */
53*10898Sroland.mainz@nrubsig.org 		if((p = f->endb - (ps = f->next)) <= 0 )
54*10898Sroland.mainz@nrubsig.org 		{	f->getr = delim;
55*10898Sroland.mainz@nrubsig.org 			f->mode |= SF_RC;
56*10898Sroland.mainz@nrubsig.org 			if(SFRPEEK(f,ps,p) <= 0)
57*10898Sroland.mainz@nrubsig.org 			{	m = -1;
58*10898Sroland.mainz@nrubsig.org 				break;
59*10898Sroland.mainz@nrubsig.org 			}
60*10898Sroland.mainz@nrubsig.org 		}
61*10898Sroland.mainz@nrubsig.org 
62*10898Sroland.mainz@nrubsig.org 		for(k = 0; k < p; ++k) /* find the delimiter */
63*10898Sroland.mainz@nrubsig.org 		{	if(ps[k] == delim)
64*10898Sroland.mainz@nrubsig.org 			{	k += 1; /* include delim in copying */
65*10898Sroland.mainz@nrubsig.org 				break;
66*10898Sroland.mainz@nrubsig.org 			}
67*10898Sroland.mainz@nrubsig.org 		}
68*10898Sroland.mainz@nrubsig.org 
69*10898Sroland.mainz@nrubsig.org 		if((m+k+1) >= n ) /* make sure there is space */
70*10898Sroland.mainz@nrubsig.org 		{	n = ((m+k+15)/8)*8;
71*10898Sroland.mainz@nrubsig.org 			if(!(s = (uchar*)realloc(s, n)) )
72*10898Sroland.mainz@nrubsig.org 			{	*sp = 0; *np = 0;
73*10898Sroland.mainz@nrubsig.org 				m = -1;
74*10898Sroland.mainz@nrubsig.org 				break;
75*10898Sroland.mainz@nrubsig.org 			}
76*10898Sroland.mainz@nrubsig.org 			*sp = (char*)s; *np = n;
77*10898Sroland.mainz@nrubsig.org 		}
78*10898Sroland.mainz@nrubsig.org 
79*10898Sroland.mainz@nrubsig.org 		memcpy(s+m, ps, k); m += k;
80*10898Sroland.mainz@nrubsig.org 		f->next = ps+k; /* skip copied data in buffer */
81*10898Sroland.mainz@nrubsig.org 
82*10898Sroland.mainz@nrubsig.org 		if(s[m-1] == delim)
83*10898Sroland.mainz@nrubsig.org 		{	s[m] = 0; /* 0-terminated */
84*10898Sroland.mainz@nrubsig.org 			break;
85*10898Sroland.mainz@nrubsig.org 		}
86*10898Sroland.mainz@nrubsig.org 	}
87*10898Sroland.mainz@nrubsig.org 
88*10898Sroland.mainz@nrubsig.org 	SFOPEN(f,0);
89*10898Sroland.mainz@nrubsig.org 	SFMTXRETURN(f,m);
90*10898Sroland.mainz@nrubsig.org }
91*10898Sroland.mainz@nrubsig.org 
92*10898Sroland.mainz@nrubsig.org ssize_t
93*10898Sroland.mainz@nrubsig.org __getdelim(char** sp, size_t* np, int delim, Sfio_t* f)
94*10898Sroland.mainz@nrubsig.org {
95*10898Sroland.mainz@nrubsig.org 	return getdelim(sp, np, delim, f);
96*10898Sroland.mainz@nrubsig.org }
97