ref: 7a7228955eeb53ce7adfb4e11fa1c500be35d616
dir: /map.c/
/* mapping register/macro names to indices */
#include <stdio.h>
#include <string.h>
#include "roff.h"
#define MAPBEG 256 /* the entries reserved for .x names */
/* register, macro, or environments names */
static struct dict mapdict;
static int mapinit;
/* map register names to [0..NREGS] */
int map(char *s)
{
int i;
if (s[0] == '.' && s[1] && !s[2]) /* ".x" is mapped to 'x' */
return (unsigned char) s[1];
if (!mapinit) {
dict_init(&mapdict, NREGS, -1, 1, 1);
mapinit = 1;
}
i = dict_idx(&mapdict, s);
if (i < 0) {
dict_put(&mapdict, s, 0);
i = dict_idx(&mapdict, s);
}
return MAPBEG + i;
}
/* return the name mapped to id; returns a static buffer */
char *map_name(int id)
{
static char map_buf[NMLEN];
if (id >= MAPBEG)
return dict_key(&mapdict, id - MAPBEG);
map_buf[0] = '.';
map_buf[1] = id;
map_buf[2] = '\0';
return map_buf;
}