/* XPAPER.C - an extended version of */
/* CP/M+ PAPER utility, enabling the setting */
/* of typestyle and some other frills $ */

#include "stdio.h"
#include "xpaperh.c"

int i, typecode = 0, tc_changed=0,d_flag = 0;
FILE *LSTptr;


main(argc, argv)
int argc;
char *argv[];
{
FAST char argv_buffer[MAXARGS * 2 + 132];

cpm_cmd_line (&argc,&argv,argv_buffer);
openprinter();

*argv++;
argc--;     /* to dispose of arg. 0 */
while (argc--) interpret(*argv++);

if (tc_changed)settypestyle();
if (d_flag) setdefaults();

closeprinter();
}


openprinter()
{
if (!(LSTptr=(fopen("LST:","wb"))))
	{
	fputs("cannot open LST:",stderr);
	 exit(1);
	 }
}

closeprinter()
{
fclose(LSTptr);
}

interpret(code)
char *code;
{
int unknown;
char *save;

unknown = FALSE;
save=code;
switch (*code++)
	{
	case 'L' : switch (*code++)   /* set line spacing */
			{
			case '6': fprintf(LSTptr,"%s",_6LPI);
				 break;
			case '8': fprintf(LSTptr,"%s",_8LPI);
				 break;
			case '1': if (*code=='0')
					fprintf(LSTptr,"%s",_10LPI);
				 else unknown=TRUE;
				 break;
			default: unknown=TRUE;
			}
		  break;

	case 'M' : switch (*code++)   /* margins */
			{
			case '(': fprintf(LSTptr,"%s%c",LM,  atoi(code));
				 break;
			case ')': fprintf(LSTptr,"%s%c",RM,  atoi(code));
				 break;
			default: unknown=TRUE;
			}
		  break;

	case 'E' : switch (*code)	   /* paper end detection  */
			{
			case 'N': fprintf(LSTptr,"%s",PDN);
				 break;
			case 'F': fprintf(LSTptr,"%s",PDF);
				 break;
			default: unknown=TRUE;
			}
		  break;

	case 'P' : switch (*code++)   /* page length lines/inches */
			{
			case 'L': fprintf(LSTptr,"%s%c",PL,  atoi(code));
				 break;
			case 'I': fprintf(LSTptr,"%s%c%c",PL,'\0', atoi(code));
				 break;
			default: unknown=TRUE;
			} 
		  break;

	case 'C' : fprintf(LSTptr,"%s",CP);  /* continuous paper */
		  break;

	case 'S' : fprintf(LSTptr,"%s",SS);  /* single sheet */
		  break;

	case 'G' : (i=(atoi(code))) ? fprintf(LSTptr,"%s%c",GAP, i):
			fprintf(LSTptr,"%s",UNGAP);
		  break;                    /* set gap length */

	case 'R' : fprintf(LSTptr,"%s",RST);
		  break;			/* reset to current defaults */

	case 'D' : d_flag=TRUE;
		  break;			/* to save current settings */

	case 'T' : tc_changed=TRUE;
		  switch (*code)		/* typestyle */
			{
			case 'E': typecode|=0x20;
				 break;
			case 'D': typecode|=0x10;
				 break;
			case 'B': typecode|=0x08;
				 break;
			case 'C': typecode|=0x04;
				 break;
			case 'P': typecode|=0x02;
				 break;
			case 'L': typecode|=0x01;
				 break;
			default: unknown=TRUE;
			}
		  break;		/* setting bits in typecode */

	case 'Q' : switch (*code)	/* hi/draft quality */
			{
			case 'H': fprintf(LSTptr,"%s",HQN);
				 break;
			case 'D': fprintf(LSTptr,"%s",HQF);
				 break;
			default: unknown=TRUE;
			}
		  break;

	case 'I' : switch (*code)	/* italics  */
			{
			case 'N': fprintf(LSTptr,"%s",ITAL);
				 break;
			case 'F': fprintf(LSTptr,"%s",NORM);
				 break;
			default: unknown=TRUE;
			}
		  break;

	case 'Z' : switch (*code)  /* zero style */
			{
			case '0': fprintf(LSTptr,"%s",ZS);
				 break;
			case 'O': fprintf(LSTptr,"%s",ZNS);
				 break;
			default: unknown=TRUE;
			}
		  break;

	case 'V' : fprintf(LSTptr,"%s%c",LGE, atoi(code));
		  break;		/* language variant */

	case 'A' : switch (*code) /* set A4/A5 defaults */
			{
			case '4': interpret("PL70");
				 interpret("L6");
				 interpret("G3");
				 interpret("S");
				 interpret("EN");
				 break;
			case '5': interpret("PL50");
				 interpret("L6");
				 interpret("G3");
				 interpret("S");
				 interpret("EN");
				 break;
			default: unknown=TRUE;
			}
		break;

	default: if   (i = (atoi(save))) 	{
					fprintf(LSTptr,"%s%c%c",PL,'\0',i);
					interpret("C");
					interpret("EF");
					interpret("L6");
					interpret("G0");
					}
		else  unknown=TRUE;

	}	/* end of switch (code++) */

if (unknown) 
	fprintf(stderr,"\nUnknown action: %s",save);
}


setdefaults()
{
fprintf(LSTptr,"%s",SETDF);
}

settypestyle()
{
fprintf(LSTptr,"%s%c",STS,typecode);
}

#include ?cpm.lib
#include ?stdio.lib
STptr,"%s",SETDF);
}

settypestyle()
{
fprintf(LSTptr,"%s%c