I have the following setup:
Code:
#define OROR 66
#define LOGICAL(OP,OPCHR,LABEL) \
case OP: \
logic=1; \
switch (lt){ \
case INT: \
switch (rt){ \
case INT: \
b=*lsi OPCHR *rsi; \
break; \
case FLT: \
b=*lsi OPCHR *rflt; \
break; \
case STR: \
error(ER_ILLEGAL_LOGIC,token,OP,get_linenum(prog)); \
break; \
case CHR: \
b=*lsi OPCHR *rchar; \
break; \
default: \
LABEL: syserror("arith",OP,get_linenum(prog),0); \
break: \
} \
return; \
case FLT: \
switch(rt){ \
case INT: \
b=*lflt OPCHR *rsi; \
break; \
case FLT: \
b=*lflt OPCHR *rflt; \
break; \
case STR: \
error(ER_ILLEGAL_LOGIC,token,OP,get_linenum(prog)); \
break; \
case CHR: \
b=*lflt OPCHR *rchar; \
break; \
default: \
goto LABEL; \
} \
return; \
case STR: \
switch(rt){ \
case INT: \
case FLT: \
case STR: \
case CHR: \
error(ER_ILLEGAL_LOGIC,token,OP,get_linenum(prog)); \
break; \
default: \
goto LABEL; \
} \
return; \
case CHR: \
switch(rt){ \
case INT: \
b=*lchar OPCHR *rsi; \
break; \
case FLT: \
b=*lchar OPCHR *rflt; \
break; \
case STR: \
error(ER_ILLEGAL_LOGIC,token,OP,get_linenum(prog)); \
break; \
case CHR: \
b=*lchar OPCHR *rchar; \
break; \
default: \
goto LABEL; \
} \
return; \
default: \
goto LABEL; \
}
LOGICAL (OROR,||,loror)
Which expands to:
Code:
case 66: logic=1; switch (lt){ case 99: switch (rt){ case 99: b=*lsi || *rsi; break; case 100: b=*lsi || *rflt; break; case 101: error(10,token,66,get_linenum(prog)); break; case 102: b=*lsi || *rchar; break; default: loror: syserror("arith",66,get_linenum(prog),0); break: } return; case 100: switch(rt){ case 99: b=*lflt || *rsi; break; case 100: b=*lflt || *rflt; break; case 101: error(10,token,66,get_linenum(prog)); break; case 102: b=*lflt || *rchar; break; default: goto loror; } return; case 101: switch(rt){ case 99: case 100: case 101: case 102: error(10,token,66,get_linenum(prog)); break; default: goto loror; } return; case 102: switch(rt){ case 99: b=*lchar || *rsi; break; case 100: b=*lchar || *rflt; break; case 101: error(10,token,66,get_linenum(prog)); break; case 102: b=*lchar || *rchar; break; default: goto loror; } return; default: goto loror; }
I am getting the error: SWITCH QUANTITY NOT AN INTEGER
But it seems to expand to an integer so I don't understand the problem. Is it recursive use of the macro?
Any ideas you have would be greatly appreciated.