7 #define NREGS (1 << 16)
11 int eregs
[NENVS
]; /* environment-specific number registers */
12 struct adj
*adj
; /* per environment line buffer */
15 static int nregs
[NREGS
]; /* global number registers */
16 static int nregs_inc
[NREGS
]; /* number register auto-increment size */
17 static char *sregs
[NREGS
]; /* global string registers */
18 static void *sregs_dat
[NREGS
]; /* builtin function data */
19 static struct env envs
[3]; /* environments */
20 static struct env
*env
; /* current enviroment */
21 static int eregs_idx
[NREGS
]; /* register environment index in eregs[] */
23 static int eregs
[] = { /* environment-specific number registers */
44 /* return the address of a number register */
48 return &env
->eregs
[eregs_idx
[id
]];
52 static void reg_name(char *s
, int id
)
54 s
[0] = (id
>> 8) & 0xff;
59 /* the contents of a number register (returns a static buffer) */
62 static char numbuf
[128];
66 sprintf(numbuf
, "%d", f_hpos());
69 sprintf(numbuf
, "%d", f_nexttrap());
73 reg_name(numbuf
, f_divreg());
76 sprintf(numbuf
, "%s", in_filename());
79 sprintf(numbuf
, "%d", in_nargs());
82 sprintf(numbuf
, "%d", *nreg(id
));
87 void num_set(int id
, int val
)
92 void num_inc(int id
, int val
)
103 int num_get(int id
, int inc
)
106 *nreg(id
) += inc
> 0 ? nregs_inc
[id
] : -nregs_inc
[id
];
110 void str_set(int id
, char *s
)
112 int len
= strlen(s
) + 1;
115 sregs
[id
] = malloc(len
);
116 memcpy(sregs
[id
], s
, len
);
117 sregs_dat
[id
] = NULL
;
120 char *str_get(int id
)
125 void *str_dget(int id
)
127 return sregs_dat
[id
];
130 void str_dset(int id
, void *d
)
140 sregs_dat
[id
] = NULL
;
143 void str_rn(int src
, int dst
)
146 sregs
[dst
] = sregs
[src
];
147 sregs_dat
[dst
] = sregs_dat
[src
];
149 sregs_dat
[src
] = NULL
;
152 static void env_set(int id
)
156 env
->adj
= adj_alloc();
160 n_l
= SC_IN
* 65 / 10;
167 n_lt
= SC_IN
* 65 / 10;
168 adj_ll(env
->adj
, n_l
);
169 adj_in(env
->adj
, n_i
);
176 for (i
= 0; i
< LEN(eregs
); i
++)
177 eregs_idx
[eregs
[i
]] = i
+ 1;
184 for (i
= 0; i
< LEN(envs
); i
++)
186 adj_free(envs
[i
].adj
);
189 static int oenv
[NPREV
]; /* environment stack */
192 void tr_ev(char **args
)
194 int id
= args
[1] ? atoi(args
[1]) : -1;
197 if (id
>= LEN(envs
) || id
< 0)
199 if (args
[1] && env
&& nenv
< NPREV
)
200 oenv
[nenv
++] = env
- envs
;
204 struct adj
*env_adj(void)
209 /* saving and restoring registers around diverted lines */
214 static struct odiv odivs
[NPREV
]; /* state before diverted text */
217 /* begin outputting diverted line */
220 struct odiv
*o
= &odivs
[nodivs
++];
227 /* end outputting diverted line */
230 struct odiv
*o
= &odivs
[--nodivs
];