
/*
 *	Parameter file for NRO word processor
 *
 *	Originally by Stephen L. Browning, 5723 North Parker Avenue
 *	Indianapolis, Indiana 46220
 *
 *	Transformed beyond immediate recognition, and
 *	adapted for Amiga by Olaf Seibert, KosmoSoft
 *
 *	Vossendijk 149-1 (study)   Beek 5 (home)
 *	5634 TN  Nijmegen          5815 CS  Merselo
 *	The Netherlands            The Netherlands
 *	Phone:
 *	       (...-31)80561045     (...-31)4786205
 *	    or 080-561045           04786-205
 *
 *	This program is NOT in the public domain. It may, however
 *	be distributed only at no charge, and this notice must be
 *	included unaltered.
 */


#include <ctype.h>
#undef tolower
#undef toupper

typedef unsigned char uchar;
typedef unsigned short ushort;

#define EOS	(uchar) '\0'
#define ESC	(uchar) 0x1B
#undef  CPMEOF	(uchar) 0x1A
#define NBSP	(uchar) 0xA0

#define TRUE	1
#define FALSE	0
#define OK	0

#define NOARGS	0x8000

#define MACRO	 0      /* Macro definition */
#define BP	 1      /* Begin page   */
#define BR	 2      /* Break        */
#define CE	 3      /* Center       */
#define FI	 4      /* Fill         */
#define FO	 5      /* Footer       */
#define HE	 6      /* Header       */
#define IN	 7      /* Indent       */
#define LS	 8      /* Line spacing */
#define NF	 9      /* No fill      */
#define PL	10      /* Page lenght  */
#define RM	11      /* Right margin */
#define SP	12      /* Line space   */
#define TI	13      /* Temp indent  */
#define UL	14      /* Underline    */
#define JU	15      /* Justify      */
#define NJ	16      /* No justify   */
#define M1	17      /* Top margin   */
#define M2	18      /* Second top margin    */
#define M3	19      /* First bottom margin  */
#define M4	20      /* Bottom-most margin   */
#define BS	21      /* Allow/disallow '\b' in output */
#define NE	22      /* Need n lines */
#define PC	23      /* Page number character */
#define CC	24      /* Control character    */
#define PO	25      /* Page offset  */
#define BO	26      /* Bold face    */
#define EH	27      /* Header for even numbered pages       */
#define OH	28      /* Header for odd numbered pages        */
#define EF	29      /* Footer for even numbered pages       */
#define OF	30      /* Footer for odd numbered pages        */
#define SO	31      /* Source file  */
#define CU	32      /* Continuous underline */
#define DE	33      /* Define macro */
#define EN	34      /* End macro definition */
#define NR	35      /* Set number register  */
#define IT	36	/* italicize    */
#define UN	37	/* Undefine a macro and all later ones */
#define PN	38	/* Page numbering - roman or arabic */
#define C2	39	/* No-break second command character */
#define COMMENT	40	/* What the name says */
#define IF	41	/* Conditional without remembering */
#define IE	42	/* Conditional with remembering */
#define EL	43	/* Else part of last remembered conditional */
#define EV	44	/* Environment switch */
#define TA	45	/* Tab settings */
#define TM	46	/* Terminal Message */


#define UNKNOWN -1

/*
 *      MAXLINE is set to a value slightly larger
 *      than twice the longest expected input line.
 *      Because of the way underlining is handled, the
 *      input line which is to be underlined, can almost
 *      triple in length.  Unlike normal underlining and
 *      boldfacing, continuous underlining affects all
 *      characters in the buffer, and represents the
 *      worst case condition.  If the distance between
 *      the left margin and the right margin is greater
 *      than about 65 characters, and continuous underlining
 *      is in effect, there is a high probability of buffer
 *      overflow.
 *	On the Amiga, we can use the standard codes for 
 *	bold, underline, and even italics, and let the
 *	printer driver worry about it.
 */

#define MAXLINE		300	/* Was 200 */
#define MAXWORD		50
#define MAXTAB		10
#define NOTAB		((ushort) -1)
#define PAGELEN		66
#define PAGEWIDTH	80
#define HUGE		0x7FFFffff
#define LEFT		0	/* Indecies into header margin limit arrays */
#define RIGHT		1
#define NFILES		4	/* Nesting depth for input files */

/*
 *      The following parameters may be defined in bdscio.h
 */

#define YES     1
#define NO      0
#define ERR     -1

/*
 *      The parameter values selected for macro definitions
 *      are somewhat arbitrary.  MACBUF is the storage area
 *      for both macro names and definitions.  Since macro
 *      processing is handled by pushing back the expansion
 *      into the pushback buffer, the longest possible expansion
 *      would be MXMLEN characters.
 *      It is assumed that most macro definitions will not
 *      exceed 20 characters, hence MXMDEF of 100.
 */

#define MXMDEF  512             /* Maximum no. of macro definitions */
#define MACBUF  20480           /* Macro definition buffer */
#define MXMLEN  1024            /* Maximum length of each macro pushback */
#define MNLEN   10              /* Maximum length of macro name */

struct macros {
	int   mxmdef;		/* See MXMDEF */
	int   macbuf;
	int   mxmlen;
        uchar **mnames;		/* Table of pointers to macro names */
        int   lastp;		/* Index to last mname  */
        uchar *emb;		/* Next char avail in macro defn buffer */
        uchar *mb;		/* Table of macro definitions */
        uchar *ppb;		/* Pointer into push back buffer */
        uchar *pbb;		/* Push back buffer */
		uchar *pbbend;	/* End of push back buffer */
};


