port to tahoe by Nir peleg of CCI
[unix-history] / usr / src / usr.bin / pascal / pdx / breakpoint / bp.c
CommitLineData
d8be300a
DF
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 */
0acacf05 6
d8be300a 7#ifndef lint
82d3cd01 8static char sccsid[] = "@(#)bp.c 5.2 (Berkeley) %G%";
d8be300a 9#endif not lint
0acacf05
ML
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
24unsigned int uniqueid;
25
26/*
27 * Add a breakpoint to the list, return a pointer to it.
28 */
29
30BPINFO *newbp(addr, type, block, cond, node, line)
31ADDRESS addr;
32BPTYPE type;
33SYM *block;
34NODE *cond;
35NODE *node;
36LINENO 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
63addbp(addr, type, block, cond, node, line)
64ADDRESS addr;
65BPTYPE type;
66SYM *block;
67NODE *cond;
68NODE *node;
69LINENO line;
70{
0acacf05 71
82d3cd01 72 (void) newbp(addr, type, block, cond, node, line);
0acacf05
ML
73}
74
75/*
76 * Delete a breakpoint.
77 *
78 * Print out a cryptic error message if it can't be found.
79 */
80
81delbp(id)
82unsigned 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
127bpfree()
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}