prototypes now handled by lint
This commit is contained in:
		
							parent
							
								
									a0460b8bfc
								
							
						
					
					
						commit
						ca104453ca
					
				
					 7 changed files with 119 additions and 54 deletions
				
			
		| 
						 | 
					@ -145,6 +145,13 @@ dumpidf(idf, opt)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		dumptags(idf->id_struct);
 | 
							dumptags(idf->id_struct);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						if (idf->id_enum)	{
 | 
				
			||||||
 | 
							if (!started++)	{
 | 
				
			||||||
 | 
								newline();
 | 
				
			||||||
 | 
								print("%s:", idf->id_text);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							dumptags(idf->id_enum);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
dumpdefs(def, opt)
 | 
					dumpdefs(def, opt)
 | 
				
			||||||
| 
						 | 
					@ -163,7 +170,7 @@ dumpdefs(def, opt)
 | 
				
			||||||
		);
 | 
							);
 | 
				
			||||||
		print("%s, line %u",
 | 
							print("%s, line %u",
 | 
				
			||||||
			def->df_file ? def->df_file : "NO_FILE", def->df_line);
 | 
								def->df_file ? def->df_file : "NO_FILE", def->df_line);
 | 
				
			||||||
		dump_type(def->df_type);
 | 
							dumptype(def->df_type);
 | 
				
			||||||
		def = def->next;
 | 
							def = def->next;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	dumplevel--;
 | 
						dumplevel--;
 | 
				
			||||||
| 
						 | 
					@ -229,7 +236,7 @@ dumpsdefs(sdef, sdk)
 | 
				
			||||||
	dumplevel--;
 | 
						dumplevel--;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
dump_proto(pl)
 | 
					dumpproto(pl)
 | 
				
			||||||
	register struct proto *pl;
 | 
						register struct proto *pl;
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	register struct type *type;
 | 
						register struct type *type;
 | 
				
			||||||
