1*426d2b71SDavid du Colombier #include <u.h> 2*426d2b71SDavid du Colombier #include <libc.h> 3*426d2b71SDavid du Colombier #include <bio.h> 4*426d2b71SDavid du Colombier #include <ctype.h> 5*426d2b71SDavid du Colombier 6*426d2b71SDavid du Colombier enum 7*426d2b71SDavid du Colombier { 8*426d2b71SDavid du Colombier Unbsp = 0x00A0, 9*426d2b71SDavid du Colombier Uprivate = 0xF000, 10*426d2b71SDavid du Colombier Uempty, /* \& */ 11*426d2b71SDavid du Colombier Uamp, /* raw & */ 12*426d2b71SDavid du Colombier Ult, /* raw < */ 13*426d2b71SDavid du Colombier Ugt, /* raw > */ 14*426d2b71SDavid du Colombier Utick, /* raw ' */ 15*426d2b71SDavid du Colombier Ubtick, /* raw ` */ 16*426d2b71SDavid du Colombier Uminus, /* raw - */ 17*426d2b71SDavid du Colombier Uspace, /* raw space */ 18*426d2b71SDavid du Colombier Upl, /* symbol + */ 19*426d2b71SDavid du Colombier Ueq, /* symbol = */ 20*426d2b71SDavid du Colombier Umi, /* symbol - */ 21*426d2b71SDavid du Colombier Uformatted, /* start diverted output */ 22*426d2b71SDavid du Colombier Uunformatted, /* end diverted output */ 23*426d2b71SDavid du Colombier 24*426d2b71SDavid du Colombier UPI = 720, /* units per inch */ 25*426d2b71SDavid du Colombier UPX = 10, /* units per pixel */ 26*426d2b71SDavid du Colombier 27*426d2b71SDavid du Colombier /* special input modes */ 28*426d2b71SDavid du Colombier CopyMode = 1<<1, 29*426d2b71SDavid du Colombier ExpandMode = 1<<2, 30*426d2b71SDavid du Colombier ArgMode = 1<<3, 31*426d2b71SDavid du Colombier HtmlMode = 1<<4, 32*426d2b71SDavid du Colombier 33*426d2b71SDavid du Colombier MaxLine = 1024, 34*426d2b71SDavid du Colombier }; 35*426d2b71SDavid du Colombier 36*426d2b71SDavid du Colombier Rune* L(char*); 37*426d2b71SDavid du Colombier 38*426d2b71SDavid du Colombier void addesc(Rune, int (*)(void), int); 39*426d2b71SDavid du Colombier void addraw(Rune*, void(*)(Rune*)); 40*426d2b71SDavid du Colombier void addreq(Rune*, void(*)(int, Rune**), int); 41*426d2b71SDavid du Colombier void af(Rune*, Rune*); 42*426d2b71SDavid du Colombier void as(Rune*, Rune*); 43*426d2b71SDavid du Colombier void br(void); 44*426d2b71SDavid du Colombier void closehtml(void); 45*426d2b71SDavid du Colombier Rune* copyarg(void); 46*426d2b71SDavid du Colombier void delraw(Rune*); 47*426d2b71SDavid du Colombier void delreq(Rune*); 48*426d2b71SDavid du Colombier void ds(Rune*, Rune*); 49*426d2b71SDavid du Colombier int dv(int); 50*426d2b71SDavid du Colombier int e_nop(void); 51*426d2b71SDavid du Colombier int e_warn(void); 52*426d2b71SDavid du Colombier void* emalloc(uint); 53*426d2b71SDavid du Colombier void* erealloc(void*, uint); 54*426d2b71SDavid du Colombier Rune* erunesmprint(char*, ...); 55*426d2b71SDavid du Colombier Rune* erunestrdup(Rune*); 56*426d2b71SDavid du Colombier char* esmprint(char*, ...); 57*426d2b71SDavid du Colombier char* estrdup(char*); 58*426d2b71SDavid du Colombier int eval(Rune*); 59*426d2b71SDavid du Colombier int evalscale(Rune*, int); 60*426d2b71SDavid du Colombier Rune* getname(void); 61*426d2b71SDavid du Colombier int getnext(void); 62*426d2b71SDavid du Colombier Rune* getds(Rune*); 63*426d2b71SDavid du Colombier Rune* _getnr(Rune*); 64*426d2b71SDavid du Colombier int getnr(Rune*); 65*426d2b71SDavid du Colombier int getnrr(Rune*); 66*426d2b71SDavid du Colombier int getrune(void); 67*426d2b71SDavid du Colombier Rune* getqarg(void); 68*426d2b71SDavid du Colombier Rune* getline(void); 69*426d2b71SDavid du Colombier void hideihtml(void); 70*426d2b71SDavid du Colombier void html(Rune*, Rune*); 71*426d2b71SDavid du Colombier void htmlinit(void); 72*426d2b71SDavid du Colombier void ihtml(Rune*, Rune*); 73*426d2b71SDavid du Colombier void inputnotify(void(*)(void)); 74*426d2b71SDavid du Colombier void itrap(void); 75*426d2b71SDavid du Colombier void itrapset(void); 76*426d2b71SDavid du Colombier int linefmt(Fmt*); 77*426d2b71SDavid du Colombier void nr(Rune*, int); 78*426d2b71SDavid du Colombier void _nr(Rune*, Rune*); 79*426d2b71SDavid du Colombier void out(Rune*); 80*426d2b71SDavid du Colombier void (*outcb)(Rune); 81*426d2b71SDavid du Colombier void outhtml(Rune*); 82*426d2b71SDavid du Colombier void outrune(Rune); 83*426d2b71SDavid du Colombier void outtrap(void); 84*426d2b71SDavid du Colombier int popinput(void); 85*426d2b71SDavid du Colombier void printds(int); 86*426d2b71SDavid du Colombier int pushinputfile(Rune*); 87*426d2b71SDavid du Colombier void pushinputstring(Rune*); 88*426d2b71SDavid du Colombier int pushstdin(void); 89*426d2b71SDavid du Colombier int queueinputfile(Rune*); 90*426d2b71SDavid du Colombier int queuestdin(void); 91*426d2b71SDavid du Colombier void r_nop(int, Rune**); 92*426d2b71SDavid du Colombier void r_warn(int, Rune**); 93*426d2b71SDavid du Colombier Rune *readline(int); 94*426d2b71SDavid du Colombier void reitag(void); 95*426d2b71SDavid du Colombier void renraw(Rune*, Rune*); 96*426d2b71SDavid du Colombier void renreq(Rune*, Rune*); 97*426d2b71SDavid du Colombier void run(void); 98*426d2b71SDavid du Colombier void runinput(void); 99*426d2b71SDavid du Colombier int runmacro(int, int, Rune**); 100*426d2b71SDavid du Colombier void runmacro1(Rune*); 101*426d2b71SDavid du Colombier Rune* rune2html(Rune); 102*426d2b71SDavid du Colombier void setlinenumber(Rune*, int); 103*426d2b71SDavid du Colombier void showihtml(void); 104*426d2b71SDavid du Colombier void sp(int); 105*426d2b71SDavid du Colombier void t1init(void); 106*426d2b71SDavid du Colombier void t2init(void); 107*426d2b71SDavid du Colombier void t3init(void); 108*426d2b71SDavid du Colombier void t4init(void); 109*426d2b71SDavid du Colombier void t5init(void); 110*426d2b71SDavid du Colombier void t6init(void); 111*426d2b71SDavid du Colombier void t7init(void); 112*426d2b71SDavid du Colombier void t8init(void); 113*426d2b71SDavid du Colombier void t9init(void); 114*426d2b71SDavid du Colombier void t10init(void); 115*426d2b71SDavid du Colombier void t11init(void); 116*426d2b71SDavid du Colombier void t12init(void); 117*426d2b71SDavid du Colombier void t13init(void); 118*426d2b71SDavid du Colombier void t14init(void); 119*426d2b71SDavid du Colombier void t15init(void); 120*426d2b71SDavid du Colombier void t16init(void); 121*426d2b71SDavid du Colombier void t17init(void); 122*426d2b71SDavid du Colombier void t18init(void); 123*426d2b71SDavid du Colombier void t19init(void); 124*426d2b71SDavid du Colombier void t20init(void); 125*426d2b71SDavid du Colombier Rune troff2rune(Rune*); 126*426d2b71SDavid du Colombier void unfont(void); 127*426d2b71SDavid du Colombier void ungetnext(Rune); 128*426d2b71SDavid du Colombier void ungetrune(Rune); 129*426d2b71SDavid du Colombier void unitag(void); 130*426d2b71SDavid du Colombier void warn(char*, ...); 131*426d2b71SDavid du Colombier 132*426d2b71SDavid du Colombier extern int backslash; 133*426d2b71SDavid du Colombier extern int bol; 134*426d2b71SDavid du Colombier extern Biobuf bout; 135*426d2b71SDavid du Colombier extern int broke; 136*426d2b71SDavid du Colombier extern int dot; 137*426d2b71SDavid du Colombier extern int inputmode; 138*426d2b71SDavid du Colombier extern int inrequest; 139*426d2b71SDavid du Colombier extern int tick; 140*426d2b71SDavid du Colombier extern int utf8; 141*426d2b71SDavid du Colombier extern int verbose; 142*426d2b71SDavid du Colombier extern int linepos; 143*426d2b71SDavid du Colombier 144*426d2b71SDavid du Colombier #define runemalloc(n) (Rune*)emalloc((n)*sizeof(Rune)) 145*426d2b71SDavid du Colombier #define runerealloc(r, n) (Rune*)erealloc(r, (n)*sizeof(Rune)) 146*426d2b71SDavid du Colombier #define runemove(a, b, n) memmove(a, b, (n)*sizeof(Rune)) 147*426d2b71SDavid du Colombier 148*426d2b71SDavid du Colombier #pragma varargck type "L" void 149