ref: 4c0d4746f96e57e216b731662e1641da14c8137a
dir: /align.c/
#include <u.h>
#include <libc.h>
#include <draw.h>
#include <bio.h>
enum {
Center,
Right,
};
static void usage(void);
int getwidth(void);
void
main(int argc, char **argv)
{
int termsize, linelen, align;
char *iline;
Biobuf in, out;
int pos = 0; /* silence warnings */
align = Center;
ARGBEGIN{
case 'r': align = Right; break;
default: usage();
}ARGEND
termsize = getwidth();
if(termsize == -1)
sysfatal("term length: %r");
Binit(&in, 0, OREAD);
Binit(&out, 1, OWRITE);
while((iline = Brdline(&in, '\n')) != 0){
linelen = Blinelen(&in);
if(linelen < termsize) {
switch(align){
case Center: pos = (termsize / 2) - (linelen / 2); break;
case Right: pos = termsize - linelen; break;
}
for(int i = 0; i < pos; i++){
Bwrite(&out, " ", 1);
}
} /* give up and just echo the string if it's longer than the term size */
Bwrite(&out, iline, linelen);
}
Bterm(&in);
Bterm(&out);
}
static void
usage(void)
{
fprint(2, "usage: %s [-r]\n", argv0);
exits("usage");
}
/* adapted from mc.c */
int
getwidth(void)
{
int n, fd, linewidth;
char buf[128], *f[10], *p;
if(access("/dev/acme", OREAD) >= 0){
if((fd = open("/dev/acme/ctl", OREAD)) < 0)
return -1;
n = read(fd, buf, sizeof buf-1);
close(fd);
if(n <= 0)
return -1;
buf[n] = 0;
n = tokenize(buf, f, nelem(f));
if(n < 7)
return -1;
if((font = openfont(nil, f[6])) == nil)
return -1;
linewidth = atoi(f[5]) / stringwidth(font, "0");
return linewidth;
}
if((p = getenv("font")) == nil)
return -1;
if((font = openfont(nil, p)) == nil)
return -1;
if((fd = open("/dev/window", OREAD)) < 0){
font = nil;
return -1;
}
n = read(fd, buf, 5*12);
close(fd);
if(n < 5*12){
font = nil;
return -1;
}
buf[n] = 0;
/* window stucture:
4 bit left edge
1 bit gap
12 bit scrollbar
4 bit gap
text
4 bit right edge
*/
linewidth = atoi(buf+3*12) - atoi(buf+1*12) - (4+1+12+4+4);
return linewidth / stringwidth(font, "0");
}