147 lines · 3.0 KB · C
RawDownload
#include <u.h>#include <libc.h>#include <thread.h>#include <ctype.h>#include <bio.h>#include <flate.h>#include <draw.h>#include <memdraw.h>#include "pdf.h" int mainstacksize = 128*1024; static voidusage(void){	fprint(2, "usage: %s FILE\n", argv0);	threadexitsall("usage");} static intdumppage(Object *page){	int ret;	Page p;	pageinit(&p, page);	ret = pagerender(&p);	if(ret)		if(p.buf.sz != 0)			fprint(1, "%s", (char*)p.buf.b);	pagefree(&p);	return ret;} static intdumppages(Object *pages){	Object *page, *kids, *type;	int i, count;	kids = dictget(pages, "Kids");	count = arraylen(kids);	for(i = 0; i < count; i += 1){		page = arrayget(kids, i);		// Must be a dict, either Page or Pages		type = dictget(page, "Type");		// MUST be a name.		if(strcmp(type->name, "Pages") == 0){			if(!dumppages(page))				return 0;		}		else if(strcmp(type->name, "Page") == 0){			if(!dumppage(page))				return 0;			print("\n");		}		else			sysfatal("Unexpected page node type '%s'", type->name);	}	return 1;}  voidthreadmain(int argc, char **argv){	Object *v, o;	Biobuf *b;	Stream *s;	Pdf *pdf;	int i, n, k, nodump; 	quotefmtinstall();	inflateinit();	memimageinit();	threadwaitchan(); 	ARGBEGIN{	default:		usage();	}ARGEND		nodump = 0; 	if(argc < 1)		usage();	if((b = Bopen(argv[0], OREAD|OCEXEC)) == nil)		sysfatal("%r");	if((pdf = pdfopen(b)) == nil)		sysfatal("%s: %r", argv[0]);	for(v = pdf->top, i = 1; v != nil && i < argc; i++){		if(isdigit(argv[i][0])){			n = atoi(argv[i]);			v = arrayget(v, n);		}else if((argv[i][0] == '.' || argv[i][0] == '!') && argv[i][1] == 0 && v->type == Ostream){			Memimage *m;			if((s = Sopen(v)) == nil)				sysfatal("%r");			if(argv[i][0] != '!' && (m = Sgetmemimage(s)) != nil){				writememimage(1, m);				freememimage(m);			}else if(write(1, s->buf.b, s->buf.sz) != s->buf.sz){				sysfatal("write failed");			}			Sclose(s);			v = nil;			break;		}else if(argv[i][0] == '"' && argv[i][1] == 0 && v->type == Odict && strcmp(dictget(v, "Type")->name, "Page") == 0){			dumppage(v);			nodump = 1;			break;		}else if(argv[i][0] == '"' && argv[i][1] == 0 && v->type == Odict && strcmp(dictget(v, "Type")->name, "Pages") == 0){			dumppages(v);			nodump = 1;			break;		}else if(argv[i][0] == '*' && argv[i][1] == 0 && v->type == Odict){			for(k = 0; k < v->dict.nkv; k++)				print("%s\n", v->dict.kv[k].key);			v = nil;			break;		}else if(argv[i][0] == '@' && argv[i][1] == 0 && v->type == Ostream){			fprint(2, "%d %d\n", v->stream.off, v->stream.len);			v = nil;			break;		}else if(argv[i][0] == '@' && isdigit(argv[i][1])){			o.ref = 1;			o.pdf = pdf;			o.type = Oindir;			o.indir.id = atoi(argv[i]+1);			pdfeval(&o);		}else{			v = dictget(v, argv[i]);		}	}	if(nodump){}	else if(v == &null)		fprint(2, "%r\n");	else if(v != nil)		print("%O\n", v);/*	if((v = dictget(pdf->info, "Creator")) != nil)		fprint(2, "creator: %s\n", v->str);	if((v = dictget(pdf->info, "Producer")) != nil)		fprint(2, "producer: %s\n", v->str);*/	pdfclose(pdf); 	threadexitsall(nil);}

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t