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