ftp.nice.ch/pub/next/developer/languages/ada/Adaed.1.11.s.tar.gz#/Adaed-1.11.0a/bmain.c

This is bmain.c in view mode; [Download] [Up]

/*
 * Copyright (C) 1985-1992  New York University
 * 
 * This file is part of the Ada/Ed-C system.  See the Ada/Ed README file for
 * warranty (none) and distribution info and also the GNU General Public
 * License for more details.

 */

#define GEN

#include <stdio.h>
#include <ctype.h>
#include "hdr.h"
#include "vars.h"
#include "gvars.h"
#include "libhdr.h"
#include "segment.h"
#include "ifile.h"
#include "slot.h"
#include "arithprots.h"
#include "dclmapprots.h"
#include "readprots.h"
#include "dbxprots.h"
#include "initprots.h"
#include "blibprots.h"
#include "libprots.h"
#include "glibprots.h"
#include "libfprots.h"
#include "librprots.h"
#include "libwprots.h"
#include "g0aprots.h"
#include "setprots.h"
#include "miscprots.h"
#include "gmiscprots.h"
#include "bmainprots.h"
#ifdef vms
#define vms_BINDER
#endif

#ifdef vms_BINDER
/*
#include descrip
#include "adabind.h"
*/
#endif

static void fold_upper(char *);
static void bpreface();
static void exitf(int);

/* Driver routine for ada gen */
char *argname;

IFILE	*AISFILE, *AXQFILE, *STUBFILE, *LIBFILE, *TREFILE;
FILE *MALFILE;
int list_unit_0 = 0; /* set by '0' option to list unit 0 structure */
int peep_option = 1; /* on for peep_hole optimization */
int adacomp_option = 0; /* set if called from adacomp */

extern Segment	CODE_SEGMENT, DATA_SEGMENT, DATA_SEGMENT_MAIN;
extern Segment   VARIANT_TABLE, FIELD_TABLE ;
char *lib_name;
#ifdef DEBUG
extern int zpadr_opt; /* not for EXPORT */
#endif

