da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/***********************************************************************
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* This software is part of the ast package *
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner* Copyright (c) 1985-2010 AT&T Intellectual Property *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* and is licensed under the *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Common Public License, Version 1.0 *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* by AT&T Intellectual Property *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* A copy of the License is available at *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* http://www.opensource.org/licenses/cpl1.0.txt *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Information and Software Systems Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* AT&T Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Florham Park NJ *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Glenn Fowler <gsf@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* David Korn <dgk@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Phong Vo <kpv@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin***********************************************************************/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include "sfhdr.h"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* Write out a long value in a portable format
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin**
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin** Written by Kiem-Phong Vo.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin*/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if __STD_C
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinint _sfputl(Sfio_t* f, Sflong_t v)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinint _sfputl(f,v)
7c2fbfb345896881c631598ee3852ce9ce33fb07April ChinSfio_t* f; /* write a portable long to this stream */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinSflong_t v; /* the value to be written */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define N_ARRAY (2*sizeof(Sflong_t))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin reg uchar *s, *ps;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin reg ssize_t n, p;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin uchar c[N_ARRAY];
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin SFMTXDECL(f);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin SFMTXENTER(f,-1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(f->mode != SF_WRITE && _sfmode(f,SF_WRITE,0) < 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin SFMTXRETURN(f, -1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin SFLOCK(f,0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin s = ps = &(c[N_ARRAY-1]);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(v < 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { /* add 1 to avoid 2-complement problems with -SF_MAXINT */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin v = -(v+1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *s = (uchar)(SFSVALUE(v) | SF_SIGN);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else *s = (uchar)(SFSVALUE(v));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin v = (Sfulong_t)v >> SF_SBITS;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while(v > 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { *--s = (uchar)(SFUVALUE(v) | SF_MORE);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin v = (Sfulong_t)v >> SF_UBITS;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n = (ps-s)+1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(n > 8 || SFWPEEK(f,ps,p) < n)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n = SFWRITE(f,(Void_t*)s,n); /* write the hard way */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { switch(n)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 8 : *ps++ = *s++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 7 : *ps++ = *s++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 6 : *ps++ = *s++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 5 : *ps++ = *s++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 4 : *ps++ = *s++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 3 : *ps++ = *s++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 2 : *ps++ = *s++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 1 : *ps++ = *s++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin f->next = ps;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin SFOPEN(f,0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin SFMTXRETURN(f, n);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}