/***********************************************************************1* *2* This software is part of the ast package *3* Copyright (c) 1985-2011 AT&T Intellectual Property *4* and is licensed under the *5* Eclipse Public License, Version 1.0 *6* by AT&T Intellectual Property *7* *8* A copy of the License is available at *9* http://www.eclipse.org/org/documents/epl-v10.html *10* (with md5 checksum b35adb5213ca9657e911e9befb180842) *11* *12* Information and Software Systems Research *13* AT&T Research *14* Florham Park NJ *15* *16* Glenn Fowler <[email protected]> *17* David Korn <[email protected]> *18* Phong Vo <[email protected]> *19* *20***********************************************************************/21#include "sfhdr.h"2223/* Read a long value coded in a portable format.24**25** Written by Kiem-Phong Vo26*/2728#if __STD_C29Sflong_t sfgetl(Sfio_t* f)30#else31Sflong_t sfgetl(f)32Sfio_t* f;33#endif34{35Sflong_t v;36uchar *s, *ends, c;37int p;38SFMTXDECL(f); /* declare a local stream variable for multithreading */3940SFMTXENTER(f,(Sflong_t)(-1));4142if(f->mode != SF_READ && _sfmode(f,SF_READ,0) < 0)43SFMTXRETURN(f, (Sflong_t)(-1));44SFLOCK(f,0);4546for(v = 0;;)47{ if(SFRPEEK(f,s,p) <= 0)48{ f->flags |= SF_ERROR;49v = (Sflong_t)(-1);50goto done;51}52for(ends = s+p; s < ends;)53{ c = *s++;54if(c&SF_MORE)55v = ((Sfulong_t)v << SF_UBITS) | SFUVALUE(c);56else57{ /* special translation for this byte */58v = ((Sfulong_t)v << SF_SBITS) | SFSVALUE(c);59f->next = s;60v = (c&SF_SIGN) ? -v-1 : v;61goto done;62}63}64f->next = s;65}66done :67SFOPEN(f,0);68SFMTXRETURN(f, v);69}707172