xref: /onnv-gate/usr/src/lib/libast/common/stdio/getdelim.c (revision 12068:08a39a083754)
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