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