tmain() { UNUSED(argc); UNUSED(argv); Sfio_t *f, *f2; char *s; int i, n; char buf[16 * 1024]; if (!(f = sfopen(NULL, tstfile("sf", 0), "w+"))) terror("Can't open file"); if (sfnputc(f, 'a', 1000) != 1000) terror("Writing"); if (sfseek(f, (Sfoff_t)0, 0) != 0) terror("Seeking"); if ((n = (int)sfsize(f)) != 1000) terror("Wrong size %d", n); if (!(f2 = sfnew(NULL, NULL, (size_t)SF_UNBOUND, sffileno(f), SF_WRITE))) { terror("Can't open stream"); } if (sfseek(f2, (Sfoff_t)1999, 0) != (Sfoff_t)1999) terror("Seeking2"); sfputc(f2, 'b'); sfsync(f2); if ((n = (int)sfsize(f2)) != 2000) terror("Wrong size2 %d", n); if ((n = (int)sfsize(f)) != 1000) terror("Wrong size3 %d", n); sfputc(f, 'a'); sfset(f, SF_SHARE, 1); if ((n = (int)sfsize(f)) != 2000) terror("Wrong size4 %d", n); if (!(f = sfopen(f, NULL, "srw"))) terror("Can't open string stream"); sfwrite(f, "0123456789", 10); if (sfsize(f) != 10) terror("String size is wrong1"); sfseek(f, (Sfoff_t)19, 0); if (sfsize(f) != 10) terror("String size is wrong2"); sfputc(f, 'a'); if (sfsize(f) != 20) terror("String size is wrong3"); sfseek(f, (Sfoff_t)0, 0); if (sfsize(f) != 20) terror("String size is wrong4"); sfseek(f, (Sfoff_t)0, 0); if (!(s = sfreserve(f, SF_UNBOUND, SF_LOCKR)) && sfvalue(f) != 20) { terror("String size is wrong5"); } sfread(f, s, 5); if (sfsize(f) != 20) terror("String size is wrong6"); sfwrite(f, "01234567890123456789", 20); if (sfsize(f) != 25) terror("String size is wrong7"); strcpy(buf, "0123456789"); if (!(f = sfopen(f, buf, "s+"))) terror("Can't open string stream2"); if (sfset(f, 0, 0) & SF_MALLOC) terror("SF_MALLOC should not have been set"); if (sfsize(f) != 10) terror("String size is wrong8"); sfread(f, buf, 5); if ((n = (int)sfwrite(f, "0123456789", 10)) != 5) terror("Write wrong amount %d", n); if (sfsize(f) != 10) terror("String size is wrong9"); if (!(f = sfopen(f, tstfile("sf", 0), "w"))) terror("Reopening file1"); for (i = 0; i < 10000; ++i) { if (sfputc(f, '0' + (i % 10)) != '0' + (i % 10)) terror("sfputc failed"); } if (!(f = sfopen(f, tstfile("sf", 0), "r+"))) terror("Reopening file2"); if (sfsize(f) != 10000) terror("Bad size of file1"); sfsetbuf(f, buf, 1024); for (i = 0; i < 20; ++i) { if (!sfreserve(f, 100, 0)) terror("Reserve failed"); } s = buf + 1024; for (i = 0; i < 20; ++i) s[i] = '0' + i % 10; sfseek(f, (Sfoff_t)(10000 - 10), 0); if (sfwrite(f, s, 20) != 20) terror("Write failed"); if (sfsize(f) != 10010) terror("Bad size of file2"); sfseek(f, (Sfoff_t)0, 0); for (i = 0; i < 10; ++i) { if (!(s = sfreserve(f, 1001, 0))) terror("Reserve failed2"); if (s[0] != '0' + i) terror("Bad data1"); } for (n = 0; n < 1001; ++n) { if (s[n] != ((n + i - 1) % 10 + '0')) terror("Bad data"); } /* test to see if a string stream extends ok during writes */ s = malloc(5); f = sfnew(NULL, (void *)s, 5, -1, SF_STRING | SF_READ | SF_WRITE | SF_MALLOC); if (!f) terror("Can't create string stream"); if (sfwrite(f, "01", 2) != 2) terror("Bad write to string stream"); if (sfwrite(f, "2345678", 7) != 7) terror("Bad write to string stream2"); if (sfputc(f, 0) != 0) terror("sfputc failed"); if (sfseek(f, (Sfoff_t)0, 0) != 0) terror("sfseek failed"); if ((n = (int)sfread(f, buf, 100)) != 10) terror("sfread gets wrong amount of data %d", n); if (strcmp(buf, "012345678") != 0) terror("Get wrong data"); texit(0); }
main() { int n, fd; Sfio_t *f; char *s, buf[1024]; int fdv[100]; buf[0] = 0; sfsetbuf(sfstdout,buf,sizeof(buf)); if(!sfstdout->pool) terror("No pool\n"); sfdisc(sfstdout,&Disc); sfset(sfstdout,SF_SHARE,0); sfputr(sfstdout,"123456789",0); if(strcmp(buf,"123456789") != 0) terror("Setting own buffer for stdout\n"); if(sfpurge(sfstdout) < 0) terror("Purging sfstdout\n"); if((fd = creat("xxx",0666)) < 0) terror("Creating xxx\n"); if(write(fd,buf,sizeof(buf)) != sizeof(buf)) terror("Writing to xxx\n"); if(lseek(fd,0L,0) < 0) terror("Seeking back to origin\n"); if(!(f = sfnew((Sfio_t*)0,buf,sizeof(buf),fd,SF_WRITE))) terror("Making stream\n"); if(!(s = sfreserve(f,SF_UNBOUND,1)) || s != buf) terror("sfreserve1 returns the wrong pointer\n"); sfwrite(f,s,0); #define NEXTFD 12 if((fd+NEXTFD) < (sizeof(fdv)/sizeof(fdv[0])) ) { struct stat st; int i; for(i = 0; i < fd+NEXTFD; ++i) fdv[i] = fstat(i,&st); } if((n = sfsetfd(f,fd+NEXTFD)) != fd+NEXTFD) terror("Try to set file descriptor to %d but get %d\n",fd+NEXTFD,n); if((fd+NEXTFD) < (sizeof(fdv)/sizeof(fdv[0])) ) { struct stat st; int i; for(i = 0; i < fd+NEXTFD; ++i) if(i != fd && fdv[i] != fstat(i,&st)) terror("Fd %d changes status after sfsetfd %d->%d\n", i, fd, fd+NEXTFD); } if(!(s = sfreserve(f,SF_UNBOUND,1)) || s != buf) terror("sfreserve2 returns the wrong pointer\n"); sfwrite(f,s,0); if(sfsetbuf(f,NIL(Void_t*),(size_t)SF_UNBOUND) != buf) terror("sfsetbuf didnot returns last buffer\n"); sfsetbuf(f,buf,sizeof(buf)); if(sfreserve(f,SF_UNBOUND,1) != buf || sfvalue(f) != sizeof(buf) ) terror("sfreserve3 returns the wrong value\n"); sfwrite(f,s,0); system("rm xxx >/dev/null 2>&1"); return 0; }
static int dofmt(Fmt_t* fp) { register int c; int b; int x; int splice; char* cp; char* dp; char* ep; char* lp; char* tp; char buf[8192]; cp = 0; while (cp || (cp = sfgetr(fp->in, '\n', 0)) && !(splice = 0) && (lp = cp + sfvalue(fp->in) - 1) || (cp = sfgetr(fp->in, '\n', SF_LASTR)) && (splice = 1) && (lp = cp + sfvalue(fp->in))) { if (isoption(fp, 'o')) { if (!isoption(fp, 'i')) { setoption(fp, 'i'); b = 0; while (cp < lp) { if (*cp == ' ') b += 1; else if (*cp == '\t') b += INDENT; else break; cp++; } fp->indent = roundof(b, INDENT); } else while (cp < lp && (*cp == ' ' || *cp == '\t')) cp++; if (!isoption(fp, 'q') && cp < lp) { setoption(fp, 'q'); if (*cp == '"') { ep = lp; while (--ep > cp) if (*ep == '"') { fp->quote = 1; break; } else if (*ep != ' ' && *ep != '\t') break; } } } again: dp = buf; ep = 0; for (b = 1;; b = 0) { if (cp >= lp) { cp = 0; break; } c = *cp++; if (isoption(fp, 'o')) { if (c == '\\') { x = 0; c = ' '; cp--; while (cp < lp) { if (*cp == '\\') { cp++; if ((lp - cp) < 1) { c = '\\'; break; } if (*cp == 'n') { cp++; c = '\n'; if ((lp - cp) > 2) { if (*cp == ']' || *cp == '@' && *(cp + 1) == '(') { *dp++ = '\\'; *dp++ = 'n'; c = *cp++; break; } if (*cp == '\\' && *(cp + 1) == 'n') { cp += 2; *dp++ = '\n'; break; } } } else if (*cp == 't' || *cp == ' ') { cp++; x = 1; c = ' '; } else { if (x && dp != buf && *(dp - 1) != ' ') *dp++ = ' '; *dp++ = '\\'; c = *cp++; break; } } else if (*cp == ' ' || *cp == '\t') { cp++; c = ' '; x = 1; } else { if (x && c != '\n' && dp != buf && *(dp - 1) != ' ') *dp++ = ' '; break; } } if (c == '\n') { c = 0; goto flush; } if (c == ' ' && (dp == buf || *(dp - 1) == ' ')) continue; } else if (c == '"') { if (b || cp >= lp) { if (fp->quote) continue; fp->section = 0; } } else if (c == '\a') { *dp++ = '\\'; c = 'a'; } else if (c == '\b') { *dp++ = '\\'; c = 'b'; } else if (c == '\f') { *dp++ = '\\'; c = 'f'; } else if (c == '\v') { *dp++ = '\\'; c = 'v'; } else if (c == ']' && (cp >= lp || *cp != ':' && *cp != '#' && *cp != '!')) { if (cp < lp && *cp == ']') { cp++; *dp++ = c; } else { fp->section = 1; fp->retain = 0; flush: *dp++ = c; *dp = 0; split(fp, buf, 0); outline(fp); goto again; } } else if (fp->section) { if (c == '[') { if (b) fp->retain = 1; else { cp--; c = 0; goto flush; } fp->section = 0; } else if (c == '{') { x = 1; for (tp = cp; tp < lp; tp++) { if (*tp == '[' || *tp == '\n') break; if (*tp == ' ' || *tp == '\t' || *tp == '"') continue; if (*tp == '\\' && (lp - tp) > 1) { if (*++tp == 'n') break; if (*tp == 't' || *tp == '\n') continue; } x = 0; break; } if (x) { if (fp->endbuf > (fp->outbuf + fp->indent + 2*INDENT)) fp->nextdent = 2*INDENT; goto flush; } else fp->section = 0; } else if (c == '}') { if (fp->indent && (b || *(cp - 2) != 'f')) { if (b) { fp->indent -= 2*INDENT; fp->endbuf += 2*INDENT; } else { cp--; c = 0; } goto flush; } else fp->section = 0; } else if (c == ' ' || c == '\t') continue; else fp->section = 0; } else if (c == '?' && (cp >= lp || *cp != '?')) { if (fp->retain) { cp--; while (cp < lp && *cp != ' ' && *cp != '\t' && *cp != ']' && dp < &buf[sizeof(buf)-3]) *dp++ = *cp++; if (cp < lp && (*cp == ' ' || *cp == '\t')) *dp++ = *cp++; *dp = 0; split(fp, buf, 0); dp = buf; ep = 0; fp->retain = 0; if (fp->outp >= fp->endbuf) outline(fp); continue; } } else if (c == ' ' || c == '\t') for (c = ' '; *cp == ' ' || *cp == '\t'; cp++); } else if (c == '\b') { if (dp > buf) { dp--; if (ep) ep--; } continue; } else if (c == '\t') { /* * expand tabs */ if (!ep) ep = dp; c = isoption(fp, 'o') ? 1 : TABSZ - (dp - buf) % TABSZ; if (dp >= &buf[sizeof(buf) - c - 3]) { cp--; break; } while (c-- > 0) *dp++ = ' '; continue; } else if (!isprint(c)) continue; if (dp >= &buf[sizeof(buf) - 3]) { tp = dp; while (--tp > buf) if (isspace(*tp)) { cp -= dp - tp; dp = tp; break; } ep = 0; break; } if (c != ' ') ep = 0; else if (!ep) ep = dp; *dp++ = c; } if (ep) *ep = 0; else *dp = 0; split(fp, buf, splice); } return 0; }