123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260 |
- /*
- * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
- * See the copyright notice in the ACK home directory, in the file "Copyright".
- *
- * Author: Ceriel J.H. Jacobs
- */
- /* U S E R O P T I O N - H A N D L I N G */
- /* $Id$ */
- #include "idfsize.h"
- #include <em_arith.h>
- #include <em_label.h>
- #include <alloc.h>
- #include "strict3rd.h"
- #include "dbsymtab.h"
- #include "type.h"
- #include "main.h"
- #include "warning.h"
- #include "nostrict.h"
- #include "nocross.h"
- #include "class.h"
- #include "squeeze.h"
- #define MINIDFSIZE 14
- #if MINIDFSIZE < 14
- You fouled up! MINIDFSIZE has to be at least 14 or the compiler will not
- recognize some keywords!
- #endif
- extern int idfsize;
- static int ndirs = 1;
- int warning_classes = W_INITIAL;
- int gdb_flag;
- DoOption(text)
- register char *text;
- {
- switch(*text++) {
- case '-':
- options[*text]++; /* debug options etc. */
- break;
- case 'U': /* allow underscores in identifiers */
- inidf['_'] = 1;
- break;
- case 'L': /* no fil/lin */
- case 'R': /* no range checks */
- case 'A': /* extra array bound checks, for machines that do not
- implement it in AAR/LAR/SAR
- */
- case 'n': /* no register messages */
- case 'x': /* every name global */
- case 's': /* symmetric: MIN(INTEGER) = -MAX(INTEGER) */
- case '3': /* strict 3rd edition Modula-2 */
- case 'l': /* local additions enabled */
- options[text[-1]]++;
- break;
- #ifdef DBSYMTAB
- case 'g': /* generate symbol table for debugger */
- options['g']++;
- if (*text == 'd') {
- /* Assume -gdb. */
- gdb_flag = 1;
- }
- options['n']++; /* no register vars ??? */
- break;
- #endif /* DBSYMTAB */
- case 'w':
- if (*text) {
- while (*text) {
- switch(*text++) {
- #ifndef STRICT_3RD_ED
- case 'O':
- warning_classes &= ~W_OLDFASHIONED;
- break;
- #endif
- #ifndef NOSTRICT
- case 'R':
- warning_classes &= ~W_STRICT;
- break;
- #endif
- case 'W':
- warning_classes &= ~W_ORDINARY;
- break;
- }
- }
- }
- else warning_classes = W_ALWAYS;
- break;
- case 'W':
- if (*text) {
- while (*text) {
- switch(*text++) {
- #ifndef STRICT_3RD_ED
- case 'O':
- warning_classes |= W_OLDFASHIONED;
- break;
- #endif
- #ifndef NOSTRICT
- case 'R':
- warning_classes |= W_STRICT;
- break;
- #endif
- case 'W':
- warning_classes |= W_ORDINARY;
- break;
- }
- }
- }
- else warning_classes = W_ALL;
- break;
- case 'M': { /* maximum identifier length */
- #ifndef SQUEEZE
- char *t = text; /* because &text is illegal */
- idfsize = txt2int(&t);
- if (*t || idfsize <= 0)
- fatal("malformed -M option");
- if (idfsize > IDFSIZE) {
- idfsize = IDFSIZE;
- warning(W_ORDINARY,"maximum identifier length is %d", IDFSIZE);
- }
- if (idfsize < MINIDFSIZE) {
- warning(W_ORDINARY, "minimum identifier length is %d", MINIDFSIZE);
- idfsize = MINIDFSIZE;
- }
- #endif
- }
- break;
- case 'I' :
- if (*text) {
- register int i;
- register char *new = text;
- if (nDEF > mDEF) {
- DEFPATH = (char **)
- Realloc((char *)DEFPATH,(unsigned)(mDEF+=10)*sizeof(char *));
- }
- for (i = ndirs++; i < nDEF; i++) {
- char *tmp = DEFPATH[i];
-
- DEFPATH[i] = new;
- new = tmp;
- }
- ++nDEF;
- }
- else DEFPATH[ndirs] = 0;
- break;
- case 'V' : /* set object sizes and alignment requirements */
- #ifndef NOCROSS
- {
- register int size;
- register int algn;
- char c;
- char *t;
- while (c = *text++) {
- char *strchr();
- t = text;
- size = txt2int(&t);
- algn = 0;
- if (*(text = t) == '.') {
- t = text + 1;
- algn = txt2int(&t);
- text = t;
- }
- if (! strchr("wislfdpS", c)) {
- error("-V: bad type indicator %c\n", c);
- }
- if (size != 0) switch (c) {
- case 'w': /* word */
- word_size = size;
- dword_size = 2 * size;
- break;
- case 'i': /* int */
- int_size = size;
- break;
- case 's': /* short (subranges) */
- short_size = size;
- break;
- case 'l': /* longint */
- long_size = size;
- break;
- case 'f': /* real */
- float_size = size;
- break;
- case 'd': /* longreal */
- double_size = size;
- break;
- case 'p': /* pointer */
- pointer_size = size;
- break;
- }
- if (algn != 0) switch (c) {
- case 'w': /* word */
- word_align = algn;
- break;
- case 'i': /* int */
- int_align = algn;
- break;
- case 's': /* short (subranges) */
- short_align = algn;
- break;
- case 'l': /* longint */
- long_align = algn;
- break;
- case 'f': /* real */
- float_align = algn;
- break;
- case 'd': /* longreal */
- double_align = algn;
- break;
- case 'p': /* pointer */
- pointer_align = algn;
- break;
- case 'S': /* initial record alignment */
- struct_align = algn;
- break;
- }
- }
- }
- #endif /* NOCROSS */
- break;
- }
- }
- #if (!SQUEEZE) | (!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;
- }
- #endif
|