ref: 96f08d8dc0198c6c1ac478349ed76398c5cf7401
dir: /out.c/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "xroff.h"
static int out_blank = 0;
static int utf8len(int c)
{
if (c <= 0x7f)
return 1;
if (c >= 0xfc)
return 6;
if (c >= 0xf8)
return 5;
if (c >= 0xf0)
return 4;
if (c >= 0xe0)
return 3;
if (c >= 0xc0)
return 2;
return 1;
}
static int nextchar(char *s)
{
int c = tr_next();
int l = utf8len(c);
int i;
if (c < 0)
return 0;
s[0] = c;
for (i = 1; i < l; i++)
s[i] = tr_next();
s[l] = '\0';
return l;
}
static void out_sp(int n)
{
printf("H%d", n_o + n_i);
printf("v%d\n", n_v * (n + 1));
out_blank = 0;
}
void tr_br(int argc, char **args)
{
out_sp(0);
}
void tr_sp(int argc, char **args)
{
out_sp(argc > 1 ? atoi(args[1]) : 1);
}
void render(void)
{
char c[LLEN];
struct glyph *g;
int fp = n_f;
int ps = n_s;
while (nextchar(c) > 0) {
g = NULL;
if (c[0] == '\\') {
nextchar(c);
if (c[0] == '(') {
int l = nextchar(c);
l += nextchar(c + l);
c[l] = '\0';
}
}
g = dev_glyph(c);
if (ps != n_s) {
printf("s%d\n", n_s);
ps = n_s;
}
if (fp != n_f) {
printf("f%d\n", n_f);
fp = n_f;
}
if (g) {
if (out_blank)
printf("h%d", dev_spacewid() * n_s / dev_uwid);
if (utf8len(c[0]) == strlen(c)) {
printf("c%s%s", c, c[1] ? "\n" : "");
} else {
printf("C%s\n", c);
}
printf("h%d", g->wid * n_s / dev_uwid);
out_blank = 0;
} else {
out_blank = 1;
}
}
}