Category : Printer Utilities
Archive   : TEXT2PS.ZIP
Filename : TEXT2PS.C

 
Output of file : TEXT2PS.C contained in archive : TEXT2PS.ZIP

/*
* text2ps
*
* Convert plain text to postscript
* - Stephen Frede, UNSW, Australia
*/

#include
#include

#define TRUE 1
#define FALSE 0
#define INCH 72.0 /* no. postscript units / inch */
#define CM 28.35 /* postscript units / cm */
#define NEW_PAGE 014 /* ^L forces a new page */

#define OPAGEOFFSET (1.0*CM) /* default hor offset if option used */
#define DTOPMARGIN (0.5*CM) /* default top margin */
#define OTOPMARGIN (1.5*CM) /* default top margin if option used */
#define DFONTSIZE 10.0 /* default font size (in points) */
#define OFONTSIZE 12.0 /* default font size if option used */
#define CHARSPERLINE 10000 /* no. of chars/line */
#define LINESPERPAGE 10000 /* no. of lines/page */
#define ROTATION 0.0 /* default orientation */
#define FONT "Courier"
#define TABSIZE 8


/* typedef char int; */

FILE *ostr;

char usage[] = "Valid text2ps options:\n\t-r[angle]\n\t-f[font]\n\t-s[size]\n\t-h[space]\n\t-p[pitch]\n\t-o[offset]\n\t-oe[offset]\n\t-m[topmargin]\n\t-w[width]\n\t-l[length]\n\t-v\n\t-?\n";
int tabsize,charsperline, /* tab spacing in # chars, # chars per line */
linesperpage; /* # lines per page */

main(argc, argv)
int argc;
char **argv;
{
int status = 0; /* exit status (no. errors occured) */
float opageoffset,
epageoffset,
topmargin,
fontsize,
linepitch,
spacing,
rotation;
char *fontname;
FILE *istr;
double atof();

fontsize = DFONTSIZE;
linepitch = 0.0;
opageoffset = 0.0;
epageoffset = 0.0;
topmargin = DTOPMARGIN;
spacing = 0.0;
tabsize = TABSIZE;
charsperline = CHARSPERLINE;
linesperpage = LINESPERPAGE;
rotation = ROTATION;
fontname = FONT;
ostr = stdout;
argv++; /* skip program name */
while(*argv && **argv == '-')
{
char c;

(*argv)++; /* skip the '-' */
c = **argv; /* option letter */
(*argv)++; /* skip option letter */
switch(c)
{
case 'o': /* offset */
if (**argv != 'e') {
if(**argv == '\0')
opageoffset = OPAGEOFFSET;
else
opageoffset = atof(*argv) * CM;
epageoffset = opageoffset;
}
else {
(*argv)++;
if (**argv == '\0')
epageoffset = OPAGEOFFSET;
else
epageoffset = atof(*argv) * CM;
}
break;

case 'm': /* top margin */
if(**argv == '\0')
topmargin = OTOPMARGIN;
else
topmargin = atof(*argv) * CM;
break;

case 'r': /* rotation */
if(**argv == '\0')
rotation = 90.0;
else
rotation = atof(*argv);
break;

case 'p': /* pitch (line spacing) */
linepitch = atof(*argv);
break;

case 's': /* font size */
if(**argv == '\0')
fontsize = OFONTSIZE;
else
fontsize = atof(*argv);
break;

case 't': /* tab size */
if(**argv == '\0')
tabsize = 4;
else
tabsize = (int) atof(*argv);
break;

case 'f': /* font */
if(**argv == '\0')
fontname = "Times-Roman";
else
fontname = *argv;
break;

case 'h': /* horizontal spacing */
if(**argv == '\0')
spacing = 0.25;
else
spacing = atof(*argv);
break;

case 'w': /* linewidth (chars per line) */
if(**argv == '\0')
charsperline = 72;
else
charsperline = (int) atof(*argv);
break;

case 'l': /* lines per page) */
if(**argv == '\0')
linesperpage = 60;
else
linesperpage = (int) atof(*argv);
break;

case 'v': /* version # */
fprintf(stderr,"Version 1.04\n");
exit(status);
break;

case '?': /* usage - options */
fprintf(stderr, usage);
exit(status);
break;

default:
(*argv)--; (*argv)--;
fprintf(stderr, "Illegal option: [%s]\n",
*argv);
(*argv)++; (*argv)++;
status++;
break;
}
argv++;
}
if(status)
{
fprintf(stderr, usage);
exit(status);
/* NOTREACHED */
}
if(linepitch == 0)
linepitch = fontsize + 2;
spacing *= fontsize;
init(fontsize, opageoffset, epageoffset, topmargin, linepitch, rotation, fontname, spacing);
if(! *argv)
process(stdin);
else while(*argv)
{
if((istr = fopen(*argv, "r")) == NULL)
{
perror(*argv);
status++;
}
else
{
process(istr);
fclose(istr);
}
argv++;
}
putc('\004', ostr);
exit(status);
}

