1 /* $Id: itemlist.cc,v 1.9 1994/06/24 11:00:06 ceriel Exp $ */
22 /* STATICALLOCDEF "item" 10 */
25 p_item il_first, il_last;
28 static struct itemlist item_list;
29 static int stop_reason;
36 register p_item i = item_list.il_first;
39 if (i->i_node == p) return 1;
49 fprintf(db_out, "(%d)\t", i->i_itemno);
50 print_node(db_out, i->i_node, 0);
51 fputs(i->i_disabled ? " (disabled)\n": "\n", db_out);
55 item_addr_actions(a, mess_type, may_stop)
60 /* Perform actions associated with position 'a', and return stop_reason
61 if we must stop there, and 0 if not.
63 register p_item i = item_list.il_first;
66 for (i = item_list.il_first; i != 0; i = i->i_next) {
67 register p_tree p = i->i_node;
70 && (p->t_address == a || p->t_address == NO_ADDR)) {
73 if (mess_type != 1) break;
74 if (! p->t_args[1] || eval_cond(p->t_args[1])) {
75 if (! stop_reason) stop_reason = i->i_itemno;
88 for (i = item_list.il_first; i != 0; i = i->i_next) {
89 register p_tree p = i->i_node;
92 && (p->t_address == a || p->t_address == NO_ADDR)) {
95 if ((! stop_reason && mess_type != 0)
96 || p->t_args[2] || ! may_stop) {
117 register p_item i = item_list.il_first;
120 register p_tree p = i->i_node;
122 if (! i->i_disabled && p->t_oper == OP_DISPLAY) do_print(p);
132 if (in_item_list(p)) return;
136 if (p->t_address == NO_ADDR
137 && (p->t_oper != OP_TRACE || ! p->t_args[0])) db_ss++;
138 if (item_list.il_first == 0) {
139 item_list.il_first = i;
142 item_list.il_last->i_next = i;
144 i->i_itemno = ++item_count;
145 item_list.il_last = i;
149 remove_from_item_list(n)
152 register p_item i = item_list.il_first, prev = 0;
158 error("no current stopping point");
163 if (n < 0) n = item_count + n + 1;
165 if (i->i_itemno == n) break;
170 error("no item %d in current status", n);
173 if (i->i_itemno == stop_reason) stop_reason = 0;
175 prev->i_next = i->i_next;
177 else item_list.il_first = i->i_next;
178 if (i == item_list.il_last) item_list.il_last = prev;
180 if (p->t_address == NO_ADDR
181 && (p->t_oper != OP_TRACE || ! p->t_args[0])) db_ss--;
186 (void) setstop(p, 0);
189 (void) settrace(p, 0);
199 get_from_item_list(n)
202 register p_item i = item_list.il_first;
206 if (n == 0) return 0;
208 if (n < 0) n = item_count + n + 1;
210 if (i->i_itemno == n) return i->i_node;
219 register p_item i = item_list.il_first;
225 error("no current stopping point");
229 if (n < 0) n = item_count + n + 1;
231 if (i->i_itemno == n) break;
235 error("no item %d in current status", n);
239 if (i->i_disabled == kind) {
240 warning("item %d already %sabled", n, kind ? "dis" : "en");
243 if (p->t_address == NO_ADDR
244 && (p->t_oper != OP_TRACE || ! p->t_args[0])) {
245 db_ss += kind == 1 ? (-1) : 1;
247 i->i_disabled = kind;
251 (void) setstop(p, ! kind);
254 (void) settrace(p, ! kind);
261 register p_item i = item_list.il_first;
263 for (; i; i = i->i_next) {
270 register p_item i = item_list.il_first;
272 for (; i; i = i->i_next) {
273 if (! i->i_disabled && i->i_node->t_oper != OP_DUMP) eval(i->i_node);