ack/lang/pc/comp/options.c
2006-02-04 00:57:05 +00:00

171 lines
3.2 KiB
C

/* U S E R O P T I O N - H A N D L I N G */
#include <em_arith.h>
#include <em_label.h>
#include "class.h"
#include "const.h"
#include "idfsize.h"
#include "main.h"
#include "type.h"
#include "nocross.h"
#include "dbsymtab.h"
#define MINIDFSIZE 9
#if MINIDFSIZE < 9
You fouled up! MINIDFSIZE has to be at least 10 or the compiler will not
recognize some keywords!
#endif
extern int idfsize;
DoOption(text)
register char *text;
{
switch( *text++ ) {
default:
options[text[-1]]++; /* flags, debug options etc. */
break;
/* recognized flags:
-i: largest value of set of integer
-u, -U: allow underscore in identifier
-w: no warnings
-R: no range checks
-A: range checks for array references
and many more if DEBUG
*/
#ifdef DBSYMTAB
case 'g':
options['g'] = 1;
options['n'] = 1;
break;
#endif
case 'i': { /* largest value of set of integer */
char *t = text;
max_intset = txt2int(&t);
text = t;
if( max_intset <= (arith) 0 || *t ) {
error("bad -i flag : use -i<num>");
max_intset = 0;
}
break;
}
case 'M': { /* maximum identifier length */
char *t = text;
idfsize = txt2int(&t);
text = t;
if( idfsize <= 0 || *t ) {
fatal("malformed -M option");
/*NOTREACHED*/
}
if( idfsize > IDFSIZE ) {
idfsize = IDFSIZE;
warning("maximum identifier length is %d", IDFSIZE);
}
if( idfsize < MINIDFSIZE ) {
idfsize = MINIDFSIZE;
warning("minimum identifier length is %d", MINIDFSIZE);
}
break;
}
/* case 'u': /* underscore allowed in identifiers */
/* class('_') = STIDF;
/* inidf['_'] = 1;
/* break;
*/
case 'V' : { /* set object sizes and alignment requirements */
/* syntax : -V[ [w|i|l|f|p] size? [.alignment]? ]* */
#ifndef NOCROSS
register arith size;
register int align;
char c, *t;
while( c = *text++ ) {
char *strindex();
t = text;
size = txt2int(&t);
align = 0;
if( *(text = t) == '.' ) {
t = text + 1;
align = txt2int(&t);
text = t;
}
if( !strindex("wilfpS", c) )
error("-V: bad type indicator %c\n", c);
if( size )
switch( c ) {
case 'w': /* word */
word_size = size;
break;
case 'i': /* int */
int_size = size;
break;
case 'l': /* long */
long_size = size;
break;
case 'f': /* real */
real_size = size;
break;
case 'p': /* pointer */
pointer_size = size;
break;
case 'S': /* structure */
/* discard size */
break;
}
if( align )
switch( c ) {
case 'w': /* word */
word_align = align;
break;
case 'i': /* int */
int_align = align;
break;
case 'l': /* long */
long_align = align;
break;
case 'f': /* real */
real_align = align;
break;
case 'p': /* pointer */
pointer_align = align;
break;
case 'S': /* initial record alignment */
struct_align = align;
break;
}
}
break;
#endif /* NOCROSS */
}
}
}
int
txt2int(tp)
register 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;
}