process(istr)
FILE *istr;
{
register char ch;
register int x, /* used for tab calculations and folding */
linenum;

linenum = 1;
x = 0;
putc('(', ostr);
while((ch=getc(istr)) != EOF)
{
if(ch < ' ' && ch != '\t' && ch != '\n' && ch != '\r' && ch != NEW_PAGE)
{
ch = '?';
}
if(ch == '\t')
{
int n = x + tabsize - (x % tabsize);

while(x < n) {
pch(' ');
x++;
}
}
else if(ch == '\n')
{
fprintf(ostr, ") n\n");
linenum = linenum + 1;
if (linenum > linesperpage) {
fprintf(ostr,"p\n");
linenum = 1;
}
x = 0;
putc('(', ostr);
}
else if(ch == '\r')
{
fprintf(ostr, ") r\n");
x = 0;
putc('(', ostr);
}
else if(ch == NEW_PAGE)
{
fprintf(ostr, ") n p\n");
linenum = 1;
x = 0;
putc('(', ostr);
}
else
{
if (x >= charsperline) {
fprintf(ostr, ") n\n");
linenum = linenum + 1;
if (linenum > linesperpage) {
fprintf(ostr,"p\n");
linenum = 1;
}
x = 0;
putc('(', ostr);
}
pch(ch);
x++;
}
}
fprintf(ostr, ") n p\n\f");
}

char *inittab[] = {
/* print a page and start a new one */
"/p",
"{ 0.0 coffset sub 0 translate",
" /temp coffset def",
" /coffset noffset def",
" /noffset temp def",
" coffset 0 translate",
" copypage erasepage newpath 0 pgtop moveto",
"} def",
"/n",
/* show the string given as an arg */
"{ spacing 0 3 -1 roll ashow",
/* now move down a line; linepitch is -'ve */
" 0 linepitch rmoveto",
/* save the new y posn */
" /y currentpoint exch pop def",
/* test if the next line would be below the bottom margin */
" y 0 lt",
/* if so, print the page, and move to the top of a new page */
" { p }",
/* else go to where the next line is due to start */
" { 0 y moveto } ifelse",
"} def",
"/r",
/* show the string given as an arg */
"{ spacing 0 3 -1 roll ashow",
/* save y */
" /y currentpoint exch pop def",
/* and then move to the beginning of the current line */
" 0 y moveto",
"} def",
(char *)0 };

init(fontsize, opageoffset, epageoffset, topmargin, linepitch, rotation, fontname, spacing)
float fontsize,
opageoffset,
epageoffset,
topmargin,
linepitch,
spacing,
rotation;
char *fontname;
{
register char **p;

fprintf(ostr, "\004\n");
p = inittab;
while(*p)
fprintf(ostr, "%s\n", *p++);
fprintf(ostr, "/%s findfont %.1f scalefont setfont\n",
fontname, fontsize);
fprintf(ostr, "/linepitch %.1f def\n", -linepitch);
fprintf(ostr, "/spacing %.1f def\n", spacing);
fprintf(ostr, "/coffset %.1f def\n", opageoffset + 4);
fprintf(ostr, "/noffset %.1f def\n", epageoffset + 4);
/* apply rotation transformation, if any */
if(rotation != 0.0)
fprintf(ostr, "%.1f rotate\n", rotation);
/* get current imageable area */
fprintf(ostr, "clippath pathbbox\n");
/* save the upper right y coordinate */
fprintf(ostr, "/pgtop exch def\n");
/* save lower left y; translate origin to lower left */
fprintf(ostr, "pop /y exch def y translate\n");
/* subtract old lower left from upper right to get top of page */
/* then subtract top margin to set top of page */
fprintf(ostr, "/pgtop pgtop y sub %.1f sub linepitch add def\n", topmargin);
/* apply horizontal offset, if any */
/* unfortunately, a slight fudge factor is required here */
fprintf(ostr, "coffset 0 translate\n");
/* move to top of page, ready to start printing */
fprintf(ostr, "newpath 0 pgtop moveto\n");
}

pch(ch)
int ch;
{
if(ch < ' ' || ch > '~')
fprintf(ostr, "\\%3.3o", ch);
else
{
if(ch == '(' || ch == ')' || ch == '\\')
putc('\\', ostr);
putc(ch, ostr);
}
}

double atof(s) /* convert string to double */
char s[];
{
double val, power;
int i;

for (i=0; s[i]==' ' || s[i]=='\t'; i++) ; /* skip white space or tabs */
if (s[i] == '+' || s[i] == '-') /* sign -if '-', ignore it */
i++;
for (val = 0; s[i] >= '0' && s[i] <= '9'; i++)
val = 10 * val + s[i] - '0';
if (s[i] == '.') {
i++;
for (power = 1; s[i] >= '0' && s[i] <= '9'; i++) {
power = power /10;
val = power * (s[i] - '0') + val;
}
}
return (val);
}




  3 Responses to “Category : Printer Utilities
Archive   : TEXT2PS.ZIP
Filename : TEXT2PS.C

  1. Very nice! Thank you for this wonderful archive. I wonder why I found it only now. Long live the BBS file archives!

  2. This is so awesome! 😀 I’d be cool if you could download an entire archive of this at once, though.

  3. But one thing that puzzles me is the “mtswslnkmcjklsdlsbdmMICROSOFT” string. There is an article about it here. It is definitely worth a read: http://www.os2museum.com/wp/mtswslnk/