119 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			119 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* USER-OPTION HANDLING */
 | |
| 
 | |
| #include	<alloc.h>
 | |
| #include	"idfsize.h"
 | |
| #include	"maxincl.h"
 | |
| #include	"class.h"
 | |
| #include	"macro.h"
 | |
| #include	"idf.h"
 | |
| 
 | |
| char options[128];			/* one for every char	*/
 | |
| int inc_pos = 1;			/* place where next -I goes */
 | |
| char *inctable[MAXINCL] = {		/* list for includes	*/
 | |
| 	".",
 | |
| 	"/usr/include",
 | |
| 	0
 | |
| };
 | |
| 
 | |
| extern int idfsize;
 | |
| int txt2int();
 | |
| 
 | |
| do_option(text)
 | |
| 	char *text;
 | |
| {
 | |
| 	switch(*text++)	{
 | |
| 	case '-':
 | |
| 		options[*text] = 1;
 | |
| 		break;
 | |
| 	default:
 | |
| 		error("illegal option: %c", text[-1]);
 | |
| 		break;
 | |
| 	case 'C' :	/* comment output		*/
 | |
| 		options['C'] = 1;
 | |
| 		break;
 | |
| 	case 'D' :	/* -Dname :	predefine name		*/
 | |
| 	{
 | |
| 		register char *cp = text, *name, *mactext;
 | |
| 
 | |
| 		if (class(*cp) != STIDF)	{
 | |
| 			error("identifier missing in -D%s", text);
 | |
| 			break;
 | |
| 		}
 | |
| 		name = cp;
 | |
| 		while (*cp && in_idf(*cp))
 | |
| 			++cp;
 | |
| 		if (!*cp)			/* -Dname */
 | |
| 			mactext = "1";
 | |
| 		else
 | |
| 		if (*cp == '=')	{		/* -Dname=text	*/
 | |
| 			*cp++ = '\0';		/* end of name	*/
 | |
| 			mactext = cp;
 | |
| 		}
 | |
| 		else	{			/* -Dname?? */
 | |
| 			error("malformed option -D%s", text);
 | |
| 			break;
 | |
| 		}
 | |
| 		macro_def(str2idf(name, 0), mactext, -1, strlen(mactext), NOFLAG);
 | |
| 		break;
 | |
| 	}
 | |
| 	case 'I' :	/* -Ipath : insert "path" into include list	*/
 | |
| 		if (*text)	{
 | |
| 			register int i = inc_pos++;
 | |
| 			register char *new = text;
 | |
| 			
 | |
| 			while (new)	{
 | |
| 				register char *tmp = inctable[i];
 | |
| 				
 | |
| 				inctable[i++] = new;
 | |
| 				if (i == MAXINCL)
 | |
| 					fatal("too many -I options");
 | |
| 				new = tmp;
 | |
| 			}
 | |
| 		}
 | |
| 		else	inctable[inc_pos] = 0;
 | |
| 		break;
 | |
| 	case 'M':	/* maximum identifier length */
 | |
| 		idfsize = txt2int(&text);
 | |
| 		if (*text)
 | |
| 			error("malformed -M option");
 | |
| 		if (idfsize > IDFSIZE) {
 | |
| 			warning("maximum identifier length is %d", IDFSIZE);
 | |
| 			idfsize = IDFSIZE;
 | |
| 		}
 | |
| 		if (idfsize < 8) {
 | |
| 			warning("minimum identifier length is 8");
 | |
| 			idfsize = 8;
 | |
| 		}
 | |
| 		break;
 | |
| 	case 'P' :	/* run preprocessor stand-alone, without #'s	*/
 | |
| 		options['P'] = 1;
 | |
| 		break;
 | |
| 	case 'U' :	/* -Uname :	undefine predefined	*/
 | |
| 		if (*text)	{
 | |
| 			register struct idf *idef = findidf(text);
 | |
| 
 | |
| 			if (idef && idef->id_macro) {
 | |
| 				free_macro(idef->id_macro);
 | |
| 				idef->id_macro = (struct macro *) 0;
 | |
| 			}
 | |
| 		}
 | |
| 		break;
 | |
| 	}
 | |
| }
 | |
| 
 | |
| int
 | |
| txt2int(tp)
 | |
| 	char **tp;
 | |
| {
 | |
| 	/*	the integer pointed to by *tp is read, while increasing
 | |
| 		*tp; the resulting value is yielded.
 | |
| 	*/
 | |
| 	register int val = 0;
 | |
| 	register int ch;
 | |
| 	
 | |
| 	while (ch = **tp, ch >= '0' && ch <= '9')	{
 | |
| 		val = val * 10 + ch - '0';
 | |
| 		(*tp)++;
 | |
| 	}
 | |
| 	return val;
 | |
| }
 |