#include #include #include "utffold.h" static Rune* bsearch(Rune c, Rune *t, int n, int ne) { Rune *p; int m; while(n > 1) { m = n/2; p = t + m*ne; if(c >= p[0]) { t = p; n = n-m; } else n = m; } if(n && c >= t[0]) return t; return 0; } Rune tobaserune(Rune c) { Rune *p; p = bsearch(c, __base2, nelem(__base2)/2, 2); if(p && *p == c) c = p[1]; return c; } #include int flagi; void fold(int fd) { Biobuf b, o; int r; if(Binit(&b, fd, OREAD) == -1) sysfatal("Binit: %r"); if(Binit(&o, 1, OWRITE) == -1) sysfatal("Binit: %r"); for(;;){ r = Bgetrune(&b); if(r == Beof) break; r = tobaserune(r); if(flagi) r = tolowerrune(r); Bputrune(&o, r); } Bterm(&b); Bterm(&o); } void usage(void) { fprint(2, "usage: fold [i] ...\n"); exits("usage"); } void main(int argc, char **argv) { int i, fd; ARGBEGIN{ case 'i': flagi = 1; break; default: usage(); }ARGEND for(i = 0; i < argc; i++){ fd = open(argv[i], OREAD); if(fd == -1) sysfatal("open: %r"); fold(fd); close(fd); } if(argc == 0) fold(0); exits(""); }