/* PSVIEW.C -- POSTSCRIPT VIEWING FILE FOR LOOKING AT THE NT DOCS WITHOUT A PS
PRINTER. COPYRIGHT (C) 1992, WINDOWS MAGAZINE -- ALL RIGHTS RESERVED */

/* THIS IS A REALLY CRUDE HACK -- IT GRABS ALL TEXT IN PARENTHESIS, THEN LOOKS AT
THE FOLLOWING SPACE-DELIMITED STRINGS FOR "fjt", "SB", OR "TX" WHICH SEEM TO BE
THE TOKENS USED BY THE THREE DIFFERENT POSTSCRIPT SYSTEMS USED. FORMATTING IS NOT
PRESERVED, AND I CAN'T GUARANTEE THAT IT WON'T MISS TEXT. -- JOHN RULEY */

/* DEFINITIONS: */

#include <stdio.h>
#include <malloc.h>
main(argc,argv)
int argc;
char *argv[];
{
FILE *in;
int i,in_paren;
char *s, *ss, *sss;

/* A COUPLE OF BIG TEXT BUFFERS... */

s = malloc(10000);
if(!s){
	printf("malloc failed\n");
	exit(2);
	}
ss = s;

sss = malloc(10000);
if(!sss){
	printf("malloc failed\n");
	exit(2);
	}

/* INSPECT THE COMMAND-LINE ARGUMENTS, AND FAIL GRACEFULLY IF NECESSARY: */

if(argc < 2){
	printf("WINDOWS Magazine Postscript text viewer - useage: viewps FILE.PS\n");
	exit(0);
	}

in = fopen(argv[1],"rb");
if(!in){
	printf("unable to open %s for input!\n",argv[1]);
	exit(1);
	}

/* A FLAG FOR WHETHER WE'RE IN THE PARENTHESIS... */

in_paren = 0;

/* MAIN LOOP */

while((i = getc(in)) != EOF)
	{
	i &= 127;

/* WHILE IN PARENTHESIS, SAVE CHARACTERS: */

	if((in_paren) && (i != ')'))*ss++ = i;

/* DETECT PARENTHESIS */

	if(i == '('){
		in_paren = 1;
		ss = s;
		*s='\0';
		}

/* ON CLOSE PARENTHESIS, DETERMINE WHETHER IT'S TEXT, AND IF SO, PRINT */

	else if(i == ')')
		{
		*ss='\0';
		get_word(in,sss);

/* KEEP GETTING STRINGS UNTIL A NON-NUMERIC ONE SHOWS UP */

		while(isnum(sss))get_word(in,sss);


/* SEE IF IT MATCHES ANY OF THE TEST PATTERNS: */

		if(strcmp(sss,"fjt") == 0)printf("%s\n",s);
		else if(strcmp(sss,"SB") == 0)printf("%s\n",s);
		else if(strcmp(sss,"TX") == 0)printf("%s\n",s);


/* RESET THE POINTERS AND FLAG: */


		ss = s;
		in_paren = 0;
		}
	}

/* CLEAN-UP FOR A GRACEFUL EXIT: */

fclose(in);
free(s);
free(sss);
}

/* THIS GUY GETS THE NEXT WHITESPACE-DELIMITED STRING: */

get_word(file,s)
FILE *file;
char *s;
{
int i;
char *ss;

ss=s;

i = getc(file);
while(i == ' ')i=getc(file);
while((i != ' ') && (i != 13) && (i != 10))
	{
	*s++ = i;
	i=getc(file);	
	}
*s++ = '\0';
/*
printf("get_word returns %s\n",ss);
*/
}

/* THIS TESTS A STRING TO SEE IF IT'S NUMERIC */

int isnum(s)
char *s;
{
int i;
/*
printf("isnum called for %s -",s);
*/

while((i = *s++) != 0)
	{
	if(!isdigit(i)){
/*
		printf("non-numeric\n");
*/
		return(0);
		}
	}
/*
printf("numeric\n");
*/
return(1);
}