Annotation of XNU/osfmk/ddb/db_variables.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.18.5  1996/01/09  19:16:34  devrcs
        !            35:  *     Search the alternate register names if configured
        !            36:  *     Changed declarations of 'register foo' to 'register int foo'.
        !            37:  *     [1995/12/01  21:42:42  jfraser]
        !            38:  *
        !            39:  *     Merged '64-bit safe' changes from DEC alpha port.
        !            40:  *     [1995/11/21  18:03:56  jfraser]
        !            41:  *
        !            42:  * Revision 1.2.18.4  1995/02/23  21:43:56  alanl
        !            43:  *     Merged with DIPC2_SHARED.
        !            44:  *     [1995/01/05  13:35:55  alanl]
        !            45:  * 
        !            46:  * Revision 1.2.21.1  1994/11/04  09:53:26  dwm
        !            47:  *     mk6 CR668 - 1.3b26 merge
        !            48:  *     * Revision 1.2.4.6  1994/05/06  18:40:13  tmt
        !            49:  *     Merged osc1.3dec/shared with osc1.3b19
        !            50:  *     Merge Alpha changes into osc1.312b source code.
        !            51:  *     64bit cleanup.
        !            52:  *     * End1.3merge
        !            53:  *     [1994/11/04  08:50:12  dwm]
        !            54:  * 
        !            55:  * Revision 1.2.18.2  1994/09/23  01:22:35  ezf
        !            56:  *     change marker to not FREE
        !            57:  *     [1994/09/22  21:11:24  ezf]
        !            58:  * 
        !            59:  * Revision 1.2.18.1  1994/06/11  21:12:37  bolinger
        !            60:  *     Merge up to NMK17.2.
        !            61:  *     [1994/06/11  20:03:04  bolinger]
        !            62:  * 
        !            63:  * Revision 1.2.23.1  1994/12/06  19:43:18  alanl
        !            64:  *     Intel merge, Oct 94 code drop.
        !            65:  *     Added db_find_reg_name (came from db_print.c).
        !            66:  *     [94/11/28            mmp]
        !            67:  * 
        !            68:  * Revision 1.2.16.1  1994/02/08  10:59:08  bernadat
        !            69:  *     Added completion variable.
        !            70:  *     [93/08/17            paire]
        !            71:  * 
        !            72:  *     Set up new fields (hidden_xxx) of db_vars[] array that are supposed
        !            73:  *     to be helpful to display variables depending on an internal value
        !            74:  *     like db_macro_level for macro arguments.
        !            75:  *     Added db_auto_wrap as new variable.
        !            76:  *     Added "set help" for listing all available variables.
        !            77:  *     Added db_show_variable() and db_show_one_variable()
        !            78:  *     to print variable values.
        !            79:  *     [93/08/12            paire]
        !            80:  *     [94/02/08            bernadat]
        !            81:  * 
        !            82:  * Revision 1.2.4.4  1993/08/11  20:38:20  elliston
        !            83:  *     Add ANSI Prototypes.  CR #9523.
        !            84:  *     [1993/08/11  03:34:13  elliston]
        !            85:  * 
        !            86:  * Revision 1.2.4.3  1993/07/27  18:28:27  elliston
        !            87:  *     Add ANSI prototypes.  CR #9523.
        !            88:  *     [1993/07/27  18:13:22  elliston]
        !            89:  * 
        !            90:  * Revision 1.2.4.2  1993/06/09  02:21:02  gm
        !            91:  *     Added to OSF/1 R1.3 from NMK15.0.
        !            92:  *     [1993/06/02  20:57:43  jeffc]
        !            93:  * 
        !            94:  * Revision 1.2  1993/04/19  16:03:25  devrcs
        !            95:  *     Changes from mk78:
        !            96:  *     Added void to db_read_write_variable().
        !            97:  *     Removed unused variable 'func' from db_set_cmd().
        !            98:  *     [92/05/16            jfriedl]
        !            99:  *     [93/02/02            bruel]
        !           100:  * 
        !           101:  *     Print old value when changing register values.
        !           102:  *     [[email protected]]
        !           103:  *     [92/12/03            bernadat]
        !           104:  * 
        !           105:  * Revision 1.1  1992/09/30  02:01:31  robert
        !           106:  *     Initial revision
        !           107:  * 
        !           108:  * $EndLog$
        !           109:  */
        !           110: /* CMU_HIST */
        !           111: /*
        !           112:  * Revision 2.5  91/10/09  16:03:59  af
        !           113:  *      Revision 2.4.3.1  91/10/05  13:08:27  jeffreyh
        !           114:  *             Added suffix handling and thread handling of variables.
        !           115:  *             Added new variables: lines, task, thread, work and arg.
        !           116:  *             Moved db_read_variable and db_write_variable to db_variables.h
        !           117:  *               as macros, and added db_read_write_variable instead.
        !           118:  *             Changed some error messages.
        !           119:  *             [91/08/29            tak]
        !           120:  * 
        !           121:  * Revision 2.4.3.1  91/10/05  13:08:27  jeffreyh
        !           122:  *     Added suffix handling and thread handling of variables.
        !           123:  *     Added new variables: lines, task, thread, work and arg.
        !           124:  *     Moved db_read_variable and db_write_variable to db_variables.h
        !           125:  *       as macros, and added db_read_write_variable instead.
        !           126:  *     Changed some error messages.
        !           127:  *     [91/08/29            tak]
        !           128:  * 
        !           129:  * Revision 2.4  91/05/14  15:36:57  mrt
        !           130:  *     Correcting copyright
        !           131:  * 
        !           132:  * Revision 2.3  91/02/05  17:07:19  mrt
        !           133:  *     Changed to new Mach copyright
        !           134:  *     [91/01/31  16:19:46  mrt]
        !           135:  * 
        !           136:  * Revision 2.2  90/08/27  21:53:24  dbg
        !           137:  *     New db_read/write_variable functions.  Should be used instead
        !           138:  *     of dereferencing valuep directly, which might not be a true
        !           139:  *     pointer if there is an fcn() access function.
        !           140:  *     [90/08/20            af]
        !           141:  * 
        !           142:  *     Fix declarations.
        !           143:  *     Check for trailing garbage after last expression on command line.
        !           144:  *     [90/08/10  14:34:54  dbg]
        !           145:  * 
        !           146:  *     Created.
        !           147:  *     [90/07/25            dbg]
        !           148:  * 
        !           149:  */
        !           150: /* CMU_ENDHIST */
        !           151: /* 
        !           152:  * Mach Operating System
        !           153:  * Copyright (c) 1991,1990 Carnegie Mellon University
        !           154:  * All Rights Reserved.
        !           155:  * 
        !           156:  * Permission to use, copy, modify and distribute this software and its
        !           157:  * documentation is hereby granted, provided that both the copyright
        !           158:  * notice and this permission notice appear in all copies of the
        !           159:  * software, derivative works or modified versions, and any portions
        !           160:  * thereof, and that both notices appear in supporting documentation.
        !           161:  * 
        !           162:  * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
        !           163:  * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
        !           164:  * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
        !           165:  * 
        !           166:  * Carnegie Mellon requests users of this software to return to
        !           167:  * 
        !           168:  *  Software Distribution Coordinator  or  [email protected]
        !           169:  *  School of Computer Science
        !           170:  *  Carnegie Mellon University
        !           171:  *  Pittsburgh PA 15213-3890
        !           172:  * 
        !           173:  * any improvements or extensions that they make and grant Carnegie Mellon
        !           174:  * the rights to redistribute these changes.
        !           175:  */
        !           176: /*
        !           177:  */
        !           178: /*
        !           179:  *     Author: David B. Golub, Carnegie Mellon University
        !           180:  *     Date:   7/90
        !           181:  */
        !           182: 
        !           183: #include <machine/db_machdep.h>
        !           184: #include <string.h>                    /* For strcpy() */
        !           185: 
        !           186: #include <ddb/db_lex.h>
        !           187: #include <ddb/db_variables.h>
        !           188: #include <ddb/db_task_thread.h>
        !           189: #include <ddb/db_sym.h>
        !           190: #include <ddb/db_command.h>
        !           191: #include <ddb/db_expr.h>
        !           192: #include <ddb/db_macro.h>
        !           193: #include <ddb/db_output.h>             /* For db_printf() */
        !           194: 
        !           195: extern db_expr_t       db_radix;
        !           196: extern db_expr_t       db_max_width;
        !           197: extern db_expr_t       db_tab_stop_width;
        !           198: extern db_expr_t       db_max_line;
        !           199: extern db_expr_t       db_auto_wrap;
        !           200: extern db_expr_t       db_macro_level;
        !           201: extern db_expr_t       db_auto_completion;
        !           202: 
        !           203: #define DB_NWORK       32              /* number of work variable */
        !           204: 
        !           205: db_expr_t      db_work[DB_NWORK];      /* work variable */
        !           206: 
        !           207: struct db_variable db_vars[] = {
        !           208:        { "maxoff",     (db_expr_t*)&db_maxoff, FCN_NULL },
        !           209:        { "autowrap",   &db_auto_wrap,          FCN_NULL },
        !           210:        { "completion", &db_auto_completion,    FCN_NULL },
        !           211:        { "maxwidth",   &db_max_width,          FCN_NULL },
        !           212:        { "radix",      &db_radix,              FCN_NULL },
        !           213:        { "tabstops",   &db_tab_stop_width,     FCN_NULL },
        !           214:        { "lines",      &db_max_line,           FCN_NULL },
        !           215:        { "thr_act",    0,                      db_set_default_act      },
        !           216:        { "task",       0,                      db_get_task_act,
        !           217:          1,            2,                      -1,     -1              },
        !           218:        { "work",       &db_work[0],            FCN_NULL,
        !           219:          1,            1,                      0,      DB_NWORK-1      },
        !           220:        { "arg",        0,                      db_arg_variable,
        !           221:          1,            1,                      1,      DB_MACRO_NARGS,
        !           222:          1,            0,      DB_MACRO_LEVEL-1,       (int *)&db_macro_level  },
        !           223: };
        !           224: struct db_variable *db_evars = db_vars + sizeof(db_vars)/sizeof(db_vars[0]);
        !           225: 
        !           226: 
        !           227: 
        !           228: /* Prototypes for functions local to this file.
        !           229:  */
        !           230: 
        !           231: static char *db_get_suffix(
        !           232:        register char   *suffix,
        !           233:        short           *suffix_value);
        !           234: 
        !           235: static boolean_t db_cmp_variable_name(
        !           236:        struct db_variable              *vp,
        !           237:        char                            *name,
        !           238:        register db_var_aux_param_t     ap);
        !           239: 
        !           240: static int db_find_variable(
        !           241:        struct db_variable      **varp,
        !           242:        db_var_aux_param_t      ap);
        !           243: 
        !           244: static int db_set_variable(db_expr_t value);
        !           245: 
        !           246: void db_list_variable(void);
        !           247: 
        !           248: static char *
        !           249: db_get_suffix(
        !           250:        register char   *suffix,
        !           251:        short           *suffix_value)
        !           252: {
        !           253:        register int value;
        !           254: 
        !           255:        for (value = 0; *suffix && *suffix != '.' && *suffix != ':'; suffix++) {
        !           256:            if (*suffix < '0' || *suffix > '9')
        !           257:                return(0);
        !           258:            value = value*10 + *suffix - '0';
        !           259:        }
        !           260:        *suffix_value = value;
        !           261:        if (*suffix == '.')
        !           262:            suffix++;
        !           263:        return(suffix);
        !           264: }
        !           265: 
        !           266: static boolean_t
        !           267: db_cmp_variable_name(
        !           268:        struct db_variable              *vp,
        !           269:        char                            *name,
        !           270:        register db_var_aux_param_t     ap)
        !           271: {
        !           272:        register char *var_np, *np;
        !           273:        register int level;
        !           274:        
        !           275:        for (np = name, var_np = vp->name; *var_np; ) {
        !           276:            if (*np++ != *var_np++)
        !           277:                return(FALSE);
        !           278:        }
        !           279:        for (level = 0; *np && *np != ':' && level < vp->max_level; level++){
        !           280:            if ((np = db_get_suffix(np, &ap->suffix[level])) == 0)
        !           281:                return(FALSE);
        !           282:        }
        !           283:        if ((*np && *np != ':') || level < vp->min_level
        !           284:            || (level > 0 && (ap->suffix[0] < vp->low 
        !           285:                              || (vp->high >= 0 && ap->suffix[0] > vp->high))))
        !           286:            return(FALSE);
        !           287:        strcpy(ap->modif, (*np)? np+1: "");
        !           288:        ap->thr_act = (db_option(ap->modif, 't')?db_default_act: THR_ACT_NULL);
        !           289:        ap->level = level;
        !           290:        ap->hidden_level = -1;
        !           291:        return(TRUE);
        !           292: }
        !           293: 
        !           294: static int
        !           295: db_find_variable(
        !           296:        struct db_variable      **varp,
        !           297:        db_var_aux_param_t      ap)
        !           298: {
        !           299:        int     t;
        !           300:        struct db_variable *vp;
        !           301: 
        !           302:        t = db_read_token();
        !           303:        if (t == tIDENT) {
        !           304:            for (vp = db_vars; vp < db_evars; vp++) {
        !           305:                if (db_cmp_variable_name(vp, db_tok_string, ap)) {
        !           306:                    *varp = vp;
        !           307:                    return (1);
        !           308:                }
        !           309:            }
        !           310:            for (vp = db_regs; vp < db_eregs; vp++) {
        !           311:                if (db_cmp_variable_name(vp, db_tok_string, ap)) {
        !           312:                    *varp = vp;
        !           313:                    return (1);
        !           314:                }
        !           315:            }
        !           316: #if defined(ALTERNATE_REGISTER_DEFS)
        !           317:            for (vp = db_altregs; vp < db_ealtregs; vp++) {
        !           318:                if (db_cmp_variable_name(vp, db_tok_string, ap)) {
        !           319:                    *varp = vp;
        !           320:                    return (1);
        !           321:                }
        !           322:            }
        !           323: #endif /* defined(ALTERNATE_REGISTER_DEFS) */
        !           324:        }
        !           325:        db_printf("Unknown variable \"$%s\"\n", db_tok_string);
        !           326:        db_error(0);
        !           327:        return (0);
        !           328: }
        !           329: 
        !           330: int
        !           331: db_get_variable(db_expr_t *valuep)
        !           332: {
        !           333:        struct db_variable *vp;
        !           334:        struct db_var_aux_param aux_param;
        !           335:        char            modif[TOK_STRING_SIZE];
        !           336: 
        !           337:        aux_param.modif = modif;
        !           338:        if (!db_find_variable(&vp, &aux_param))
        !           339:            return (0);
        !           340: 
        !           341:        db_read_write_variable(vp, valuep, DB_VAR_GET, &aux_param);
        !           342: 
        !           343:        return (1);
        !           344: }
        !           345: 
        !           346: static int
        !           347: db_set_variable(db_expr_t value)
        !           348: {
        !           349:        struct db_variable *vp;
        !           350:        struct db_var_aux_param aux_param;
        !           351:        char            modif[TOK_STRING_SIZE];
        !           352: 
        !           353:        aux_param.modif = modif;
        !           354:        if (!db_find_variable(&vp, &aux_param))
        !           355:            return (0);
        !           356: 
        !           357:        db_read_write_variable(vp, &value, DB_VAR_SET, &aux_param);
        !           358: 
        !           359:        return (1);
        !           360: }
        !           361: 
        !           362: void
        !           363: db_read_write_variable(
        !           364:        struct db_variable      *vp,
        !           365:        db_expr_t               *valuep,
        !           366:        int                     rw_flag,
        !           367:        db_var_aux_param_t      ap)
        !           368: {
        !           369:        int     (*func)(struct db_variable*, db_expr_t*,int, db_var_aux_param_t)
        !           370:                        = vp->fcn;
        !           371:        struct  db_var_aux_param aux_param;
        !           372:        db_expr_t old_value;
        !           373: 
        !           374:        if (ap == 0) {
        !           375:            ap = &aux_param;
        !           376:            ap->modif = "";
        !           377:            ap->level = 0;
        !           378:            ap->thr_act = THR_ACT_NULL;
        !           379:        }
        !           380:        if (rw_flag == DB_VAR_SET && vp->precious)
        !           381:                db_read_write_variable(vp, &old_value, DB_VAR_GET, ap);
        !           382:        if (func == FCN_NULL) {
        !           383:            if (rw_flag == DB_VAR_SET)
        !           384:                vp->valuep[(ap->level)? (ap->suffix[0] - vp->low): 0] = *valuep;
        !           385:            else
        !           386:                *valuep = vp->valuep[(ap->level)? (ap->suffix[0] - vp->low): 0];
        !           387:        } else
        !           388:            (*func)(vp, valuep, rw_flag, ap);
        !           389:        if (rw_flag == DB_VAR_SET && vp->precious)
        !           390:                db_printf("\t$%s:%s<%#x>\t%#8n\t=\t%#8n\n", vp->name,
        !           391:                          ap->modif, ap->thr_act, old_value, *valuep);
        !           392: }
        !           393: 
        !           394: void
        !           395: db_list_variable(void)
        !           396: {
        !           397:        register struct db_variable *new;
        !           398:        register struct db_variable *old;
        !           399:        register struct db_variable *cur;
        !           400:        unsigned int l;
        !           401:        unsigned int len;
        !           402:        short i;
        !           403:        unsigned int j;
        !           404: 
        !           405:        len = 1;
        !           406:        for (cur = db_vars; cur < db_evars; cur++) {
        !           407:            if (cur->min_level > 0 || cur->max_level > 0) {
        !           408:                j = 3 * (cur->max_level - cur->min_level + 1) - 1;
        !           409:                if (cur->max_level > cur->min_level)
        !           410:                    j += 2;
        !           411:            } else
        !           412:                j = 0;
        !           413:            if ((l = strlen(cur->name) + j) >= len)
        !           414:                len = l + 1;
        !           415:        }
        !           416: 
        !           417:        old = (struct db_variable *)0;
        !           418:        for (;;) {
        !           419:            new = (struct db_variable *)0;
        !           420:            for (cur = db_vars; cur < db_evars; cur++)
        !           421:                if ((new == (struct db_variable *)0 ||
        !           422:                     strcmp(cur->name, new->name) < 0) &&
        !           423:                    (old == (struct db_variable *)0 ||
        !           424:                     strcmp(cur->name, old->name) > 0))
        !           425:                    new = cur;
        !           426:            if (new == (struct db_variable *)0)
        !           427:                    return;
        !           428:            db_reserve_output_position(len);
        !           429:            db_printf(new->name);
        !           430:            j = strlen(new->name);
        !           431:            if (new->min_level > 0) {
        !           432:                db_putchar('?');
        !           433:                db_putchar('?');
        !           434:                j += 2;
        !           435:                for (i = new->min_level - 1; i > 0; i--) {
        !           436:                    db_putchar('.');
        !           437:                    db_putchar('?');
        !           438:                    db_putchar('?');
        !           439:                    j += 3;
        !           440:                }
        !           441:                if (new->max_level > new->min_level) {
        !           442:                    db_putchar('[');
        !           443:                    db_putchar('.');
        !           444:                    db_putchar('?');
        !           445:                    db_putchar('?');
        !           446:                    j += 4;
        !           447:                }
        !           448:                i = new->min_level + 1;
        !           449:            } else {
        !           450:                if (new->max_level > new->min_level) {
        !           451:                    db_putchar('[');
        !           452:                    j++;
        !           453:                }
        !           454:                i = new->min_level;
        !           455:            }
        !           456:            while (i++ < new->max_level) {
        !           457:                 db_putchar('.');
        !           458:                 db_putchar('?');
        !           459:                 db_putchar('?');
        !           460:                 j += 3;
        !           461:            }
        !           462:            if (new->max_level > new->min_level) {
        !           463:                 db_putchar(']');
        !           464:                 j++;
        !           465:            }
        !           466:            while (j++ < len)
        !           467:                    db_putchar(' ');
        !           468:            old = new;
        !           469:        }
        !           470: }
        !           471: 
        !           472: void
        !           473: db_set_cmd(void)
        !           474: {
        !           475:        db_expr_t       value;
        !           476:        int             t;
        !           477:        struct db_variable *vp;
        !           478:        struct db_var_aux_param aux_param;
        !           479:        char            modif[TOK_STRING_SIZE];
        !           480: 
        !           481:        aux_param.modif = modif;
        !           482:        t = db_read_token();
        !           483:        if (t == tIDENT && strcmp("help", db_tok_string) == 0) {
        !           484:                db_list_variable();
        !           485:                return;
        !           486:        }
        !           487:        if (t != tDOLLAR) {
        !           488:            db_error("Variable name should be prefixed with $\n");
        !           489:            return;
        !           490:        }
        !           491:        if (!db_find_variable(&vp, &aux_param)) {
        !           492:            db_error("Unknown variable\n");
        !           493:            return;
        !           494:        }
        !           495: 
        !           496:        t = db_read_token();
        !           497:        if (t != tEQ)
        !           498:            db_unread_token(t);
        !           499: 
        !           500:        if (!db_expression(&value)) {
        !           501:            db_error("No value\n");
        !           502:            return;
        !           503:        }
        !           504:        if ((t = db_read_token()) == tSEMI_COLON)
        !           505:            db_unread_token(t);
        !           506:        else if (t != tEOL)
        !           507:            db_error("?\n");
        !           508: 
        !           509:        db_read_write_variable(vp, &value, DB_VAR_SET, &aux_param);
        !           510: }
        !           511: 
        !           512: void
        !           513: db_show_one_variable(void)
        !           514: {
        !           515:        struct db_variable *cur;
        !           516:        unsigned int len;
        !           517:        unsigned int sl;
        !           518:        unsigned int slen;
        !           519:        short h;
        !           520:        short i;
        !           521:        short j;
        !           522:        short k;
        !           523:        short low;
        !           524:        int hidden_level;
        !           525:        struct db_var_aux_param aux_param;
        !           526:        char *p;
        !           527:        char *q;
        !           528:        char *name;
        !           529:        db_addr_t offset;
        !           530: 
        !           531:        for (cur = db_vars; cur < db_evars; cur++)
        !           532:            if (db_cmp_variable_name(cur, db_tok_string, &aux_param))
        !           533:                break;
        !           534:        if (cur == db_evars) {
        !           535:            for (cur = db_vars; cur < db_evars; cur++) {
        !           536:                for (q = cur->name, p = db_tok_string; *q && *p == *q; p++,q++)
        !           537:                    continue;
        !           538:                if (*q == '\0')
        !           539:                    break;
        !           540:            }
        !           541:            if (cur == db_evars) {
        !           542:                db_error("Unknown variable\n");
        !           543:                return;
        !           544:            }
        !           545: 
        !           546:            for (i = 0; *p && *p != ':' && i < cur->max_level; i++, p = q)
        !           547:                if ((q = db_get_suffix(p, &aux_param.suffix[i])) == 0)
        !           548:                    break;
        !           549:            aux_param.level = i;
        !           550:            if ((*p && *p != ':') ||
        !           551:                (i > 0 && (aux_param.suffix[0] < cur->low  ||
        !           552:                           (cur->high >= 0 &&
        !           553:                            aux_param.suffix[0] > cur->high)))) {
        !           554:                db_error("Unknown variable format\n");
        !           555:                return;
        !           556:            }
        !           557: 
        !           558:            strcpy(aux_param.modif, *p ? p + 1 : "");
        !           559:            aux_param.thr_act = (db_option(aux_param.modif, 't') ?
        !           560:                        db_default_act : THR_ACT_NULL);
        !           561:        }
        !           562: 
        !           563:        if (cur->hidden_level)
        !           564:            if (*cur->hidden_levelp >= cur->hidden_low &&
        !           565:                *cur->hidden_levelp <= cur->hidden_high) {
        !           566:                hidden_level = 1;
        !           567:                aux_param.hidden_level = h = *cur->hidden_levelp;
        !           568:            } else {
        !           569:                hidden_level = 0;
        !           570:                aux_param.hidden_level = h = cur->hidden_low;
        !           571:                slen = 1;
        !           572:                for (k = aux_param.level > 0 ? aux_param.suffix[0] : cur->high;
        !           573:                     k > 9; k /= 10)
        !           574:                    slen++;
        !           575:            }
        !           576:        else
        !           577:            aux_param.hidden_level = -1;
        !           578: 
        !           579:        if ((cur->min_level == 0 && !cur->hidden_level) || cur->high < 0)
        !           580:            j = 0;
        !           581:        else {
        !           582:            if (cur->min_level > 0) {
        !           583:                j = 1;
        !           584:                for (k = aux_param.level > 0 ?
        !           585:                     aux_param.suffix[0] : cur->high; k > 9; k /= 10)
        !           586:                    j++;
        !           587:            } else
        !           588:                j = 0;
        !           589:            if (cur->hidden_level && hidden_level == 0) {
        !           590:                j += 3;
        !           591:                for (k = aux_param.hidden_level >= 0 ?
        !           592:                     aux_param.hidden_level : cur->hidden_high; k > 9; k /= 10)
        !           593:                    j++;
        !           594:            }
        !           595:        }
        !           596:        len = strlen(cur->name) + j;
        !           597:        i = low = aux_param.level > 0 ? aux_param.suffix[0] : cur->low;
        !           598: 
        !           599:        for (;;) {
        !           600:            db_printf(cur->name);
        !           601:            j = strlen(cur->name);
        !           602:            if (cur->high >= 0) {
        !           603:                if (cur->min_level > 0) {
        !           604:                    db_printf("%d", i);
        !           605:                    j++;
        !           606:                    for (k = i; k > 9; k /= 10)
        !           607:                        j++;
        !           608:                }
        !           609:                if (cur->hidden_level && hidden_level == 0) {
        !           610:                    sl = 1;
        !           611:                    for (k = i; k > 9; k /= 10)
        !           612:                        sl++;
        !           613:                    while (sl++ < slen) {
        !           614:                        db_putchar(' ');
        !           615:                        j++;
        !           616:                    }
        !           617:                    db_printf("[%d]", h);
        !           618:                    j += 3;
        !           619:                    for (k = h; k > 9; k /= 10)
        !           620:                        j++;
        !           621:                }
        !           622:            }
        !           623: 
        !           624:            while (j++ < len)
        !           625:                db_putchar(' ');
        !           626:            db_putchar(':');
        !           627:            db_putchar(' ');
        !           628: 
        !           629:            if (cur->fcn) {
        !           630:                aux_param.suffix[0] = i;
        !           631:                (*cur->fcn)(cur, (db_expr_t *)0, DB_VAR_SHOW, &aux_param);
        !           632:            } else {
        !           633:                db_printf("%#n", *(cur->valuep + i));
        !           634:                db_find_xtrn_task_sym_and_offset(*(cur->valuep + i), &name,
        !           635:                                                 &offset, TASK_NULL);
        !           636:                if (name != (char *)0 && offset <= db_maxoff &&
        !           637:                    offset != *(cur->valuep + i)) {
        !           638:                    db_printf("\t%s", name);
        !           639:                    if (offset != 0)
        !           640:                        db_printf("+%#r", offset);
        !           641:                }
        !           642:            }
        !           643:            db_putchar('\n');
        !           644:            if (cur->high < 0)
        !           645:                break;
        !           646:            if (aux_param.level > 0 || i++ == cur->high) {
        !           647:                if (!cur->hidden_level ||
        !           648:                    hidden_level == 0 ||
        !           649:                    h++ == cur->hidden_high)
        !           650:                    break;
        !           651:                aux_param.hidden_level = h;
        !           652:                i = low;
        !           653:            }
        !           654:        }
        !           655: }
        !           656: 
        !           657: void
        !           658: db_show_variable(void)
        !           659: {
        !           660:        struct db_variable *cur;
        !           661:        unsigned int l;
        !           662:        unsigned int len;
        !           663:        unsigned int sl;
        !           664:        unsigned int slen;
        !           665:        short h;
        !           666:        short i;
        !           667:        short j;
        !           668:        short k;
        !           669:        int t;
        !           670:        int t1;
        !           671:        struct db_var_aux_param aux_param;
        !           672:        char *name;
        !           673:        db_addr_t offset;
        !           674: 
        !           675:        switch(t = db_read_token()) {
        !           676:        case tEOL:
        !           677:        case tEOF:
        !           678:        case tSEMI_COLON:
        !           679:            break;
        !           680: 
        !           681:        case tDOLLAR:
        !           682:            t1 = db_read_token();
        !           683:            if (t1 == tIDENT) {
        !           684:                db_show_one_variable();
        !           685:                return;
        !           686:            }
        !           687:            db_error("Not a variable name after $\n");
        !           688:            db_unread_token(t);
        !           689:            return;
        !           690: 
        !           691:        default:
        !           692:            db_error("Variable name should be prefixed with $\n");
        !           693:            db_unread_token(t);
        !           694:            return;
        !           695:        }
        !           696:        db_unread_token(t);
        !           697: 
        !           698:        slen = len = 1;
        !           699:        for (cur = db_vars; cur < db_evars; cur++) {
        !           700:            if ((cur->min_level == 0 && !cur->hidden_level) || cur->high < 0)
        !           701:                j = 0;
        !           702:            else {
        !           703:                if (cur->min_level > 0) {
        !           704:                    j = 1;
        !           705:                    for (k = cur->high; k > 9; k /= 10)
        !           706:                        j++;
        !           707:                } else
        !           708:                    j = 0;
        !           709:                if (cur->hidden_level &&
        !           710:                    (*cur->hidden_levelp < cur->hidden_low ||
        !           711:                     *cur->hidden_levelp > cur->hidden_high)) {
        !           712:                    j += 3;
        !           713:                    for (k = cur->hidden_high; k > 9; k /= 10)
        !           714:                        j++;
        !           715:                }
        !           716:            }
        !           717:            if ((l = strlen(cur->name) + j) >= len)
        !           718:                len = l + 1;
        !           719:        }
        !           720: 
        !           721:        aux_param.modif = "";
        !           722:        aux_param.level = 1;
        !           723:        aux_param.thr_act = THR_ACT_NULL;
        !           724: 
        !           725:        for (cur = db_vars; cur < db_evars; cur++) {
        !           726:            i = cur->low;
        !           727:            if (cur->hidden_level) {
        !           728:                if (*cur->hidden_levelp >= cur->hidden_low &&
        !           729:                    *cur->hidden_levelp <= cur->hidden_high) {
        !           730:                    h = cur->hidden_low - 1;
        !           731:                    aux_param.hidden_level = *cur->hidden_levelp;
        !           732:                } else {
        !           733:                    h = cur->hidden_low;
        !           734:                    aux_param.hidden_level = cur->hidden_low;
        !           735:                }
        !           736:                slen = 1;
        !           737:                for (k = cur->high; k > 9; k /= 10)
        !           738:                    slen++;
        !           739:            } else
        !           740:                aux_param.hidden_level = -1;
        !           741: 
        !           742:            if (cur != db_vars && cur->high >= 0 &&
        !           743:                (cur->min_level > 0 || cur->hidden_level))
        !           744:                    db_putchar('\n');
        !           745: 
        !           746:            for (;;) {
        !           747:                db_printf(cur->name);
        !           748:                j = strlen(cur->name);
        !           749:                if (cur->high >= 0) {
        !           750:                    if (cur->min_level > 0) {
        !           751:                        db_printf("%d", i);
        !           752:                        j++;
        !           753:                        for (k = i; k > 9; k /= 10)
        !           754:                            j++;
        !           755:                    }
        !           756:                    if (cur->hidden_level && h >= cur->hidden_low) {
        !           757:                        sl = 1;
        !           758:                        for (k = i; k > 9; k /= 10)
        !           759:                            sl++;
        !           760:                        while (sl++ < slen) {
        !           761:                            db_putchar(' ');
        !           762:                            j++;
        !           763:                        }
        !           764:                        db_printf("[%d]", h);
        !           765:                        j += 3;
        !           766:                        for (k = h; k > 9; k /= 10)
        !           767:                            j++;
        !           768:                    }
        !           769:                }
        !           770:                while (j++ < len)
        !           771:                    db_putchar(' ');
        !           772:                db_putchar(':');
        !           773:                db_putchar(' ');
        !           774: 
        !           775:                if (cur->fcn) {
        !           776:                    aux_param.suffix[0] = i;
        !           777:                    (*cur->fcn)(cur, (db_expr_t *)0, DB_VAR_SHOW, &aux_param);
        !           778:                } else {
        !           779:                    db_printf("%#n", *(cur->valuep + i));
        !           780:                    db_find_xtrn_task_sym_and_offset(*(cur->valuep + i), &name,
        !           781:                                                     &offset, TASK_NULL);
        !           782:                    if (name != (char *)0 && offset <= db_maxoff &&
        !           783:                        offset != *(cur->valuep + i)) {
        !           784:                        db_printf("\t%s", name);
        !           785:                        if (offset != 0)
        !           786:                            db_printf("+%#r", offset);
        !           787:                    }
        !           788:                }
        !           789:                db_putchar('\n');
        !           790:                if (cur->high < 0)
        !           791:                    break;
        !           792:                if (i++ == cur->high) {
        !           793:                    if (!cur->hidden_level || h++ == cur->hidden_high)
        !           794:                        break;
        !           795:                    aux_param.hidden_level = h;
        !           796:                    i = cur->low;
        !           797:                }
        !           798:            }
        !           799:        }
        !           800: }
        !           801: 
        !           802: /*
        !           803:  * given a name of a machine register, return a variable pointer to it.
        !           804:  */
        !           805: db_variable_t
        !           806: db_find_reg_name(
        !           807:        char    *s)
        !           808: {
        !           809:        register db_variable_t  regp;
        !           810: 
        !           811:        if ( s == (char *)0 )
        !           812:                return DB_VAR_NULL;
        !           813: 
        !           814:        for (regp = db_regs; regp < db_eregs; regp++) {
        !           815:                if ( strcmp( s, regp->name) == 0 )
        !           816:                        return regp;
        !           817:        }
        !           818:        return DB_VAR_NULL;
        !           819: }

unix.superglobalmegacorp.com

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