|
|
1.1 root 1: /*
2: * Contains functions for dealing with things that happen in the
3: * future.
4: *
5: * @(#)daemon.c 3.3 (Berkeley) 6/15/81
6: */
7:
8: #include <curses.h>
9: #include "rogue.h"
10:
11: #define EMPTY 0
12: #define DAEMON -1
13: #define MAXDAEMONS 20
14:
15: #define _X_ { EMPTY }
16:
17: struct delayed_action {
18: int d_type;
19: int (*d_func)();
20: int d_arg;
21: int d_time;
22: } d_list[MAXDAEMONS] = {
23: _X_, _X_, _X_, _X_, _X_, _X_, _X_, _X_, _X_, _X_,
24: _X_, _X_, _X_, _X_, _X_, _X_, _X_, _X_, _X_, _X_,
25: };
26:
27: /*
28: * d_slot:
29: * Find an empty slot in the daemon/fuse list
30: */
31: struct delayed_action *
32: d_slot()
33: {
34: register int i;
35: register struct delayed_action *dev;
36:
37: for (i = 0, dev = d_list; i < MAXDAEMONS; i++, dev++)
38: if (dev->d_type == EMPTY)
39: return dev;
40: debug("Ran out of fuse slots");
41: return NULL;
42: }
43:
44: /*
45: * find_slot:
46: * Find a particular slot in the table
47: */
48:
49: struct delayed_action *
50: find_slot(func)
51: register int (*func)();
52: {
53: register int i;
54: register struct delayed_action *dev;
55:
56: for (i = 0, dev = d_list; i < MAXDAEMONS; i++, dev++)
57: if (dev->d_type != EMPTY && func == dev->d_func)
58: return dev;
59: return NULL;
60: }
61:
62: /*
63: * daemon:
64: * Start a daemon, takes a function.
65: */
66:
67: daemon(func, arg, type)
68: int (*func)(), arg, type;
69: {
70: register struct delayed_action *dev;
71:
72: dev = d_slot();
73: dev->d_type = type;
74: dev->d_func = func;
75: dev->d_arg = arg;
76: dev->d_time = DAEMON;
77: }
78:
79: /*
80: * kill_daemon:
81: * Remove a daemon from the list
82: */
83:
84: kill_daemon(func)
85: int (*func)();
86: {
87: register struct delayed_action *dev;
88:
89: if ((dev = find_slot(func)) == NULL)
90: return;
91: /*
92: * Take it out of the list
93: */
94: dev->d_type = EMPTY;
95: }
96:
97: /*
98: * do_daemons:
99: * Run all the daemons that are active with the current flag,
100: * passing the argument to the function.
101: */
102:
103: do_daemons(flag)
104: register int flag;
105: {
106: register struct delayed_action *dev;
107:
108: /*
109: * Loop through the devil list
110: */
111: for (dev = d_list; dev < &d_list[MAXDAEMONS]; dev++)
112: /*
113: * Executing each one, giving it the proper arguments
114: */
115: if (dev->d_type == flag && dev->d_time == DAEMON)
116: (*dev->d_func)(dev->d_arg);
117: }
118:
119: /*
120: * fuse:
121: * Start a fuse to go off in a certain number of turns
122: */
123:
124: fuse(func, arg, time, type)
125: int (*func)(), arg, time, type;
126: {
127: register struct delayed_action *wire;
128:
129: wire = d_slot();
130: wire->d_type = type;
131: wire->d_func = func;
132: wire->d_arg = arg;
133: wire->d_time = time;
134: }
135:
136: /*
137: * lengthen:
138: * Increase the time until a fuse goes off
139: */
140:
141: lengthen(func, xtime)
142: int (*func)();
143: int xtime;
144: {
145: register struct delayed_action *wire;
146:
147: if ((wire = find_slot(func)) == NULL)
148: return;
149: wire->d_time += xtime;
150: }
151:
152: /*
153: * extinguish:
154: * Put out a fuse
155: */
156:
157: extinguish(func)
158: int (*func)();
159: {
160: register struct delayed_action *wire;
161:
162: if ((wire = find_slot(func)) == NULL)
163: return;
164: wire->d_type = EMPTY;
165: }
166:
167: /*
168: * do_fuses:
169: * Decrement counters and start needed fuses
170: */
171:
172: do_fuses(flag)
173: register int flag;
174: {
175: register struct delayed_action *wire;
176:
177: /*
178: * Step though the list
179: */
180: for (wire = d_list; wire < &d_list[MAXDAEMONS]; wire++)
181: {
182: /*
183: * Decrementing counters and starting things we want. We also need
184: * to remove the fuse from the list once it has gone off.
185: */
186: if (flag == wire->d_type && wire->d_time > 0 && --wire->d_time == 0)
187: {
188: wire->d_type = EMPTY;
189: (*wire->d_func)(wire->d_arg);
190: }
191: }
192: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.