ack/lang/m2/comp/options.c

244 lines
4.5 KiB
C
Raw Normal View History

/*
* (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
*/
1986-04-17 09:28:09 +00:00
/* U S E R O P T I O N - H A N D L I N G */
/* $Header$ */
1986-04-17 09:28:09 +00:00
#include "idfsize.h"
1986-05-01 19:06:53 +00:00
#include <em_arith.h>
#include <em_label.h>
1987-05-18 15:57:33 +00:00
#include <alloc.h>
1986-05-01 19:06:53 +00:00
#include "strict3rd.h"
1986-04-17 09:28:09 +00:00
#include "type.h"
1986-04-25 10:14:08 +00:00
#include "main.h"
1986-11-05 14:33:00 +00:00
#include "warning.h"
1987-11-09 10:17:20 +00:00
#include "squeeze.h"
#include "nocross.h"
1986-04-17 09:28:09 +00:00
#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
1986-04-17 09:28:09 +00:00
extern int idfsize;
static int ndirs = 1;
1986-11-05 14:33:00 +00:00
int warning_classes;
1986-04-25 10:14:08 +00:00
1986-05-01 19:06:53 +00:00
DoOption(text)
1986-10-06 20:36:30 +00:00
register char *text;
1986-04-17 09:28:09 +00:00
{
switch(*text++) {
case '-':
options[*text]++; /* debug options etc. */
1986-04-17 09:28:09 +00:00
break;
case 'L': /* no fil/lin */
case 'R': /* no range checks */
case 'n': /* no register messages */
case 'x': /* every name global */
1987-06-23 17:12:25 +00:00
case 's': /* symmetric: MIN(INTEGER) = -MAX(INTEGER) */
#ifndef STRICT_3RD_ED
case '3': /* strict 3rd edition Modula-2 */
#endif
options[text[-1]]++;
break;
1986-04-17 09:28:09 +00:00
1986-11-05 14:33:00 +00:00
case 'w':
if (*text) {
while (*text) {
switch(*text++) {
#ifndef STRICT_3RD_ED
1986-11-05 14:33:00 +00:00
case 'O':
warning_classes &= ~W_OLDFASHIONED;
break;
#endif
1987-11-09 10:17:20 +00:00
#ifndef SQUEEZE
1986-11-05 14:33:00 +00:00
case 'R':
warning_classes &= ~W_STRICT;
break;
1987-11-09 10:17:20 +00:00
#endif
1986-11-05 14:33:00 +00:00
case 'W':
warning_classes &= ~W_ORDINARY;
break;
}
}
}
else warning_classes = 0;
break;
case 'W':
1987-07-21 13:54:33 +00:00
if (*text) {
while (*text) {
switch(*text++) {
#ifndef STRICT_3RD_ED
1987-07-21 13:54:33 +00:00
case 'O':
warning_classes |= W_OLDFASHIONED;
break;
#endif
1987-11-09 10:17:20 +00:00
#ifndef SQUEEZE
1987-07-21 13:54:33 +00:00
case 'R':
warning_classes |= W_STRICT;
break;
1987-11-09 10:17:20 +00:00
#endif
1987-07-21 13:54:33 +00:00
case 'W':
warning_classes |= W_ORDINARY;
break;
}
1986-11-05 14:33:00 +00:00
}
}
1987-07-21 13:54:33 +00:00
else warning_classes = W_OLDFASHIONED|W_STRICT|W_ORDINARY;
1986-11-05 14:33:00 +00:00
break;
1986-10-06 20:36:30 +00:00
case 'M': { /* maximum identifier length */
char *t = text; /* because &text is illegal */
idfsize = txt2int(&t);
if (*t || idfsize <= 0)
1986-04-17 09:28:09 +00:00
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;
}
1986-10-06 20:36:30 +00:00
}
1986-04-17 09:28:09 +00:00
break;
1986-04-25 10:14:08 +00:00
case 'I' :
1986-12-09 17:41:06 +00:00
if (*text) {
register int i;
1986-12-09 17:41:06 +00:00
register char *new = text;
if (++nDEF > mDEF) {
char **n = (char **)
1987-05-18 15:57:33 +00:00
Malloc((unsigned)((10+mDEF)*sizeof(char *)));
for (i = 0; i < mDEF; i++) {
n[i] = DEFPATH[i];
}
free((char *) DEFPATH);
DEFPATH = n;
mDEF += 10;
}
i = ndirs++;
1986-12-09 17:41:06 +00:00
while (new) {
register char *tmp = DEFPATH[i];
DEFPATH[i++] = new;
new = tmp;
}
1986-04-25 10:14:08 +00:00
}
1986-12-09 17:41:06 +00:00
else DEFPATH[ndirs] = 0;
1986-04-25 10:14:08 +00:00
break;
1986-04-17 09:28:09 +00:00
case 'V' : /* set object sizes and alignment requirements */
#ifndef NOCROSS
1986-04-17 09:28:09 +00:00
{
1987-07-13 10:30:37 +00:00
register int size;
1987-05-21 09:37:28 +00:00
register int align;
1986-04-17 09:28:09 +00:00
char c;
1986-10-06 20:36:30 +00:00
char *t;
1986-04-17 09:28:09 +00:00
while (c = *text++) {
1987-05-21 09:37:28 +00:00
char *strindex();
1986-10-06 20:36:30 +00:00
t = text;
size = txt2int(&t);
1986-04-17 09:28:09 +00:00
align = 0;
1986-10-06 20:36:30 +00:00
if (*(text = t) == '.') {
t = text + 1;
align = txt2int(&t);
text = t;
1986-04-17 09:28:09 +00:00
}
1987-05-21 09:37:28 +00:00
if (! strindex("wislfdpS", c)) {
error("-V: bad type indicator %c\n", c);
}
if (size != 0) switch (c) {
1986-04-17 09:28:09 +00:00
case 'w': /* word */
1987-05-21 09:37:28 +00:00
word_size = size;
dword_size = 2 * size;
1986-04-17 09:28:09 +00:00
break;
case 'i': /* int */
1987-05-21 09:37:28 +00:00
int_size = size;
1986-04-17 09:28:09 +00:00
break;
case 's': /* short (subranges) */
1987-05-21 09:37:28 +00:00
short_size = size;
break;
1986-04-17 09:28:09 +00:00
case 'l': /* longint */
1987-05-21 09:37:28 +00:00
long_size = size;
1986-04-17 09:28:09 +00:00
break;
case 'f': /* real */
1987-05-21 09:37:28 +00:00
float_size = size;
1986-04-17 09:28:09 +00:00
break;
case 'd': /* longreal */
1987-05-21 09:37:28 +00:00
double_size = size;
1986-04-17 09:28:09 +00:00
break;
case 'p': /* pointer */
1987-05-21 09:37:28 +00:00
pointer_size = size;
break;
}
if (align != 0) switch (c) {
case 'w': /* word */
word_align = align;
break;
case 'i': /* int */
int_align = align;
break;
case 's': /* short (subranges) */
short_align = align;
break;
case 'l': /* longint */
long_align = align;
break;
case 'f': /* real */
float_align = align;
break;
case 'd': /* longreal */
double_align = align;
break;
case 'p': /* pointer */
pointer_align = align;
1986-04-17 09:28:09 +00:00
break;
case 'S': /* initial record alignment */
1987-05-21 09:37:28 +00:00
struct_align = align;
1986-04-17 09:28:09 +00:00
break;
}
}
}
#endif NOCROSS
break;
1986-04-17 09:28:09 +00:00
}
}
int
txt2int(tp)
1986-10-06 20:36:30 +00:00
register char **tp;
1986-04-17 09:28:09 +00:00
{
/* 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;
}