/***********************************************************************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 an unsigned long value coded portably for a given range.24**25** Written by Kiem-Phong Vo26*/2728#if __STD_C29Sfulong_t sfgetm(Sfio_t* f, Sfulong_t m)30#else31Sfulong_t sfgetm(f, m)32Sfio_t* f;33Sfulong_t m;34#endif35{36Sfulong_t v;37reg uchar *s, *ends, c;38reg int p;39SFMTXDECL(f);4041SFMTXENTER(f, (Sfulong_t)(-1));4243if(f->mode != SF_READ && _sfmode(f,SF_READ,0) < 0)44SFMTXRETURN(f, (Sfulong_t)(-1));4546SFLOCK(f,0);4748for(v = 0;; )49{ if(SFRPEEK(f,s,p) <= 0)50{ f->flags |= SF_ERROR;51v = (Sfulong_t)(-1);52goto done;53}54for(ends = s+p; s < ends;)55{ c = *s++;56v = (v << SF_BBITS) | SFBVALUE(c);57if((m >>= SF_BBITS) <= 0)58{ f->next = s;59goto done;60}61}62f->next = s;63}64done:65SFOPEN(f,0);66SFMTXRETURN(f, v);67}686970