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 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 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