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

This is axqr.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.

 */

/* procedures for reading axq files.
 * Since these are used by the interpreter, it is ESSENTIAL that
 * neither hdr.h or ghdr.h be required for their compilation.
 */

#include "config.h"
#include <stdio.h>
#include "ifile.h"
#include "segment.h"
#include "slot.h"
#include "stdlib.h"
#include "libfprots.h"
#include "miscprots.h"
#include "axqrprots.h"

static Slot *get_slot(IFILE *, int, int *);

/* define DEBUG to include print statments that are always done */

#ifdef DEBUG
#define IOT
#endif

#ifdef IOT
extern int iot_ifile;
#endif

Segment segment_new(int kind, int initdim)		/*;segment_new*/
{
	Segment	s;

	s = (Segment) emalloct(sizeof(Segment_s), "segment-new");
	s->seg_kind = kind;
	s->seg_ptr = (int **) 0;
	if (kind==SEGMENT_KIND_CODE) {
		s->seg_size = sizeof(char);
		if (initdim==0) initdim = 128;
		s->seg_dim = initdim;
		s->seg_extend = 128;
	}
	else {
		s->seg_size = sizeof(int);
		if (initdim==0) initdim = 32; /* initial dimension */
		s->seg_dim = initdim;
		s->seg_extend = 8;
	}
	s->seg_pos = 0;
	s->seg_maxpos = 0;
	s->seg_data = emalloct(s->seg_dim * s->seg_size, "segment-data");
	s->seg_id = SEG_ID;		/* insert value to check segment validity*/
	return s;
}

Segment segment_read(IFILE *file)				/*;segment_read*/
{
    Segment	seg;
	short	dim;
	int		kind;
	kind = getnum(file,"segment-kind");
	dim = getnum(file,"segment-dim");
	seg = segment_new(kind, dim);
#ifdef HI_LEVEL_IO
	fread(seg->seg_data,seg->seg_size,dim,file->fh_file);
#else
	read(file->fh_file,seg->seg_data,seg->seg_size*dim);
#endif
	seg->seg_maxpos = dim - 1;
	return seg;
}

void read_axq(IFILE *axq_file, Axq axq)							/*;read_axq*/
{
	/* axq has been set with loads an AXQ */

	Segment	newseg,segment_get();
	int		si,snum,nsegs,sj;
	char	**get_axq_slots();
	char	*funame,*u_type;
	long	genpos,rec;

#ifdef TBSL
	if (debug_trace) {
		TO_ERRFILE("reading axq ",  axq_file_name) ;
	}
	efclose(axq_file);
#endif
	for (rec=read_init(axq_file); rec != 0; rec=read_next(axq_file,rec)) {
		funame = getstr(axq_file,"axq-unit-name");
		getnum(axq_file,"axq-num");
		u_type = unit_name_type(funame);
		/* In the C version, DATA_SLOTS CODE_SLOTS and EXCEPTION_SLOTS are at
		 * the end of the file, and are read below
		 */
		/* load subprogram bodies, package specs and bodies and main unit */
		if (!(streq(u_type,"su") || streq(u_type,"sp") || streq(u_type,"bo")
		  || streq(u_type,"ma"))) {
			continue; /* skip other units */
		}
		genpos = getlong(axq_file,"axq-gen-pos");
		/* position to start of generator info */
		ifseek(axq_file, "axq-gen_info", genpos, 0);
		for (si=0;si<4;si++) {
			nsegs = getnum(axq_file,"number-segments");
			for (sj=1;sj<=nsegs;sj++) {
				snum = getnum(axq_file,"axq-segment-num");
				newseg = segment_read(axq_file);
				if (newseg->seg_kind==SEGMENT_KIND_CODE) {
					if (snum>=axq->axq_code_segments_dim)  {
#ifdef IOT
						if(axq_file->fh_trace) {
							printf("snum %d dim %d\n",snum,
							  axq->axq_code_segments_dim);
						}
#endif
						chaos("code_segment_number error");
					}
					axq->axq_code_segments[snum] = newseg->seg_data;
					axq->axq_code_seglen[snum] = newseg->seg_dim;
				}
				if (newseg->seg_kind==SEGMENT_KIND_DATA) {
					if (snum>=axq->axq_data_segments_dim)  {
#ifdef IOT
						if (axq_file->fh_trace) {
							printf("snum %d dim %d\n",snum,
							  axq->axq_data_segments_dim);
						}
#endif
						chaos("data_segment number too big");
					}
					axq->axq_data_segments[snum] = (int *) newseg->seg_data;
					axq->axq_data_seglen[snum] = newseg->seg_dim;
				}
			}
		}
	}
#ifdef TBSL
else {
	TO_LIST("*** Unable to read AXQfile ",axq_file_name);
	stop;
}
#endif
}

