diff options
author | rsc <devnull@localhost> | 2005-01-04 21:23:50 +0000 |
---|---|---|
committer | rsc <devnull@localhost> | 2005-01-04 21:23:50 +0000 |
commit | 24c02865d8fcc97d1fb5cb9281810d8074aa5eb1 (patch) | |
tree | 3bb16794ded14341ee58d9f1f173ce92fb4d2be7 /src/cmd/page/page.c | |
parent | d1e9002f81f14fbfef1ebc4261edccd9eb97b72c (diff) | |
download | plan9port-24c02865d8fcc97d1fb5cb9281810d8074aa5eb1.tar.gz plan9port-24c02865d8fcc97d1fb5cb9281810d8074aa5eb1.tar.bz2 plan9port-24c02865d8fcc97d1fb5cb9281810d8074aa5eb1.zip |
placeholder; does not yet build
Diffstat (limited to 'src/cmd/page/page.c')
-rw-r--r-- | src/cmd/page/page.c | 236 |
1 files changed, 236 insertions, 0 deletions
diff --git a/src/cmd/page/page.c b/src/cmd/page/page.c new file mode 100644 index 00000000..3669ebfb --- /dev/null +++ b/src/cmd/page/page.c @@ -0,0 +1,236 @@ +#include <u.h> +#include <libc.h> +#include <draw.h> +#include <event.h> +#include <bio.h> +#include "page.h" + +int resizing; +int mknewwindow; +int doabort; +int chatty; +int reverse = -1; +int goodps = 1; +int ppi = 100; +int teegs = 0; +int truetoboundingbox; +int textbits=4, gfxbits=4; +int wctlfd = -1; +int stdinfd; +int truecolor; +int imagemode; +int notewatcher; +int notegp; + +int +watcher(void *v, char *x) +{ + USED(v); + + if(strcmp(x, "die") != 0) + postnote(PNGROUP, notegp, x); + _exits(0); + return 0; +} + +int +bell(void *u, char *x) +{ + if(x && strcmp(x, "hangup") == 0) + _exits(0); + + if(x && strstr(x, "die") == nil) + fprint(2, "postnote %d: %s\n", getpid(), x); + + /* alarms come from the gs monitor */ + if(x && strstr(x, "alarm")){ + postnote(PNGROUP, getpid(), "die (gs error)"); + postnote(PNPROC, notewatcher, "die (gs error)"); + } + + /* function mentions u so that it's in the stack trace */ + if((u == nil || u != x) && doabort) + abort(); + +/* fprint(2, "exiting %d\n", getpid()); */ + wexits("note"); + return 0; +} + +static int +afmt(Fmt *fmt) +{ + char *s; + + s = va_arg(fmt->args, char*); + if(s == nil || s[0] == '\0') + return fmtstrcpy(fmt, ""); + else + return fmtprint(fmt, "%#q", s); +} + +void +usage(void) +{ + fprint(2, "usage: page [-biRrw] [-p ppi] file...\n"); + exits("usage"); +} + +void +main(int argc, char **argv) +{ + Document *doc; + Biobuf *b; + enum { Ninput = 16 }; + uchar buf[Ninput+1]; + int readstdin; + + ARGBEGIN{ + /* "temporary" debugging options */ + case 'P': + goodps = 0; + break; + case 'v': + chatty++; + break; + case 'V': + teegs++; + break; + case 'a': + doabort++; + break; + case 'T': + textbits = atoi(EARGF(usage())); + gfxbits = atoi(EARGF(usage())); + break; + + /* real options */ + case 'R': + resizing = 1; + break; + case 'r': + reverse = 1; + break; + case 'p': + ppi = atoi(EARGF(usage())); + break; + case 'b': + truetoboundingbox = 1; + break; + case 'w': + mknewwindow = 1; + resizing = 1; + break; + case 'i': + imagemode = 1; + break; + default: + usage(); + }ARGEND; + + notegp = getpid(); + + switch(notewatcher = fork()){ + case -1: + sysfatal("fork\n"); + exits(0); + default: + break; + case 0: + atnotify(watcher, 1); + for(;;) + sleep(1000); + _exits(0); + } + + rfork(RFNOTEG); + atnotify(bell, 1); + + readstdin = 0; + if(imagemode == 0 && argc == 0){ + readstdin = 1; + stdinfd = dup(0, -1); + close(0); + open("/dev/cons", OREAD); + } + + quotefmtinstall(); + fmtinstall('a', afmt); + + fmtinstall('R', Rfmt); + fmtinstall('P', Pfmt); + + if(readstdin){ + b = nil; + if(readn(stdinfd, buf, Ninput) != Ninput){ + fprint(2, "page: short read reading %s\n", argv[0]); + wexits("read"); + } + }else if(argc != 0){ + if(!(b = Bopen(argv[0], OREAD))) { + fprint(2, "page: cannot open \"%s\"\n", argv[0]); + wexits("open"); + } + + if(Bread(b, buf, Ninput) != Ninput) { + fprint(2, "page: short read reading %s\n", argv[0]); + wexits("read"); + } + }else + b = nil; + + buf[Ninput] = '\0'; + if(imagemode) + doc = initgfx(nil, 0, nil, nil, 0); + else if(strncmp((char*)buf, "%PDF-", 5) == 0) + doc = initpdf(b, argc, argv, buf, Ninput); + else if(strncmp((char*)buf, "\x04%!", 2) == 0) + doc = initps(b, argc, argv, buf, Ninput); + else if(buf[0] == '\x1B' && strstr((char*)buf, "@PJL")) + doc = initps(b, argc, argv, buf, Ninput); + else if(strncmp((char*)buf, "%!", 2) == 0) + doc = initps(b, argc, argv, buf, Ninput); + else if(strcmp((char*)buf, "\xF7\x02\x01\x83\x92\xC0\x1C;") == 0) + doc = initdvi(b, argc, argv, buf, Ninput); + else if(strncmp((char*)buf, "\xD0\xCF\x11\xE0\xA1\xB1\x1A\xE1", 8) == 0) + doc = initmsdoc(b, argc, argv, buf, Ninput); + else if(strncmp((char*)buf, "x T ", 4) == 0) + doc = inittroff(b, argc, argv, buf, Ninput); + else { + if(ppi != 100) { + fprint(2, "page: you can't specify -p with graphic files\n"); + wexits("-p and graphics"); + } + doc = initgfx(b, argc, argv, buf, Ninput); + } + + if(doc == nil) { + fprint(2, "page: error reading file: %r\n"); + wexits("document init"); + } + + if(doc->npage < 1 && !imagemode) { + fprint(2, "page: no pages found?\n"); + wexits("pagecount"); + } + + if(reverse == -1) /* neither cmdline nor ps reader set it */ + reverse = 0; + + if(initdraw(0, 0, "page") < 0){ + fprint(2, "page: initdraw failed: %r\n"); + wexits("initdraw"); + } + truecolor = screen->depth > 8; + viewer(doc); + wexits(0); +} + +void +wexits(char *s) +{ + if(s && *s && strcmp(s, "note") != 0 && mknewwindow) + sleep(10*1000); + postnote(PNPROC, notewatcher, "die"); + exits(s); +} |