Annotation of coherent/b/bin/db_400/dbh/dbh.C,v, revision 1.1.1.1

1.1       root        1: head     1.1;
                      2: branch   ;
                      3: access   ;
                      4: symbols  ;
                      5: locks    bin:1.1; strict;
                      6: comment  @@;
                      7: 
                      8: 
                      9: 1.1
                     10: date     93.03.11.07.46.36;  author bin;  state Exp;
                     11: branches ;
                     12: next     ;
                     13: 
                     14: 
                     15: desc
                     16: @@
                     17: 
                     18: 
                     19: 
                     20: 1.1
                     21: log
                     22: @Initial revision
                     23: @
                     24: text
                     25: @// File:      dbh.C
                     26: //
                     27: // Purpose:    main file for C++ debugger
                     28: 
                     29: 
                     30: // ----------------------------------------------------------------------
                     31: // Includes.
                     32: 
                     33: #include <coff.h>
                     34: #include <fcntl.h>
                     35: #include <stdio.h>
                     36: #include <stdlib.h>
                     37: #include <stream.h>
                     38: #include <string.h>
                     39: #include "sys.h"
                     40: 
                     41: // ----------------------------------------------------------------------
                     42: // Definitions.
                     43: //     Constants.
                     44: //     Macros with argument lists.
                     45: //     Typedefs.
                     46: //     Enums.
                     47: 
                     48: const int      STR_LEN = 256;  // general-purpose buffer length
                     49: const int      MAX_ARGS = 10;  // limit on number of args, minus switches
                     50: 
                     51: // command syntax in effect (command line parser selects one of these)
                     52: const int      DBH_NULL = 0;   // no valid syntax
                     53: const int      DBH_COFF = 1;   // dbh <coff file>
                     54: 
                     55: // Class for keeping track of the main coff file under investigation.
                     56: class CoffObj {
                     57: public:                // public fields
                     58:        char *          fname;  // file name
                     59: public:                // constructors/destructors
                     60:        CoffObj(void): fname(NULL) {}
                     61: };
                     62: 
                     63: // Class for command line parser.
                     64: class DbhCmd {
                     65: public:                // public fields
                     66:        int             cmdSyntax;
                     67:        const char *    args[MAX_ARGS];
                     68: 
                     69: public:                // constructors/destructors
                     70:        DbhCmd(void): cmdSyntax(DBH_NULL) { args[0] = NULL; }
                     71: };
                     72: 
                     73: // ----------------------------------------------------------------------
                     74: // Functions.
                     75: //     Import Functions.
                     76: //     Export Functions.
                     77: //     Local Functions.
                     78: 
                     79: void   coffLoad(const char *);
                     80: void   cmdLine(int argc, char * argv[], DbhCmd &);
                     81: void   dbhCoff(DbhCmd &);
                     82: void   doCmd(const char *);
                     83: void   doCmdStr(const char *);
                     84: void   fatal(const char *);
                     85: void   usage(void);
                     86: 
                     87: // ----------------------------------------------------------------------
                     88: // Global Data.
                     89: //     Import Variables.
                     90: //     Export Variables.
                     91: //     Local Variables.
                     92: 
                     93: const char *   cmd;                    // alias for argv[0]
                     94: char           errstr[STR_LEN];                // error message buffer
                     95: 
                     96: // ----------------------------------------------------------------------
                     97: // Code.
                     98: 
                     99: // command line forms:
                    100: //     dbh <coff file>
                    101: 
                    102: int main(int argc, char * argv[]) {
                    103: 
                    104:        DbhCmd  dbhCmd;
                    105: 
                    106:        // process command line
                    107:        cmdLine(argc, argv, dbhCmd);
                    108: 
                    109:        // do whatever command syntax dictates
                    110:        switch(dbhCmd.cmdSyntax) {
                    111:        case DBH_COFF:          // dbh <coff file>
                    112:                dbhCoff(dbhCmd);
                    113:                break;
                    114:        }
                    115: }
                    116: 
                    117: // Print a string to stderr and abort the debug session.
                    118: void
                    119: fatal(const char * msg) {
                    120:        cerr << cmd << " error: " << msg << endl;
                    121:        exit(1);
                    122: }
                    123: 
                    124: // Given raw command arguments, process switches and parse
                    125: // the line to determine the type of db session.  Return
                    126: // parse info in "dbhCmd".
                    127: void
                    128: cmdLine(int argc, char * argv[], DbhCmd & dbhCmd) {
                    129: 
                    130:        // copy command name to "cmd", mainly for error messages
                    131:        cmd = argv[0];
                    132: 
                    133:        // check number of arguments
                    134:        if (argc != 2) {
                    135:                usage();
                    136:        }
                    137: 
                    138:        // get command syntax and set args for subcommand
                    139:        dbhCmd.cmdSyntax = DBH_COFF;
                    140:        dbhCmd.args[0] = argv[1];
                    141: }
                    142: 
                    143: // Display usage message and abort the debug session.
                    144: void
                    145: usage(void) {
                    146:        cerr << "Usage:\t" << cmd << " <coff program>" << endl;
                    147:        exit(1);
                    148: }
                    149: 
                    150: // Run a dbh session for command syntax
                    151: //     dbh <coff file>
                    152: void
                    153: dbhCoff(DbhCmd & dbhCmd) {
                    154:        // get needed info from coff file
                    155:        coffLoad(dbhCmd.args[0]);
                    156: 
                    157:        // enter command loop
                    158:        doCmdStr(":x");
                    159: }
                    160: 
                    161: // Load info from COFF binary.
                    162: void
                    163: coffLoad(const char * fname) {
                    164:        FILEHDR coffh;
                    165:        int     coff_fd;
                    166: 
                    167:        if ((coff_fd = open(fname, O_RDONLY)) == -1) {
                    168:                sprintf(errstr, "Can't open object file %s", fname);
                    169:                fatal(errstr);
                    170:        }
                    171: 
                    172:        if (read(coff_fd, &coffh, sizeof(coffh)) != sizeof(coffh)) {
                    173:                sprintf(errstr, "Can't read object file %s", fname);
                    174:                fatal(errstr);
                    175:        } 
                    176: 
                    177:        if (coffh.f_magic != C_386_MAGIC) {
                    178:                sprintf(errstr, "Object file %s is not COFF", fname);
                    179:                fatal(errstr);
                    180:        } 
                    181: 
                    182:        getCoffSyms(coff_fd);
                    183: 
                    184:        getCoffSegs(coff_fd);
                    185: 
                    186:        close(coff_fd);
                    187: }
                    188: 
                    189: // Perform a db command string.
                    190: // String consists of zero or more commands separated by newlines.
                    191: void
                    192: doCmdStr(const char * cmdStr) {
                    193:        char    cmd1[STR_LEN];
                    194: 
                    195:        // copy each line, minus trailing newline, into "cmd1"
                    196:        // and invoke single command processor
                    197:        for (const char * cp = cmdStr; cp < cmdStr + strlen(cmdStr);) {
                    198:                const char * delim = strchr(cp, '\n');
                    199:                if (delim) {
                    200:                        int copyLen = STR_LEN;
                    201:                        if (delim - cp < copyLen)
                    202:                                copyLen = delim - cp;
                    203:                        strncpy(cmd1, cp, copyLen);
                    204:                        doCmd(cmd1);
                    205:                        cp = delim + 1;
                    206:                } else {
                    207:                        strncpy(cmd1, cp, STR_LEN);
                    208:                        doCmd(cmd1);
                    209:                        break;
                    210:                }
                    211:        }
                    212: }
                    213: 
                    214: // Do a single db command.
                    215: void
                    216: doCmd(const char * cmdStr) {
                    217:        cout << cmdStr << endl;
                    218: }
                    219: @

unix.superglobalmegacorp.com

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