|
|
1.1 root 1: /*
2: * Copyright (c) 1980 Regents of the University of California.
3: * All rights reserved. The Berkeley software License Agreement
4: * specifies the terms and conditions for redistribution.
5: */
6:
7: #ifndef lint
8: static char sccsid[] = "@(#)bp.c 5.2 (Berkeley) 4/7/87";
9: #endif not lint
10:
11: /*
12: * Direct management of bpinfo structures.
13: */
14:
15: #include "defs.h"
16: #include "breakpoint.h"
17: #include "tree.h"
18: #include "sym.h"
19: #include "main.h"
20: #include "source.h"
21: #include "object.h"
22: #include "bp.rep"
23:
24: unsigned int uniqueid;
25:
26: /*
27: * Add a breakpoint to the list, return a pointer to it.
28: */
29:
30: BPINFO *newbp(addr, type, block, cond, node, line)
31: ADDRESS addr;
32: BPTYPE type;
33: SYM *block;
34: NODE *cond;
35: NODE *node;
36: LINENO line;
37: {
38: register BPINFO *p;
39:
40: p = alloc(1, BPINFO);
41: p->bpid = ++uniqueid;
42: p->bpaddr = addr;
43: p->bptype = type;
44: p->bpblock = block;
45: p->bpcond = cond;
46: p->bpnode = node;
47: p->bpline = line;
48: p->bpnext = bphead;
49: if (option('b')) {
50: printf("new bp (%d) at %d, type %d\n", p->bpid, p->bpaddr, p->bptype);
51: fflush(stdout);
52: }
53: bphead = p;
54: return(p);
55: }
56:
57: /*
58: * Add a breakpoint, but don't return anything.
59: * Just for folks outside of "breakpoint" who don't know that
60: * a BPINFO exists.
61: */
62:
63: addbp(addr, type, block, cond, node, line)
64: ADDRESS addr;
65: BPTYPE type;
66: SYM *block;
67: NODE *cond;
68: NODE *node;
69: LINENO line;
70: {
71:
72: (void) newbp(addr, type, block, cond, node, line);
73: }
74:
75: /*
76: * Delete a breakpoint.
77: *
78: * Print out a cryptic error message if it can't be found.
79: */
80:
81: delbp(id)
82: unsigned int id;
83: {
84: register BPINFO *p, *last;
85:
86: last = NIL;
87: for (p = bphead; p != NIL; p = p->bpnext) {
88: if (p->bpid == id) {
89: break;
90: }
91: last = p;
92: }
93: if (p == NIL) {
94: error("%d unknown", id);
95: }
96: switch (p->bptype) {
97: case ALL_ON:
98: if (p->bpline >= 0) {
99: tracing--;
100: } else {
101: inst_tracing--;
102: }
103: break;
104:
105: case STOP_ON:
106: var_tracing--;
107: break;
108:
109: default:
110: /* do nothing */
111: break;
112: }
113: if (last == NIL) {
114: bphead = p->bpnext;
115: } else {
116: last->bpnext = p->bpnext;
117: }
118: tfree(p->bpcond);
119: tfree(p->bpnode);
120: dispose(p);
121: }
122:
123: /*
124: * Free all storage in the breakpoint table.
125: */
126:
127: bpfree()
128: {
129: register BPINFO *p, *next;
130:
131: fixbps();
132: for (p = bphead; p != NIL; p = next) {
133: next = p->bpnext;
134: tfree(p->bpcond);
135: tfree(p->bpnode);
136: dispose(p);
137: }
138: bphead = NIL;
139: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.