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

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

 */
#include "ada.h"
#include "stdlib.h"
#include "adalexprots.h"
#include "miscprots.h"
#include "prsutilprots.h"

int	stack_count(struct prsstack *ps)						/*;stack_count*/
{
	int size = 0;

	while( ps != (struct prsstack *)0) {
		ps = ps->prev;
		size++;
	}

	return (size);
}

void copystack(struct two_pool *s, struct two_pool **head, int *size)
															/*;copystack*/
{
	/*	This procedure copies the stack s represented by a singly linked list
	 *  It returns a pointer to the head (top) of the new stack, as well as a
	 *  count of the size of the stack, returned in size
	 *  Note : lists in the front-end are circular, so the link of the last node
	 *	   points to the head of the list.
	 */

	struct two_pool *next,
	*tmp_tp;

	*size = 1;
	/*	Copy head node	 */
	tmp_tp = *head = TALLOC ();
	tmp_tp -> link = NULL;
	tmp_tp -> val.state = s -> val.state;
	/*  Copy rest of list	 */
	next = s -> link;
	while (next != NULL) {
		tmp_tp -> link = TALLOC ();
		tmp_tp = tmp_tp -> link;
		tmp_tp -> link = NULL;
		tmp_tp -> val.state = next -> val.state;
		next = next -> link;
		(*size)++;
	}
}

void dump_stack(struct two_pool *s)						/*;dump_stack*/
{
	int	    count = 0;
#ifdef DEBUG
	if (trcopt) {
		while (s != (struct two_pool *)0) {
			count++;
			fprintf (errfile, "%d %s", s -> val.state,
			  ( ((count%10) == 0) ? "\n":",") );
			s = s -> link;
		}
		fprintf (errfile, " ======>size = %d<====== \n",count);
	}
#endif
}

void dump_prssyms(struct two_pool *s)					/*;dump_prssyms*/
{
	int	    count = 0;
#ifdef DEBUG
	if (trcopt) {
		while (s != (struct two_pool *)0) {
			count++;
			fprintf (errfile, "%s %s", TOKSTR(s -> val.state),
			  ( ((count%5) == 0) ? "\n":",") );
			s = s -> link;
		}
		fprintf (errfile, " ======>size = %d<====== \n",count);
	}
#endif
}

void dump_prsstack(struct prsstack *p)					/*;dump_prsstack*/ 
{
	/* dump symbols of parse stack */
	int count = 0;
#ifdef DEBUG
	if (trcopt) {
		while (p!=(struct prsstack *)0) {
			count++;
			fprintf(errfile,"%s %c",TOKSTR(p->symbol),
			  ( (count%5 == 0) ? '\n' : ' ') );
			p = p->prev;
		}
		fprintf(errfile,"	 size = %d\n",count);
	}
#endif
}

void dump_toksyms(char *s)							/*;dump_toksyms*/
{
	int	    t;

#ifdef DEBUG
	if (trcopt) {
		fprintf (errfile, "Dump of TOKSYMS [%s]\n", s);
		for (t = n_TOKSYMS; t >= 0; t--) {
			fprintf (errfile, "%s%s", TOKSTR(TOKSYMS[t]),
			  ((t % 15) == 14 ? "\n" : " "));
		}
		fprintf (errfile, "\n	< ===== >\n");
	}
#endif
}


void convtolower(char *s)								/*;convtolower*/
{
	/* Convtolower: convert an entire string to lowercase. */
	while (*s) {
		if (isupper(*s))
			*s = tolower(*s);
		s++;
	}
}

void cand_clear()										/*;cand_clear*/
{
	/* cand_clear :	 clear (reinitialize) all candidate sets to empty */
	short x;

	for (x = DELETE; x <= SPELL_SUBST; x++) {
		/* TBSL: free current candidates */
		CANDIDATES[x] = NULL;
		n_CANDIDATES[x] = 0;
	}
}

