ref: bf62c957f310d3d127093f472d98ed1e3bf94490
dir: /cp.c/
#include <stdio.h>
#include "xroff.h"
static int cp_backed = -1;
static int regid(void)
{
int c1;
int c2 = 0;
c1 = cp_next();
if (c1 == '(') {
c1 = cp_next();
c2 = cp_next();
}
return REG(c1, c2);
}
static void cp_num(void)
{
char buf[32];
sprintf(buf, "%d", num_get(regid()));
in_push(buf);
}
static void cp_str(void)
{
char *buf = str_get(regid());
if (buf)
in_push(buf);
}
int cp_next(void)
{
int c = cp_backed >= 0 ? cp_backed : in_next();
cp_backed = -1;
if (c == '\\') {
c = in_next();
if (c == 'n') {
cp_num();
c = in_next();
} else if (c == '*') {
cp_str();;
c = in_next();
} else {
in_back(c);
c = '\\';
}
}
return c;
}
void cp_back(int c)
{
cp_backed = c;
}