+#include "regis.h"
+
+#define OUT (out ? out : stdout)
+static FILE *out;
+
+void regis_set_output(FILE *fp)
+{
+ out = fp;
+}
+
+void regis_enter(void)
+{
+ fprintf(OUT, "\033P0p\n");
+}
+
+void regis_leave(void)
+{
+ fprintf(OUT, "\033\\");
+ fflush(OUT);
+}
+
+void regis_draw_page(int x)
+{
+ fprintf(OUT, "P(P%d)\n", x ? 1 : 0);
+}
+
+void regis_show_page(int x)
+{
+ fprintf(OUT, "S(P%d)\n", x ? 1 : 0);
+}
+
+void regis_clear(void)
+{
+ fprintf(OUT, "S(E)\n");
+}
+
+void regis_abspos(int x, int y)
+{
+ fputc('P', OUT);
+ regis_absv(x, y);
+}
+
+void regis_relpos(int x, int y)
+{
+ fputc('P', OUT);
+ regis_relv(x, y);
+}
+
+void regis_absv(int x, int y)
+{
+ fprintf(OUT, "[%d,%d]\n", x, y);
+}
+
+void regis_relv(int x, int y)
+{
+ fprintf(OUT, "[%+d,%+d]\n", x, y);
+}
+
+void regis_nullv(void)
+{
+ fprintf(OUT, "[]\n");
+}
+
+static unsigned int cur_mode;
+
+void regis_begin_vector(unsigned int mode)
+{
+ if(mode & REGIS_FILL) {
+ fprintf(OUT, "F(");
+ }
+ fputc('V', OUT);
+ if(mode & REGIS_BOUNDED) {
+ fprintf(OUT, "(B)");
+ }
+ fputc('\n', OUT);
+ cur_mode = mode;
+}
+
+void regis_end_vector(void)
+{
+ fprintf(OUT, "(E)");
+ if(cur_mode & REGIS_FILL) {
+ fputc(')', OUT);
+ }
+ fputc('\n', OUT);
+}