Minix again
This commit is contained in:
		
							parent
							
								
									01f77a03af
								
							
						
					
					
						commit
						b6a7d4fa0f
					
				
					 6 changed files with 37 additions and 59 deletions
				
			
		| 
						 | 
				
			
			@ -21,7 +21,7 @@
 | 
			
		|||
 | 
			
		||||
 | 
			
		||||
!File: nparams.h
 | 
			
		||||
#define	NPARAMS 32	/* maximum number of parameters of macros	*/
 | 
			
		||||
#define	NPARAMS 32	/* maximum number of parameters 		*/
 | 
			
		||||
#define	STDC_NPARAMS 31	/* ANSI limit on number of parameters		*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -21,7 +21,7 @@
 | 
			
		|||
 | 
			
		||||
 | 
			
		||||
!File: nparams.h
 | 
			
		||||
#define	NPARAMS 32	/* maximum number of parameters of macros	*/
 | 
			
		||||
#define	NPARAMS 32	/* maximum number of parameters 		*/
 | 
			
		||||
#define	STDC_NPARAMS 31	/* ANSI limit on number of parameters		*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -348,7 +348,7 @@ equal_type(tp, otp, check_qual)
 | 
			
		|||
	    || (tp->tp_unsigned != otp->tp_unsigned)
 | 
			
		||||
	    || (tp->tp_align != otp->tp_align))
 | 
			
		||||
		return 0;
 | 
			
		||||
	if (tp->tp_fund != ARRAY /* && tp->tp_fund != STRUCT */ ) {	/* UNION ??? */
 | 
			
		||||
	if (tp->tp_fund != ARRAY) {
 | 
			
		||||
		if (tp->tp_size != otp->tp_size)
 | 
			
		||||
			return 0;
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -516,6 +516,7 @@ struct type *tp;
 | 
			
		|||
	register struct sdef *sdf;
 | 
			
		||||
 | 
			
		||||
	ASSERT(tp);
 | 
			
		||||
 | 
			
		||||
	if (tp->tp_typequal & TQ_CONST) return 1;
 | 
			
		||||
	sdf = tp->tp_sdef;
 | 
			
		||||
	while (sdf) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -206,7 +206,7 @@ ch3bin(expp, oper, expr)
 | 
			
		|||
				*expp = intexpr((arith)((oper == AND) ? 0 : 1),
 | 
			
		||||
						INT);
 | 
			
		||||
			}
 | 
			
		||||
			(*expp)->ex_flags |= ex->ex_flags;
 | 
			
		||||
			(*expp)->ex_flags |= ex->ex_flags | EX_ILVALUE;
 | 
			
		||||
			free_expression(ex);
 | 
			
		||||
		}
 | 
			
		||||
		else
 | 
			
		||||
