tmain() { UNUSED(argc); UNUSED(argv); unsigned int i, r; Sfio_t *fp; if (!(fp = sftmp(8))) terror("Can't open temp file"); for (i = 10000; i <= 100000; i += 9) { if (sfputu(fp, i) < 0) terror("Writing %u", i); } sfseek(fp, (Sfoff_t)0, 0); for (i = 10000; i <= 100000; i += 9) { if ((r = (unsigned int)sfgetu(fp)) != i) terror("Input=%u, Expect=%u", r, i); } texit(0); }
MAIN() { unsigned int i, r; Sfio_t *fp; if(!(fp = sftmp(8))) terror("Can't open temp file\n"); for(i = 10000; i <= 100000; i += 9) if(sfputu(fp,i) < 0) terror("Writing %u\n",i); sfseek(fp,(Sfoff_t)0,0); for(i = 10000; i <= 100000; i += 9) if((r = (unsigned int)sfgetu(fp)) != i) terror("Input=%u, Expect=%u\n",r,i); TSTEXIT(0); }
int pzheadwrite(Pz_t* pz, Sfio_t* op) { register size_t i; register size_t m; register size_t n; register char* s; if (pz->flags & PZ_HEAD) return 0; pz->oop = op; if (!(pz->flags & PZ_NOGZIP)) sfdcgzip(op, 0); if (pz->flags & PZ_NOPZIP) return 0; sfputc(op, PZ_MAGIC_1); sfputc(op, PZ_MAGIC_2); if (sfsync(op)) return -1; sfputc(op, pz->major = PZ_MAJOR); sfputc(op, pz->minor = PZ_MINOR); sfputu(op, pz->win); if (pz->disc->comment) { sfputc(op, PZ_HDR_comment); m = strlen(pz->disc->comment) + 1; sfputu(op, m); sfwrite(op, pz->disc->comment, m); } if (pz->det && (m = sfstrtell(pz->det))) { sfputc(op, PZ_HDR_options); if (!(s = sfstruse(pz->det))) { if (pz->disc->errorf) (*pz->disc->errorf)(pz, pz->disc, ERROR_SYSTEM|2, "out of space"); return -1; } m++; sfputu(op, m); sfwrite(op, s, m); } if (i = pz->prefix.count) { sfputc(op, PZ_HDR_prefix); if (pz->prefix.terminator >= 0) { m = 0; while (i-- > 0) { if (!(s = sfgetr(pz->io, pz->prefix.terminator, 0))) { if (pz->disc->errorf) (*pz->disc->errorf)(pz, pz->disc, 2, "%s: cannot read %I*u prefix record%s from data", pz->path, sizeof(pz->prefix.count), pz->prefix.count, pz->prefix.count == 1 ? "" : "s"); return -1; } m += n = sfvalue(pz->io); sfwrite(pz->tmp, s, n); } s = sfstrseek(pz->tmp, 0, SEEK_SET); } else { m = i; if (!(s = (char*)sfreserve(pz->io, m, 0))) { if (pz->disc->errorf) (*pz->disc->errorf)(pz, pz->disc, 2, "%s: cannot read %I*u prefix byte%s from data", pz->path, sizeof(pz->prefix.count), pz->prefix.count, pz->prefix.count == 1 ? "" : "s"); return -1; } } sfputu(op, m); sfwrite(op, s, m); } pz->flags |= PZ_HEAD; return pzpartwrite(pz, op); }
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); }