Annotation of Gnu-Mach/ddb/db_macro.c, revision 1.1.1.1

1.1       root        1: /* 
                      2:  * Mach Operating System
                      3:  * Copyright (c) 1991,1990 Carnegie Mellon University
                      4:  * All Rights Reserved.
                      5:  * 
                      6:  * Permission to use, copy, modify and distribute this software and its
                      7:  * documentation is hereby granted, provided that both the copyright
                      8:  * notice and this permission notice appear in all copies of the
                      9:  * software, derivative works or modified versions, and any portions
                     10:  * thereof, and that both notices appear in supporting documentation.
                     11:  * 
                     12:  * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
                     13:  * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
                     14:  * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
                     15:  * 
                     16:  * Carnegie Mellon requests users of this software to return to
                     17:  * 
                     18:  *  Software Distribution Coordinator  or  [email protected]
                     19:  *  School of Computer Science
                     20:  *  Carnegie Mellon University
                     21:  *  Pittsburgh PA 15213-3890
                     22:  * 
                     23:  * any improvements or extensions that they make and grant Carnegie Mellon
                     24:  * the rights to redistribute these changes.
                     25:  */
                     26: #include "mach_kdb.h"
                     27: #if MACH_KDB
                     28: 
                     29: #include <kern/thread.h>
                     30: 
                     31: #include <machine/db_machdep.h>
                     32: #include <ddb/db_lex.h>
                     33: #include <ddb/db_variables.h>
                     34: #include <ddb/db_command.h>
                     35: 
                     36: 
                     37: 
                     38: /*
                     39:  * debugger macro support
                     40:  */
                     41: 
                     42: #define DB_MACRO_LEVEL 5               /* max macro nesting */
                     43: #define DB_NARGS       10              /* max args */
                     44: #define DB_NUSER_MACRO 10              /* max user macros */
                     45: 
                     46: int            db_macro_free = DB_NUSER_MACRO;
                     47: struct db_user_macro {
                     48:        char    m_name[TOK_STRING_SIZE];
                     49:        char    m_lbuf[DB_LEX_LINE_SIZE];
                     50:        int     m_size;
                     51: } db_user_macro[DB_NUSER_MACRO];
                     52: 
                     53: int            db_macro_level = 0;
                     54: db_expr_t      db_macro_args[DB_MACRO_LEVEL][DB_NARGS];
                     55: 
                     56: static struct db_user_macro *
                     57: db_lookup_macro(name)
                     58:        char *name;
                     59: {
                     60:        register struct db_user_macro *mp;
                     61: 
                     62:        for (mp = db_user_macro; mp < &db_user_macro[DB_NUSER_MACRO]; mp++) {
                     63:            if (mp->m_name[0] == 0)
                     64:                continue;
                     65:            if (strcmp(mp->m_name, name) == 0)
                     66:                return(mp);
                     67:        }
                     68:        return(0);
                     69: }
                     70: 
                     71: void
                     72: db_def_macro_cmd()
                     73: {
                     74:        register char *p;
                     75:        register c;
                     76:        register struct db_user_macro *mp, *ep;
                     77: 
                     78:        if (db_read_token() != tIDENT) {
                     79:            db_printf("Bad macro name \"%s\"\n", db_tok_string);
                     80:            db_error(0);
                     81:            /* NOTREACHED */
                     82:        }
                     83:        if ((mp = db_lookup_macro(db_tok_string)) == 0) {
                     84:            if (db_macro_free <= 0)
                     85:                db_error("Too many macros\n");
                     86:                /* NOTREACHED */
                     87:            ep = &db_user_macro[DB_NUSER_MACRO];
                     88:            for (mp = db_user_macro; mp < ep && mp->m_name[0]; mp++);
                     89:            if (mp >= ep)
                     90:                db_error("ddb: internal error(macro)\n");
                     91:                /* NOTREACHED */
                     92:            db_macro_free--;
                     93:            db_strcpy(mp->m_name, db_tok_string);
                     94:        }
                     95:        for (c = db_read_char(); c == ' ' || c == '\t'; c = db_read_char());
                     96:        for (p = mp->m_lbuf; c > 0; c = db_read_char())
                     97:            *p++ = c;
                     98:        *p = 0;
                     99:        mp->m_size = p - mp->m_lbuf;
                    100: }
                    101: 
                    102: void
                    103: db_del_macro_cmd()
                    104: {
                    105:        register struct db_user_macro *mp;
                    106: 
                    107:        if (db_read_token() != tIDENT 
                    108:            || (mp = db_lookup_macro(db_tok_string)) == 0) {
                    109:            db_printf("No such macro \"%s\"\n", db_tok_string);
                    110:            db_error(0);
                    111:            /* NOTREACHED */
                    112:        } else {
                    113:            mp->m_name[0] = 0;
                    114:            db_macro_free++;
                    115:        }
                    116: }
                    117: 
                    118: void
                    119: db_show_macro()
                    120: {
                    121:        register struct db_user_macro *mp;
                    122:        int  t;
                    123:        char *name = 0;
                    124: 
                    125:        if ((t = db_read_token()) == tIDENT)
                    126:            name = db_tok_string;
                    127:        else
                    128:            db_unread_token(t);
                    129:        for (mp = db_user_macro; mp < &db_user_macro[DB_NUSER_MACRO]; mp++) {
                    130:            if (mp->m_name[0] == 0)
                    131:                continue;
                    132:            if (name && strcmp(mp->m_name, name))
                    133:                continue;
                    134:            db_printf("%s: %s", mp->m_name, mp->m_lbuf);
                    135:        }
                    136: }
                    137:        
                    138: int
                    139: db_exec_macro(name)
                    140:        char *name;
                    141: {
                    142:        register struct db_user_macro *mp;
                    143:        register n;
                    144: 
                    145:        if ((mp = db_lookup_macro(name)) == 0)
                    146:            return(-1);
                    147:        if (db_macro_level+1 >= DB_MACRO_LEVEL) {
                    148:            db_macro_level = 0;
                    149:            db_error("Too many macro nest\n");
                    150:            /* NOTREACHED */
                    151:        }
                    152:        for (n = 0;
                    153:             n < DB_NARGS && 
                    154:             db_expression(&db_macro_args[db_macro_level+1][n]);
                    155:             n++);
                    156:        while (n < DB_NARGS)
                    157:            db_macro_args[db_macro_level+1][n++] = 0;
                    158:        db_macro_level++;
                    159:        db_exec_cmd_nest(mp->m_lbuf, mp->m_size);
                    160:        db_macro_level--;
                    161:        return(0);
                    162: }
                    163: 
                    164: int
                    165: /* ARGSUSED */
                    166: db_arg_variable(vp, valuep, flag, ap)
                    167:        struct db_variable      *vp;
                    168:        db_expr_t               *valuep;
                    169:        int                     flag;
                    170:        db_var_aux_param_t      ap;
                    171: {
                    172:        if (ap->level != 1 || ap->suffix[0] < 1 || ap->suffix[0] > DB_NARGS) {
                    173:            db_error("Bad $arg variable\n");
                    174:            /* NOTREACHED */
                    175:        }
                    176:        if (flag == DB_VAR_GET)
                    177:            *valuep = db_macro_args[db_macro_level][ap->suffix[0]-1];
                    178:        else
                    179:            db_macro_args[db_macro_level][ap->suffix[0]-1] = *valuep;
                    180:        return(0);
                    181: }
                    182: 
                    183: #endif MACH_KDB

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.