| 
						 | 
					@ -246,7 +253,7 @@ dump_proto(pl)
 | 
				
			||||||
				? "ellipsis" : "unknown" ));
 | 
									? "ellipsis" : "unknown" ));
 | 
				
			||||||
		newline();
 | 
							newline();
 | 
				
			||||||
		if (type = pl->pl_type){
 | 
							if (type = pl->pl_type){
 | 
				
			||||||
			dump_type(type);
 | 
								dumptype(type);
 | 
				
			||||||
			newline();
 | 
								newline();
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if (pl->pl_idf) {
 | 
							if (pl->pl_idf) {
 | 
				
			||||||
| 
						 | 
					@ -261,7 +268,7 @@ dump_proto(pl)
 | 
				
			||||||
	print("dump proto type list (end)\n");
 | 
						print("dump proto type list (end)\n");
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
dump_type(tp)
 | 
					dumptype(tp)
 | 
				
			||||||
	register struct type *tp;
 | 
						register struct type *tp;
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int ops = 1;
 | 
						int ops = 1;
 | 
				
			||||||
| 
						 | 
					@ -271,6 +278,7 @@ dump_type(tp)
 | 
				
			||||||
	if (!tp) {
 | 
						if (!tp) {
 | 
				
			||||||
		print("<NILTYPE>");
 | 
							print("<NILTYPE>");
 | 
				
			||||||
		newline();
 | 
							newline();
 | 
				
			||||||
 | 
							dumplevel--;
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -290,7 +298,7 @@ dump_type(tp)
 | 
				
			||||||
			if (tp->tp_proto) {
 | 
								if (tp->tp_proto) {
 | 
				
			||||||
				print("with prototype");
 | 
									print("with prototype");
 | 
				
			||||||
				dumplevel++;
 | 
									dumplevel++;
 | 
				
			||||||
				dump_proto(tp->tp_proto);
 | 
									dumpproto(tp->tp_proto);
 | 
				
			||||||
				dumplevel--;
 | 
									dumplevel--;
 | 
				
			||||||
				newline();
 | 
									newline();
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
| 
						 | 
					@ -302,7 +310,7 @@ dump_type(tp)
 | 
				
			||||||
			if (tp->tp_idf)
 | 
								if (tp->tp_idf)
 | 
				
			||||||
				print("%s ", tp->tp_idf->id_text);
 | 
									print("%s ", tp->tp_idf->id_text);
 | 
				
			||||||
#ifndef NOBITFIELD
 | 
					#ifndef NOBITFIELD
 | 
				
			||||||
			if (tp->tp_field)	{
 | 
								if (tp->tp_fund == FIELD && tp->tp_field)	{
 | 
				
			||||||
				struct field *fd = tp->tp_field;
 | 
									struct field *fd = tp->tp_field;
 | 
				
			||||||
				
 | 
									
 | 
				
			||||||
				print("[s=%ld,w=%ld] of ",
 | 
									print("[s=%ld,w=%ld] of ",
 | 
				
			||||||
| 
						 | 
					@ -356,7 +364,7 @@ type2str(tp)
 | 
				
			||||||
				sprint(buf, "%s %s ", buf,
 | 
									sprint(buf, "%s %s ", buf,
 | 
				
			||||||
					tp->tp_idf->id_text);
 | 
										tp->tp_idf->id_text);
 | 
				
			||||||
#ifndef NOBITFIELD
 | 
					#ifndef NOBITFIELD
 | 
				
			||||||
			if (tp->tp_field)	{
 | 
								if (tp->tp_fund == FIELD && tp->tp_field)	{
 | 
				
			||||||
				struct field *fd = tp->tp_field;
 | 
									struct field *fd = tp->tp_field;
 | 
				
			||||||
				
 | 
									
 | 
				
			||||||
				sprint(buf, "%s [s=%ld,w=%ld] of ", buf,
 | 
									sprint(buf, "%s [s=%ld,w=%ld] of ", buf,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -8,14 +8,21 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define	LFDF	'a'	/* Library Function Definition */
 | 
					#define	LFDF	'a'	/* Library Function Definition */
 | 
				
			||||||
#define	LVDF	'b'	/* Library Variable Definition */
 | 
					#define	LVDF	'b'	/* Library Variable Definition */
 | 
				
			||||||
#define	EFDF	'c'	/* External Function Definition */
 | 
					
 | 
				
			||||||
#define	EVDF	'd'	/* External Variable Definition */
 | 
					#define	PFDF	'd'	/* Prototype Function Definition */
 | 
				
			||||||
#define	EFDC	'e'	/* External Function Declaration */
 | 
					
 | 
				
			||||||
#define	EVDC	'f'	/* External Variable Declaration */
 | 
					#define	EFDF	'f'	/* External Function Definition */
 | 
				
			||||||
#define	IFDC	'g'	/* Implicit Function Declaration */
 | 
					#define	EVDF	'g'	/* External Variable Definition */
 | 
				
			||||||
#define	SFDF	'h'	/* Static Function Definition */
 | 
					#define	EFDC	'h'	/* External Function Declaration */
 | 
				
			||||||
#define	SVDF	'i'	/* Static Variable Definition */
 | 
					#define	EVDC	'i'	/* External Variable Declaration */
 | 
				
			||||||
#define	FC	'j'	/* Function Call */
 | 
					
 | 
				
			||||||
#define	VU	'k'	/* Variable Usage */
 | 
					#define	IFDC	'm'	/* Implicit Function Declaration */
 | 
				
			||||||
#define	XXDF	'l'	/* Ignore Class */
 | 
					
 | 
				
			||||||
 | 
					#define	SFDF	'q'	/* Static Function Definition */
 | 
				
			||||||
 | 
					#define	SVDF	'r'	/* Static Variable Definition */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	FC	'u'	/* Function Call */
 | 
				
			||||||
 | 
					#define	VU	'v'	/* Variable Usage */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define	XXDF	'z'	/* Ignore Class */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -364,6 +364,10 @@ lint_ptr_conv(from, to)
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (from == VOID) {
 | 
				
			||||||
 | 
							/* OK any which way */
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
	if (from == CHAR) {
 | 
						if (from == CHAR) {
 | 
				
			||||||
		hwarning("pointer to char may not align correctly for a %s",
 | 
							hwarning("pointer to char may not align correctly for a %s",
 | 
				
			||||||
			symbol2str(to));
 | 
								symbol2str(to));
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -17,6 +17,7 @@
 | 
				
			||||||
#include	"arith.h"
 | 
					#include	"arith.h"
 | 
				
			||||||
#include	"assert.h"
 | 
					#include	"assert.h"
 | 
				
			||||||
#include	"type.h"
 | 
					#include	"type.h"
 | 
				
			||||||
 | 
					#include	"proto.h"
 | 
				
			||||||
#include	"declar.h"
 | 
					#include	"declar.h"
 | 
				
			||||||
#include	"decspecs.h"
 | 
					#include	"decspecs.h"
 | 
				
			||||||
#include	"LLlex.h"
 | 
					#include	"LLlex.h"
 | 
				
			||||||
| 
						 | 
					@ -50,7 +51,8 @@ PRIVATE outargs();
 | 
				
			||||||
PRIVATE outarg();
 | 
					PRIVATE outarg();
 | 
				
			||||||
PRIVATE outargstring();
 | 
					PRIVATE outargstring();
 | 
				
			||||||
PRIVATE outargtype();
 | 
					PRIVATE outargtype();
 | 
				
			||||||
PRIVATE fill_arg();
 | 
					PRIVATE add_expr_arg();
 | 
				
			||||||
 | 
					PRIVATE def2decl();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
lint_declare_idf(idf, sc)
 | 
					lint_declare_idf(idf, sc)
 | 
				
			||||||
	struct idf *idf;
 | 
						struct idf *idf;
 | 
				
			||||||
| 
						 | 
					@ -90,11 +92,11 @@ lint_ext_def(idf, sc)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
/* At this place the following fields of the output definition can be
 | 
					/* At this place the following fields of the output definition can be
 | 
				
			||||||
 * filled:
 | 
					 * filled:
 | 
				
			||||||
 *		name, stat_number, class, file, line, type.
 | 
					 *		od_name, od_statnr, od_class, od_file, od_line, od_type.
 | 
				
			||||||
 * For variable definitions and declarations this will be all.
 | 
					 * For variable definitions and declarations this will be all.
 | 
				
			||||||
 * For functions the fields nrargs and argtps are filled after parsing
 | 
					 * For functions the fields od_nrargs and od_arg are filled after parsing
 | 
				
			||||||
 * the arguments.
 | 
					 * the arguments.
 | 
				
			||||||
 * The returns-field is known at the end of the function definition.
 | 
					 * The od_valreturned field is known at the end of the function definition.
 | 
				
			||||||
 * sc indicates the storage class defined by the declaration specifier.
 | 
					 * sc indicates the storage class defined by the declaration specifier.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
	register struct def *def = idf->id_def;
 | 
						register struct def *def = idf->id_def;
 | 
				
			||||||
| 
						 | 
					@ -126,6 +128,7 @@ lint_ext_def(idf, sc)
 | 
				
			||||||
	OutDef.od_valreturned = NORETURN;
 | 
						OutDef.od_valreturned = NORETURN;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PRIVATE
 | 
				
			||||||
def2decl(sc)
 | 
					def2decl(sc)
 | 
				
			||||||
	int sc;
 | 
						int sc;
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					@ -159,7 +162,7 @@ local_EFDC(idf)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
lint_formals()
 | 
					lint_formals()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
/* Make a list of tp_entries containing the types of the formal
 | 
					/* Make a list of 'struct argument's containing the types of the formal
 | 
				
			||||||
 * parameters of the function definition just parsed.
 | 
					 * parameters of the function definition just parsed.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
	register struct stack_entry *se = stack_level_of(L_FORMAL1)->sl_entry;
 | 
						register struct stack_entry *se = stack_level_of(L_FORMAL1)->sl_entry;
 | 
				
			||||||
| 
						 | 
					@ -170,24 +173,6 @@ lint_formals()
 | 
				
			||||||
		register struct type *type = se->se_idf->id_def->df_type;
 | 
							register struct type *type = se->se_idf->id_def->df_type;
 | 
				
			||||||
		register struct argument *arg = new_argument();
 | 
							register struct argument *arg = new_argument();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		/*	Do the conversions on the formals that could not be
 | 
					 | 
				
			||||||
			done in declare_idf().
 | 
					 | 
				
			||||||
			It is, unfortunately, impossible not to do them,
 | 
					 | 
				
			||||||
			since the corresponding actuals will have been
 | 
					 | 
				
			||||||
			converted to generate proper code and we do not
 | 
					 | 
				
			||||||
			want to duplicate the whole of expression handling
 | 
					 | 
				
			||||||
			for lint.
 | 
					 | 
				
			||||||
		*/
 | 
					 | 
				
			||||||
		switch (type->tp_fund) {
 | 
					 | 
				
			||||||
		case CHAR:
 | 
					 | 
				
			||||||
		case SHORT:
 | 
					 | 
				
			||||||
			type = (type->tp_unsigned ? uint_type : int_type);
 | 
					 | 
				
			||||||
			break;
 | 
					 | 
				
			||||||
		case FLOAT:
 | 
					 | 
				
			||||||
			type = double_type;
 | 
					 | 
				
			||||||
			break;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		if (f_FORMAT && nrargs == f_FORMATn) {
 | 
							if (f_FORMAT && nrargs == f_FORMATn) {
 | 
				
			||||||
			if (	!f_FORMATvar
 | 
								if (	!f_FORMATvar
 | 
				
			||||||
			&&	(	type->tp_fund != POINTER
 | 
								&&	(	type->tp_fund != POINTER
 | 
				
			||||||
| 
						 | 
					@ -258,6 +243,46 @@ lint_formals()
 | 
				
			||||||
	OutDef.od_nrargs = nrargs;
 | 
						OutDef.od_nrargs = nrargs;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					output_proto(idf, def)
 | 
				
			||||||
 | 
						struct idf *idf;
 | 
				
			||||||
 | 
						struct def *def;
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						/* fund == FUNCTION && sc != STATIC */
 | 
				
			||||||
 | 
						register struct proto *pl = def->df_type->tp_proto;
 | 
				
			||||||
 | 
						register int nrargs = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (!pl) return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						OutDef.od_name = idf->id_text;
 | 
				
			||||||
 | 
						OutDef.od_statnr = 0;
 | 
				
			||||||
 | 
						OutDef.od_class = PFDF;
 | 
				
			||||||
 | 
						OutDef.od_file = def->df_file;
 | 
				
			||||||
 | 
						OutDef.od_line = def->df_line;
 | 
				
			||||||
 | 
						OutDef.od_type = def->df_type->tp_up;
 | 
				
			||||||
 | 
						OutDef.od_valreturned = NORETURN;/*???*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						while (pl) {
 | 
				
			||||||
 | 
							register struct type *type = pl->pl_type;
 | 
				
			||||||
 | 
							register struct argument *arg = new_argument();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (type) {
 | 
				
			||||||
 | 
								arg->ar_type = type;
 | 
				
			||||||
 | 
								arg->ar_class = ArgFormal;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							else {
 | 
				
			||||||
 | 
								arg->ar_class = ArgEllipsis;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							arg->next = OutDef.od_arg;
 | 
				
			||||||
 | 
							OutDef.od_arg = arg;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							nrargs++;
 | 
				
			||||||
 | 
							pl = pl->next;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						OutDef.od_nrargs = nrargs;
 | 
				
			||||||
 | 
						outdef();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
output_use(idf)
 | 
					output_use(idf)
 | 
				
			||||||
	struct idf *idf;
 | 
						struct idf *idf;
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					@ -286,7 +311,7 @@ PRIVATE
 | 
				
			||||||
output_def(od)
 | 
					output_def(od)
 | 
				
			||||||
	struct outdef *od;
 | 
						struct outdef *od;
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
/* As the types are output the tp_entries are removed, because they
 | 
					/* As the types are output the 'struct argument's are freed, because they
 | 
				
			||||||
 * are then not needed anymore.
 | 
					 * are then not needed anymore.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
	if (od->od_class == XXDF || !od->od_name || od->od_name[0] == '#')
 | 
						if (od->od_class == XXDF || !od->od_name || od->od_name[0] == '#')
 | 
				
			||||||
| 
						 | 
					@ -301,7 +326,7 @@ output_def(od)
 | 
				
			||||||
			od->od_class = LVDF;
 | 
								od->od_class = LVDF;
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
		case SFDF:
 | 
							case SFDF:
 | 
				
			||||||
			/* remove tp_entries */
 | 
								/* free the 'struct argument's */
 | 
				
			||||||
			while (od->od_arg) {
 | 
								while (od->od_arg) {
 | 
				
			||||||
				register struct argument *tmp = od->od_arg;
 | 
									register struct argument *tmp = od->od_arg;
 | 
				
			||||||
				od->od_arg = od->od_arg->next;
 | 
									od->od_arg = od->od_arg->next;
 | 
				
			||||||
| 
						 | 
					@ -314,9 +339,10 @@ output_def(od)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	printf("%s:%d:%c", od->od_name, od->od_statnr, od->od_class);
 | 
						printf("%s:%d:%c", od->od_name, od->od_statnr, od->od_class);
 | 
				
			||||||
	switch (od->od_class) {
 | 
						switch (od->od_class) {
 | 
				
			||||||
 | 
						case LFDF:
 | 
				
			||||||
 | 
						case PFDF:
 | 
				
			||||||
	case EFDF:
 | 
						case EFDF:
 | 
				
			||||||
	case SFDF:
 | 
						case SFDF:
 | 
				
			||||||
	case LFDF:
 | 
					 | 
				
			||||||
		if (f_VARARGSn != -1) {
 | 
							if (f_VARARGSn != -1) {
 | 
				
			||||||
			printf(":%d", -1 - f_VARARGSn);
 | 
								printf(":%d", -1 - f_VARARGSn);
 | 
				
			||||||
			outargs(od->od_arg, f_VARARGSn);
 | 
								outargs(od->od_arg, f_VARARGSn);
 | 
				
			||||||
| 
						 | 
					@ -407,6 +433,10 @@ outarg(arg)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						case ArgEllipsis:
 | 
				
			||||||
 | 
							printf(".");	/* one is enough for computers */
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	default:
 | 
						default:
 | 
				
			||||||
		NOTREACHED();
 | 
							NOTREACHED();
 | 
				
			||||||
		/*NOTREACHED*/
 | 
							/*NOTREACHED*/
 | 
				
			||||||
| 
						 | 
					@ -460,21 +490,28 @@ outargtype(tp)
 | 
				
			||||||
		printf("%s ", symbol2str(tp->tp_fund));
 | 
							printf("%s ", symbol2str(tp->tp_fund));
 | 
				
			||||||
		if (is_anon_idf(tp->tp_idf)) {
 | 
							if (is_anon_idf(tp->tp_idf)) {
 | 
				
			||||||
			/* skip the #<num>, replace it by '#anonymous id' */
 | 
								/* skip the #<num>, replace it by '#anonymous id' */
 | 
				
			||||||
			printf("#anonymous id%s", strindex(tp->tp_idf->id_text, ' '));
 | 
								printf("#anonymous id%s",
 | 
				
			||||||
 | 
									strindex(tp->tp_idf->id_text, ' ')
 | 
				
			||||||
 | 
								);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							else {
 | 
				
			||||||
 | 
								printf(tp->tp_idf->id_text);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		else printf(tp->tp_idf->id_text);
 | 
					 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	case CHAR:
 | 
						case CHAR:
 | 
				
			||||||
	case INT:
 | 
						case INT:
 | 
				
			||||||
	case SHORT:
 | 
						case SHORT:
 | 
				
			||||||
	case LONG:
 | 
						case LONG:
 | 
				
			||||||
 | 
						case ULONG:
 | 
				
			||||||
	case FLOAT:
 | 
						case FLOAT:
 | 
				
			||||||
	case DOUBLE:
 | 
						case DOUBLE:
 | 
				
			||||||
 | 
						case LNGDBL:
 | 
				
			||||||
	case VOID:
 | 
						case VOID:
 | 
				
			||||||
	case ERRONEOUS:
 | 
						case ERRONEOUS:
 | 
				
			||||||
		if (tp->tp_unsigned)
 | 
							if (tp->tp_unsigned) {
 | 
				
			||||||
			printf("unsigned ");
 | 
								printf("unsigned ");
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		printf("%s", symbol2str(tp->tp_fund));
 | 
							printf("%s", symbol2str(tp->tp_fund));
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
	default:
 | 
						default:
 | 
				
			||||||
| 
						 | 
					@ -526,19 +563,20 @@ fill_outcall(ex, used)
 | 
				
			||||||
	OutCall.od_arg = (struct argument *)0;
 | 
						OutCall.od_arg = (struct argument *)0;
 | 
				
			||||||
	OutCall.od_nrargs = 0;
 | 
						OutCall.od_nrargs = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if ((ex = ex->OP_RIGHT) != 0) {	/* function call with arguments */
 | 
						if ((ex = ex->OP_RIGHT) != 0) {
 | 
				
			||||||
		/* store types of argument expressions in tp_entries */
 | 
							/* function call with arguments: */
 | 
				
			||||||
 | 
							/* store types of argument expressions in 'struct argument's */
 | 
				
			||||||
		while (ex->ex_class == Oper && ex->OP_OPER == PARCOMMA) {
 | 
							while (ex->ex_class == Oper && ex->OP_OPER == PARCOMMA) {
 | 
				
			||||||
			fill_arg(ex->OP_RIGHT);
 | 
								add_expr_arg(ex->OP_RIGHT);
 | 
				
			||||||
			ex = ex->OP_LEFT;
 | 
								ex = ex->OP_LEFT;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		fill_arg(ex);
 | 
							add_expr_arg(ex);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	OutCall.od_valused = used;	/* USED, IGNORED or VOIDED */
 | 
						OutCall.od_valused = used;	/* USED, IGNORED or VOIDED */
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
PRIVATE
 | 
					PRIVATE
 | 
				
			||||||
fill_arg(e)
 | 
					add_expr_arg(e)
 | 
				
			||||||
	struct expr *e;
 | 
						struct expr *e;
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	register struct argument *arg;
 | 
						register struct argument *arg;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -10,6 +10,7 @@
 | 
				
			||||||
#define	ArgExpr		1		/* actual */
 | 
					#define	ArgExpr		1		/* actual */
 | 
				
			||||||
#define	ArgConst	2		/* integer constant */
 | 
					#define	ArgConst	2		/* integer constant */
 | 
				
			||||||
#define	ArgString	3		/* string */
 | 
					#define	ArgString	3		/* string */
 | 
				
			||||||
 | 
					#define	ArgEllipsis	4		/* ellipsis */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct argument {
 | 
					struct argument {
 | 
				
			||||||
	struct argument *next;
 | 
						struct argument *next;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -199,7 +199,8 @@ lint_1_global(idf, def)
 | 
				
			||||||
	struct def *def;
 | 
						struct def *def;
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	register int sc = def->df_sc;
 | 
						register int sc = def->df_sc;
 | 
				
			||||||
	register int fund = def->df_type->tp_fund;
 | 
						register struct type *tp = def->df_type;
 | 
				
			||||||
 | 
						register int fund = tp->tp_fund;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	switch (sc) {
 | 
						switch (sc) {
 | 
				
			||||||
	case STATIC:
 | 
						case STATIC:
 | 
				
			||||||
| 
						 | 
					@ -211,6 +212,10 @@ lint_1_global(idf, def)
 | 
				
			||||||
		if (fund == ERRONEOUS)
 | 
							if (fund == ERRONEOUS)
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (fund == FUNCTION && sc != STATIC) {
 | 
				
			||||||
 | 
								output_proto(idf, def);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (def->df_set || def->df_used) {
 | 
							if (def->df_set || def->df_used) {
 | 
				
			||||||
			/* Output a line to the intermediate file for
 | 
								/* Output a line to the intermediate file for
 | 
				
			||||||
			 * used external variables (including functions)
 | 
								 * used external variables (including functions)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -99,12 +99,12 @@ code_endswitch()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (sh->sh_default == 0)	/* no default occurred yet */
 | 
						if (sh->sh_default == 0)	/* no default occurred yet */
 | 
				
			||||||
		sh->sh_default = sh->sh_break;
 | 
							sh->sh_default = sh->sh_break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef LINT
 | 
				
			||||||
	C_bra(sh->sh_break);		/* skip the switch table now	*/
 | 
						C_bra(sh->sh_break);		/* skip the switch table now	*/
 | 
				
			||||||
	C_df_ilb(sh->sh_table);		/* switch table entry		*/
 | 
						C_df_ilb(sh->sh_table);		/* switch table entry		*/
 | 
				
			||||||
	/* evaluate the switch expr.	*/
 | 
						/* evaluate the switch expr.	*/
 | 
				
			||||||
#ifndef LINT
 | 
					 | 
				
			||||||
	code_expr(sh->sh_expr, RVAL, TRUE, NO_LABEL, NO_LABEL);
 | 
						code_expr(sh->sh_expr, RVAL, TRUE, NO_LABEL, NO_LABEL);
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
	if (sh->sh_nrofentries <= 1) {
 | 
						if (sh->sh_nrofentries <= 1) {
 | 
				
			||||||
		if (sh->sh_nrofentries) {
 | 
							if (sh->sh_nrofentries) {
 | 
				
			||||||
			load_cst(sh->sh_lowerbd, size);
 | 
								load_cst(sh->sh_lowerbd, size);
 | 
				
			||||||
| 
						 | 
					@ -150,6 +150,8 @@ code_endswitch()
 | 
				
			||||||
	    }
 | 
						    }
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	C_df_ilb(sh->sh_break);
 | 
						C_df_ilb(sh->sh_break);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	switch_stack = sh->next;	/* unstack the switch descriptor */
 | 
						switch_stack = sh->next;	/* unstack the switch descriptor */
 | 
				
			||||||
	for (ce = sh->sh_entries; ce;) { /* free allocated switch structure */
 | 
						for (ce = sh->sh_entries; ce;) { /* free allocated switch structure */
 | 
				
			||||||
		register struct case_entry *tmp = ce->next;
 | 
							register struct case_entry *tmp = ce->next;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		
		Reference in a new issue