Commit | Line | Data |
---|---|---|
bb0cfa24 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 | */ | |
6 | ||
b8401192 | 7 | #ifndef lint |
bb0cfa24 | 8 | static char sccsid[] = "@(#)schedule.c 5.1 (Berkeley) %G%"; |
b8401192 KM |
9 | #endif not lint |
10 | ||
11 | # include "trek.h" | |
12 | ||
13 | /* | |
14 | ** SCHEDULE AN EVENT | |
15 | ** | |
16 | ** An event of type 'type' is scheduled for time NOW + 'offset' | |
17 | ** into the first available slot. 'x', 'y', and 'z' are | |
18 | ** considered the attributes for this event. | |
19 | ** | |
20 | ** The address of the slot is returned. | |
21 | */ | |
22 | ||
23 | struct event *schedule(type, offset, x, y, z) | |
24 | int type; | |
06d69904 | 25 | double offset; |
b8401192 KM |
26 | char x, y; |
27 | char z; | |
28 | { | |
29 | register struct event *e; | |
30 | register int i; | |
06d69904 | 31 | double date; |
b8401192 KM |
32 | |
33 | date = Now.date + offset; | |
34 | for (i = 0; i < MAXEVENTS; i++) | |
35 | { | |
36 | e = &Event[i]; | |
37 | if (e->evcode) | |
38 | continue; | |
39 | /* got a slot */ | |
40 | # ifdef xTRACE | |
41 | if (Trace) | |
42 | printf("schedule: type %d @ %.2f slot %d parm %d %d %d\n", | |
43 | type, date, i, x, y, z); | |
44 | # endif | |
45 | e->evcode = type; | |
46 | e->date = date; | |
47 | e->x = x; | |
48 | e->y = y; | |
49 | e->systemname = z; | |
50 | Now.eventptr[type] = e; | |
51 | return (e); | |
52 | } | |
53 | syserr("Cannot schedule event %d parm %d %d %d", type, x, y, z); | |
54 | } | |
55 | ||
56 | ||
57 | /* | |
58 | ** RESCHEDULE AN EVENT | |
59 | ** | |
60 | ** The event pointed to by 'e' is rescheduled to the current | |
61 | ** time plus 'offset'. | |
62 | */ | |
63 | ||
64 | reschedule(e1, offset) | |
65 | struct event *e1; | |
06d69904 | 66 | double offset; |
b8401192 | 67 | { |
06d69904 | 68 | double date; |
b8401192 KM |
69 | register struct event *e; |
70 | ||
71 | e = e1; | |
72 | ||
73 | date = Now.date + offset; | |
74 | e->date = date; | |
75 | # ifdef xTRACE | |
76 | if (Trace) | |
77 | printf("reschedule: type %d parm %d %d %d @ %.2f\n", | |
78 | e->evcode, e->x, e->y, e->systemname, date); | |
79 | # endif | |
80 | return; | |
81 | } | |
82 | ||
83 | ||
84 | /* | |
85 | ** UNSCHEDULE AN EVENT | |
86 | ** | |
87 | ** The event at slot 'e' is deleted. | |
88 | */ | |
89 | ||
90 | unschedule(e1) | |
91 | struct event *e1; | |
92 | { | |
93 | register struct event *e; | |
94 | ||
95 | e = e1; | |
96 | ||
97 | # ifdef xTRACE | |
98 | if (Trace) | |
99 | printf("unschedule: type %d @ %.2f parm %d %d %d\n", | |
100 | e->evcode, e->date, e->x, e->y, e->systemname); | |
101 | # endif | |
102 | Now.eventptr[e->evcode & E_EVENT] = 0; | |
103 | e->date = 1e50; | |
104 | e->evcode = 0; | |
105 | return; | |
106 | } | |
107 | ||
108 | ||
109 | /* | |
110 | ** Abreviated schedule routine | |
111 | ** | |
112 | ** Parameters are the event index and a factor for the time | |
113 | ** figure. | |
114 | */ | |
115 | ||
116 | struct event *xsched(ev1, factor, x, y, z) | |
117 | int ev1; | |
118 | int factor; | |
119 | int x, y, z; | |
120 | { | |
121 | register int ev; | |
122 | ||
123 | ev = ev1; | |
124 | return (schedule(ev, -Param.eventdly[ev] * Param.time * log(franf()) / factor, x, y, z)); | |
125 | } | |
126 | ||
127 | ||
128 | /* | |
129 | ** Simplified reschedule routine | |
130 | ** | |
131 | ** Parameters are the event index, the initial date, and the | |
132 | ** division factor. Look at the code to see what really happens. | |
133 | */ | |
134 | ||
135 | xresched(e1, ev1, factor) | |
136 | struct event *e1; | |
137 | int ev1; | |
138 | int factor; | |
139 | { | |
140 | register int ev; | |
141 | register struct event *e; | |
142 | ||
143 | ev = ev1; | |
144 | e = e1; | |
145 | reschedule(e, -Param.eventdly[ev] * Param.time * log(franf()) / factor); | |
146 | } |