/* txt2ps translator for use with Charon Copyright (C) 1990 Brad K. Clements, Clarkson University All Rights Reserved. Portions based on Textps.c by Eric Gisin, egisin@waterloo.csnet */ #include #include #include #define STANDALONE 0 #include "callback.h" #include "tagvalue.h" char *stackinfo="$STACKSIZE:4096"; #define BUFFSIZE 1024 #define OBUFFSIZE 1024 #define FONTSIZE 12 #define MAX_LINE_LENGTH 256 char *Head1[] = { "%!PS-Adobe-1.0\n", "%%Creator: text_ps.c\n", "%%DocumentFonts: Courier, Helvetica, Times-Roman\n", NULL}; char *Head2[] = { "/S {fontsize mul 780 exch sub 0 exch moveto show} def\n", "/P+ {/Save save def M concat} def\n", "/P- {showpage Save restore} def\n", NULL}; char *Mdef[] = {"/M [1 0 0 1 18 0] def \n", "/M [0 -.727 0.727 0 21 737] def\n"}; int Choose(); long start, end, bytes; int nobanner; /* when true, disable banner flag */ int main(int argc, char *argv[]) { int rc; unsigned header_flags; char ibuffer[32], *c; for(rc=0; rc < argc; rc++) { if(!strcmp(argv[rc],"-nobanner")) nobanner = 1; } if(nobanner && (c = getenv(TV_CFlags))) { /* clear banner page flags */ header_flags = atoi(c); header_flags &= ~TVCF_BANNER; /* clear banner flag */ sprintf(ibuffer,"%s=%u",TV_CFlags, header_flags); setenv(ibuffer); } if(!Choose()) return(RT_CHANGED_TAGS); /* even if we didn't change the text, don't do banners */ time(&start); Translate(); time(&end); fprintf(STDERR,"Translated %ld input bytes, %ld output bytes in %d seconds\n",bytes, tellp(STDOUT), (int) end-start); return(RT_OK|RT_CHANGED_TEXT); } int Choose() { char *c; char buffer[1024]; int count; int mode = 0; int rc = 1; /* the choose function examines the input buffer, looking for the first series of non-whitespace characters. If the first non whitespace character set is not %! then we know that this is not a PostScript file. */ seekp(STDIN, 0, SEEK_SET); count = read(STDIN, buffer, 1024); for(c=buffer; count > 0; count--, c++) { /* into loop if char c is valid */ if(isascii(*c) && isspace(*c)) continue; switch( mode ) { case 0 : /* looking for % */ if(*c != '%') { rc = 1; goto out; } mode++; break; case 1 : /* looking for ! */ if(*c == '!') rc = 0; else rc = 1; goto out; }; } /* end while */ out:; seekp(STDIN, 0, SEEK_SET); return(rc); /* nothing but blanks so far */ } int Translate() { int x; char *c; int copies = 1; int sequence; int page = 0; int fontsize; int LineNumFlag; int rownum = 1; int pagelength = 66; int wide = 0; int row; int col = 0; int writeptr; int savec; char line[MAX_LINE_LENGTH]; char ibuffer[BUFFSIZE]; int count; int eof = 0; unsigned header_flags; bytes = 0; if(c = getenv(TV_CCopies)) { copies = atoi(c); if(!copies) copies = 1; sprintf(ibuffer,"%s=1",TV_CCopies); setenv(ibuffer); } for(x=0; Head1[x] != NULL; x++) write(STDOUT, Head1[x], strlen(Head1[x])); write(STDOUT, Mdef[wide], strlen(Mdef[wide])); fprintf(STDOUT,"/#copies %d def\n",copies); fprintf(STDOUT,"/fontsize %d def\n",FONTSIZE); /* select font here */ fprintf(STDOUT,"/Courier "); fprintf(STDOUT,"findfont fontsize scalefont setfont\n"); for(x=0; Head2[x] != NULL; x++) { write(STDOUT, Head2[x], strlen(Head2[x])); } row = rownum; while(!eof) { count = read(STDIN, ibuffer, BUFFSIZE); if(count == -1) break; if(count < BUFFSIZE) eof = 1; /* next read will be end */ bytes += count; for(c = ibuffer; count; count--, c++) { switch(*c) { case -1 : case '\r': break; case '\n' : case '\f' : leave:; if(*c == -1 && row == rownum) return(0); if(row == rownum) { page++; fprintf(STDOUT,"%%%%Page: ? %d\nP+\n",page); } if(col > 0) { line[col < MAX_LINE_LENGTH ? col : MAX_LINE_LENGTH] = 0; putstring(line); fprintf(STDOUT, "%d S\n", row); } scan:; if(*c == '\n') row++; if(row == pagelength || *c == '\f' || *c == -1) { row = rownum; fprintf(STDOUT,"P-\n"); } if(*c == -1) { return(0); } col = 0; break; case '\t' : while(col < MAX_LINE_LENGTH) { line[col++] = ' '; if(col % 8 == 0) break; } break; case '\b' : if(col) col--; break; default : if(col < MAX_LINE_LENGTH) line[col++] = isascii(*c) && isprint(*c) ? *c : ' '; break; } /* end c switch */ } /* end for */ } /* end !eof */ c = ibuffer; *c = -1; goto leave; } int putstring(register char *s) { register c; char buffer[512]; char *x, *limit; x = buffer; limit = x + 509; *x++ = '('; while((c = *s++)!= '\0') { if(c=='\\' || c == '(' || c == ')') *x++ = '\\'; *x++ = c; if(x > limit) { write(STDOUT, buffer, x - buffer); x = buffer; } } *x++ = ')'; write(STDOUT, buffer, x - buffer); return(0); }