OK let me take a stab.
This isn't going to be much prettier, but it'll let you use a switch
statement.  You'll still need those constants, probably put an entry for
them in event_action_type.  Then you'll need an array of integers you fill
in at boot time where
  that_array[ACTION_TYPE] = &ea_type
So now you have a (fast) way to get to the table index from the constant.
Then in the switch statement,

switch(ev->action)
{
  case ACTION_TYPE:
    chprintf(ch, "Action type: %s\n\r",
      event_action_table[that_array[ev->action]].name);
    break;
}

Er.. that's not a very elegant solution, is it?
There's probably something better.
*wanders off, mumbling something about 5am and coffee*
--Palrich.

----- Original Message ----- 
From: "Jeremy Hill" <[EMAIL PROTECTED]>
To: <[email protected]>
Sent: Saturday, August 30, 2003 3:52 AM
Subject: More describable event actions


> Greetings Rom List,
>
> Long question here..takes a little bit to set up the question(s) that I
need to ask.  Please
> bear with me!
>
> I am working on modifying Kyndig's Event system a little to add some
flexibility. Out of the
> box, the event_data structure looks like (only relevant parts shown for
this question):
> struct event_data
> {
>     ...
>    int      action;
> };
>
> Where action is assigned via:
>
> #define ACTION_PRINT 1
>
> eg. ev->action = ACTION_PRINT;
>
> and is used in event_update as such:
> void event_update(void)
> {
> ...                        switch(ev->action)
>                         {
>                          case ACTION_PRINT:
>                             ...<do the event, with this action's specific
stuff>
>                         }
> }
>
> Because I commonly find myself querying the event queue to see what's
doing what for debug
> reasons, I like to see what action is attached to each event.  Typically,
since with the above
> we only have an integer representing the action, we would have to do
something like:
>
> if (ev->action == ACTION_PRINT)
>     send_to_char("Action type: print\n\r", ch);
>
> I decided to move the actions into a table that looks like (structure and
table):
> struct event_action_type
> {
>     char *name;
>     sh_int *pea; //Pointer-to-Event-Action [number]
> };
>
> const struct event_action_type event_action_table[] =
> {
>     {"print", &ea_print},
>     {"wait", &ea_wait},
>     {"act", &ea_act},
>     {"function", &ea_function},
>     {"kill_menu", &ea_killmenu},
>     {"NULL", NULL}
> };
>
> This uses the same basic technique as the skill table; each
event_action_table[].pea is assigned
> a number on bootup. ea_print = 1, ea_wait = 2, etc.  Now ev->action =
ea_print, for example.
> The reason behind a table is that a table can be readily expanded as needs
arise.  For example,
> as more action types are added (and as they get more sophisticated), I'll
add a function pointer
> to simply dispatch an event function to handle the event rather than doing
the handling in the
> event_update itself (I realize that function calls are slower, but it
would be much more sane to
> manage).
>
> In the meantime, I have run into a serious problem.  In event_update, a
switch statement is used
> to see what the ev->action is.  My cases are ea_print, ea_wait, etc, but I
cannot use them as
> case labels.  Eg.:
>
> switch (ev->action)
>     case ea_print:
>
> This obviously won't work.
>
> Finally, my questions:
> Anything I can do to keep the switch, or will I need to resort to an ugly
if/elseif block? (if
> ev->action == ea_print...)
> Do you think I should reconsider my design in the first place?  If so,
what do you recommend?
> I'm not quite sure I'm seeing appreciable gains for the work that has
already been done. Plus I
> am worried that once many events get up and running, this system may be
much more slow than the
> simplistic one of ACTION_XXXX.  What do you think?
>
> I felt like I should ask the list, as many of the list members are way
more experienced than
> myself!
>
> Thanks for your help,
>
> Jeremy
>
>
> -- 
> ROM mailing list
> [email protected]
> http://www.rom.org/cgi-bin/mailman/listinfo/rom


Reply via email to