#include <u.h>
#include <libc.h>
#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 <bio.h>
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("");
}
|