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; }