/* Control parameters for nro */

#define NUMENV		10
#define ENVSTACK	20

struct environ {
        int   lsval;	/* Current line spacing, init = 1       */
        int   tival;	/* Current temp indent, init = 0        */
        int   inval;	/* Current indent, >= 0, init = 0       */
        int   tmval;	/* Current temp right margin, init = 60 */
        int   rmval;	/* Current right margin, init = 60      */
        int   ceval;	/* Number of lines to center, init = 0  */
        int   ulval;	/* Number of lines to underline, init = 0 */
        int   cuval;	/* No. lines to continuously underline, init = 0 */
	int   itval;	/* Number of lines to italicize, init = 0 */
        int   juval;	/* Justify if YES, init = YES           */
        int   boval;	/* Number of lines to bold face, init = 0 */

        int   fill;	/* Fill if YES, init = YES              */
	int   pnflg;	/* Value for page numbering, init = 0   */
	short dontbrk;	/* Disables line breaking, init = FALSE */

        int   pgchr;	/* Page number character, init = '#'    */
        int   cmdchr;	/* Command character, init = '.'        */
        int   c2chr;	/* No-break cmd character, init = '\''  */
        int   sprdir;	/* Direction for spread(), init = 0     */

	short reqmode;	/* Requested mode for bold underline &c */
	short expmode;	/* Expected mode at begin of output buffer */
	short curmode;	/* Current mode in output buffer        */

	short lastie;	/* Remembered conditional               */

        short outp;	/* Next avail char position in outbuf, init = 0 */
        short outw;	/* Width of text currently in buffer    */
        short outwds;	/* Number of words in buffer, init = 0  */
        uchar outbuf[MAXLINE];	/* Output of filled text        */
	ushort tabstop[MAXTAB]; /* Tab settings                 */
};

/* Global variables: */

struct docctl {		/* -- These should not be pushable: --  */
        int   bsflg;	/* Can output contain '\b', init = FALSE */
	short iflvl;	/* Number of @} 's to be skipped        */
        short flevel;	/* Nesting depth for source cmd, init = 0 */
        int   nr[26];	/* Number registers                     */
	short curmode;	/* Current mode at end of printer       */
	uchar envstack[ENVSTACK];
	uchar envsp;	/* Current environment stack depth      */
#ifdef CPM
        short lpr;	/* Output to printer, init = FALSE      */
#endif
};


/* Page control parameters for nro */

struct page {
        int   curpag;	/* Current output page number, init =0  */
        int   newpag;	/* Next output page number, init = 1    */
        int   lineno;	/* Next line to be printed, init = 0    */
        int   plval;	/* Page length in lines, init = 66      */
        int   m1val;	/* Margin before and including header   */
        int   m2val;	/* Margin after header                  */
        int   m3val;	/* Margin after last text line          */
        int   m4val;	/* Bottom margin, including footer      */
        int   bottom;	/* Last live line on page               */
			/*   = plval - m3val - m4val            */
        int   offset;	/* Page offset from left, init = 0      */
        int   frstpg;	/* First page to print, init = 0        */
        int   lastpg;	/* Last page to print, init = 30000     */
        int   prflg;	/* Print on or off, init = TRUE         */
        int   ehlim[2];	/* Left/right margins for headers/footers     */
        int   ohlim[2];	/* Init = 0 and PAGEWIDTH                     */
        int   eflim[2];
        int   oflim[2];
        uchar ehead[MAXLINE];	/* Top of page title, init = '\n'     */
        uchar ohead[MAXLINE];
        uchar efoot[MAXLINE];	/* Bottom of page title, init = '\n'  */
        uchar ofoot[MAXLINE];
};

#define BSAMIGA   0  /* Use Amiga command sequences for bold & underline */
#define BSYES     1  /* Use backspaces for bold & underline         */
#define BSNO      2  /* Use carriage returns for bold & underline   */

#define PNARABIC  0  /* Use Arabic way of page numbering            */
#define PNLROMAN  1  /* Use lowercase Roman way of page numbering   */
#define PNUROMAN  2  /* Use upperercase Roman way of page numbering */

void *malloc();
uchar *getmac(), *tabexp();
short processfx();

#ifndef CPM
# define prchar(c, fp)	putc(c, fp)
#endif

#define STRINGTYP	'"'	/* Command has string argument          */
#define MORETXT		';'	/* Command seperator                    */
#define ESCCHAR		'@'	/* The substitution escape char         */
#define CMDCHAR		'.'	/* The default command character        */
#define C2CHAR		'\''	/* The default no-break cmd character   */
#define PGCHAR		'#'	/* The default page number character    */

#define BEGIF		('{'|0x8000)
#define ENDIF		('}'|0x8000)

#define FXPLAIN		0	/* Printer command sequences */
#define FXBO		1
#define FXIT		2
#define FXUL		4

#define NOGUARD		0x8000

/* #define putlin(string, stream)	fwrite(string, strlen(string), 1, stream) fputs(string, stream); */
#ifndef CPM
#  define iseol(c)	(c) == '\n'
#  define isnteol(c)	(c) != '\n'
#else
#  define iseol(c)	(c) == '\n' || (c) == '\r'
#  define isnteol(c)	(c) != '\n' && (c) != '\r'
#endif
#undef isspace
#define isspace(c)	(c) == ' ' || (c) == '\t'
#define isntspace(c)	(c) != ' ' && (c) != '\t'
