aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/page/page.c
diff options
context:
space:
mode:
authorrsc <devnull@localhost>2005-01-04 21:23:50 +0000
committerrsc <devnull@localhost>2005-01-04 21:23:50 +0000
commit24c02865d8fcc97d1fb5cb9281810d8074aa5eb1 (patch)
tree3bb16794ded14341ee58d9f1f173ce92fb4d2be7 /src/cmd/page/page.c
parentd1e9002f81f14fbfef1ebc4261edccd9eb97b72c (diff)
downloadplan9port-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.c236
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);
+}