File:  [Coherent Logic Development] / freem / src / mdebug.c
Revision 1.3: download - view: text, annotated - select for diffs
Sun Mar 9 19:50:47 2025 UTC (4 months, 3 weeks ago) by snw
Branches: MAIN
CVS tags: v0-63-1-rc1, v0-63-0-rc1, v0-63-0, v0-62-3, v0-62-2, v0-62-1, v0-62-0, HEAD
Second phase of REUSE compliance and header reformat

    1: /*
    2:  *   $Id: mdebug.c,v 1.3 2025/03/09 19:50:47 snw Exp $
    3:  *    debugger enhancements
    4:  *
    5:  *  
    6:  *   Author: Serena Willis <snw@coherent-logic.com>
    7:  *    Copyright (C) 1998 MUG Deutschland
    8:  *    Copyright (C) 2020, 2025 Coherent Logic Development LLC
    9:  *
   10:  *
   11:  *   This file is part of FreeM.
   12:  *
   13:  *   FreeM is free software: you can redistribute it and/or modify
   14:  *   it under the terms of the GNU Affero Public License as published by
   15:  *   the Free Software Foundation, either version 3 of the License, or
   16:  *   (at your option) any later version.
   17:  *
   18:  *   FreeM is distributed in the hope that it will be useful,
   19:  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
   20:  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   21:  *   GNU Affero Public License for more details.
   22:  *
   23:  *   You should have received a copy of the GNU Affero Public License
   24:  *   along with FreeM.  If not, see <https://www.gnu.org/licenses/>.
   25:  *
   26:  *   $Log: mdebug.c,v $
   27:  *   Revision 1.3  2025/03/09 19:50:47  snw
   28:  *   Second phase of REUSE compliance and header reformat
   29:  *
   30:  *
   31:  * SPDX-FileCopyrightText:  (C) 2025 Coherent Logic Development LLC
   32:  * SPDX-License-Identifier: AGPL-3.0-or-later
   33:  **/
   34: 
   35: #include <stdio.h>
   36: #include <stdlib.h>
   37: #include <string.h>
   38: 
   39: #include "mpsdef.h"
   40: #include "mdebug.h"
   41: #include "freem.h"
   42: #include "mref.h"
   43: 
   44: dbg_watch dbg_watchlist[MAXWATCH];    /* list of watchpoints */
   45: short dbg_enable_watch;               /* 0 = watches disabled, 1 = watches enabled */
   46: int dbg_pending_watches;
   47: 
   48: 
   49: void dbg_init (void)
   50: {
   51:     register int i;
   52: 
   53:     dbg_enable_watch = 0;
   54:     dbg_pending_watches = 0;
   55: 
   56:     for (i = 0; i < MAXWATCH; i++) {
   57: 
   58:         dbg_watchlist[i].varnam = NULL;
   59:         dbg_watchlist[i].chgct = 0;
   60: 
   61:     }
   62: 
   63: }
   64: 
   65: dbg_watch *dbg_add_watch (char *varnam)
   66: {
   67:     register int i;
   68:     int index = -1;
   69:     short found = 0;
   70:     dbg_watch *w;
   71: 
   72:     if ((w = dbg_find_watch (varnam)) != NULL) {
   73:         set_io (UNIX);
   74:         fprintf (stderr, "You are already watching '%s' (changed %d times).\n", dbg_get_watch_name (w->varnam), w->chgct);
   75:         set_io (MUMPS);
   76:         return NULL;
   77:     }
   78: 
   79:     for (i = 0; i < MAXWATCH; i++) {
   80:         if (dbg_watchlist[i].varnam == NULL) {
   81:             found++;
   82:             index = i;
   83:             break;
   84:         }
   85:     }
   86: 
   87:     if (!found) {
   88:         set_io (UNIX);
   89:         fprintf (stderr, "No free watchlist entries available. Try removing an existing watchpoint first.\n");
   90:         set_io (MUMPS);
   91: 
   92:         return NULL;
   93:     }
   94: 
   95:     if ((dbg_watchlist[index].varnam = (char *) malloc (256 * sizeof (char))) == NULL) {
   96:         set_io (UNIX);
   97:         fprintf (stderr, "Could not allocate memory for the new watchlist entry.\n");
   98:         set_io (MUMPS);
   99: 
  100:         return NULL;
  101:     }
  102: 
  103:     strcpy (dbg_watchlist[index].varnam, varnam);
  104:     dbg_watchlist[index].chgct = 0;
  105: 
  106:     set_io (UNIX);
  107:     fprintf (stderr, "Added '%s' to the watchlist.\n", dbg_get_watch_name (varnam));
  108:     set_io (MUMPS);
  109: 
  110:     return NULL;
  111:     
  112: }
  113: 
  114: void dbg_dump_watchlist (void) 
  115: {
  116: 	register int i;
  117: 
  118: 	for (i = 0; i < MAXWATCH; i++) {
  119: 		if (dbg_watchlist[i].firect) {
  120: 			dbg_dump_watch (dbg_watchlist[i].varnam);
  121: 		}
  122: 	}
  123: 
  124: 	dbg_pending_watches = 0;
  125: }
  126: 
  127: 
  128: void dbg_remove_watch (char *varnam)
  129: {
  130:     dbg_watch *w;
  131: 
  132:     if ((w = dbg_find_watch (varnam)) == NULL) {
  133:         set_io (UNIX);
  134:         fprintf (stderr, "'%s' is not being watched.\n", dbg_get_watch_name (varnam));
  135:         set_io (MUMPS);
  136: 
  137:         return;
  138:     }
  139: 
  140:     free (w->varnam);
  141:     
  142:     w->chgct = 0;
  143:     w->firect = 0;
  144: 
  145:     set_io (UNIX);
  146:     printf ("Removed '%s' from the watchlist.\n", dbg_get_watch_name (varnam));
  147:     set_io (MUMPS);
  148:     
  149:     return;
  150: }
  151: 
  152: void dbg_dump_watch (char *varnam)
  153: {
  154:     char *ddwbuf;
  155:     dbg_watch *w;
  156: 
  157:     ddwbuf = (char *) malloc (STRLEN * sizeof (char));
  158:     NULLPTRCHK(ddwbuf,"dbg_dump_watch");
  159: 
  160:     if ((w = dbg_find_watch (varnam)) == NULL) {
  161:         set_io (UNIX);
  162:         fprintf (stderr, "'%s' is not being watched.\n", dbg_get_watch_name (varnam));
  163:         set_io (MUMPS);
  164: 
  165:         return;
  166:     }
  167: 
  168:     w->firect = 0;
  169: 
  170:     if (varnam[0] != '^') {
  171:     	symtab (get_sym, varnam, ddwbuf);
  172:     }
  173:     else {
  174:     	if (varnam[1] == '$') {
  175:     		ssvn (get_sym, varnam, ddwbuf);
  176:     	}
  177:     	else {
  178:     		global (get_sym, varnam, ddwbuf);
  179:     	}
  180:     }
  181: 
  182:     stcnv_m2c (ddwbuf);
  183: 
  184:     set_io (UNIX);
  185:     printf (">> WATCHPOINT:  %s => '%s' (changed %d times)\n", dbg_get_watch_name (varnam), ddwbuf, w->chgct);
  186:     set_io (MUMPS);
  187: 
  188:     free (ddwbuf);
  189: 
  190: }
  191: 
  192: dbg_watch *dbg_find_watch (char *varnam)
  193: {
  194:     register int i;
  195:     
  196: 
  197:     for (i = 0; i < MAXWATCH; i++) {
  198:         if (dbg_watchlist[i].varnam != NULL) {
  199:             if (strcmp (varnam, dbg_watchlist[i].varnam) == 0) {
  200:                 return &(dbg_watchlist[i]);
  201:             }
  202: 
  203:         }
  204:     }
  205: 
  206:     return NULL;
  207: }
  208: 
  209: char *dbg_get_watch_name (char *varnam)
  210: {
  211:     freem_ref_t *r;
  212:     char *s;
  213:     
  214:     r = (freem_ref_t *) malloc (sizeof (freem_ref_t));
  215:     NULLPTRCHK(r,"dbg_get_watch_name");
  216:     
  217:     s = (char *) malloc (STRLEN * sizeof (char));
  218:     NULLPTRCHK(s,"dbg_get_watch_name");
  219:     
  220:     mref_init (r, MREF_RT_LOCAL, "");
  221:     internal_to_mref (r, varnam);
  222:     mref_to_external (r, s);
  223:         
  224:     free (r);
  225:         
  226:     return s;
  227:         
  228: }
  229: 
  230: void dbg_fire_watch (char *varnam) {
  231: 
  232: 	dbg_watch *w;
  233: 
  234: 	if ((w = dbg_find_watch (varnam)) == NULL) {
  235: 		return;
  236: 	}
  237: 
  238: 	w->chgct++;
  239: 	w->firect++;
  240: 	dbg_pending_watches++;
  241: 
  242: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>