/*  Last edited: Nov 22 11:58 1994 (pmr) */
#define TRUE	  1
#define FALSE	  0

#define MAX_DEF	100
#define MAX_NAM  20
#define MAX_DIR	 14

#define MAX_LINE 256
#define MAX_WORD 128
#define NL	'\n'
#define BLANK	'\040'
#define QUOTED	'\042'

char egenincstr[MAX_LINE];
char  genincstr[MAX_LINE];

int output = TRUE;

int include_it = FALSE;

int log_it = FALSE;

int egen_include = FALSE;

int gen_include = FALSE;

int ignore_case = FALSE;

int make_vms_comments = FALSE;

int free_vms_comments = FALSE;

int make_unix_comments = FALSE;

int free_unix_comments = FALSE;

int num_def = 0;	/* number of defines */

struct DEFtype {
	char value;
	char name[MAX_NAM];
} defines[MAX_DEF];

FILE *fin, *fout;

#define PP_MARKERS	"#Cc"

#define PP_INCLUDE	0
#define PP_DEFINE	1
#define PP_UNDEF	2
#define PP_IFDEF	3
#define PP_IFNDEF	4
#define PP_ELIF		5
#define PP_ELSE		6
#define PP_ENDIF	7
#define PP_EGENINC      8
#define PP_GENINC       9
#define PP_MAKEVMS     10
#define PP_FREEUNIX    11
#define PP_MAKEUNIX    12
#define PP_FREEVMS     13

char directive[MAX_DIR][MAX_NAM] = {
	"#include",
	"#define",
	"#undef",
	"#ifdef",
	"#ifndef",
	"#elif",
	"#else",
	"#endif",
	"IEGenInclude:",
	"IGenInclude:",
	"!CVMS",
	"cunix",
	"!cunix",
	"CVMS",
};

/* prototyping */

int main (int, char **);
void init_defines (void);
int scan_args (int, char **);
int cpp_direct (char *);
void add_define (char *);
void del_define (char *);
int is_defined (char *);
char *next_line (FILE *);
char *next_word (char *, int);
int process (int, int, FILE *);
void do_include (char *);
int is_include (const char *, const char *);
int sub_include (char *, const char *, const char *);
void free_comment (char *str, const char *startcomment, const char *endcomment);
void make_comment (char *str, const char *endcomment, const char *startcomment);
int is_comment (const char *s, const char *comment);

#ifdef VMS
int strcasecmp (const char *, const char *);
int strncasecmp (const char *, const char *, size_t);

int strcasecmp (const char *s, const char *t)
{
	for ( ; toupper(*s) == toupper(*t); *s++, *t++)
		if ( *s == '\0' )
			return 0;
	return *s - *t;
}

int strncasecmp (const char *s, const char *t, size_t n)
{
	size_t i = --n;

	for ( ; toupper(*s) == toupper(*t) && i; *s++, *t++, i--)
		if ( *s == '\0' )
			return 0;
	return *s - *t;
}
#endif
