/* 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 <ctype.h> 
#include <time.h>
#include <string.h>
#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);
}