long get_cde_slots(IFILE *file, Axq axq)					/*;get_cde_slots*/
{
	/* get slots info from file. The offset within the file is not changed */

	long	dpos,start_pos;
	int		n_code,n_data,n_exception,dim;

	start_pos = iftell(file); /* save pos so can restore after reading slots*/
	dpos = file->fh_slots;/* get offset for slots */
	if (dpos==0l)
		chaos("get_cde_slots: slot offset zero");
	ifseek(file,"slots-start",dpos,0);/* position to start of slot info */
	n_code = getnum(file,"n-code");
	n_data = getnum(file,"n-data");
	n_exception = getnum(file,"n-exception");
	axq->axq_code_slots_dim = n_code + 1;
	axq->axq_code_slots = get_slot(file,n_code,&dim);
	axq->axq_code_segments_dim = dim;
	axq->axq_data_slots_dim = n_data + 1;
	axq->axq_data_slots = get_slot(file,n_data,&dim);
	axq->axq_data_segments_dim = dim;
	axq->axq_exception_slots_dim = n_exception + 1;
	axq->axq_exception_slots = get_slot(file,n_exception,&dim);
	axq->axq_exception_slots_dim = dim;
#ifdef IOT
	if (file->fh_trace) {
		printf("slots dims code %d data %d exception %d\n", /* DEBUG */
		  axq->axq_code_slots_dim, axq->axq_data_slots_dim,
		  axq->axq_exception_slots_dim);
		printf("code_segments_dim %d data_segments_dim %d\n", /* DEBUG */
		  axq->axq_code_segments_dim, axq->axq_data_segments_dim);
	}
#endif
	ifseek(file,"slots-reset",start_pos,0);/* restore position */
	return dpos; /* return offset of start of slot info */
}

static Slot *get_slot(IFILE *file, int nmax, int *dim)			/*;get_slot*/
{
	/* This procedure reads in the SLOTS information. 
	 * Entries are Slots structures. nmax is guess at needed dimension,
	 * dim is set to dimension actually found.
	 */

	int i,n,exists;
	Slot	*tup;
	Slot	slot;

	*dim = nmax+1;
	tup = (Slot *) emalloct((unsigned)*dim * sizeof(Slot), "get-slot");
	n  = getnum(file,"slot-entries");
#ifdef IOT
	if (file->fh_trace)
		printf("get_slot initial dim %d entries %d\n",*dim,n); /*DEBUG*/
#endif
	for (i = 1; i <= n; i++) {
		exists = getnum(file,"slot-exists");
		if (exists) {
			slot = (Slot) emalloct(sizeof(Slot_s), "get-slot-1");
			slot->slot_seq = getnum(file,"slot-seq");
			slot->slot_unit = getnum(file,"slot-unit");
			slot->slot_number = getnum(file,"slot-number");
			slot->slot_name = getstr(file,"slot_name");
			if (slot->slot_number >= *dim) {
				*dim = slot->slot_number + 1;
#ifdef IOT
				if (file->fh_trace)
					printf("expanding dim to %d\n",*dim); /* DEBUG */
#endif
			}
#ifdef IOT
			if (file->fh_trace)
				printf("reading entry %d slot number %d\n",i,slot->slot_number);
#endif
			tup[i] =  slot;
		}
		else {
			tup[i] = (Slot)0;
		}
	}
	return tup;
}

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