ref: 2219823d7fa91cff01b26706c07a80ade53f408b
dir: /reg.c/
#include <stdlib.h>
#include <stdlib.h>
#include <string.h>
#include "xroff.h"
#define NREGS (1 << 16)
int nreg[NREGS];
char *sreg[NREGS];
int num_get(int id)
{
return nreg[id];
}
int num_set(int id, int n)
{
int o = nreg[id];
nreg[id] = n;
return o;
}
void tr_nr(char **args)
{
int id;
if (!args[2])
return;
id = REG(args[1][0], args[1][1]);
nreg[id] = tr_int(args[2], nreg[id], 'u');
}
void str_set(int id, char *s)
{
int len = strlen(s) + 1;
if (sreg[id])
free(sreg[id]);
sreg[id] = malloc(len);
strcpy(sreg[id], s);
}
char *str_get(int id)
{
return sreg[id];
}
static struct env envs[3];
struct env *env;
void env_init(void)
{
int i;
for (i = 0; i < LEN(envs); i++) {
struct env *e = &envs[i];
e->f = 1;
e->i = 0;
e->j = 1;
e->l = SC_IN * 65 / 10;
e->s = 10;
e->u = 1;
e->v = 12 * SC_PT;
e->s0 = e->s;
e->f0 = e->f;
e->adj = adj_alloc();
}
env = &envs[0];
}
void env_free(void)
{
int i;
for (i = 0; i < LEN(envs); i++)
adj_free(envs[i].adj);
}
static int oenv[NPREV];
static int nenv;
void tr_ev(char **args)
{
int id = args[1] ? atoi(args[1]) : -1;
if (id < 0 && nenv)
id = oenv[--nenv];
if (id >= LEN(envs) || id < 0)
return;
if (args[1] && env && nenv < NPREV)
oenv[nenv++] = env - envs;
env = &envs[id];
}