void dump_cand()										/*;dump_cand*/
{
	/* dump_cand :	dump contents of the candidates map to errfile */
	short x,i;
	struct cand *c;
	char *sub;

#ifdef DEBUG
	if (trcopt) {
		for (x = DELETE; x <= SPELL_SUBST; x++) {
			switch (x) {
			case DELETE:
			case MERGE:
				if (n_CANDIDATES[x] == 0)
					break;
				fprintf(errfile,"%s :\n",(x == DELETE ? "delete" : "merge"));
				c = CANDIDATES[x];
				i=0;
				while (c != (struct cand *)0) {
					fprintf(errfile,"[ %s %d ] %c",TOKSTR(c->token_sym),
					  c->backup_toks+1,((++i % 5) == 0 ? '\n' : ' ') );
					c = c->next;
				}  /* end while */
				if (i%5 != 0) fprintf(errfile,"\n");
				break;
			case INSERT:
			case SUBST:
			case SPELL_SUBST:
				if (n_CANDIDATES[x] == 0)
					break;
				if (x == INSERT) sub = "insert";
				else if (x == SUBST) sub = "subst";
				else sub = "spell_subst";

				fprintf(errfile,"%s :\n",sub);
				c = CANDIDATES[x];
				i=0;
				while (c != (struct cand *)0) {
					fprintf(errfile,"[ %s %s %d ] %c",TOKSTR(c->token_sym),
					  TOKSTR(c->t3),
					  c->backup_toks+1,((++i % 4) == 0 ? '\n' : ' ') );
					c = c->next;
				}
				if (i%4 != 0) fprintf(errfile,"\n");
				break;
			} /* end switch */
		} /* end for */
	}
#endif
}

struct prsstack *copytoken(struct prsstack *b)				/*;copytoken*/
{
	struct prsstack *a;
	char *oldp, *newp;
	int i;

	/* First get space for a */
	a = PRSALLOC();
	a->symbol = b->symbol;
	a->prev = NULL;
	if ( ISTOKEN(b) ) { /* copy token structure */

		a->ptr.token = TOKALLOC();
		a->ptr.token->index = b->ptr.token->index;
		a->ptr.token->loc = b->ptr.token->loc;
	}
	else {  /* copy ast structure */

		a->ptr.ast = new_node(b->ptr.ast->kind);
		oldp = (char *)(b->ptr.ast); 
		newp = (char *)(a->ptr.ast);
		for (i = 0; i < sizeof(struct ast); i++)
			*newp++ = *oldp++;
	}
	/* end of macro definition */
	return a;
}

/* start allocation routines */

/* This file contains the allocation and freeing routines for various
   structures */
/* replace EMalloc by emalloc (misc.c)
 * char *EMalloc(n)
 */


static struct prsstack *deadprsstack = (struct prsstack *)0;
static void prsfree1(struct prsstack *, struct prsstack *);
static void prsfree2(struct prsstack *, struct prsstack *);
static struct prsstack * prsfakealloc();
struct prsstack *(*prsalloc)(unsigned) =(struct prsstack *(*)(unsigned))emalloc;
void (*prsfree)(struct prsstack *, struct prsstack *) = prsfree1;

static struct prsstack *prsfakealloc()					/*;prsfakealloc*/
{
	struct prsstack *tmp;

	if (deadprsstack != (struct prsstack *)0) {
		tmp = deadprsstack;
		deadprsstack = deadprsstack->prev;
		return(tmp);
	}
	prsalloc = (struct prsstack *(*)(unsigned)) emalloc;
	prsfree = prsfree1;
	return((struct prsstack *)emalloc(sizeof(struct prsstack)));
}

static void prsfree1(struct prsstack *p, struct prsstack *q)	/*;prsfree1*/
{
	prsfree = prsfree2;
	prsalloc = (struct prsstack *(*)(unsigned)) prsfakealloc;
	q->prev = deadprsstack;
	deadprsstack = p;
}

static void prsfree2(struct prsstack *p, struct prsstack *q)	/*;prsfree2*/
{
	q->prev = deadprsstack;
	deadprsstack = p;
}

static struct two_pool *deadtwostack = (struct two_pool *)0;
static void tfree1(struct two_pool *, struct two_pool *);
static void tfree2(struct two_pool *, struct two_pool *);
static struct two_pool *tfakealloc();
struct two_pool *(*talloc)(unsigned) = (struct two_pool *(*)(unsigned)) emalloc;
void (*tfree)(struct two_pool *, struct two_pool *) = tfree1;

