Home | History | Annotate | Line # | Download | only in trek
schedule.c revision 1.2
      1 /*
      2  * Copyright (c) 1980 Regents of the University of California.
      3  * All rights reserved.
      4  *
      5  * Redistribution and use in source and binary forms, with or without
      6  * modification, are permitted provided that the following conditions
      7  * are met:
      8  * 1. Redistributions of source code must retain the above copyright
      9  *    notice, this list of conditions and the following disclaimer.
     10  * 2. Redistributions in binary form must reproduce the above copyright
     11  *    notice, this list of conditions and the following disclaimer in the
     12  *    documentation and/or other materials provided with the distribution.
     13  * 3. All advertising materials mentioning features or use of this software
     14  *    must display the following acknowledgement:
     15  *	This product includes software developed by the University of
     16  *	California, Berkeley and its contributors.
     17  * 4. Neither the name of the University nor the names of its contributors
     18  *    may be used to endorse or promote products derived from this software
     19  *    without specific prior written permission.
     20  *
     21  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
     22  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     24  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
     25  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     26  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     27  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     28  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     29  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     30  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     31  * SUCH DAMAGE.
     32  */
     33 
     34 #ifndef lint
     35 /*static char sccsid[] = "from: @(#)schedule.c	5.4 (Berkeley) 6/1/90";*/
     36 static char rcsid[] = "$Id: schedule.c,v 1.2 1993/08/01 18:50:03 mycroft Exp $";
     37 #endif /* not lint */
     38 
     39 # include	"trek.h"
     40 
     41 /*
     42 **  SCHEDULE AN EVENT
     43 **
     44 **	An event of type 'type' is scheduled for time NOW + 'offset'
     45 **	into the first available slot.  'x', 'y', and 'z' are
     46 **	considered the attributes for this event.
     47 **
     48 **	The address of the slot is returned.
     49 */
     50 
     51 struct event *schedule(type, offset, x, y, z)
     52 int	type;
     53 double	offset;
     54 char	x, y;
     55 char	z;
     56 {
     57 	register struct event	*e;
     58 	register int		i;
     59 	double			date;
     60 
     61 	date = Now.date + offset;
     62 	for (i = 0; i < MAXEVENTS; i++)
     63 	{
     64 		e = &Event[i];
     65 		if (e->evcode)
     66 			continue;
     67 		/* got a slot */
     68 #		ifdef xTRACE
     69 		if (Trace)
     70 			printf("schedule: type %d @ %.2f slot %d parm %d %d %d\n",
     71 				type, date, i, x, y, z);
     72 #		endif
     73 		e->evcode = type;
     74 		e->date = date;
     75 		e->x = x;
     76 		e->y = y;
     77 		e->systemname = z;
     78 		Now.eventptr[type] = e;
     79 		return (e);
     80 	}
     81 	syserr("Cannot schedule event %d parm %d %d %d", type, x, y, z);
     82 }
     83 
     84 
     85 /*
     86 **  RESCHEDULE AN EVENT
     87 **
     88 **	The event pointed to by 'e' is rescheduled to the current
     89 **	time plus 'offset'.
     90 */
     91 
     92 reschedule(e1, offset)
     93 struct event	*e1;
     94 double		offset;
     95 {
     96 	double			date;
     97 	register struct event	*e;
     98 
     99 	e = e1;
    100 
    101 	date = Now.date + offset;
    102 	e->date = date;
    103 #	ifdef xTRACE
    104 	if (Trace)
    105 		printf("reschedule: type %d parm %d %d %d @ %.2f\n",
    106 			e->evcode, e->x, e->y, e->systemname, date);
    107 #	endif
    108 	return;
    109 }
    110 
    111 
    112 /*
    113 **  UNSCHEDULE AN EVENT
    114 **
    115 **	The event at slot 'e' is deleted.
    116 */
    117 
    118 unschedule(e1)
    119 struct event	*e1;
    120 {
    121 	register struct event	*e;
    122 
    123 	e = e1;
    124 
    125 #	ifdef xTRACE
    126 	if (Trace)
    127 		printf("unschedule: type %d @ %.2f parm %d %d %d\n",
    128 			e->evcode, e->date, e->x, e->y, e->systemname);
    129 #	endif
    130 	Now.eventptr[e->evcode & E_EVENT] = 0;
    131 	e->date = 1e50;
    132 	e->evcode = 0;
    133 	return;
    134 }
    135 
    136 
    137 /*
    138 **  Abreviated schedule routine
    139 **
    140 **	Parameters are the event index and a factor for the time
    141 **	figure.
    142 */
    143 
    144 struct event *xsched(ev1, factor, x, y, z)
    145 int	ev1;
    146 int	factor;
    147 int	x, y, z;
    148 {
    149 	register int	ev;
    150 
    151 	ev = ev1;
    152 	return (schedule(ev, -Param.eventdly[ev] * Param.time * log(franf()) / factor, x, y, z));
    153 }
    154 
    155 
    156 /*
    157 **  Simplified reschedule routine
    158 **
    159 **	Parameters are the event index, the initial date, and the
    160 **	division factor.  Look at the code to see what really happens.
    161 */
    162 
    163 xresched(e1, ev1, factor)
    164 struct event	*e1;
    165 int		ev1;
    166 int		factor;
    167 {
    168 	register int		ev;
    169 	register struct event	*e;
    170 
    171 	ev = ev1;
    172 	e = e1;
    173 	reschedule(e, -Param.eventdly[ev] * Param.time * log(franf()) / factor);
    174 }
    175