4.3BSD/usr/contrib/dipress/src/bin/dipress/main.c

Compare this file to the similar file:
Show the results in this format:

/******************************************************************************
 *
 *	main	--	main routine for dipress 
 *			(ditroff to interpress conversion)
 *
 *	John Mellor-Crummey (Xerox Corp)
 *
 *	Copyright 1985 Xerox Corporation
 *
 *****************************************************************************/

#include <stdio.h>
#include <ctype.h>
#include <sys/types.h>
#include <sys/file.h>
#include <sys/stat.h>
#include <strings.h>

#include "defs.h"	/* constant and macro definitions */
#include "externs.h"	/* declarations for global variables */


/*-----------------------------------------------------------------------------
 *
 *	main processes the list of command line options and opens the 
 *	necessary temporary files
 *
 *---------------------------------------------------------------------------*/
main(argc, argv)
int argc;
char **argv;
{
	FILE *inputfile;

	/* set up signal handlers to insure clean termination */
	signalHandler();	

	/* process command line options */

	while ((--argc > 0) && (**++argv == '-'))
	{
		switch (*++*argv) 
		{
		case 'd':		
			/* produce debugging info */
			dbg = atoi(++*argv);
			if (dbg == 0) dbg = 1;
			setbuf(stdout, (char *)NULL);
			printf("debugging level %d\n", dbg);
			break;
		case 'f':
		case 'F':
			/* reset default font directory 
			 * accept either form '-f <dir>' or '-f<dir>'
			 */
			if (*(*argv+1) == '\0')
			{
				fontdirectory = *++argv;
				--argc;
			}
			else
				fontdirectory = ++*argv;
			break;
		case 'o':		
			/* read the following list of page numbers */
			readPageList(++*argv);
			break;
		case 't':		
			/* dump the interpress to the standard output */
			outputfile = fileno(stdout);
			break;
		default:
			reportError(CONTINUE,"option -%c not recognized\n", (char *) **argv);
			break;
		}
	}

	/* construct name for temporary files */
	(void) sprintf(tempfilename, "/tmp/dip%d", getpid());

	if (outputfile != fileno(stdout))
	{
		/* open file to hold master */
		if ((outputfile=open(tempfilename, O_WRONLY | O_TRUNC | O_CREAT, 0666)) == -1)
			reportError(QUIT, "temporary file %s: %s",
			tempfilename, sys_errlist[errno]);
		ip_select(outputfile);
	}

	/* open file to hold body */
	(void) strcat(tempfilename, "b");

	if ((pagebodyfile = open(tempfilename, O_WRONLY | O_TRUNC | O_CREAT, 0666)) == -1)
		reportError(QUIT, "temporary file %s: %s",
		tempfilename, sys_errlist[errno]);

	ip_raw_select(pagebodyfile);



	if (argc <= 0)	/* if no file specified, default to stdin */
		ditroffToIpress(stdin);
	else
		/* process files explicitly specified */
		while (argc-- > 0)
		{
			if ((inputfile = fopen(*argv++, "r")) == NULL)
				reportError(QUIT, "can't open %s: %s",
					*argv, sys_errlist[errno]);
			ditroffToIpress(inputfile);
			(void) fclose(inputfile);
		}
	goodbye();
}


/*-----------------------------------------------------------------------------
 * readPageList	--	read a list of page specifications of the form
 *			p1 or p1-p2 separated by commas. if in the dash form
 *			either p1 or p2 is omitted, it will appropriately 
 *			default to the first of last page of the document
 *---------------------------------------------------------------------------*/
readPageList(ptr)
char *ptr;
{
	while(*ptr != '\0')
	{
		pagerange[nPageRanges][0] = 
			((isdigit(*ptr)) ? readPageNumber(&ptr): DEFAULTRANGEBOT);
		pagerange[nPageRanges][1] = 
			((*ptr != '-') ? pagerange[nPageRanges][0] : 
					((isdigit(*++ptr)) ? readPageNumber(&ptr) : 
							 DEFAULTRANGETOP));
		nPageRanges++;
		if (*ptr != '\0') ptr++;
	}
}


/*-----------------------------------------------------------------------------
 * readPageNumber	--	read a page number from a string and update the
 *				pointer to the next non-digit
 *---------------------------------------------------------------------------*/
readPageNumber(ptr)
char **ptr;
{
	int pagenumber = 0;

	while(isdigit(**ptr))
	{
		pagenumber = pagenumber * 10 + **ptr - '0';
		++*ptr;
	}
	return(pagenumber);
}