static struct two_pool *tfakealloc()
{
	struct two_pool *tmp;

	if (deadtwostack != (struct two_pool *)0) {
		tmp = deadtwostack;
		deadtwostack = deadtwostack->link;
		return(tmp);
	}
	talloc = (struct two_pool *(*)(unsigned)) emalloc;
	tfree = tfree1;
	return((struct two_pool *)emalloc(sizeof(struct two_pool)));
}

static void tfree1(struct two_pool *p, struct two_pool *q)		/*;tfree1*/
{
	tfree = tfree2;
	talloc = (struct two_pool *(*)(unsigned)) tfakealloc;
	q->link = deadtwostack;
	deadtwostack = p;
}

static void tfree2(struct two_pool *p, struct two_pool *q)		/*;tfree2*/
{
	q->link = deadtwostack;
	deadtwostack = p;
}

static struct token *deadtokstack = (struct token *)0;
static void tokfree1(struct token *);						/*;tokfree1*/
static void tokfree2(struct token *);						/*;tokfree1*/
static struct token *tokfakealloc();
struct token *(*tokalloc)(unsigned) = (struct token *(*)(unsigned)) emalloc;
void (*tokfree)(struct token *) = tokfree1;

static struct token *tokfakealloc()						/*;tokfakealloc*/
{
	struct token *tmp;

	if (deadtokstack == (struct token *)0) {
		tokalloc = (struct token *(*)(unsigned)) emalloc;
		tokfree = tokfree1;
		return((struct token *)emalloc(sizeof(struct token)));
	}
	tmp = deadtokstack;
	deadtokstack = ((struct tmptok *)deadtokstack)->link;
	return(tmp);
}

static void tokfree1(struct token *p)						/*;tokfree1*/
{
	((struct tmptok *)p)->link = deadtokstack;
	deadtokstack = p;
	tokalloc = (struct token *(*)(unsigned)) tokfakealloc;
	tokfree = tokfree2;
}

static void tokfree2(struct token *p)						/*;tokfree2*/
{
	((struct tmptok *)p)->link = deadtokstack;
	deadtokstack = p;
}

static struct ast *deadnodestack = (struct ast *)0;

struct ast *new_node(int kind)								/*;new_node*/
{
	struct ast *node;

	if (deadnodestack == (struct ast *) 0)
		node = (struct ast *)emalloc(sizeof(struct ast));
	else {
		node = deadnodestack;
		deadnodestack = ((struct tmpnode *)deadnodestack)->link;
	}
	node->kind = kind;
	node->count = 0;  /* This is used to check if a count has been set */
#ifdef DEBUG
	/* initialize spans information to 0 (may not be necessary!!) */
	node->span.line = node->span.col = 0;
#endif
	return(node);
}

void nodefree(struct ast *p)								/*;nodefree*/
{
	if (p != opt_node && p != any_node && p->kind != AS_FREE) {
		((struct tmpnode *)p)->link = deadnodestack;
		((struct tmpnode *)p)->kind = AS_FREE;
		deadnodestack = p;
	}
}

static struct ast **deadaststack = (struct ast **)0;

struct ast **astalloc()											/*;astalloc*/
{
	struct ast **tmp;

	if (deadaststack == (struct ast **)0)
		return((struct ast **)emalloc(MAX_AST * sizeof(struct ast *)));
	tmp = deadaststack;
	deadaststack = ((struct tmpast *)deadaststack)->link;
	return(tmp);
}

void astfree(struct ast **p)									/*;astfree*/
{
	((struct tmpast *)p)->link = deadaststack;
	deadaststack = p;
}

/* Cand stuff is for error recovery */

struct cand *(*candalloc)(unsigned) = (struct cand *(*)(unsigned)) emalloc;

char *find_name(struct prsstack *x)								/*;find_name*/
{
	if  (ISTOKEN(x)) return TOKSTR(x->ptr.token->index);
	return namelist(x->symbol);
}

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