Annotation of XNU/osfmk/ddb/db_macro.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
                      3:  *
                      4:  * @APPLE_LICENSE_HEADER_START@
                      5:  * 
                      6:  * The contents of this file constitute Original Code as defined in and
                      7:  * are subject to the Apple Public Source License Version 1.1 (the
                      8:  * "License").  You may not use this file except in compliance with the
                      9:  * License.  Please obtain a copy of the License at
                     10:  * http://www.apple.com/publicsource and read it before using this file.
                     11:  * 
                     12:  * This Original Code and all software distributed under the License are
                     13:  * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
                     14:  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
                     15:  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
                     16:  * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
                     17:  * License for the specific language governing rights and limitations
                     18:  * under the License.
                     19:  * 
                     20:  * @APPLE_LICENSE_HEADER_END@
                     21:  */
                     22: /*
                     23:  * @OSF_COPYRIGHT@
                     24:  */
                     25: /*
                     26:  * HISTORY
                     27:  * 
                     28:  * Revision 1.1.1.1  1998/09/22 21:05:48  wsanchez
                     29:  * Import of Mac OS X kernel (~semeria)
                     30:  *
                     31:  * Revision 1.1.1.1  1998/03/07 02:26:09  wsanchez
                     32:  * Import of OSF Mach kernel (~mburg)
                     33:  *
                     34:  * Revision 1.2.10.4  1996/01/09  19:15:54  devrcs
                     35:  *     Change 'register foo' to 'register int foo'.
                     36:  *     [1995/12/01  21:42:14  jfraser]
                     37:  *
                     38:  *     Merged '64-bit safe' changes from DEC alpha port.
                     39:  *     [1995/11/21  18:03:15  jfraser]
                     40:  *
                     41:  * Revision 1.2.10.3  1995/01/06  19:10:28  devrcs
                     42:  *     mk6 CR668 - 1.3b26 merge
                     43:  *     fix typing
                     44:  *     [1994/11/04  08:49:38  dwm]
                     45:  * 
                     46:  * Revision 1.2.10.2  1994/09/23  01:20:19  ezf
                     47:  *     change marker to not FREE
                     48:  *     [1994/09/22  21:10:23  ezf]
                     49:  * 
                     50:  * Revision 1.2.10.1  1994/06/11  21:11:52  bolinger
                     51:  *     Merge up to NMK17.2.
                     52:  *     [1994/06/11  20:01:51  bolinger]
                     53:  * 
                     54:  * Revision 1.2.8.1  1994/02/08  10:58:03  bernadat
                     55:  *     Fixed reinitialization of db_macro_level to -1.
                     56:  *     Put DB_MACRO_LEVEL and DB_NARGS macros to <ddb/db_variables.h>.
                     57:  *     Changed name of DB_NARGS to DB_MACRO_NARGS.
                     58:  *     Added support of DB_VAR_SHOW.
                     59:  *     [93/08/12            paire]
                     60:  *     [94/02/07            bernadat]
                     61:  * 
                     62:  * Revision 1.2.2.4  1993/08/11  20:37:58  elliston
                     63:  *     Add ANSI Prototypes.  CR #9523.
                     64:  *     [1993/08/11  03:33:33  elliston]
                     65:  * 
                     66:  * Revision 1.2.2.3  1993/07/27  18:27:42  elliston
                     67:  *     Add ANSI prototypes.  CR #9523.
                     68:  *     [1993/07/27  18:12:24  elliston]
                     69:  * 
                     70:  * Revision 1.2.2.2  1993/06/09  02:20:18  gm
                     71:  *     Added to OSF/1 R1.3 from NMK15.0.
                     72:  *     [1993/06/02  20:56:40  jeffc]
                     73:  * 
                     74:  * Revision 1.2  1993/04/19  16:02:25  devrcs
                     75:  *     Changes from mk78:
                     76:  *     Removed unused variable from db_exec_macro().
                     77:  *     Added include of <ddb/db_command.h>.
                     78:  *     [92/05/16            jfriedl]
                     79:  *     [93/02/02            bruel]
                     80:  * 
                     81:  * Revision 1.1  1992/09/30  02:01:12  robert
                     82:  *     Initial revision
                     83:  * 
                     84:  * $EndLog$
                     85:  */
                     86: /* CMU_HIST */
                     87: /*
                     88:  * Revision 2.2  91/10/09  16:01:09  af
                     89:  *      Revision 2.1.3.1  91/10/05  13:06:40  jeffreyh
                     90:  *             Created for macro support.
                     91:  *             [91/08/29            tak]
                     92:  * 
                     93:  * Revision 2.1.3.1  91/10/05  13:06:40  jeffreyh
                     94:  *     Created for macro support.
                     95:  *     [91/08/29            tak]
                     96:  * 
                     97:  */
                     98: /* CMU_ENDHIST */
                     99: /* 
                    100:  * Mach Operating System
                    101:  * Copyright (c) 1991,1990 Carnegie Mellon University
                    102:  * All Rights Reserved.
                    103:  * 
                    104:  * Permission to use, copy, modify and distribute this software and its
                    105:  * documentation is hereby granted, provided that both the copyright
                    106:  * notice and this permission notice appear in all copies of the
                    107:  * software, derivative works or modified versions, and any portions
                    108:  * thereof, and that both notices appear in supporting documentation.
                    109:  * 
                    110:  * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
                    111:  * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
                    112:  * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
                    113:  * 
                    114:  * Carnegie Mellon requests users of this software to return to
                    115:  * 
                    116:  *  Software Distribution Coordinator  or  [email protected]
                    117:  *  School of Computer Science
                    118:  *  Carnegie Mellon University
                    119:  *  Pittsburgh PA 15213-3890
                    120:  * 
                    121:  * any improvements or extensions that they make and grant Carnegie Mellon
                    122:  * the rights to redistribute these changes.
                    123:  */
                    124: /*
                    125:  */
                    126: #include <kern/thread.h>
                    127: #include <string.h>                    /* For strcmp(), strcpy() */
                    128: 
                    129: #include <machine/db_machdep.h>
                    130: #include <ddb/db_command.h>
                    131: #include <ddb/db_expr.h>
                    132: #include <ddb/db_lex.h>
                    133: #include <ddb/db_macro.h>
                    134: #include <ddb/db_output.h>             /* For db_printf() */
                    135: #include <ddb/db_sym.h>
                    136: #include <ddb/db_variables.h>
                    137: 
                    138: /*
                    139:  * debugger macro support
                    140:  */
                    141: 
                    142: #define DB_NUSER_MACRO 10              /* max user macros */
                    143: 
                    144: int            db_macro_free = DB_NUSER_MACRO;
                    145: struct db_user_macro {
                    146:        char    m_name[TOK_STRING_SIZE];
                    147:        char    m_lbuf[DB_LEX_LINE_SIZE];
                    148:        int     m_size;
                    149: } db_user_macro[DB_NUSER_MACRO];
                    150: 
                    151: int            db_macro_level = -1;
                    152: db_expr_t      db_macro_args[DB_MACRO_LEVEL][DB_MACRO_NARGS];
                    153: 
                    154: 
                    155: /* Prototypes for functions local to this file.
                    156:  */
                    157: static struct db_user_macro *db_lookup_macro(char *name);
                    158: 
                    159: 
                    160: static struct db_user_macro *
                    161: db_lookup_macro(char *name)
                    162: {
                    163:        register struct db_user_macro *mp;
                    164: 
                    165:        for (mp = db_user_macro; mp < &db_user_macro[DB_NUSER_MACRO]; mp++) {
                    166:            if (mp->m_name[0] == 0)
                    167:                continue;
                    168:            if (strcmp(mp->m_name, name) == 0)
                    169:                return(mp);
                    170:        }
                    171:        return(0);
                    172: }
                    173: 
                    174: void
                    175: db_def_macro_cmd(void)
                    176: {
                    177:        register char *p;
                    178:        register int c;
                    179:        register struct db_user_macro *mp, *ep;
                    180: 
                    181:        if (db_read_token() != tIDENT) {
                    182:            db_printf("Bad macro name \"%s\"\n", db_tok_string);
                    183:            db_error(0);
                    184:            /* NOTREACHED */
                    185:        }
                    186:        if ((mp = db_lookup_macro(db_tok_string)) == 0) {
                    187:            if (db_macro_free <= 0)
                    188:                db_error("Too many macros\n");
                    189:                /* NOTREACHED */
                    190:            ep = &db_user_macro[DB_NUSER_MACRO];
                    191:            for (mp = db_user_macro; mp < ep && mp->m_name[0]; mp++);
                    192:            if (mp >= ep)
                    193:                db_error("ddb: internal error(macro)\n");
                    194:                /* NOTREACHED */
                    195:            db_macro_free--;
                    196:            strcpy(mp->m_name, db_tok_string);
                    197:        }
                    198:        for (c = db_read_char(); c == ' ' || c == '\t'; c = db_read_char());
                    199:        for (p = mp->m_lbuf; c > 0; c = db_read_char())
                    200:            *p++ = c;
                    201:        *p = 0;
                    202:        mp->m_size = p - mp->m_lbuf;
                    203: }
                    204: 
                    205: void
                    206: db_del_macro_cmd(void)
                    207: {
                    208:        register struct db_user_macro *mp;
                    209: 
                    210:        if (db_read_token() != tIDENT 
                    211:            || (mp = db_lookup_macro(db_tok_string)) == 0) {
                    212:            db_printf("No such macro \"%s\"\n", db_tok_string);
                    213:            db_error(0);
                    214:            /* NOTREACHED */
                    215:        }
                    216:        mp->m_name[0] = 0;
                    217:        db_macro_free++;
                    218: }
                    219: 
                    220: void
                    221: db_show_macro(void)
                    222: {
                    223:        register struct db_user_macro *mp;
                    224:        int  t;
                    225:        char *name = 0;
                    226: 
                    227:        if ((t = db_read_token()) == tIDENT)
                    228:            name = db_tok_string;
                    229:        else
                    230:            db_unread_token(t);
                    231:        for (mp = db_user_macro; mp < &db_user_macro[DB_NUSER_MACRO]; mp++) {
                    232:            if (mp->m_name[0] == 0)
                    233:                continue;
                    234:            if (name && strcmp(mp->m_name, name))
                    235:                continue;
                    236:            db_printf("%s: %s", mp->m_name, mp->m_lbuf);
                    237:        }
                    238: }
                    239: 
                    240: int
                    241: db_exec_macro(char *name)
                    242: {
                    243:        register struct db_user_macro *mp;
                    244:        register int n;
                    245: 
                    246:        if ((mp = db_lookup_macro(name)) == 0)
                    247:            return(-1);
                    248:        if (db_macro_level+1 >= DB_MACRO_LEVEL) {
                    249:            db_macro_level = -1;
                    250:            db_error("Too many macro nest\n");
                    251:            /* NOTREACHED */
                    252:        }
                    253:        for (n = 0;
                    254:             n < DB_MACRO_NARGS && 
                    255:             db_expression(&db_macro_args[db_macro_level+1][n]);
                    256:             n++);
                    257:        while (n < DB_MACRO_NARGS)
                    258:            db_macro_args[db_macro_level+1][n++] = 0;
                    259:        db_macro_level++;
                    260:        db_exec_cmd_nest(mp->m_lbuf, mp->m_size);
                    261:        db_macro_level--;
                    262:        return(0);
                    263: }
                    264: 
                    265: int
                    266: db_arg_variable(
                    267:        struct db_variable      *vp,
                    268:        db_expr_t               *valuep,
                    269:        int                     flag,
                    270:        db_var_aux_param_t      ap)
                    271: {
                    272:        db_expr_t value;
                    273:        char *name;
                    274:        db_addr_t offset;
                    275: 
                    276:        if (flag == DB_VAR_SHOW) {
                    277:            value = db_macro_args[ap->hidden_level][ap->suffix[0]-1];
                    278:            db_printf("%#n", value);
                    279:            db_find_xtrn_task_sym_and_offset(value, &name, &offset, TASK_NULL);
                    280:            if (name != (char *)0 && offset <= db_maxoff && offset != value) {
                    281:                db_printf("\t%s", name);
                    282:                if (offset != 0)
                    283:                    db_printf("+%#r", offset);
                    284:            }
                    285:            return(0);
                    286:        }
                    287: 
                    288:        if (ap->level != 1 || ap->suffix[0] < 1 ||
                    289:            ap->suffix[0] > DB_MACRO_NARGS) {
                    290:            db_error("Bad $arg variable\n");
                    291:            /* NOTREACHED */
                    292:        }
                    293:        if (flag == DB_VAR_GET)
                    294:            *valuep = db_macro_args[db_macro_level][ap->suffix[0]-1];
                    295:        else
                    296:            db_macro_args[db_macro_level][ap->suffix[0]-1] = *valuep;
                    297:        return(0);
                    298: }

unix.superglobalmegacorp.com

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