Blame


1 c42a1d3d 2006-02-21 devnull #include "a.h"
2 c42a1d3d 2006-02-21 devnull /*
3 c42a1d3d 2006-02-21 devnull * 8. Number Registers
4 c42a1d3d 2006-02-21 devnull * (Reg register implementation is also here.)
5 c42a1d3d 2006-02-21 devnull */
6 c42a1d3d 2006-02-21 devnull
7 c42a1d3d 2006-02-21 devnull /*
8 c42a1d3d 2006-02-21 devnull * \nx N
9 c42a1d3d 2006-02-21 devnull * \n(xx N
10 c42a1d3d 2006-02-21 devnull * \n+x N+=M
11 c42a1d3d 2006-02-21 devnull * \n-x N-=M
12 c42a1d3d 2006-02-21 devnull *
13 c42a1d3d 2006-02-21 devnull * .nr R ±N M
14 c42a1d3d 2006-02-21 devnull * .af R c
15 c42a1d3d 2006-02-21 devnull *
16 c42a1d3d 2006-02-21 devnull * formats
17 c42a1d3d 2006-02-21 devnull * 1 0, 1, 2, 3, ...
18 c42a1d3d 2006-02-21 devnull * 001 001, 002, 003, ...
19 c42a1d3d 2006-02-21 devnull * i 0, i, ii, iii, iv, v, ...
20 c42a1d3d 2006-02-21 devnull * I 0, I, II, III, IV, V, ...
21 c42a1d3d 2006-02-21 devnull * a 0, a, b, ..., aa, ab, ..., zz, aaa, ...
22 c42a1d3d 2006-02-21 devnull * A 0, A, B, ..., AA, AB, ..., ZZ, AAA, ...
23 c42a1d3d 2006-02-21 devnull *
24 c42a1d3d 2006-02-21 devnull * \gx \g(xx return format of number register
25 c42a1d3d 2006-02-21 devnull *
26 c42a1d3d 2006-02-21 devnull * .rr R
27 c42a1d3d 2006-02-21 devnull */
28 c42a1d3d 2006-02-21 devnull
29 c42a1d3d 2006-02-21 devnull typedef struct Reg Reg;
30 c42a1d3d 2006-02-21 devnull struct Reg
31 c42a1d3d 2006-02-21 devnull {
32 c42a1d3d 2006-02-21 devnull Reg *next;
33 c42a1d3d 2006-02-21 devnull Rune *name;
34 c42a1d3d 2006-02-21 devnull Rune *val;
35 c42a1d3d 2006-02-21 devnull Rune *fmt;
36 c42a1d3d 2006-02-21 devnull int inc;
37 c42a1d3d 2006-02-21 devnull };
38 c42a1d3d 2006-02-21 devnull
39 c42a1d3d 2006-02-21 devnull Reg *dslist;
40 c42a1d3d 2006-02-21 devnull Reg *nrlist;
41 c42a1d3d 2006-02-21 devnull
42 c42a1d3d 2006-02-21 devnull /*
43 c42a1d3d 2006-02-21 devnull * Define strings and numbers.
44 c42a1d3d 2006-02-21 devnull */
45 c42a1d3d 2006-02-21 devnull void
46 c42a1d3d 2006-02-21 devnull dsnr(Rune *name, Rune *val, Reg **l)
47 c42a1d3d 2006-02-21 devnull {
48 c42a1d3d 2006-02-21 devnull Reg *s;
49 c42a1d3d 2006-02-21 devnull
50 c42a1d3d 2006-02-21 devnull for(s = *l; s != nil; s = *l){
51 c42a1d3d 2006-02-21 devnull if(runestrcmp(s->name, name) == 0)
52 c42a1d3d 2006-02-21 devnull break;
53 c42a1d3d 2006-02-21 devnull l = &s->next;
54 c42a1d3d 2006-02-21 devnull }
55 c42a1d3d 2006-02-21 devnull if(val == nil){
56 c42a1d3d 2006-02-21 devnull if(s){
57 c42a1d3d 2006-02-21 devnull *l = s->next;
58 c42a1d3d 2006-02-21 devnull free(s->val);
59 c42a1d3d 2006-02-21 devnull free(s->fmt);
60 c42a1d3d 2006-02-21 devnull free(s);
61 c42a1d3d 2006-02-21 devnull }
62 c42a1d3d 2006-02-21 devnull return;
63 c42a1d3d 2006-02-21 devnull }
64 c42a1d3d 2006-02-21 devnull if(s == nil){
65 c42a1d3d 2006-02-21 devnull s = emalloc(sizeof(Reg));
66 c42a1d3d 2006-02-21 devnull *l = s;
67 c42a1d3d 2006-02-21 devnull s->name = erunestrdup(name);
68 c42a1d3d 2006-02-21 devnull }else
69 c42a1d3d 2006-02-21 devnull free(s->val);
70 c42a1d3d 2006-02-21 devnull s->val = erunestrdup(val);
71 c42a1d3d 2006-02-21 devnull }
72 c42a1d3d 2006-02-21 devnull
73 c42a1d3d 2006-02-21 devnull Rune*
74 c42a1d3d 2006-02-21 devnull getdsnr(Rune *name, Reg *list)
75 c42a1d3d 2006-02-21 devnull {
76 c42a1d3d 2006-02-21 devnull Reg *s;
77 fa325e9b 2020-01-10 cross
78 c42a1d3d 2006-02-21 devnull for(s=list; s; s=s->next)
79 c42a1d3d 2006-02-21 devnull if(runestrcmp(name, s->name) == 0)
80 c42a1d3d 2006-02-21 devnull return s->val;
81 c42a1d3d 2006-02-21 devnull return nil;
82 c42a1d3d 2006-02-21 devnull }
83 c42a1d3d 2006-02-21 devnull
84 c42a1d3d 2006-02-21 devnull void
85 c42a1d3d 2006-02-21 devnull ds(Rune *name, Rune *val)
86 c42a1d3d 2006-02-21 devnull {
87 c42a1d3d 2006-02-21 devnull dsnr(name, val, &dslist);
88 c42a1d3d 2006-02-21 devnull }
89 c42a1d3d 2006-02-21 devnull
90 c42a1d3d 2006-02-21 devnull void
91 c42a1d3d 2006-02-21 devnull as(Rune *name, Rune *val)
92 c42a1d3d 2006-02-21 devnull {
93 c42a1d3d 2006-02-21 devnull Rune *p, *q;
94 fa325e9b 2020-01-10 cross
95 c42a1d3d 2006-02-21 devnull p = getds(name);
96 c42a1d3d 2006-02-21 devnull if(p == nil)
97 c42a1d3d 2006-02-21 devnull p = L("");
98 c42a1d3d 2006-02-21 devnull q = runemalloc(runestrlen(p)+runestrlen(val)+1);
99 c42a1d3d 2006-02-21 devnull runestrcpy(q, p);
100 c42a1d3d 2006-02-21 devnull runestrcat(q, val);
101 c42a1d3d 2006-02-21 devnull ds(name, q);
102 c42a1d3d 2006-02-21 devnull free(q);
103 c42a1d3d 2006-02-21 devnull }
104 c42a1d3d 2006-02-21 devnull
105 c42a1d3d 2006-02-21 devnull Rune*
106 c42a1d3d 2006-02-21 devnull getds(Rune *name)
107 c42a1d3d 2006-02-21 devnull {
108 c42a1d3d 2006-02-21 devnull return getdsnr(name, dslist);
109 c42a1d3d 2006-02-21 devnull }
110 c42a1d3d 2006-02-21 devnull
111 c42a1d3d 2006-02-21 devnull void
112 c42a1d3d 2006-02-21 devnull printds(int t)
113 c42a1d3d 2006-02-21 devnull {
114 c42a1d3d 2006-02-21 devnull int n, total;
115 c42a1d3d 2006-02-21 devnull Reg *s;
116 fa325e9b 2020-01-10 cross
117 c42a1d3d 2006-02-21 devnull total = 0;
118 c42a1d3d 2006-02-21 devnull for(s=dslist; s; s=s->next){
119 c42a1d3d 2006-02-21 devnull if(s->val)
120 c42a1d3d 2006-02-21 devnull n = runestrlen(s->val);
121 c42a1d3d 2006-02-21 devnull else
122 c42a1d3d 2006-02-21 devnull n = 0;
123 c42a1d3d 2006-02-21 devnull total += n;
124 c42a1d3d 2006-02-21 devnull if(!t)
125 c42a1d3d 2006-02-21 devnull fprint(2, "%S\t%d\n", s->name, n);
126 c42a1d3d 2006-02-21 devnull }
127 c42a1d3d 2006-02-21 devnull fprint(2, "total\t%d\n", total);
128 c42a1d3d 2006-02-21 devnull }
129 c42a1d3d 2006-02-21 devnull
130 c42a1d3d 2006-02-21 devnull void
131 c42a1d3d 2006-02-21 devnull nr(Rune *name, int val)
132 c42a1d3d 2006-02-21 devnull {
133 c42a1d3d 2006-02-21 devnull Rune buf[20];
134 fa325e9b 2020-01-10 cross
135 c42a1d3d 2006-02-21 devnull runesnprint(buf, nelem(buf), "%d", val);
136 c42a1d3d 2006-02-21 devnull _nr(name, buf);
137 c42a1d3d 2006-02-21 devnull }
138 c42a1d3d 2006-02-21 devnull
139 c42a1d3d 2006-02-21 devnull void
140 c42a1d3d 2006-02-21 devnull af(Rune *name, Rune *fmt)
141 c42a1d3d 2006-02-21 devnull {
142 c42a1d3d 2006-02-21 devnull Reg *s;
143 c42a1d3d 2006-02-21 devnull
144 c42a1d3d 2006-02-21 devnull if(_getnr(name) == nil)
145 c42a1d3d 2006-02-21 devnull _nr(name, L("0"));
146 c42a1d3d 2006-02-21 devnull for(s=nrlist; s; s=s->next)
147 c42a1d3d 2006-02-21 devnull if(runestrcmp(s->name, name) == 0)
148 c42a1d3d 2006-02-21 devnull s->fmt = erunestrdup(fmt);
149 c42a1d3d 2006-02-21 devnull }
150 c42a1d3d 2006-02-21 devnull
151 c42a1d3d 2006-02-21 devnull Rune*
152 c42a1d3d 2006-02-21 devnull getaf(Rune *name)
153 c42a1d3d 2006-02-21 devnull {
154 c42a1d3d 2006-02-21 devnull Reg *s;
155 fa325e9b 2020-01-10 cross
156 c42a1d3d 2006-02-21 devnull for(s=nrlist; s; s=s->next)
157 c42a1d3d 2006-02-21 devnull if(runestrcmp(s->name, name) == 0)
158 c42a1d3d 2006-02-21 devnull return s->fmt;
159 c42a1d3d 2006-02-21 devnull return nil;
160 c42a1d3d 2006-02-21 devnull }
161 c42a1d3d 2006-02-21 devnull
162 c42a1d3d 2006-02-21 devnull void
163 c42a1d3d 2006-02-21 devnull printnr(void)
164 c42a1d3d 2006-02-21 devnull {
165 c42a1d3d 2006-02-21 devnull Reg *r;
166 fa325e9b 2020-01-10 cross
167 c42a1d3d 2006-02-21 devnull for(r=nrlist; r; r=r->next)
168 c42a1d3d 2006-02-21 devnull fprint(2, "%S %S %d\n", r->name, r->val, r->inc);
169 c42a1d3d 2006-02-21 devnull }
170 c42a1d3d 2006-02-21 devnull
171 c42a1d3d 2006-02-21 devnull /*
172 c42a1d3d 2006-02-21 devnull * Some internal number registers are actually strings,
173 c42a1d3d 2006-02-21 devnull * so provide _ versions to get at them.
174 c42a1d3d 2006-02-21 devnull */
175 c42a1d3d 2006-02-21 devnull void
176 c42a1d3d 2006-02-21 devnull _nr(Rune *name, Rune *val)
177 c42a1d3d 2006-02-21 devnull {
178 c42a1d3d 2006-02-21 devnull dsnr(name, val, &nrlist);
179 c42a1d3d 2006-02-21 devnull }
180 c42a1d3d 2006-02-21 devnull
181 c42a1d3d 2006-02-21 devnull Rune*
182 c42a1d3d 2006-02-21 devnull _getnr(Rune *name)
183 c42a1d3d 2006-02-21 devnull {
184 c42a1d3d 2006-02-21 devnull return getdsnr(name, nrlist);
185 c42a1d3d 2006-02-21 devnull }
186 c42a1d3d 2006-02-21 devnull
187 c42a1d3d 2006-02-21 devnull int
188 c42a1d3d 2006-02-21 devnull getnr(Rune *name)
189 c42a1d3d 2006-02-21 devnull {
190 c42a1d3d 2006-02-21 devnull Rune *p;
191 c42a1d3d 2006-02-21 devnull
192 c42a1d3d 2006-02-21 devnull p = _getnr(name);
193 c42a1d3d 2006-02-21 devnull if(p == nil)
194 c42a1d3d 2006-02-21 devnull return 0;
195 c42a1d3d 2006-02-21 devnull return eval(p);
196 c42a1d3d 2006-02-21 devnull }
197 c42a1d3d 2006-02-21 devnull
198 c42a1d3d 2006-02-21 devnull /* new register */
199 c42a1d3d 2006-02-21 devnull void
200 c42a1d3d 2006-02-21 devnull r_nr(int argc, Rune **argv)
201 c42a1d3d 2006-02-21 devnull {
202 c42a1d3d 2006-02-21 devnull Reg *s;
203 c42a1d3d 2006-02-21 devnull
204 c42a1d3d 2006-02-21 devnull if(argc < 2)
205 c42a1d3d 2006-02-21 devnull return;
206 c42a1d3d 2006-02-21 devnull if(argc < 3)
207 c42a1d3d 2006-02-21 devnull nr(argv[1], 0);
208 c42a1d3d 2006-02-21 devnull else{
209 c42a1d3d 2006-02-21 devnull if(argv[2][0] == '+')
210 c42a1d3d 2006-02-21 devnull nr(argv[1], getnr(argv[1])+eval(argv[2]+1));
211 c42a1d3d 2006-02-21 devnull else if(argv[2][0] == '-')
212 c42a1d3d 2006-02-21 devnull nr(argv[1], getnr(argv[1])-eval(argv[2]+1));
213 c42a1d3d 2006-02-21 devnull else
214 c42a1d3d 2006-02-21 devnull nr(argv[1], eval(argv[2]));
215 c42a1d3d 2006-02-21 devnull }
216 c42a1d3d 2006-02-21 devnull if(argc > 3){
217 c42a1d3d 2006-02-21 devnull for(s=nrlist; s; s=s->next)
218 c42a1d3d 2006-02-21 devnull if(runestrcmp(s->name, argv[1]) == 0)
219 c42a1d3d 2006-02-21 devnull s->inc = eval(argv[3]);
220 c42a1d3d 2006-02-21 devnull }
221 c42a1d3d 2006-02-21 devnull }
222 c42a1d3d 2006-02-21 devnull
223 c42a1d3d 2006-02-21 devnull /* assign format */
224 c42a1d3d 2006-02-21 devnull void
225 c42a1d3d 2006-02-21 devnull r_af(int argc, Rune **argv)
226 c42a1d3d 2006-02-21 devnull {
227 c42a1d3d 2006-02-21 devnull USED(argc);
228 fa325e9b 2020-01-10 cross
229 c42a1d3d 2006-02-21 devnull af(argv[1], argv[2]);
230 c42a1d3d 2006-02-21 devnull }
231 c42a1d3d 2006-02-21 devnull
232 c42a1d3d 2006-02-21 devnull /* remove register */
233 c42a1d3d 2006-02-21 devnull void
234 c42a1d3d 2006-02-21 devnull r_rr(int argc, Rune **argv)
235 c42a1d3d 2006-02-21 devnull {
236 c42a1d3d 2006-02-21 devnull int i;
237 fa325e9b 2020-01-10 cross
238 c42a1d3d 2006-02-21 devnull for(i=1; i<argc; i++)
239 c42a1d3d 2006-02-21 devnull _nr(argv[i], nil);
240 c42a1d3d 2006-02-21 devnull }
241 c42a1d3d 2006-02-21 devnull
242 c42a1d3d 2006-02-21 devnull /* fmt integer in base 26 */
243 c42a1d3d 2006-02-21 devnull void
244 c42a1d3d 2006-02-21 devnull alpha(Rune *buf, int n, int a)
245 c42a1d3d 2006-02-21 devnull {
246 c42a1d3d 2006-02-21 devnull int i, v;
247 fa325e9b 2020-01-10 cross
248 c42a1d3d 2006-02-21 devnull i = 1;
249 c42a1d3d 2006-02-21 devnull for(v=n; v>0; v/=26)
250 c42a1d3d 2006-02-21 devnull i++;
251 c42a1d3d 2006-02-21 devnull if(i == 0)
252 c42a1d3d 2006-02-21 devnull i = 1;
253 c42a1d3d 2006-02-21 devnull buf[i] = 0;
254 c42a1d3d 2006-02-21 devnull while(i > 0){
255 c42a1d3d 2006-02-21 devnull buf[--i] = a+n%26;
256 c42a1d3d 2006-02-21 devnull n /= 26;
257 c42a1d3d 2006-02-21 devnull }
258 c42a1d3d 2006-02-21 devnull }
259 c42a1d3d 2006-02-21 devnull
260 c42a1d3d 2006-02-21 devnull struct romanv {
261 c42a1d3d 2006-02-21 devnull char *s;
262 c42a1d3d 2006-02-21 devnull int v;
263 c42a1d3d 2006-02-21 devnull } romanv[] =
264 c42a1d3d 2006-02-21 devnull {
265 c42a1d3d 2006-02-21 devnull "m", 1000,
266 c42a1d3d 2006-02-21 devnull "cm", 900,
267 c42a1d3d 2006-02-21 devnull "d", 500,
268 c42a1d3d 2006-02-21 devnull "cd", 400,
269 c42a1d3d 2006-02-21 devnull "c", 100,
270 c42a1d3d 2006-02-21 devnull "xc", 90,
271 c42a1d3d 2006-02-21 devnull "l", 50,
272 c42a1d3d 2006-02-21 devnull "xl", 40,
273 c42a1d3d 2006-02-21 devnull "x", 10,
274 c42a1d3d 2006-02-21 devnull "ix", 9,
275 c42a1d3d 2006-02-21 devnull "v", 5,
276 c42a1d3d 2006-02-21 devnull "iv", 4,
277 c42a1d3d 2006-02-21 devnull "i", 1
278 c42a1d3d 2006-02-21 devnull };
279 c42a1d3d 2006-02-21 devnull
280 c42a1d3d 2006-02-21 devnull /* fmt integer in roman numerals! */
281 c42a1d3d 2006-02-21 devnull void
282 c42a1d3d 2006-02-21 devnull roman(Rune *buf, int n, int upper)
283 c42a1d3d 2006-02-21 devnull {
284 c42a1d3d 2006-02-21 devnull Rune *p;
285 c42a1d3d 2006-02-21 devnull char *q;
286 c42a1d3d 2006-02-21 devnull struct romanv *r;
287 fa325e9b 2020-01-10 cross
288 c42a1d3d 2006-02-21 devnull if(upper)
289 c42a1d3d 2006-02-21 devnull upper = 'A' - 'a';
290 c42a1d3d 2006-02-21 devnull if(n >= 5000 || n <= 0){
291 c42a1d3d 2006-02-21 devnull runestrcpy(buf, L("-"));
292 c42a1d3d 2006-02-21 devnull return;
293 c42a1d3d 2006-02-21 devnull }
294 c42a1d3d 2006-02-21 devnull p = buf;
295 c42a1d3d 2006-02-21 devnull r = romanv;
296 c42a1d3d 2006-02-21 devnull while(n > 0){
297 c42a1d3d 2006-02-21 devnull while(n >= r->v){
298 c42a1d3d 2006-02-21 devnull for(q=r->s; *q; q++)
299 c42a1d3d 2006-02-21 devnull *p++ = *q + upper;
300 c42a1d3d 2006-02-21 devnull n -= r->v;
301 c42a1d3d 2006-02-21 devnull }
302 c42a1d3d 2006-02-21 devnull r++;
303 c42a1d3d 2006-02-21 devnull }
304 c42a1d3d 2006-02-21 devnull *p = 0;
305 c42a1d3d 2006-02-21 devnull }
306 c42a1d3d 2006-02-21 devnull
307 c42a1d3d 2006-02-21 devnull Rune*
308 c42a1d3d 2006-02-21 devnull getname(void)
309 c42a1d3d 2006-02-21 devnull {
310 c42a1d3d 2006-02-21 devnull int i, c, cc;
311 c42a1d3d 2006-02-21 devnull static Rune buf[100];
312 fa325e9b 2020-01-10 cross
313 c42a1d3d 2006-02-21 devnull /* XXX add [name] syntax as in groff */
314 c42a1d3d 2006-02-21 devnull c = getnext();
315 c42a1d3d 2006-02-21 devnull if(c < 0)
316 c42a1d3d 2006-02-21 devnull return L("");
317 c42a1d3d 2006-02-21 devnull if(c == '\n'){
318 c42a1d3d 2006-02-21 devnull warn("newline in name\n");
319 c42a1d3d 2006-02-21 devnull ungetnext(c);
320 c42a1d3d 2006-02-21 devnull return L("");
321 c42a1d3d 2006-02-21 devnull }
322 c42a1d3d 2006-02-21 devnull if(c == '['){
323 c42a1d3d 2006-02-21 devnull for(i=0; i<nelem(buf)-1; i++){
324 c42a1d3d 2006-02-21 devnull if((c = getrune()) < 0)
325 c42a1d3d 2006-02-21 devnull return L("");
326 c42a1d3d 2006-02-21 devnull if(c == ']'){
327 c42a1d3d 2006-02-21 devnull buf[i] = 0;
328 c42a1d3d 2006-02-21 devnull return buf;
329 c42a1d3d 2006-02-21 devnull }
330 c42a1d3d 2006-02-21 devnull buf[i] = c;
331 c42a1d3d 2006-02-21 devnull }
332 c42a1d3d 2006-02-21 devnull return L("");
333 c42a1d3d 2006-02-21 devnull }
334 c42a1d3d 2006-02-21 devnull if(c != '('){
335 c42a1d3d 2006-02-21 devnull buf[0] = c;
336 c42a1d3d 2006-02-21 devnull buf[1] = 0;
337 c42a1d3d 2006-02-21 devnull return buf;
338 c42a1d3d 2006-02-21 devnull }
339 c42a1d3d 2006-02-21 devnull c = getnext();
340 c42a1d3d 2006-02-21 devnull cc = getnext();
341 c42a1d3d 2006-02-21 devnull if(c < 0 || cc < 0)
342 c42a1d3d 2006-02-21 devnull return L("");
343 c42a1d3d 2006-02-21 devnull if(c == '\n' | cc == '\n'){
344 c42a1d3d 2006-02-21 devnull warn("newline in \\n");
345 c42a1d3d 2006-02-21 devnull ungetnext(cc);
346 c42a1d3d 2006-02-21 devnull if(c == '\n')
347 c42a1d3d 2006-02-21 devnull ungetnext(c);
348 c42a1d3d 2006-02-21 devnull }
349 c42a1d3d 2006-02-21 devnull buf[0] = c;
350 c42a1d3d 2006-02-21 devnull buf[1] = cc;
351 c42a1d3d 2006-02-21 devnull buf[2] = 0;
352 c42a1d3d 2006-02-21 devnull return buf;
353 c42a1d3d 2006-02-21 devnull }
354 c42a1d3d 2006-02-21 devnull
355 c42a1d3d 2006-02-21 devnull /* \n - return number register */
356 c42a1d3d 2006-02-21 devnull int
357 c42a1d3d 2006-02-21 devnull e_n(void)
358 c42a1d3d 2006-02-21 devnull {
359 c42a1d3d 2006-02-21 devnull int inc, v, l;
360 c42a1d3d 2006-02-21 devnull Rune *name, *fmt, buf[100];
361 c42a1d3d 2006-02-21 devnull Reg *s;
362 fa325e9b 2020-01-10 cross
363 c42a1d3d 2006-02-21 devnull inc = getnext();
364 c42a1d3d 2006-02-21 devnull if(inc < 0)
365 c42a1d3d 2006-02-21 devnull return -1;
366 c42a1d3d 2006-02-21 devnull if(inc != '+' && inc != '-'){
367 c42a1d3d 2006-02-21 devnull ungetnext(inc);
368 c42a1d3d 2006-02-21 devnull inc = 0;
369 c42a1d3d 2006-02-21 devnull }
370 c42a1d3d 2006-02-21 devnull name = getname();
371 c42a1d3d 2006-02-21 devnull if(_getnr(name) == nil)
372 c42a1d3d 2006-02-21 devnull _nr(name, L("0"));
373 c42a1d3d 2006-02-21 devnull for(s=nrlist; s; s=s->next){
374 c42a1d3d 2006-02-21 devnull if(runestrcmp(s->name, name) == 0){
375 c42a1d3d 2006-02-21 devnull if(s->fmt == nil && !inc && s->val[0]){
376 c42a1d3d 2006-02-21 devnull /* might be a string! */
377 c42a1d3d 2006-02-21 devnull pushinputstring(s->val);
378 c42a1d3d 2006-02-21 devnull return 0;
379 c42a1d3d 2006-02-21 devnull }
380 c42a1d3d 2006-02-21 devnull v = eval(s->val);
381 c42a1d3d 2006-02-21 devnull if(inc){
382 c42a1d3d 2006-02-21 devnull if(inc == '+')
383 c42a1d3d 2006-02-21 devnull v += s->inc;
384 c42a1d3d 2006-02-21 devnull else
385 c42a1d3d 2006-02-21 devnull v -= s->inc;
386 c42a1d3d 2006-02-21 devnull runesnprint(buf, nelem(buf), "%d", v);
387 c42a1d3d 2006-02-21 devnull free(s->val);
388 c42a1d3d 2006-02-21 devnull s->val = erunestrdup(buf);
389 c42a1d3d 2006-02-21 devnull }
390 c42a1d3d 2006-02-21 devnull fmt = s->fmt;
391 c42a1d3d 2006-02-21 devnull if(fmt == nil)
392 c42a1d3d 2006-02-21 devnull fmt = L("1");
393 c42a1d3d 2006-02-21 devnull switch(fmt[0]){
394 c42a1d3d 2006-02-21 devnull case 'i':
395 c42a1d3d 2006-02-21 devnull case 'I':
396 c42a1d3d 2006-02-21 devnull roman(buf, v, fmt[0]=='I');
397 c42a1d3d 2006-02-21 devnull break;
398 c42a1d3d 2006-02-21 devnull case 'a':
399 c42a1d3d 2006-02-21 devnull case 'A':
400 c42a1d3d 2006-02-21 devnull alpha(buf, v, fmt[0]);
401 c42a1d3d 2006-02-21 devnull break;
402 c42a1d3d 2006-02-21 devnull default:
403 c42a1d3d 2006-02-21 devnull l = runestrlen(fmt);
404 c42a1d3d 2006-02-21 devnull if(l == 0)
405 c42a1d3d 2006-02-21 devnull l = 1;
406 c42a1d3d 2006-02-21 devnull runesnprint(buf, sizeof buf, "%0*d", l, v);
407 c42a1d3d 2006-02-21 devnull break;
408 c42a1d3d 2006-02-21 devnull }
409 c42a1d3d 2006-02-21 devnull pushinputstring(buf);
410 c42a1d3d 2006-02-21 devnull return 0;
411 c42a1d3d 2006-02-21 devnull }
412 c42a1d3d 2006-02-21 devnull }
413 c42a1d3d 2006-02-21 devnull pushinputstring(L(""));
414 c42a1d3d 2006-02-21 devnull return 0;
415 c42a1d3d 2006-02-21 devnull }
416 c42a1d3d 2006-02-21 devnull
417 c42a1d3d 2006-02-21 devnull /* \g - number register format */
418 c42a1d3d 2006-02-21 devnull int
419 c42a1d3d 2006-02-21 devnull e_g(void)
420 c42a1d3d 2006-02-21 devnull {
421 c42a1d3d 2006-02-21 devnull Rune *p;
422 c42a1d3d 2006-02-21 devnull
423 c42a1d3d 2006-02-21 devnull p = getaf(getname());
424 c42a1d3d 2006-02-21 devnull if(p == nil)
425 c42a1d3d 2006-02-21 devnull p = L("1");
426 c42a1d3d 2006-02-21 devnull pushinputstring(p);
427 c42a1d3d 2006-02-21 devnull return 0;
428 c42a1d3d 2006-02-21 devnull }
429 c42a1d3d 2006-02-21 devnull
430 c42a1d3d 2006-02-21 devnull void
431 c42a1d3d 2006-02-21 devnull r_pnr(int argc, Rune **argv)
432 c42a1d3d 2006-02-21 devnull {
433 c42a1d3d 2006-02-21 devnull USED(argc);
434 c42a1d3d 2006-02-21 devnull USED(argv);
435 c42a1d3d 2006-02-21 devnull printnr();
436 c42a1d3d 2006-02-21 devnull }
437 c42a1d3d 2006-02-21 devnull
438 c42a1d3d 2006-02-21 devnull void
439 c42a1d3d 2006-02-21 devnull t8init(void)
440 c42a1d3d 2006-02-21 devnull {
441 c42a1d3d 2006-02-21 devnull addreq(L("nr"), r_nr, -1);
442 c42a1d3d 2006-02-21 devnull addreq(L("af"), r_af, 2);
443 c42a1d3d 2006-02-21 devnull addreq(L("rr"), r_rr, -1);
444 c42a1d3d 2006-02-21 devnull addreq(L("pnr"), r_pnr, 0);
445 fa325e9b 2020-01-10 cross
446 c42a1d3d 2006-02-21 devnull addesc('n', e_n, CopyMode|ArgMode|HtmlMode);
447 c42a1d3d 2006-02-21 devnull addesc('g', e_g, 0);
448 c42a1d3d 2006-02-21 devnull }