void main(int argc, char **argv)
{
	int		c, i, n, iot_level = 2;
	int		errflg = 0, nobuffer = 0, mflag = 0;
	extern int  optind;
	extern char *optarg;
	char	*t_name;
	char	*fname, *tfname, *source_name;
	int		r_trace = TRUE, w_trace = TRUE; /* trace modes for -f option */
#ifdef vms_BINDER
	int         status;
	char        buffer[50];
	short       rlength;
	struct      dsc$descriptor_s entity_desc;
	struct      dsc$descriptor_s value_desc;
#endif

	AISFILE = (IFILE *)0;
	AXQFILE = (IFILE *)0;
	LIBFILE = (IFILE *)0;
	STUBFILE = (IFILE *)0;
	TREFILE = (IFILE *)0;

	MAINunit = "";
	interface_files = "";

	while ((c = getopt (argc, argv, "c:g:f:m:i:")) != EOF)
		/*
		 *    user:
		 *	c	set if called from adacomp (errors in msg format).
		 *	f	file i/o trace, followed by list of options
		 *		a	trace ais files
		 *		d	do not include descriptors in trace
		 *		n	do not include file numbers in trace
		 *		r	subsequent traces for reading only
		 *		t	trace tre files
		 *		w	subsequenc traces for writing only
		 *		(traces initially for both r and w, use of r or w
		 *		limits further files traces to just that mode)
		 *		1	set trace level to 1
		 *		2	set trace level to 2
		 *	g	debugging, followed by list of options:
		 *		0	show structure of unit 0
		 *		M	malloc trace (including init_sem)
		 *		b	do not buffer standard output
		 *		e	flag signalling errors in the parsing phase
		 *		g	list generated code
		 *		l	show line numbers in generated code
		 *		m	malloc trace (after init_sem)
		 *		z	call trapini to initialize traps
		 *      i   to specify object files and libraries for pragma interface
		 *  	l	using library
		 *	m	main unit name
		 *  	n	new library
		 */
		switch (c) {
		case 'c': 
			adacomp_option++;
			source_name = malloc(strlen(optarg)+1);
			strcpy(source_name, optarg);
			break;
		case 'i':
			interface_files = strjoin(interface_files, optarg);
			interface_files = strjoin(interface_files, " ");
			break;
		case 'l': /* using existing library */
			break;
		case 'm': /* specify main unit name */
			MAINunit = malloc(strlen(optarg)+1);
			strcpy(MAINunit, optarg);
			fold_upper(MAINunit);
			break;
		case 'n': /* indicates new library */
			new_library = TRUE;
			break;
#ifdef DEBUG
		case 'f':	/* process ifile trace options */
			n = strlen(optarg);
			for (i = 0; i < n; i++) {
				switch (optarg[i]) {

				case 'o':
					/* turn off file offset trace */
					iot_off_info(0);
					break;
				case 'a':
					if (w_trace) iot_ais_w = iot_level;
					if (r_trace) iot_ais_r = iot_level;
					break;
				case 't':
					if (w_trace) iot_tre_w = iot_level;
					if (r_trace) iot_tre_r = iot_level;
					break;
				case 'l':
					if (w_trace) iot_lib_w = iot_level;
					if (r_trace) iot_lib_r = iot_level;
					break;
				case 'n': 
					iot_set_opt_number(0);
					break;
				case 'd': 
					iot_set_opt_desc(0); 
					break;
				case 'r': 
					w_trace= FALSE; 
					r_trace= TRUE; 
					break;
				case 'w': 
					r_trace = FALSE; 
					w_trace = TRUE; 
					break;
				case '1': 
					iot_level = 1; 
					break;
				case '2': 
					iot_level = 2; 
					break;
				}
			}
			break;
#endif
		case 'g': /* gen debug options */
			n = strlen(optarg);
			for (i = 0; i < n; i++) {
				switch((int)optarg[i]) {
#ifdef DEBUG
				case 'a':
					zpadr_opt = 0; /* do not print addresses in zpadr */
					break;
#endif
				case 'g':
					list_code++;
					break;
				case 'l':
					line_option++;
					break;
#ifdef DEBUG
				case 'b': /* do not buffer output */
					nobuffer++;
					break;
				case 'd': /* force debugging output */
					debug_flag++;
					break;
				case 'e':
					errors = TRUE;
					break;
				case 'o': /* disable optimization (peep) */
					peep_option = 0;
					break;
				case 'm': /* malloc trace */
					mflag++;
					break;
				case '0': /* read trace including unit 0 */
					list_unit_0++;
					break;
				case 'z': 
					trapini();
					break;
#endif
				}
			}
			break;
		case '?':
			errflg++;
		}
#ifdef IBM_PC
	if (!adacomp_option) {
		fprintf(stderr, "NYU Binder Version 1.7.2,");
		fprintf(stderr, " Copyright (C) 1985-1987 by New York University\n");
	}
#endif
	fname = (char *)0;
	if (optind < argc)
		fname = argv[optind];
	/* if fname not given, get from environment. */
	if (!errflg && fname == (char *)0) {
		fname = getenv("ADALIB");
		if (fname!= (char *)0 && !adacomp_option) {
#ifdef IBM_PC
			fprintf(stderr, "L");
#else
			fprintf(stderr, "l");
#endif
			fprintf(stderr, "ibrary defined by ADALIB: %s\n", fname);
		}
	}
	if (fname == (char *)0 || errflg) {
		fprintf (stderr, "Usage: adabind [-m main_unit] [library]\n");
		exitp(RC_ABORT);
	}
	lib_name = emalloc(strlen(fname) + 1);
	strcpy(lib_name, fname);
	t_name = libset(lib_name); /* set library */
	gen_option = FALSE; /* bind only */

#ifdef vms_BINDER
	if (!adacomp_option) {
		entity_desc.dsc$b_dtype = DSC$K_DTYPE_T;
		entity_desc.dsc$b_class = DSC$K_CLASS_S;
		value_desc.dsc$b_dtype = DSC$K_DTYPE_T;
		value_desc.dsc$b_class = DSC$K_CLASS_S;
		value_desc.dsc$a_pointer = buffer;
		value_desc.dsc$w_length = 50;
		entity_desc.dsc$a_pointer = "C";
		entity_desc.dsc$w_length = 1;
		status = CLI$PRESENT(&entity_desc);
#ifdef DEBUG
		printf("C status %d\n", status);
#endif
		if (status & 1) {
			status = CLI$GET_VALUE(&entity_desc, &value_desc, &rlength);
			value_desc.dsc$a_pointer[rlength] = '\0';
			adacomp_option++;
			source_name  = strjoin(value_desc.dsc$a_pointer, "");
#ifdef DEBUG
			printf("C %s\n", source_name);
#endif
		}


		entity_desc.dsc$b_dtype = DSC$K_DTYPE_T;
		entity_desc.dsc$b_class = DSC$K_CLASS_S;
		value_desc.dsc$b_dtype = DSC$K_DTYPE_T;
		value_desc.dsc$b_class = DSC$K_CLASS_S;
		value_desc.dsc$a_pointer = buffer;
		value_desc.dsc$w_length = 50;
		entity_desc.dsc$a_pointer = "MAIN_UNIT";
		entity_desc.dsc$w_length = 9;
		status = CLI$PRESENT(&entity_desc);
#ifdef DEBUG
		printf("MAIN_UNIT status %d\n", status);
#endif
		if (status & 1) {
			status = CLI$GET_VALUE(&entity_desc, &value_desc, &rlength);
			value_desc.dsc$a_pointer[rlength] = '\0';
			MAINunit = strjoin(value_desc.dsc$a_pointer, "");
			fold_upper(MAINunit);
#ifdef DEBUG
			printf("MAIN_UNIT %s\n", MAINunit);
#endif
		}
		entity_desc.dsc$a_pointer = "LIBRARY";
		entity_desc.dsc$w_length = 7;
		status = CLI$PRESENT(&entity_desc);
#ifdef DEBUG
		printf("LIBRARY status %d\n", status);
#endif
		if (status & 1) {
			status = CLI$GET_VALUE(&entity_desc, &value_desc, &rlength);
			value_desc.dsc$a_pointer[rlength] = '\0';
			fname = strjoin(value_desc.dsc$a_pointer, "");
#ifdef DEBUG
			printf("LIBRARY %s\n", fname);
#endif
		}
		lib_name = emalloc(strlen(fname) + 1);
		strcpy(lib_name, fname);
		t_name = libset(lib_name); /* set library */
		gen_option = FALSE; /* bind only */
	}
#endif
	tup_init(); /* initialize set and tuple procedures */
#ifdef DEBUG
	if (mflag) {
		trace_malloc();
		/* can't use strjoin to setup efopen arg as want trace ! */
		/*MALFILE = efopen(strjoin(FILENAME, ".mas"), "w", "t"); */
		tfname = malloc(strlen(fname) +4 + 1);
		MALFILE = efopen(strcat(strcpy(tfname, fname), ".mag"), "w", "t");
		free(tfname);
	}
#endif
	FILENAME = (fname != (char *)0) ? strjoin(fname, "") : fname;

	PREDEFNAME = predef_env();
	if (nobuffer) {
		setbuf (stdout, (char *) 0);	/* do not buffer output (for debug) */
	}
	rat_init(); /* initialize arithmetic and rational package*/
	dstrings_init(2048, 256); /* initialize dstrings package */
	init_sem();
	DATA_SEGMENT_MAIN = main_data_segment();
	aisunits_read = tup_new(0);
	init_symbols = tup_exp(init_symbols, seq_symbol_n);
	for (i = 1; i <= seq_symbol_n; i++)
		init_symbols[i] = seq_symbol[i];

	num_predef_units = init_predef();
	/*
	 * When the separate compilation facility is being used all references to
	 * AIS files will be made via the directory in LIBFILE. AISFILENAME is set
	 * to a number.
	 */
	if (new_library) 
		AISFILENAME = "1";
	else
		AISFILENAME = lib_aisname(); /* retrieve name from library */
	/* open the appropriate files using the suffix .axq for axq files and
	 * .trc for tree file. 
	 *
	 * Open MESSAGEFILE with suffixe ".msg" if a file name specified;
	 * otherwise, if a file name not required, and one is not given,
	 * used stderr.
	 */
	AXQFILE  = ifopen(AISFILENAME, "axq", "w", "a", iot_ais_w, 0);
	if (adacomp_option) {
		MSGFILE  = efopenl(source_name, "msg", "a", "t");
		/* unbuffer output for debugging purposes */
		setbuf(MSGFILE, (char *) 0);
	}
	else {
		MSGFILE = stdout;
	}
	bpreface();

	/* Code formerly procedure finit() in init.c is now put here directly */
	if (!errors) {
		write_glib();
		cleanup_files();
	}

	exitf(RC_SUCCESS);
}

