180 lines
4.5 KiB
Plaintext
180 lines
4.5 KiB
Plaintext
|
/*----------------------------------------------------------------------------
|
||
|
%%File: INTERP\EM.RUL
|
||
|
%%Unit: Event Monitor (mntr)
|
||
|
%%Contact: daleg
|
||
|
|
||
|
Event Monitor Sample Rule Base.
|
||
|
|
||
|
This is a source file to the Rule Compiler to demonstrate how to process
|
||
|
events.
|
||
|
|
||
|
----------------------------------------------------------------------------
|
||
|
NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE
|
||
|
|
||
|
There are *two* rule syntaxes used here, simple rules, and rule patterns.
|
||
|
|
||
|
Simple rules appear as ordinary C "if" statements, and follow the same
|
||
|
syntax rules. Example of a simple rule:
|
||
|
|
||
|
if ("x")
|
||
|
{
|
||
|
Say("You just typed \"x\"");
|
||
|
}
|
||
|
|
||
|
In Rule patterns, the test clause is enclosed by square
|
||
|
brackets [ ] instead of the parentheses ( ) used in simple rules.
|
||
|
Example of a rule pattern:
|
||
|
|
||
|
if ["d" "e" "m" "o"] ... (LCheckButton2)
|
||
|
{
|
||
|
Say("You just typed \"demo\"");
|
||
|
}
|
||
|
|
||
|
The pattern is a regular expression, with the following allowable
|
||
|
operators:
|
||
|
|
||
|
operator Marks Example
|
||
|
------------------------------------------------------------------------
|
||
|
| Alternatives "a" "b" | "c" "d"
|
||
|
[ ] Optional sequences [ "a" "b" "c" ]
|
||
|
{ } Required sequence { "a" "b" | "c" "d" }
|
||
|
|
||
|
|
||
|
Note that required or optional (sub) sequences can always have alternatives
|
||
|
|
||
|
----------------------------------------------------------------------------
|
||
|
----------------------------------------------------------------------------
|
||
|
|
||
|
Note also that there are two forms of rules, "if" rules, and "and_if"
|
||
|
rules.
|
||
|
|
||
|
Rules marked with "if" are primary rules, and are automatically sheduled
|
||
|
to run whenever any of their primary events are scheduled.
|
||
|
|
||
|
Rules marked with "and_if" are secondary rules, and must be explicitly
|
||
|
scheduled from another rule or from the application. The "..." syntax
|
||
|
and the "then ()" function are used to schedule rules from within the
|
||
|
rule.base
|
||
|
|
||
|
See the document "Writing Rules In The Event Monitor" for details.
|
||
|
|
||
|
----------------------------------------------------------------------------*/
|
||
|
|
||
|
// #include "genrules.rul"
|
||
|
|
||
|
#pragma argv "-d -f -a -m128 -s128 -xl -xo -pEm"
|
||
|
|
||
|
#include "libem.h" // configure genem.c and other client-side stuff
|
||
|
#include "uemevt.h"
|
||
|
|
||
|
declare group ALWAYS;
|
||
|
|
||
|
declare event_type _YYSTD : ALWAYS;
|
||
|
declare event_type IE : ALWAYS;
|
||
|
|
||
|
// BUGBUG MsoPact doesn't enqueue
|
||
|
declare action NoArgs(0) MSOACT *MsoPact( // Declare action cons
|
||
|
MSOACTTBL *pacttbl,
|
||
|
int actt,
|
||
|
...
|
||
|
);
|
||
|
|
||
|
#if YY_DELAYED // BUGBUG tmp #if
|
||
|
#define TraceMB PactTraceMB
|
||
|
#endif
|
||
|
|
||
|
// {
|
||
|
//*** _YYSTD -- standard events
|
||
|
In event_type _YYSTD;
|
||
|
|
||
|
declare _YYSTD_INIT export; // OnInit
|
||
|
declare _YYSTD_LOADING_RULEBASE export; // OnRulesLoaded
|
||
|
|
||
|
declare _YYSTD_GENERIC export; // generic
|
||
|
declare _YYSTD_UNKNOWN export; // unknown
|
||
|
|
||
|
if (_YYSTD_INIT) {
|
||
|
TraceMB("init");
|
||
|
}
|
||
|
|
||
|
// }
|
||
|
|
||
|
|
||
|
// {
|
||
|
//*** IE -- IE-specific events
|
||
|
In event_type IE;
|
||
|
|
||
|
declare keytable IE_KEYTABLE integer /*prefix("IE")*/ // Declare char keys
|
||
|
default (irulIE_UNKNOWN);
|
||
|
|
||
|
declare IE_ALPHA generic(alpha) export; // ALPHA tk event
|
||
|
|
||
|
declare IE_UNKNOWN export; // unknown
|
||
|
declare IE_GENERIC export; // generic
|
||
|
|
||
|
declare IE_UIGENERIC;
|
||
|
declare IE_UIMENU key(UEME_UIMENU) IE_UIGENERIC export; //
|
||
|
declare IE_UIQCUT key(UEME_UIQCUT) IE_UIGENERIC export; //
|
||
|
declare IE_UISCUT key(UEME_UISCUT) IE_UIGENERIC export; //
|
||
|
declare IE_UIHOTKEY key(UEME_UIHOTKEY) IE_UIGENERIC export; //
|
||
|
|
||
|
declare IE_RUNGENERIC;
|
||
|
declare IE_RUNWMCMD key(UEME_RUNWMCMD) IE_RUNGENERIC export;
|
||
|
|
||
|
if (IE_GENERIC) {
|
||
|
TraceMB("generic");
|
||
|
}
|
||
|
|
||
|
if (IE_UIGENERIC) {
|
||
|
TraceMB("ui*");
|
||
|
}
|
||
|
|
||
|
if [IE_UIMENU IE_RUNGENERIC] {
|
||
|
TraceMB("ui run*");
|
||
|
}
|
||
|
|
||
|
if (IE_RUNGENERIC) {
|
||
|
TraceMB("run*");
|
||
|
}
|
||
|
|
||
|
|
||
|
// }
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
#if 0 // {
|
||
|
|
||
|
#if 0
|
||
|
#include "clock.rul"
|
||
|
#endif
|
||
|
|
||
|
#endif // }
|
||
|
|
||
|
|
||
|
//*** code
|
||
|
//
|
||
|
|
||
|
#ifdef TraceMB
|
||
|
action NoArgs msoactfNonEdit
|
||
|
MSOACT *TraceMB(char *str) // PactTraceMB
|
||
|
#undef TraceMB
|
||
|
{
|
||
|
TraceMB(str);
|
||
|
//return 0;
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
FUNCTION void TraceMB(char *str)
|
||
|
{
|
||
|
TraceMsg(DM_TRACE, "em: %s", str);
|
||
|
#if 0
|
||
|
// can't call this since MSOEM isn't reentrant
|
||
|
MessageBox(NULL, str, "em", MB_OKCANCEL);
|
||
|
#endif
|
||
|
return;
|
||
|
}
|