Blame


1 c42a1d3d 2006-02-21 devnull #include "a.h"
2 c42a1d3d 2006-02-21 devnull
3 c42a1d3d 2006-02-21 devnull /*
4 c42a1d3d 2006-02-21 devnull * 16. Conditional acceptance of input.
5 c42a1d3d 2006-02-21 devnull *
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
9 c42a1d3d 2006-02-21 devnull * N - N>0
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
13 c42a1d3d 2006-02-21 devnull *
14 c42a1d3d 2006-02-21 devnull * \{xxx\} can be used for newline in bodies
15 c42a1d3d 2006-02-21 devnull *
16 c42a1d3d 2006-02-21 devnull * .if .ie .el
17 c42a1d3d 2006-02-21 devnull *
18 c42a1d3d 2006-02-21 devnull */
19 c42a1d3d 2006-02-21 devnull
20 c42a1d3d 2006-02-21 devnull int iftrue[20];
21 c42a1d3d 2006-02-21 devnull int niftrue;
22 c42a1d3d 2006-02-21 devnull
23 c42a1d3d 2006-02-21 devnull void
24 c42a1d3d 2006-02-21 devnull startbody(void)
25 c42a1d3d 2006-02-21 devnull {
26 c42a1d3d 2006-02-21 devnull int c;
27 fa325e9b 2020-01-10 cross
28 c42a1d3d 2006-02-21 devnull while((c = getrune()) == ' ' || c == '\t')
29 c42a1d3d 2006-02-21 devnull ;
30 c42a1d3d 2006-02-21 devnull ungetrune(c);
31 c42a1d3d 2006-02-21 devnull }
32 c42a1d3d 2006-02-21 devnull
33 c42a1d3d 2006-02-21 devnull void
34 c42a1d3d 2006-02-21 devnull skipbody(void)
35 c42a1d3d 2006-02-21 devnull {
36 c42a1d3d 2006-02-21 devnull int c, cc, nbrace;
37 c42a1d3d 2006-02-21 devnull
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)
41 c42a1d3d 2006-02-21 devnull break;
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--;
46 c42a1d3d 2006-02-21 devnull }
47 c42a1d3d 2006-02-21 devnull }
48 c42a1d3d 2006-02-21 devnull
49 c42a1d3d 2006-02-21 devnull int
50 c42a1d3d 2006-02-21 devnull ifeval(void)
51 c42a1d3d 2006-02-21 devnull {
52 c42a1d3d 2006-02-21 devnull int c, cc, neg, nc;
53 c42a1d3d 2006-02-21 devnull Rune line[MaxLine], *p, *e, *q;
54 c42a1d3d 2006-02-21 devnull Rune *a;
55 fa325e9b 2020-01-10 cross
56 c42a1d3d 2006-02-21 devnull while((c = getnext()) == ' ' || c == '\t')
57 c42a1d3d 2006-02-21 devnull ;
58 c42a1d3d 2006-02-21 devnull neg = 0;
59 c42a1d3d 2006-02-21 devnull while(c == '!'){
60 c42a1d3d 2006-02-21 devnull neg = !neg;
61 c42a1d3d 2006-02-21 devnull c = getnext();
62 c42a1d3d 2006-02-21 devnull }
63 c42a1d3d 2006-02-21 devnull
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;
68 c42a1d3d 2006-02-21 devnull free(a);
69 c42a1d3d 2006-02-21 devnull return c;
70 c42a1d3d 2006-02-21 devnull }
71 fa325e9b 2020-01-10 cross
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)
81 c42a1d3d 2006-02-21 devnull ;
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)
86 c42a1d3d 2006-02-21 devnull ;
87 c42a1d3d 2006-02-21 devnull return 0 ^ neg;
88 c42a1d3d 2006-02-21 devnull }
89 c42a1d3d 2006-02-21 devnull
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);
93 c42a1d3d 2006-02-21 devnull nc = 0;
94 c42a1d3d 2006-02-21 devnull q = nil;
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)
98 c42a1d3d 2006-02-21 devnull break;
99 c42a1d3d 2006-02-21 devnull q = p;
100 c42a1d3d 2006-02-21 devnull }
101 c42a1d3d 2006-02-21 devnull *p++ = cc;
102 c42a1d3d 2006-02-21 devnull }
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;
106 c42a1d3d 2006-02-21 devnull }
107 c42a1d3d 2006-02-21 devnull if(nc < 2){
108 c42a1d3d 2006-02-21 devnull return 0;
109 c42a1d3d 2006-02-21 devnull }
110 c42a1d3d 2006-02-21 devnull *p = 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;
113 c42a1d3d 2006-02-21 devnull }
114 fa325e9b 2020-01-10 cross
115 c42a1d3d 2006-02-21 devnull void
116 c42a1d3d 2006-02-21 devnull r_if(Rune *name)
117 c42a1d3d 2006-02-21 devnull {
118 c42a1d3d 2006-02-21 devnull int n;
119 fa325e9b 2020-01-10 cross
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;
125 c42a1d3d 2006-02-21 devnull }
126 c42a1d3d 2006-02-21 devnull if(n)
127 c42a1d3d 2006-02-21 devnull startbody();
128 c42a1d3d 2006-02-21 devnull else
129 c42a1d3d 2006-02-21 devnull skipbody();
130 c42a1d3d 2006-02-21 devnull }
131 c42a1d3d 2006-02-21 devnull
132 c42a1d3d 2006-02-21 devnull void
133 c42a1d3d 2006-02-21 devnull r_el(Rune *name)
134 c42a1d3d 2006-02-21 devnull {
135 c42a1d3d 2006-02-21 devnull USED(name);
136 fa325e9b 2020-01-10 cross
137 c42a1d3d 2006-02-21 devnull if(niftrue <= 0){
138 c42a1d3d 2006-02-21 devnull warn("%Cel underflow", dot);
139 c42a1d3d 2006-02-21 devnull return;
140 c42a1d3d 2006-02-21 devnull }
141 c42a1d3d 2006-02-21 devnull if(iftrue[--niftrue])
142 c42a1d3d 2006-02-21 devnull skipbody();
143 c42a1d3d 2006-02-21 devnull else
144 c42a1d3d 2006-02-21 devnull startbody();
145 c42a1d3d 2006-02-21 devnull }
146 c42a1d3d 2006-02-21 devnull
147 c42a1d3d 2006-02-21 devnull void
148 c42a1d3d 2006-02-21 devnull t16init(void)
149 c42a1d3d 2006-02-21 devnull {
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);
153 fa325e9b 2020-01-10 cross
154 c42a1d3d 2006-02-21 devnull addesc('{', e_nop, HtmlMode|ArgMode);
155 c42a1d3d 2006-02-21 devnull addesc('}', e_nop, HtmlMode|ArgMode);
156 c42a1d3d 2006-02-21 devnull }