summaryrefslogtreecommitdiff
path: root/dviware/beebe/src/tosprx.c
diff options
context:
space:
mode:
Diffstat (limited to 'dviware/beebe/src/tosprx.c')
-rw-r--r--dviware/beebe/src/tosprx.c388
1 files changed, 388 insertions, 0 deletions
diff --git a/dviware/beebe/src/tosprx.c b/dviware/beebe/src/tosprx.c
new file mode 100644
index 0000000000..7c236ae932
--- /dev/null
+++ b/dviware/beebe/src/tosprx.c
@@ -0,0 +1,388 @@
+/* -*-C-*- tosprx.c */
+/*-->tosprx*/
+/**********************************************************************/
+/******************************* tosprx *******************************/
+/**********************************************************************/
+
+#include "machdefs.h"
+#include "typedefs.h"
+
+/* Toshiba P1351 to Printronix 300/600 plot file translator */
+
+#ifndef ANSI_PROTOTYPES
+#define ANSI_PROTOTYPES 0
+#endif
+
+#ifndef OS_TOPS20
+#define OS_TOPS20 0
+#endif
+
+#define NL '\n'
+#define FF '\f'
+#define ESC '\033'
+#if OS_TOPS20
+#undef FASTZERO
+#define FASTZERO 1
+#endif
+
+#define XDPI 60 /* horizontal dots/inch */
+#define XPSIZE 13 /* horizontal paper size in inches */
+#define XSIZE (XDPI*XPSIZE) /* number of horizontal dots */
+#define XWORDS ((XSIZE + HOST_WORD_SIZE - 1)/HOST_WORD_SIZE)
+ /* number of words in rows */
+ /* of bitmap array */
+
+#define YDPI 72 /* vertical dots/inch */
+#define YPSIZE 22 /* vertical paper size in inches */
+#define YSIZE (YDPI*YPSIZE) /* number of vertical dots */
+
+#define XBIT XWORDS
+#define YBIT YSIZE
+
+int nplot,xrast,yrast;
+float topmargin = 0.0;
+float leftmargin = 0.0;
+
+/* The printer bit map */
+
+UNSIGN32 bitmap[YBIT] [XBIT];
+
+#include <stdio.h>
+#include <time.h>
+#include "gendefs.h"
+#include "gblprocs.h"
+#define BITMAP(y,x) (bitmap + ((UNSIGN32)XBIT*(UNSIGN32)(y)) + (UNSIGN32)(x))
+
+#if ANSI_PROTOTYPES
+int getdigit(void);
+void plotline(void);
+void relhormv(void);
+#else /* NOT ANSI_PROTOTYPES */
+int getdigit();
+void plotline();
+void relhormv();
+#endif /* ANSI_PROTOTYPES */
+
+int
+main()
+{
+ register int c;
+
+ nplot = 0; /* plot page number */
+ xrast = 0;
+ yrast = YBIT-1; /* current raster line */
+ clrbmap();
+ while ((c = getchar()) != EOF)
+ {
+ switch (c)
+ {
+ case ESC:
+ if ((c = getchar()) == ';')
+ plotline();
+ else if (c == 'H')
+ {
+ ungetc(c,stdin);
+ relhormv();
+ }
+ break;
+
+ case NL:
+ xrast = 0;
+ break;
+
+ case FF:
+ nplot++;
+ prtbmap();
+ (void)fprintf(stderr," [%d",nplot);
+ clrbmap();
+ (void)fprintf(stderr,"]");
+ break;
+
+ default: /* discard other characters */
+ break;
+ }
+ }
+ prtbmap();
+}
+
+int
+getdigit()
+{
+ register int c;
+
+ c = getchar();
+ if ((c < '0') | ('9' < c))
+ {
+ (void)fprintf(stderr,
+ "?Expected digit, but found char %03o\n on page %d in line %d\n",
+ c,nplot,YBIT-yrast);
+ exit(1);
+ }
+ else
+ return (c - '0');
+}
+
+void
+plotline()
+{
+ register int c,mask,nword,y;
+ int nchar,count,org_count;
+
+ if (yrast < 24) /* bit map is full, print it */
+ {
+ prtbmap();
+ clrbmap();
+ yrast = YBIT-1;
+ }
+ count = getdigit();
+ count = 10*count + getdigit();
+ count = 10*count + getdigit();
+ count = 10*count + getdigit(); /* count = number of columns */
+ count *= 4; /* count = number of char quadruples */
+ org_count = count;
+
+ nchar = 0; /* cyclic counter 0 1 2 3 */
+ while (((c = getchar()) != EOF) && (c != NL) && count)
+ {
+ count--;
+ if (c < '\100')
+ {
+ (void)fprintf(stderr,
+ "?Illegal character %03o on page %d line %d -- flushed line\n",
+ c,nplot,YBIT-yrast);
+ while (((c = getchar()) != EOF) && (c != NL))
+ count--;
+ }
+ else if (xrast < XSIZE) /*still inside bitmap */
+ {
+ if (c > '\100') /* have dots to set */
+ {
+ nword = xrast/HOST_WORD_SIZE;
+ mask = 1;
+ mask <<= (HOST_WORD_SIZE-1); /* bit at left end of word */
+ mask >>= (xrast % HOST_WORD_SIZE);
+ y = yrast - 6*nchar;
+ if (c & '\040')
+ bitmap[y ][nword] |= mask;
+ if (c & '\020')
+ bitmap[y-1][nword] |= mask;
+ if (c & '\010')
+ bitmap[y-2][nword] |= mask;
+ if (c & '\004')
+ bitmap[y-3][nword] |= mask;
+ if (c & '\002')
+ bitmap[y-4][nword] |= mask;
+ if (c & '\001')
+ bitmap[y-5][nword] |= mask;
+ }
+ nchar = (++nchar) & 03;
+ if (!nchar)
+ ++xrast; /* new column every four characters */
+ }
+ }
+ if (count)
+ (void)fprintf(stderr,"?Input count = %d, but %d left at EOL\n",
+ org_count,count);
+ if (c == NL)
+ {
+ xrast = 0;
+ yrast -= 24; /* one printline has 24 rasters */
+ }
+ else if (c == ESC) /* expect <ESC>Hnnnc hor. motion */
+ relhormv();
+ else
+ (void)fprintf(stderr,
+ "?Expected NL, but found %03o -- flushing line\n",c);
+}
+
+#include "clrbmap.h"
+
+/*-->prtbmap*/
+/**********************************************************************/
+/****************************** prtbmap *******************************/
+/**********************************************************************/
+
+void
+prtbmap()
+
+{
+ register UNSIGN32 *p;
+ register INT16 i,j,k,ybottom,ytop;
+
+ /* The Printronix encodes 6 horizontal bits in a single ASCII */
+ /* character biased by 64 to make it printable, but requires that */
+ /* the bits be reversed. The following table is indexed by a */
+ /* 6-bit pattern (0..63) and was produced automatically by an */
+ /* EMACS TECO macro */
+ /* raster code as */
+ /* 123456 --> 654321 */
+ static char remap[] =
+ { /* 1000000 --> 1000000 */
+ 64,
+ /* 1000001 --> 1100000 */ 96,
+ /* 1000010 --> 1010000 */ 80,
+ /* 1000011 --> 1110000 */ 112,
+ /* 1000100 --> 1001000 */ 72,
+ /* 1000101 --> 1101000 */ 104,
+ /* 1000110 --> 1011000 */ 88,
+ /* 1000111 --> 1111000 */ 120,
+ /* 1001000 --> 1000100 */ 68,
+ /* 1001001 --> 1100100 */ 100,
+ /* 1001010 --> 1010100 */ 84,
+ /* 1001011 --> 1110100 */ 116,
+ /* 1001100 --> 1001100 */ 76,
+ /* 1001101 --> 1101100 */ 108,
+ /* 1001110 --> 1011100 */ 92,
+ /* 1001111 --> 1111100 */ 124,
+ /* 1010000 --> 1000010 */ 66,
+ /* 1010001 --> 1100010 */ 98,
+ /* 1010010 --> 1010010 */ 82,
+ /* 1010011 --> 1110010 */ 114,
+ /* 1010100 --> 1001010 */ 74,
+ /* 1010101 --> 1101010 */ 106,
+ /* 1010110 --> 1011010 */ 90,
+ /* 1010111 --> 1111010 */ 122,
+ /* 1011000 --> 1000110 */ 70,
+ /* 1011001 --> 1100110 */ 102,
+ /* 1011010 --> 1010110 */ 86,
+ /* 1011011 --> 1110110 */ 118,
+ /* 1011100 --> 1001110 */ 78,
+ /* 1011101 --> 1101110 */ 110,
+ /* 1011110 --> 1011110 */ 94,
+ /* 1011111 --> 1111110 */ 126,
+ /* 1100000 --> 1000001 */ 65,
+ /* 1100001 --> 1100001 */ 97,
+ /* 1100010 --> 1010001 */ 81,
+ /* 1100011 --> 1110001 */ 113,
+ /* 1100100 --> 1001001 */ 73,
+ /* 1100101 --> 1101001 */ 105,
+ /* 1100110 --> 1011001 */ 89,
+ /* 1100111 --> 1111001 */ 121,
+ /* 1101000 --> 1000101 */ 69,
+ /* 1101001 --> 1100101 */ 101,
+ /* 1101010 --> 1010101 */ 85,
+ /* 1101011 --> 1110101 */ 117,
+ /* 1101100 --> 1001101 */ 77,
+ /* 1101101 --> 1101101 */ 109,
+ /* 1101110 --> 1011101 */ 93,
+ /* 1101111 --> 1111101 */ 125,
+ /* 1110000 --> 1000011 */ 67,
+ /* 1110001 --> 1100011 */ 99,
+ /* 1110010 --> 1010011 */ 83,
+ /* 1110011 --> 1110011 */ 115,
+ /* 1110100 --> 1001011 */ 75,
+ /* 1110101 --> 1101011 */ 107,
+ /* 1110110 --> 1011011 */ 91,
+ /* 1110111 --> 1111011 */ 123,
+ /* 1111000 --> 1000111 */ 71,
+ /* 1111001 --> 1100111 */ 103,
+ /* 1111010 --> 1010111 */ 87,
+ /* 1111011 --> 1110111 */ 119,
+ /* 1111100 --> 1001111 */ 79,
+ /* 1111101 --> 1101111 */ 111,
+ /* 1111110 --> 1011111 */ 95,
+ /* 1111111 --> 1111111 */ 127
+ };
+
+ ytop = YBIT-1;
+
+ k = -1; /* find bottom non-zero raster */
+ for (j = 0; (j < ytop) && (k < 0); ++j) /* loop over raster lines */
+ {
+ p = &bitmap[j][XBIT-1];
+ for (k = XBIT - 1; ((k >= 0) && (*p == 0)); --k)
+ --p; /* trim white space */
+ }
+ ybottom = MAX(0,j-1);
+
+ putchar('\f'); /* start new page with FF */
+ for (j = (INT16)(topmargin*((float)YDPI)); j > 0; --j)
+ { /* supply top margin spacing */
+ putchar('\005'); /* Printronix graphics prefix */
+ putchar('\n');
+ }
+ for (j = ytop; (j >= ybottom) ; --j) /* loop over raster lines */
+ {
+ p = &bitmap[j][XBIT-1];
+ for (k = XBIT - 1; ((k >= 0) && (*p == 0)); --k)
+ --p; /* trim white space */
+ putchar('\005'); /* Printronix graphics prefix */
+
+ for (i = (5 + (INT16)(leftmargin*((float)XDPI)))/6;
+ (i > 0) && (k >= 0); --i)
+ putchar('\100');/* left margin spacing if line not empty */
+
+ p = &bitmap[j][0]; /* the j-th raster line */
+
+ for (i = 0; i <= k; ++i)/* loop over trimmed raster */
+ { /* use machine-specific coding here for efficiency */
+ putchar(remap[((*p) >> 30) & 077]);
+ putchar(remap[((*p) >> 24) & 077]);
+ putchar(remap[((*p) >> 18) & 077]);
+ putchar(remap[((*p) >> 12) & 077]);
+ putchar(remap[((*p) >> 6) & 077]);
+ putchar(remap[((*p) ) & 077]);
+ ++p;
+ }
+ putchar('\n');
+ }
+ (void)fflush(stdout);
+}
+
+/*-->relhormv*/
+/**********************************************************************/
+/****************************** relhormv ******************************/
+/**********************************************************************/
+
+void
+relhormv()
+{
+ register int c,n;
+
+ if ((c = getchar()) != 'H')
+ {
+ (void)fprintf(stderr,
+ "?Expected <ESC>Hnnn Relative Horizontal Motion command \
+- flushing line\n");
+ while (((c = getchar()) != EOF) && (c != NL))
+ ;
+ return;
+ }
+ c = getchar();
+ if (IN('@',c,'F'))
+ n = (c - '@')*256;
+ else
+ {
+ (void)fprintf(stderr,
+ "?Illegal <ESC>Hnnn Relative Horizontal Motion command \
+- flushing line\n");
+ while (((c = getchar()) != EOF) && (c != NL))
+ ;
+ return;
+ }
+ c = getchar();
+ if (IN('@',c,'O'))
+ n += (c - '@')*16;
+ else
+ {
+ (void)fprintf(stderr,
+ "?Illegal <ESC>Hnnn Relative Horizontal Motion command \
+- flushing line\n");
+ while (((c = getchar()) != EOF) && (c != NL))
+ ;
+ return;
+ }
+ c = getchar();
+ if (IN('@',c,'O'))
+ n += (c - '@');
+ else
+ {
+ (void)fprintf(stderr,
+ "?Illegal <ESC>Hnnn Relative Horizontal Motion command \
+- flushing line\n");
+ while (((c = getchar()) != EOF) && (c != NL))
+ ;
+ return;
+ }
+ xrast += n;
+}