/*
* Copyright (C) 2012-2022 Jiro Senju
*
* This package is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* any later version.
*
* This package is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this package. If not, see .
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#ifdef HAVE_ARPA_INET_H
#include
#elif defined(HAVE_NETINET_IN_H)
#include
#else
/* What can I do? */
#endif
#include
#ifdef HAVE_STRING_H
#include
#else
/* What can I do? */
#endif
enum dvi_instruction {
SETCHAR0,
SETCHAR127 = 127,
SET1, // c[1]
SET2, // c[2]
SET3, // c[3]
SET4, // c[4]
SETRULE, // a[4] b[4]
PUT1, // c[1]
PUT2, // c[2]
PUT3, // c[3]
PUT4, // c[4]
PUTRULE, // a[4] b[4]
NOP,
BOP, // c0[4] c1[4]...c9[4] p[4]
EOP,
PUSH,
POP,
RIGHT1, // b[1]
RIGHT2, // b[2]
RIGHT3, // b[3]
RIGHT4, // b[4]
W0,
W1, // b[1]
W2, // b[2]
W3, // b[3]
W4, // b[4]
X0,
X1, // b[1]
X2, // b[2]
X3, // b[3]
X4, // b[4]
DOWN1, // a[1]
DOWN2, // a[2]
DOWN3, // a[3]
DOWN4, // a[4]
Y0,
Y1, // a[1]
Y2, // a[2]
Y3, // a[3]
Y4, // a[4]
Z0,
Z1, // a[1]
Z2, // a[2]
Z3, // a[3]
Z4, // a[4]
FNTNUM0,
FNTNUM63 = FNTNUM0 + 63,
FNT1, // k[1]
FNT2, // k[2]
FNT3, // k[3]
FNT4, // k[4]
XXX1, // k[1] x[k]
XXX2, // k[2] x[k]
XXX3, // k[3] x[k]
XXX4, // k[4] x[k]
FNTDEF1, // k[1] c[4] s[4] d[4] a[1] l[1] n[a+l]
FNTDEF2, // k[2] c[4] s[4] d[4] a[1] l[1] n[a+l]
FNTDEF3, // k[3] c[4] s[4] d[4] a[1] l[1] n[a+l]
FNTDEF4, // k[4] c[4] s[4] d[4] a[1] l[1] n[a+l]
PRE, // i[1] num[4] den[4] mag[4] k[1] x[k]
POST, // p[4] num[4] den[4] mag[4] l[4] u[4] s[2] t[2]
POSTPOST, // q[4] i[1] 223 (more than 4 bytes)
DIR = 255 // d[1] (ptex)
};
static inline uint16_t two(void *p)
{
uint16_t v;
ptrdiff_t a = (ptrdiff_t)p;
if (a & 1)
memcpy(&v, p, sizeof(v));
else
v = *(uint16_t *)p;
return ntohs(v);
}
static inline uint32_t three(void *p)
{
uint16_t u16;
uint8_t u8, *q;
u16 = two(p);
p += 2;
q = p;
u8 = *q;
return (u16 << 8) | u8;
}
static inline uint32_t four(void *p)
{
uint32_t v;
ptrdiff_t a = (ptrdiff_t)p;
if (a & 3)
memcpy(&v, p, sizeof(v));
else
v = *(uint32_t *)p;
return ntohl(v);
}