Annotation of XNU/osfmk/ddb/db_macro.c, revision 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.