Beispiel #1
0
Sflong_t sfgetl(reg Sfio_t * f)
{
    Sflong_t v;
    reg uchar *s, *ends, c;
    reg int p;

    SFMTXSTART(f, (Sflong_t) (-1));

    if (f->mode != SF_READ && _sfmode(f, SF_READ, 0) < 0)
	SFMTXRETURN(f, (Sflong_t) (-1));
    SFLOCK(f, 0);

    for (v = 0;;) {
	if (SFRPEEK(f, s, p) <= 0) {
	    f->flags |= SF_ERROR;
	    v = (Sflong_t) (-1);
	    goto done;
	}
	for (ends = s + p; s < ends;) {
	    c = *s++;
	    if (c & SF_MORE)
		v = ((Sfulong_t) v << SF_UBITS) | SFUVALUE(c);
	    else {		/* special translation for this byte */
		v = ((Sfulong_t) v << SF_SBITS) | SFSVALUE(c);
		f->next = s;
		v = (c & SF_SIGN) ? -v - 1 : v;
		goto done;
	    }
	}
	f->next = s;
    }
  done:
    SFOPEN(f, 0);
    SFMTXRETURN(f, v);
}
Beispiel #2
0
ssize_t
getdelim(char** sp, size_t* np, int delim, Sfio_t* f)
{
	ssize_t		m;
	ssize_t		n;
	ssize_t		k;
	ssize_t		p;
	uchar*		s;
	uchar*		ps;
	SFMTXDECL(f);

	STDIO_INT(f, "getdelim", ssize_t, (char**, size_t*, int, Sfio_t*), (sp, np, delim, f))

	SFMTXENTER(f, -1);

	if(delim < 0 || delim > 255 || !sp || !np) /* bad parameters */
		SFMTXRETURN(f, -1);

	if(f->mode != SF_READ && _sfmode(f,SF_READ,0) < 0)
		SFMTXRETURN(f, -1);

	SFLOCK(f,0);

	if(!(s = (uchar*)(*sp)) || (n = *np) < 0)
		{ s = NIL(uchar*); n = 0; }
Beispiel #3
0
/*	Get the size of a stream.
**
**	Written by Kiem-Phong Vo.
*/
Sfoff_t sfsize(reg Sfio_t * f)
{
    Sfdisc_t *disc;
    reg int mode;
    Sfoff_t s;

    SFMTXSTART(f, (Sfoff_t) (-1));

    if ((mode = f->mode & SF_RDWR) != (int) f->mode
	&& _sfmode(f, mode, 0) < 0)
	SFMTXRETURN(f, (Sfoff_t) (-1));

    if (f->flags & SF_STRING) {
	SFSTRSIZE(f);
	SFMTXRETURN(f, f->extent);
    }

    SFLOCK(f, 0);

    s = f->here;

    if (f->extent >= 0) {
	if (f->flags & (SF_SHARE | SF_APPENDWR)) {
	    for (disc = f->disc; disc; disc = disc->disc)
		if (disc->seekf)
		    break;
	    if (!HAVE_SYS_STAT_H || disc) {
		Sfoff_t e;
		if ((e = SFSK(f, 0, SEEK_END, disc)) >= 0)
		    f->extent = e;
		if (SFSK(f, f->here, SEEK_SET, disc) != f->here)
		    f->here = SFSK(f, (Sfoff_t) 0, SEEK_CUR, disc);
	    }
#ifdef HAVE_SYS_STAT_H
	    else {
		Stat_t st;
		if (fstat(f->file, &st) < 0)
		    f->extent = -1;
		else if ((f->extent = st.st_size) < f->here)
		    f->here = SFSK(f, (Sfoff_t) 0, SEEK_CUR, disc);
	    }
#endif
	}

	if ((f->flags & (SF_SHARE | SF_PUBLIC)) == (SF_SHARE | SF_PUBLIC))
	    f->here = SFSK(f, (Sfoff_t) 0, SEEK_CUR, f->disc);
    }

    if (f->here != s && (f->mode & SF_READ)) {	/* buffered data is known to be invalid */
	f->next = f->endb = f->endr = f->endw = f->data;
    }

    if (f->here < 0)
	f->extent = -1;
    else if (f->extent < f->here)
	f->extent = f->here;

    if ((s = f->extent) >= 0) {
	if (f->flags & SF_APPENDWR)
	    s += (f->next - f->data);
	else if (f->mode & SF_WRITE) {
	    s = f->here + (f->next - f->data);
	    if (s < f->extent)
		s = f->extent;
	}
    }

    SFOPEN(f, 0);
    SFMTXRETURN(f, s);
}
Beispiel #4
0
int _sfputd(Sfio_t * f, Sfdouble_t v)
{
#define N_ARRAY		(16*sizeof(Sfdouble_t))
    reg ssize_t n, w;
    reg uchar *s, *ends;
    int exp;
    uchar c[N_ARRAY];
    double x;

    SFMTXSTART(f, -1);

    if (f->mode != SF_WRITE && _sfmode(f, SF_WRITE, 0) < 0)
	SFMTXRETURN(f, -1);
    SFLOCK(f, 0);

    /* get the sign of v */
    if (v < 0.) {
	v = -v;
	n = 1;
    } else
	n = 0;

    /* make the magnitude of v < 1 */
    if (v != 0.)
	v = frexp(v, &exp);
    else
	exp = 0;

    /* code the sign of v and exp */
    if ((w = exp) < 0) {
	n |= 02;
	w = -w;
    }

    /* write out the signs and the exp */
    SFOPEN(f, 0);
    if (sfputc(f, n) < 0 || (w = sfputu(f, w)) < 0)
	SFMTXRETURN(f, -1);
    SFLOCK(f, 0);
    w += 1;

    s = (ends = &c[0]) + sizeof(c);
    while (s > ends) {		/* get 2^SF_PRECIS precision at a time */
	n = (int) (x = ldexp(v, SF_PRECIS));
	*--s = n | SF_MORE;
	v = x - n;
	if (v <= 0.)
	    break;
    }

    /* last byte is not SF_MORE */
    ends = &c[0] + sizeof(c) - 1;
    *ends &= ~SF_MORE;

    /* write out coded bytes */
    n = ends - s + 1;
    w = SFWRITE(f, (void *) s, n) == n ? w + n : -1;

    SFOPEN(f, 0);
    SFMTXRETURN(f, w);
}