ftp.nice.ch/pub/next/developer/languages/lisp/AKCL.1.599.s.tar.gz#/akcl-1-599/c/fasl_pass2.c

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

/*
(C) Copyright Taiichi Yuasa and Masami Hagiya, 1984.  All rights reserved.
*/

/*
	fasl_pass2.c
	DG-SPECIFIC

	fasl loader pass2 routines
*/

#include "../h/fasl.h"
#include "../h/fasl_global.h"

data_pass2()
{
	FAS_HDR_P	hdr_p;
	FAS_DATA_P	data_p;
	FAS_DICT_P	dict_p;

	int	not_over;	/* overwrite flag */
	short	*block_end;	/* end of this block */
	short	*rdata_p;	/* relocation data pointer */
	short	*p_addr;	/* partition start addr */
	short	*rdata_addr;	/* relocationed data addr */
	short	*base_p;	/* base pointer */
	short	*dword_p;	/* dictionaried data word pointer */
	short	data_len;	/* copy of data_words */
	short	base, repeat_count;
	short	reloc;		/* relocation operation */
	short	reloc_ex;	/* extended relocaton operation */

	/* initialize */
	hdr_p = (FAS_HDR_P)fas_buffp;
	if ((hdr_p->hdr_typ) && OVER_BIT)
		not_over = FALSE;
		else
		not_over = TRUE;
	block_end = (short *)fas_buffp + hdr_p->hdr_len;
	data_p = (FAS_DATA_P)(fas_buffp + FAS_HEADER_BLEN);
	if (datab_rev < 2)
		rdata_p = (short *)(data_p + 1) - 2;
		else
		rdata_p = (short *)(data_p + 1);
	data_len = data_p->data_words;
	if (data_len == 0) return;

	if (datab_rev < 2)
		repeat_count = 1;
		else
		repeat_count = data_p->data_repeat;
	base = data_p->data_base;

/*
	part_table_p = fasl_get_table(base);
	p_addr = (short *)(part_table_p->part_addr);
*/
	p_addr = fasl_get_addr(base);

	/* data relocation */
	reloc = (data_p->data_reloc) & RELOC_OP;
	reloc_ex = ((data_p->data_reloc) & RELOC_OP_EX) >> RELOC_OP_S;
	if (reloc != EX_RELOC) unexpect_reloc(reloc);

	base_p = &(data_p->data_base);
	dword_p = &(data_p->data_disp);
	relocation(reloc_ex, base_p, dword_p);
	rdata_addr = *((int *)dword_p);

	while(repeat_count-- > 0) {
/*	  if (not_over == TRUE)
	  	fasl_set_map(rdata_addr - fas_rstart, data_len,
				rdata_p, rdata_addr);		*/
	  /* block move data to alocated memory */
	  blockmove((char *)rdata_addr, (char *)rdata_p, data_len * 2);
	  dict_p = (FAS_DICT_P)(rdata_p + data_len);
				/* set to first dictionary */

	  while (dict_p < block_end) {	/* loop for each dictionary */
		reloc = (dict_p->dict_reloc) & RELOC_OP;
		reloc_ex = ((dict_p->dict_reloc) & RELOC_OP_EX)
							>> RELOC_OP_S;

/*		if ((reloc != EX_RELOC) && (reloc != BIT_RELOC)) */
		if (reloc != EX_RELOC)
			unexpect_reloc(reloc);

		/* set base pointer */
		base_p = &(dict_p->dict_base);
	  	/* set dictionaried data word pointer */
		if (datab_rev == 0)
			dword_p = p_addr + dict_p->dict_data;
			else		/* offset from partition */
			dword_p = rdata_addr + dict_p->dict_data;
					/* offset from data */
		/* relocate this data word */
		relocation(reloc_ex, base_p, dword_p);
		/* for next dictionary */
		dict_p = dict_p + 1;
	  }	/* end of while for each dictionary */

	  /* advance rdata_addr to relocate once more */
	  rdata_addr += data_len;
	}	/* end of while for repeat count */
}

ent_pass2()
{
	FAS_HDR_P	hdr_p;
	FAS_ENT_P	ent_p;
	FAS_ENTD_P	entd_p;

	short	name_len, base, reloc, reloc_ex;
	short	*base_p, *dword_p;
	long	disp;
	char	*name_ptr;
	char	namebuff[MAX_SYMBOL + 1];
	int	i, repeat;

	if (fas_routine_addr != 0) return;

	hdr_p = (FAS_HDR_P)fas_buffp;
	ent_p = (FAS_ENT_P)(hdr_p + 1);
	entd_p = (FAS_ENTD_P)(ent_p + 1);

	repeat = ent_p->ent_count;

	while (repeat-- > 0) {
	   name_len = (entd_p->entd_len) & L_MASK;
	   if (name_len < 4) goto NEXT;
	   name_ptr = (char *)fas_buffp + (entd_p->entd_ptr);
	   for (i=0; i < 4; i++)	/* compare first 4 bytes */
		namebuff[i] = *(name_ptr + i);
	   namebuff[i] = '\0';

	   if (strcmp(fas_routine_name, namebuff) == 0) goto FOUND_SYM;
				/* init routine name ? */

NEXT:
	   entd_p += 1;	/* advance for next */
	   continue;

FOUND_SYM:
	   /* We found the init routine's symbol. Relocate it. */

	   reloc = entd_p->entd_reloc & RELOC_OP;
	   reloc_ex = (entd_p->entd_reloc & RELOC_OP_EX) >> RELOC_OP_S;

	   if (reloc != EX_RELOC) unexpect_reloc(reloc);

	   base_p = &(entd_p->entd_base);
	   dword_p = &(entd_p->entd_disp);
	   relocation(reloc_ex, base_p, dword_p);

	   /* save init routine address */
	   fas_routine_addr = *((int *)dword_p);
	   break;
	   }	/* end of while */
}

fasl_set_map(sb, len, sp, dp)
int sb, len;
short *sp, *dp;
{
	int	i, mask;

/*
	while(len-- > 0) {
		i = sb / 32;
		mask = 1 << (31 - sb % 32);
		if ((fas_map[i] & mask) &&
		    (*(dp + sb) != *(sp + sb)))
			FEerror("Overwrite error", 0);
		fas_map[i] |= mask;
		sb++;
	}
*/
}

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