| 
						 | 
				
			
			@ -217,7 +217,7 @@ ch3bin(expp, oper, expr)
 | 
			
		|||
				and ((oper == AND) || (oper == OR))
 | 
			
		||||
			*/
 | 
			
		||||
			if ((oper == AND) == (expr->VL_VALUE != (arith)0)) {
 | 
			
		||||
				(*expp)->ex_flags |= expr->ex_flags;
 | 
			
		||||
				(*expp)->ex_flags |= expr->ex_flags | EX_ILVALUE;
 | 
			
		||||
				free_expression(expr);
 | 
			
		||||
			}
 | 
			
		||||
			else {
 | 
			
		||||
| 
						 | 
				
			
			@ -297,7 +297,8 @@ pntminuspnt(expp, oper, expr)
 | 
			
		|||
	ch3cast(expp, CAST, pa_type);	/* ptr-ptr: result has pa_type	*/
 | 
			
		||||
	ch3bin(expp, '/',
 | 
			
		||||
		intexpr(size_of_type(up_type, "object"), pa_type->tp_fund));
 | 
			
		||||
	ch3cast(expp, CAST, int_type);	/* result will be an integer expr */
 | 
			
		||||
	ch3cast(expp, CAST, pa_type);	/* result will be an integgral expr */
 | 
			
		||||
					/* cast necessary ??? */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
mk_binop(expp, oper, expr, commutative)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -29,7 +29,7 @@ struct pkey {
 | 
			
		|||
	char *pk_name;
 | 
			
		||||
	int pk_key;
 | 
			
		||||
} pragmas[] = {
 | 
			
		||||
	{"flags",	P_FLAGS},
 | 
			
		||||
	{"cemflags",	P_FLAGS},
 | 
			
		||||
	{0,		P_UNKNOWN}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -319,23 +319,26 @@ free_proto_list(pl)
 | 
			
		|||
remove_proto_tag(tp)
 | 
			
		||||
struct type *tp;
 | 
			
		||||
{
 | 
			
		||||
	struct idf *ident;
 | 
			
		||||
	struct tag *tg, *otg = 0;
 | 
			
		||||
	register struct idf *ident;
 | 
			
		||||
	register struct tag *tgp, **tgpp;
 | 
			
		||||
 | 
			
		||||
	while(tp->tp_up) tp = tp->tp_up;
 | 
			
		||||
 | 
			
		||||
	ident = tp->tp_idf;
 | 
			
		||||
	switch(tp->tp_fund) {
 | 
			
		||||
	case ENUM: tg = ident->id_enum; break;
 | 
			
		||||
	case UNION:
 | 
			
		||||
	case STRUCT: tg = ident->id_struct; break;
 | 
			
		||||
	switch (tp->tp_fund) {
 | 
			
		||||
	case ENUM: tgpp = &(ident->id_enum); break;
 | 
			
		||||
	case STRUCT:
 | 
			
		||||
	case UNION: tgpp = &(ident->id_struct); break;
 | 
			
		||||
	default: return;
 | 
			
		||||
	}
 | 
			
		||||
	while (tg && tg->tg_type != tp) {
 | 
			
		||||
		otg = tg;
 | 
			
		||||
		tg = tg->next;
 | 
			
		||||
 | 
			
		||||
	while((*tgpp) && (*tgpp)->tg_type != tp) {
 | 
			
		||||
		tgpp = &((*tgpp)->next);
 | 
			
		||||
	}
 | 
			
		||||
	if (tg ->tg_level > L_PROTO) return;
 | 
			
		||||
	ASSERT(*tgpp);
 | 
			
		||||
 | 
			
		||||
	tgp = *tgpp;
 | 
			
		||||
	if (tgp->tg_level > L_PROTO) return;
 | 
			
		||||
 | 
			
		||||
#ifdef DEBUG
 | 
			
		||||
	if (options['t'])
 | 
			
		||||
| 
						 | 
				
			
			@ -343,26 +346,15 @@ struct type *tp;
 | 
			
		|||
			ident->id_text);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
	if (!otg) {
 | 
			
		||||
		switch(tp->tp_fund) {
 | 
			
		||||
		case ENUM: ident->id_enum = tg->next; break;
 | 
			
		||||
		case UNION:
 | 
			
		||||
		case STRUCT: ident->id_struct = tg->next; break;
 | 
			
		||||
		}
 | 
			
		||||
		free_tag(tg);
 | 
			
		||||
	}
 | 
			
		||||
	else {
 | 
			
		||||
		otg->next = tg->next;
 | 
			
		||||
		free_tag(tg);
 | 
			
		||||
	}
 | 
			
		||||
	(*tgpp) = tgp->next;
 | 
			
		||||
	free_tag(tgp);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
remove_proto_idfs(pl)
 | 
			
		||||
	register struct proto *pl;
 | 
			
		||||
{
 | 
			
		||||
	/*	Remove all the identifier definitions from the
 | 
			
		||||
		prototype list. Keep in account the recursive
 | 
			
		||||
		function definitions.
 | 
			
		||||
		prototype list.
 | 
			
		||||
	*/
 | 
			
		||||
	register struct def *def;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -372,21 +364,6 @@ remove_proto_idfs(pl)
 | 
			
		|||
			if (options['t'])
 | 
			
		||||
				print("Removing idf %s from list\n",
 | 
			
		||||
					pl->pl_idf->id_text);
 | 
			
		||||
#endif
 | 
			
		||||
			/*	Remove all the definitions made within
 | 
			
		||||
				a prototype.
 | 
			
		||||
				??? is this really necessary (Hans)
 | 
			
		||||
				wasn't this done before in the declaration
 | 
			
		||||
			*/
 | 
			
		||||
#if 0
 | 
			
		||||
			if (pl->pl_flag & PL_FORMAL) {
 | 
			
		||||
				register struct type *tp = pl->pl_type;
 | 
			
		||||
 | 
			
		||||
				while (tp && tp->tp_fund != FUNCTION)
 | 
			
		||||
					tp = tp->tp_up;
 | 
			
		||||
				if (tp)
 | 
			
		||||
				    debug("remove_proto_idfs(tp->tp_proto)");
 | 
			
		||||
			}
 | 
			
		||||
#endif
 | 
			
		||||
			def = pl->pl_idf->id_def;
 | 
			
		||||
			if (def && def->df_level <= L_PROTO){
 | 
			
		||||
| 
						 | 
				
			
			@ -417,34 +394,34 @@ call_proto(expp)
 | 
			
		|||
	register struct proto *pl = NO_PROTO;
 | 
			
		||||
	static struct proto ellipsis = { 0, 0, 0, PL_ELLIPSIS };
 | 
			
		||||
 | 
			
		||||
	if (left != NILEXPR) {	/* in case of an error */
 | 
			
		||||
	if (left != NILEXPR) {		/* in case of an error */
 | 
			
		||||
		register struct type *tp = left->ex_type;
 | 
			
		||||
 | 
			
		||||
		while (tp && tp->tp_fund != FUNCTION)
 | 
			
		||||
			tp = tp->tp_up;
 | 
			
		||||
		pl = (tp && tp->tp_proto) ? tp->tp_proto : NO_PROTO;
 | 
			
		||||
		if (tp && tp->tp_proto)
 | 
			
		||||
			pl = tp->tp_proto;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (right != NILEXPR) { /* function call with parameters */
 | 
			
		||||
		register struct expr *ex = right;
 | 
			
		||||
	if (right != NILEXPR) {		/* function call with parameters */
 | 
			
		||||
		register struct expr **ep = &((*expp)->OP_RIGHT);
 | 
			
		||||
		register int ecnt = 0, pcnt = 0;
 | 
			
		||||
		struct expr **estack[NPARAMS];
 | 
			
		||||
		struct proto *pstack[NPARAMS];
 | 
			
		||||
 | 
			
		||||
		/* stack up the parameter expressions */
 | 
			
		||||
		while (ex->ex_class == Oper && ex->OP_OPER == PARCOMMA) {
 | 
			
		||||
		while (right->ex_class == Oper && right->OP_OPER == PARCOMMA) {
 | 
			
		||||
			if (ecnt == STDC_NPARAMS)
 | 
			
		||||
				strict("number of parameters exceeds ANSI limit");
 | 
			
		||||
			if (ecnt >= NPARAMS-1) {
 | 
			
		||||
				error("too many parameters");
 | 
			
		||||
				return;
 | 
			
		||||
			}
 | 
			
		||||
			estack[ecnt++] = &(ex->OP_RIGHT);
 | 
			
		||||
			ep = &(ex->OP_LEFT);
 | 
			
		||||
			ex = ex->OP_LEFT;
 | 
			
		||||
			estack[ecnt++] = &(right->OP_RIGHT);
 | 
			
		||||
			ep = &(right->OP_LEFT);
 | 
			
		||||
			right = right->OP_LEFT;
 | 
			
		||||
		}
 | 
			
		||||
		estack[ecnt++] = ep;
 | 
			
		||||
		estack[ecnt] = ep;
 | 
			
		||||
 | 
			
		||||
		/*	Declarations like int f(void) do not expect any
 | 
			
		||||
			parameters.
 | 
			
		||||
| 
						 | 
				
			
			@ -456,19 +433,18 @@ call_proto(expp)
 | 
			
		|||
 | 
			
		||||
		/* stack up the prototypes */
 | 
			
		||||
		if (pl) {
 | 
			
		||||
			pcnt--;
 | 
			
		||||
			do {
 | 
			
		||||
				/* stack prototypes */
 | 
			
		||||
				pstack[pcnt++] = pl;
 | 
			
		||||
				pstack[++pcnt] = pl;
 | 
			
		||||
				pl = pl->next;
 | 
			
		||||
			} while (pl);
 | 
			
		||||
			pcnt--;
 | 
			
		||||
		}
 | 
			
		||||
		else {
 | 
			
		||||
			pcnt = 0;
 | 
			
		||||
			pstack[0] = &ellipsis;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		for (--ecnt; ecnt >= 0; ecnt--) {
 | 
			
		||||
		for (ecnt; ecnt >= 0; ecnt--) {
 | 
			
		||||
			/*	Only the parameters specified in the prototype
 | 
			
		||||
				are checked and converted. The parameters that
 | 
			
		||||
				fall under the ellipsis clause are neither
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		
		Reference in a new issue