1: /* 2: * Copyright (c) 1983 Regents of the University of California. 3: * All rights reserved. The Berkeley software License Agreement 4: * specifies the terms and conditions for redistribution. 5: */ 6: 7: #ifndef lint 8: static char sccsid[] = "@(#)operators.c 5.1 (Berkeley) 5/31/85"; 9: #endif not lint 10: 11: static char rcsid[] = "$Header: operators.c,v 1.5 84/12/26 10:41:01 linton Exp $"; 12: 13: /* 14: * Tree node classes. 15: */ 16: 17: #include "defs.h" 18: #include "operators.h" 19: 20: #ifndef public 21: typedef struct { 22: char numargs; 23: char opflags; 24: String opstring; 25: } Opinfo; 26: 27: typedef enum { 28: O_NOP, 29: O_NAME, O_SYM, O_LCON, O_CCON, O_FCON, O_SCON, 30: O_RVAL, O_INDEX, O_INDIR, O_DOT, 31: O_COMMA, 32: 33: O_ITOF, O_ADD, O_ADDF, O_SUB, O_SUBF, O_NEG, O_NEGF, 34: O_MUL, O_MULF, O_DIVF, O_DIV, O_MOD, 35: 36: O_AND, O_OR, 37: 38: O_LT, O_LTF, O_LE, O_LEF, O_GT, O_GTF, O_GE, O_GEF, 39: O_EQ, O_EQF, O_NE, O_NEF, 40: 41: O_ALIAS, /* rename a command */ 42: O_ASSIGN, /* assign a value to a program variable */ 43: O_CALL, /* call a procedure in the program */ 44: O_CATCH, /* catch a signal before program does */ 45: O_CHFILE, /* change (or print) the current source file */ 46: O_CONT, /* continue execution */ 47: O_DEBUG, /* invoke a dbx internal debugging routine */ 48: O_DELETE, /* remove a trace/stop */ 49: O_DUMP, /* dump out variables */ 50: O_EDIT, /* edit a file (or function) */ 51: O_FUNC, /* set the current function */ 52: O_GRIPE, /* send mail to debugger support person */ 53: O_HELP, /* print a synopsis of debugger commands */ 54: O_IGNORE, /* let program catch signal */ 55: O_LIST, /* list source lines */ 56: O_PRINT, /* print the values of a list of expressions */ 57: O_PSYM, /* print symbol information */ 58: O_RUN, /* start up program */ 59: O_SKIP, /* skip the current line */ 60: O_SOURCE, /* read commands from a file */ 61: O_STATUS, /* display currently active trace/stop's */ 62: O_STEP, /* execute a single line */ 63: O_STOP, /* stop on an event */ 64: O_STOPI, /* stop on an event at an instruction boundary */ 65: O_TRACE, /* trace something on an event */ 66: O_TRACEI, /* trace at the instruction level */ 67: O_WHATIS, /* print the declaration of a variable */ 68: O_WHERE, /* print a stack trace */ 69: O_WHEREIS, /* print all the symbols with the given name */ 70: O_WHICH, /* print out full qualification of a symbol */ 71: O_EXAMINE, /* examine program instructions/data */ 72: 73: O_ADDEVENT, /* add an event */ 74: O_ENDX, /* end of program reached */ 75: O_IF, /* if first arg is true, do commands in second arg */ 76: O_ONCE, /* add a "one-time" event, delete when first reached */ 77: O_PRINTCALL, /* print out the current procedure and its arguments */ 78: O_PRINTIFCHANGED, /* print the value of the argument if it has changed */ 79: O_PRINTRTN, /* print out the routine and value that just returned */ 80: O_PRINTSRCPOS, /* print out the current source position */ 81: O_PROCRTN, /* call completed */ 82: O_QLINE, /* filename, line number */ 83: O_STOPIFCHANGED, /* stop if the value of the argument has changed */ 84: O_STOPX, /* stop execution */ 85: O_TRACEON, /* begin tracing source line, variable, or all lines */ 86: O_TRACEOFF, /* end tracing source line, variable, or all lines */ 87: 88: O_TYPERENAME, /* state the type of an expression */ 89: O_RERUN, /* re-run program with the same arguments as before */ 90: O_RETURN, /* continue execution until procedure returns */ 91: O_UP, /* move current function up the call stack */ 92: O_DOWN, /* move current function down the call stack */ 93: O_CALLPROC, /* call command */ 94: O_SEARCH, /* regular expression pattern search through source */ 95: O_SET, /* set a debugger variable */ 96: O_UNSET, /* unset a debugger variable */ 97: O_UNALIAS, /* remove an alias */ 98: 99: O_LASTOP 100: } Operator; 101: 102: /* 103: * Operator flags and predicates. 104: */ 105: 106: #define null 0 107: #define LEAF 01 108: #define UNARY 02 109: #define BINARY 04 110: #define BOOL 010 111: #define REALOP 020 112: #define INTOP 040 113: 114: #define isbitset(a, m) ((a&m) == m) 115: #define isleaf(o) isbitset(opinfo[ord(o)].opflags, LEAF) 116: #define isunary(o) isbitset(opinfo[ord(o)].opflags, UNARY) 117: #define isbinary(o) isbitset(opinfo[ord(o)].opflags, BINARY) 118: #define isreal(o) isbitset(opinfo[ord(o)].opflags, REALOP) 119: #define isint(o) isbitset(opinfo[ord(o)].opflags, INTOP) 120: #define isboolean(o) isbitset(opinfo[ord(o)].opflags, BOOL) 121: 122: #define degree(o) (opinfo[ord(o)].opflags&(LEAF|UNARY|BINARY)) 123: #define nargs(o) (opinfo[ord(o)].numargs) 124: 125: #endif 126: 127: /* 128: * Operator information structure. 129: */ 130: 131: public Opinfo opinfo[] ={ 132: /* O_NOP */ 0, null, 0, 133: /* O_NAME */ -1, LEAF, 0, 134: /* O_SYM */ -1, LEAF, 0, 135: /* O_LCON */ -1, LEAF, 0, 136: /* O_CCON */ -1, LEAF, 0, 137: /* O_FCON */ -1, LEAF, 0, 138: /* O_SCON */ -1, LEAF, 0, 139: /* O_RVAL */ 1, UNARY, 0, 140: /* O_INDEX */ 2, null, 0, 141: /* O_INDIR */ 1, UNARY, "^", 142: /* O_DOT */ 2, null, ".", 143: /* O_COMMA */ 2, null, ",", 144: /* O_ITOF */ 1, UNARY|INTOP, 0, 145: /* O_ADD */ 2, BINARY|INTOP, "+", 146: /* O_ADDF */ 2, BINARY|REALOP, "+", 147: /* O_SUB */ 2, BINARY|INTOP, "-", 148: /* O_SUBF */ 2, BINARY|REALOP, "-", 149: /* O_NEG */ 1, UNARY|INTOP, "-", 150: /* O_NEGF */ 1, UNARY|REALOP, "-", 151: /* O_MUL */ 2, BINARY|INTOP, "*", 152: /* O_MULF */ 2, BINARY|REALOP, "*", 153: /* O_DIVF */ 2, BINARY|REALOP, "/", 154: /* O_DIV */ 2, BINARY|INTOP, " div ", 155: /* O_MOD */ 2, BINARY|INTOP, " mod ", 156: /* O_AND */ 2, BINARY|INTOP, " and ", 157: /* O_OR */ 2, BINARY|INTOP, " or ", 158: /* O_LT */ 2, BINARY|INTOP, " < ", 159: /* O_LTF */ 2, BINARY|REALOP, " < ", 160: /* O_LE */ 2, BINARY|INTOP, " <= ", 161: /* O_LEF */ 2, BINARY|REALOP, " <= ", 162: /* O_GT */ 2, BINARY|INTOP, " > ", 163: /* O_GTF */ 2, BINARY|REALOP, " > ", 164: /* O_GE */ 2, BINARY|INTOP, " >= ", 165: /* O_GEF */ 2, BINARY|REALOP, " >= ", 166: /* O_EQ */ 2, BINARY|INTOP, " = ", 167: /* O_EQF */ 2, BINARY|REALOP, " = ", 168: /* O_NE */ 2, BINARY|INTOP, " <> ", 169: /* O_NEF */ 2, BINARY|REALOP, " <> ", 170: 171: /* O_ALIAS */ 2, null, "alias", 172: /* O_ASSIGN */ 2, null, " := ", 173: /* O_CALL */ 2, null, "call", 174: /* O_CATCH */ 0, null, "catch", 175: /* O_CHFILE */ 0, null, "file", 176: /* O_CONT */ 0, null, "cont", 177: /* O_DEBUG */ 0, null, "debug", 178: /* O_DELETE */ 1, null, "delete", 179: /* O_DUMP */ 1, null, "dump", 180: /* O_EDIT */ 0, null, "edit", 181: /* O_FUNC */ 1, null, "func", 182: /* O_GRIPE */ 0, null, "gripe", 183: /* O_HELP */ 0, null, "help", 184: /* O_IGNORE */ 0, null, "ignore", 185: /* O_LIST */ 2, null, "list", 186: /* O_PRINT */ 1, null, "print", 187: /* O_PSYM */ 1, null, "psym", 188: /* O_RUN */ 0, null, "run", 189: /* O_SKIP */ 0, null, "skip", 190: /* O_SOURCE */ 0, null, "source", 191: /* O_STATUS */ 0, null, "status", 192: /* O_STEP */ 0, null, "step", 193: /* O_STOP */ 3, null, "stop", 194: /* O_STOPI */ 3, null, "stopi", 195: /* O_TRACE */ 3, null, "trace", 196: /* O_TRACEI */ 3, null, "tracei", 197: /* O_WHATIS */ 1, null, "whatis", 198: /* O_WHERE */ 0, null, "where", 199: /* O_WHEREIS */ 1, null, "whereis", 200: /* O_WHICH */ 1, null, "which", 201: /* O_EXAMINE */ 0, null, "examine", 202: 203: /* O_ADDEVENT */ 0, null, "when", 204: /* O_ENDX */ 0, null, nil, 205: /* O_IF */ 0, null, "if", 206: /* O_ONCE */ 0, null, "once", 207: /* O_PRINTCALL */ 1, null, "printcall", 208: /* O_PRINTIFCHANGED */ 1, null, "printifchanged", 209: /* O_PRINTRTN */ 1, null, "printrtn", 210: /* O_PRINTSRCPOS */ 1, null, "printsrcpos", 211: /* O_PROCRTN */ 1, null, "procrtn", 212: /* O_QLINE */ 2, null, nil, 213: /* O_STOPIFCHANGED */ 1, null, "stopifchanged", 214: /* O_STOPX */ 0, null, "stop", 215: /* O_TRACEON */ 1, null, "traceon", 216: /* O_TRACEOFF */ 1, null, "traceoff", 217: /* O_TYPERENAME */ 2, UNARY, "type rename", 218: /* O_RERUN */ 0, null, "rerun", 219: /* O_RETURN */ 1, null, "return", 220: /* O_UP */ 1, UNARY, "up", 221: /* O_DOWN */ 1, UNARY, "down", 222: /* O_CALLPROC */ 2, null, "call", 223: /* O_SEARCH */ 2, null, "search", 224: /* O_SET */ 2, null, "set", 225: /* O_UNSET */ 1, null, "unset", 226: /* O_UNALIAS */ 1, null, "unalias", 227: };