1 c42a1d3d 2006-02-21 devnull #include "a.h"
4 c42a1d3d 2006-02-21 devnull * 16. Conditional acceptance of input.
6 c42a1d3d 2006-02-21 devnull * conditions are
7 c42a1d3d 2006-02-21 devnull * c - condition letter (o, e, t, n)
8 c42a1d3d 2006-02-21 devnull * !c - not c
10 c42a1d3d 2006-02-21 devnull * !N - N <= 0
11 c42a1d3d 2006-02-21 devnull * 'a'b' - if a==b
12 c42a1d3d 2006-02-21 devnull * !'a'b' - if a!=b
14 c42a1d3d 2006-02-21 devnull * \{xxx\} can be used for newline in bodies
16 c42a1d3d 2006-02-21 devnull * .if .ie .el
20 c42a1d3d 2006-02-21 devnull int iftrue[20];
21 c42a1d3d 2006-02-21 devnull int niftrue;
24 c42a1d3d 2006-02-21 devnull startbody(void)
28 c42a1d3d 2006-02-21 devnull while((c = getrune()) == ' ' || c == '\t')
30 c42a1d3d 2006-02-21 devnull ungetrune(c);
34 c42a1d3d 2006-02-21 devnull skipbody(void)
36 c42a1d3d 2006-02-21 devnull int c, cc, nbrace;
38 c42a1d3d 2006-02-21 devnull nbrace = 0;
39 c42a1d3d 2006-02-21 devnull for(cc=0; (c = getrune()) >= 0; cc=c){
40 c42a1d3d 2006-02-21 devnull if(c == '\n' && nbrace <= 0)
42 c42a1d3d 2006-02-21 devnull if(cc == '\\' && c == '{')
43 c42a1d3d 2006-02-21 devnull nbrace++;
44 c42a1d3d 2006-02-21 devnull if(cc == '\\' && c == '}')
45 c42a1d3d 2006-02-21 devnull nbrace--;
50 c42a1d3d 2006-02-21 devnull ifeval(void)
52 c42a1d3d 2006-02-21 devnull int c, cc, neg, nc;
53 c42a1d3d 2006-02-21 devnull Rune line[MaxLine], *p, *e, *q;
56 c42a1d3d 2006-02-21 devnull while((c = getnext()) == ' ' || c == '\t')
59 c42a1d3d 2006-02-21 devnull while(c == '!'){
60 c42a1d3d 2006-02-21 devnull neg = !neg;
61 c42a1d3d 2006-02-21 devnull c = getnext();
64 c42a1d3d 2006-02-21 devnull if('0' <= c && c <= '9'){
65 c42a1d3d 2006-02-21 devnull ungetnext(c);
66 c42a1d3d 2006-02-21 devnull a = copyarg();
67 c42a1d3d 2006-02-21 devnull c = (eval(a)>0) ^ neg;
69 c42a1d3d 2006-02-21 devnull return c;
72 c42a1d3d 2006-02-21 devnull switch(c){
73 c42a1d3d 2006-02-21 devnull case ' ':
74 c42a1d3d 2006-02-21 devnull case '\n':
75 c42a1d3d 2006-02-21 devnull ungetnext(c);
76 c42a1d3d 2006-02-21 devnull return !neg;
77 c42a1d3d 2006-02-21 devnull case 'o': /* odd page */
78 c42a1d3d 2006-02-21 devnull case 't': /* troff */
79 c42a1d3d 2006-02-21 devnull case 'h': /* htmlroff */
80 c42a1d3d 2006-02-21 devnull while((c = getrune()) != ' ' && c != '\t' && c != '\n' && c >= 0)
82 c42a1d3d 2006-02-21 devnull return 1 ^ neg;
83 c42a1d3d 2006-02-21 devnull case 'n': /* nroff */
84 c42a1d3d 2006-02-21 devnull case 'e': /* even page */
85 c42a1d3d 2006-02-21 devnull while((c = getnext()) != ' ' && c != '\t' && c != '\n' && c >= 0)
87 c42a1d3d 2006-02-21 devnull return 0 ^ neg;
90 c42a1d3d 2006-02-21 devnull /* string comparison 'string1'string2' */
91 c42a1d3d 2006-02-21 devnull p = line;
92 c42a1d3d 2006-02-21 devnull e = p+nelem(line);
95 c42a1d3d 2006-02-21 devnull while((cc=getnext()) >= 0 && cc != '\n' && p<e){
96 c42a1d3d 2006-02-21 devnull if(cc == c){
97 c42a1d3d 2006-02-21 devnull if(++nc == 2)
101 c42a1d3d 2006-02-21 devnull *p++ = cc;
103 c42a1d3d 2006-02-21 devnull if(cc != c){
104 c42a1d3d 2006-02-21 devnull ungetnext(cc);
105 c42a1d3d 2006-02-21 devnull return 0;
107 c42a1d3d 2006-02-21 devnull if(nc < 2){
108 c42a1d3d 2006-02-21 devnull return 0;
111 c42a1d3d 2006-02-21 devnull return (q-line == p-(q+1)
112 c42a1d3d 2006-02-21 devnull && memcmp(line, q+1, (q-line)*sizeof(Rune))==0) ^ neg;
116 c42a1d3d 2006-02-21 devnull r_if(Rune *name)
120 c42a1d3d 2006-02-21 devnull n = ifeval();
121 c42a1d3d 2006-02-21 devnull if(runestrcmp(name, L("ie")) == 0){
122 c42a1d3d 2006-02-21 devnull if(niftrue >= nelem(iftrue))
123 c42a1d3d 2006-02-21 devnull sysfatal("%Cie overflow", dot);
124 c42a1d3d 2006-02-21 devnull iftrue[niftrue++] = n;
127 c42a1d3d 2006-02-21 devnull startbody();
129 c42a1d3d 2006-02-21 devnull skipbody();
133 c42a1d3d 2006-02-21 devnull r_el(Rune *name)
135 c42a1d3d 2006-02-21 devnull USED(name);
137 c42a1d3d 2006-02-21 devnull if(niftrue <= 0){
138 c42a1d3d 2006-02-21 devnull warn("%Cel underflow", dot);
141 c42a1d3d 2006-02-21 devnull if(iftrue[--niftrue])
142 c42a1d3d 2006-02-21 devnull skipbody();
144 c42a1d3d 2006-02-21 devnull startbody();
148 c42a1d3d 2006-02-21 devnull t16init(void)
150 c42a1d3d 2006-02-21 devnull addraw(L("if"), r_if);
151 c42a1d3d 2006-02-21 devnull addraw(L("ie"), r_if);
152 c42a1d3d 2006-02-21 devnull addraw(L("el"), r_el);
154 c42a1d3d 2006-02-21 devnull addesc('{', e_nop, HtmlMode|ArgMode);
155 c42a1d3d 2006-02-21 devnull addesc('}', e_nop, HtmlMode|ArgMode);