struct cs_tailq cs_tailq;
TAILQ_HEAD(patch_list, patch) patches;static void usage(void);static void back_patch(void);static void output_code(FILE *ofile);static void output_listing(FILE *listfile, char *ifilename);static void dump_scope(scope_t *scope);static void emit_patch(scope_t *scope, int patch);static int check_patch(patch_t **start_patch, int start_instr,		       int *skip_addr, int *func_vals);struct path_list search_path;int includes_search_curdir;char *appname;FILE *ofile;char *ofilename;char *regfilename;FILE *regfile;char *listfilename;FILE *listfile;static TAILQ_HEAD(,instruction) seq_program;struct cs_tailq cs_tailq;struct scope_list scope_stack;symlist_t patch_functions;#if DEBUGextern int yy_flex_debug;extern int yydebug;#endifextern FILE *yyin;extern int yyparse(void);intmain(argc, argv)	int argc;	char *argv[];{	extern char *optarg;	extern int optind;	int  ch;	int  retval;	char *inputfilename;	scope_t *sentinal;	TAILQ_INIT(&patches);	SLIST_INIT(&search_path);	TAILQ_INIT(&seq_program);        TAILQ_INIT(&cs_tailq);	SLIST_INIT(&scope_stack);	/* Set Sentinal scope node */	sentinal = scope_alloc();	sentinal->type = SCOPE_ROOT;		includes_search_curdir = 1;	appname = *argv;	regfile = NULL;	listfile = NULL;#if DEBUG	yy_flex_debug = 0;	yydebug = 0;#endif	while ((ch = getopt(argc, argv, "d:l:n:o:r:I:O:")) != -1) {		switch(ch) {		case 'd':#if DEBUG			if (strcmp(optarg, "s") == 0) {				yy_flex_debug = 1;			} else if (strcmp(optarg, "p") == 0) {				yydebug = 1;			} else {				fprintf(stderr, "%s: -d Requires either an "					"'s' or 'p' argument\n", appname);				usage();			}#else			stop("-d: Assembler not built with debugging "			     "information", EX_SOFTWARE);#endif			break;		case 'l':			/* Create a program listing */			if ((listfile = fopen(optarg, "w")) == NULL) {				perror(optarg);				stop(NULL, EX_CANTCREAT);			}			listfilename = optarg;			break;		case 'n':			/* Don't complain about the -nostdinc directrive */			if (strcmp(optarg, "ostdinc")) {				fprintf(stderr, "%s: Unknown option -%c%s\n",					appname, ch, optarg);				usage();				/* NOTREACHED */			}			break;		case 'o':			if ((ofile = fopen(optarg, "w")) == NULL) {				perror(optarg);				stop(NULL, EX_CANTCREAT);			}			ofilename = optarg;			break;		case 'r':			if ((regfile = fopen(optarg, "w")) == NULL) {				perror(optarg);				stop(NULL, EX_CANTCREAT);			}			regfilename = optarg;			break;		case 'I':		{			path_entry_t include_dir;			if (strcmp(optarg, "-") == 0) {				if (includes_search_curdir == 0) {					fprintf(stderr, "%s: Warning - '-I-' "							"specified multiple "							"times\n", appname);				}				includes_search_curdir = 0;				for (include_dir = search_path.slh_first;				     include_dir != NULL;				     include_dir = include_dir->links.sle_next)					/*					 * All entries before a '-I-' only					 * apply to includes specified with					 * quotes instead of "<>".					 */					include_dir->quoted_includes_only = 1;			} else {				include_dir =				    (path_entry_t)malloc(sizeof(*include_dir));				if (include_dir == NULL) {					perror(optarg);					stop(NULL, EX_OSERR);				}				include_dir->directory = strdup(optarg);				if (include_dir->directory == NULL) {					perror(optarg);					stop(NULL, EX_OSERR);				}				include_dir->quoted_includes_only = 0;				SLIST_INSERT_HEAD(&search_path, include_dir,						  links);			}			break;		}		case '?':		default:			usage();			/* NOTREACHED */		}	}	argc -= optind;	argv += optind;	if (argc != 1) {		fprintf(stderr, "%s: No input file specifiled\n", appname);		usage();		/* NOTREACHED */	}	symtable_open();	inputfilename = *argv;	include_file(*argv, SOURCE_FILE);	retval = yyparse();	if (retval == 0) {		if (SLIST_FIRST(&scope_stack) == NULL		 || SLIST_FIRST(&scope_stack)->type != SCOPE_ROOT) {			stop("Unterminated conditional expression",			     EX_DATAERR);			/* NOTREACHED */		}		/* Process outmost scope */		process_scope(SLIST_FIRST(&scope_stack));		/*		 * Decend the tree of scopes and insert/emit		 * patches as appropriate.  We perform a depth first		 * tranversal, recursively handling each scope.		 */		/* start at the root scope */		dump_scope(SLIST_FIRST(&scope_stack));		/* Patch up forward jump addresses */		back_patch();		if (ofile != NULL)			output_code(ofile);		if (regfile != NULL) {			symtable_dump(regfile);		}		if (listfile != NULL)			output_listing(listfile, inputfilename);	}	stop(NULL, 0);	/* NOTREACHED */	return (0);}