static void fold_upper(char *s)								/*;fold_upper*/
{
	register char c;

	while (c = *s) {
		if (islower(c)) *s = toupper(c);
		s++;
	}
}

void fold_lower(char *s)										/*;fold_lower*/
{
	register char c;

	while (c = *s) {
		if (isupper(c)) *s = tolower(c);
		s++;
	}
}

static void bpreface()											/*;bpreface*/
{
	/* bpreface is version of preface for use with binder */

	int	i;
	Tuple	aisread_tup;

	aisread_tup = tup_new(0);
	initialize_1();
	/* 1- Load PREDEF */

	TASKS_DECLARED = FALSE;
	/* 2- Generate user program */

	initialize_2();

	ada_line = 9998;
	/* if binding, make ais_read tupe correspond to library */
	aisread_tup = tup_new(0);
	for (i = 11; i <= unit_numbers; i++)
		aisread_tup = tup_with(aisread_tup, pUnits[i]->name);

#ifdef EXPORT
	list_code = 0;
#endif
	if (binder(aisread_tup))
		store_axq(AXQFILE, unit_number_now);
	ifclose(AXQFILE);
	if (errors) {
#ifdef DEBUG
		user_info("Binding stopped");
#endif
		exitf(RC_ERRORS);
	}
}

static void exitf(int status)										/*;exitf*/
{
	/* exit after closing any open files */
	ifoclose(AXQFILE);
	ifoclose(LIBFILE);
	ifoclose(STUBFILE);
	exitp(status);
}

void user_error(char *reason)									/*;user_error*/
{
	errors++;
	if (adacomp_option) {
		list_hdr(ERR_SEMANTIC);
		fprintf(MSGFILE, " %s\n", reason);
	}
	else
		printf(" %s\n", reason);
}

void user_info(char *line)										/*;user_info*/
{
	/* In SETL USER_INFO macro is defined to be
     * PRINTA(GENfile, INFORMATION, ada_line, 0, ada_line, 0, '	'+line)    endm;
	 * where the argument is always a unit_name passed to formatted name
	 * In C, we call user_info and fill in needed info
	 */

	if (adacomp_option) {
		list_hdr(INFORMATION);
		fprintf(MSGFILE, "%s\n", line);
	}
	else {
		printf("%s\n", line);
	}
}

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.