|
|
/*****************************************************************************
emact.h
Owner: DaleG Copyright (c) 1997 Microsoft Corporation
Delayed Action Interpreter mechanism, shared header file.
*****************************************************************************/
#ifndef _EMACT_H
#define _EMACT_H
#include "emrultk.h"
MSOEXTERN_C_BEGIN // ***************** Begin extern "C" ********************
#define iactAllocMax 256
/* M S O A C T */ /*----------------------------------------------------------------------------
%%Structure: MSOACT %%Contact: daleg
Delayed-Action structure. Used to pass argument values to functions delay-called from the rulebase. ----------------------------------------------------------------------------*/
typedef struct _MSOACT { union { struct { short actt; // Action type
MSOBF fComposite : 1; // Composite action?
MSOBF fValidate : 1; // Check if act OK?
MSOBF fAdjust : 1; // Adjusting CA?
MSOBF fDeferred : 1; // Deferred eval?
long rgl[8]; // Arg values, 1st rec
struct _MSOACT *pactSublist; // Child record
} rec1; struct { long hdrCA; // Shared rec1 header
MSOCA ca; // Edit range
} rec1_ca; long hdr; // Shared header
long rglSublist[10]; // Arg values, 2nd+ rec
char *rszSublist[10]; // Arg values, 2nd+ rec
}; struct _MSOACT *pactNext; // Next record
} MSOACT;
#define msoacttNil (-1) // Out of range actt
#define msopactNULL ((MSOACT *) (-1)) // End of list marker
// Return object pointer of (first record of) a pact
#define PObjectPact(pact) \
((pact)->rec1_ca.ca.pObject)
// Return cpFirst of (first record of) a pact
#define CpFirstPact(pact) \
((pact)->rec1_ca.ca.cpFirst)
// Return cpLim of (first record of) a pact
#define CpLimPact(pact) \
((pact)->rec1_ca.ca.cpLim)
/* M S O A C T B L K */ /*----------------------------------------------------------------------------
%%Function: MSOACTBLK %%Contact: daleg
Delayed-Action structure allocation block. ----------------------------------------------------------------------------*/
typedef struct _MSOACTBLK { struct _MSOACTBLK *pactblkNext; // Next alloc block
MSOACT rgact[iactAllocMax]; // Array of MSOACTs
} MSOACTBLK;
/* M S O A C T T R E C */ /*----------------------------------------------------------------------------
%%Function: MSOACTTREC %%Contact: daleg
Action-type table record. Holds flags associated with actt values. ----------------------------------------------------------------------------*/
typedef struct _MSOACTTREC { short cargs; // Num of args to fn
unsigned short actf; // Action flags
} MSOACTTREC;
// Base action flags
#define msoactfExclusiveEdit 0x0001 // Truncates other acts
#define msoactfTruncatable 0x0002 // Trucated by Excl act
#define msoactfNonExclPaired 0x0004 // Trunc unless paired
// "User"-level action flags
#define msoactfNonEdit 0x0000 // Not an edit
#define msoactfEdit 0x0003 // e.g. Edits
#define msoactfProp 0x0002 // e.g. Props
#define msoactfPairedProp 0x0004 // Props paired w/edits
#define msoactfOverlapCalc 0x0007 // Overlap calc necess
#define msoactfCond 0x0010 // Cond exec next act
#define msoactfConposite 0x0020 // Composite action
// Return whether the action is a composite, composed of multiple records
#define MsoFCompositeAct(actt, pacttbl) \
MsoFActfActt(actt, msoactfConposite, pacttbl)
// Return whether ACT record has actf flag set
#define MsoFActfActt(actt, actfMask, pacttbl) \
(MsoActfActt((actt), (pacttbl)) & (actfMask))
// Return whether ACT record has actf flag set
#define MsoFActfIs(actf, actfMask) \
((actf) & (actfMask))
// Return whether ACT record type has actf flag set
#define MsoFActfActtIs(actt, actfMatch, pacttbl) \
(MsoActfActt((actt), (pacttbl)) == (actfMatch))
// Return whether ACT record type has actf flag set
#define MsoActfActt(actt, pacttbl) \
(MsoPActtrec((actt), (pacttbl))->actf)
// Return action record (MSOACTTREC) associated with ACT record
#define MsoPActtrec(actt, pacttbl) \
(&(pacttbl)->rgacttrec[actt])
/* M S O A C T T B L */ /*----------------------------------------------------------------------------
%%Structure: MSOACTTBL %%Contact: daleg
Action-type table. Contains MSOACT state and action flags. ----------------------------------------------------------------------------*/
typedef struct _MSOACTTBL { const MSOACTTREC *rgacttrec; // Per-action data
MSOCP cpFirstEditPrev; // 1st CP of last edit
MSOCP dcpEditPrev; // dCP of last edit
MSOCP cpLimEdit; // cpLim, edit so far
MSORULTKH *prultkh; // Text Token cache
MSOACT *pactPending; // Pending actions
MSOACT *pactPendingPrev; // Prev pending acts
MSOACT *pactFree; // Free list
MSOACTBLK *pactblkAlloc; // Allocation list
} MSOACTTBL;
// Start a new MSOACT action list frame
#define MsoPushPactPending() \
MsoBeginActSublist((_pacttbl), &(_pacttbl)->pactPendingPrev)
// End and close a new MSOACT sub-list, and return sublist
#define MsoPopPactPending(ppact) \
(*(ppact) = (_pacttbl)->pactPending, \ MsoEndActSublist((_pacttbl), &(_pacttbl)->pactPendingPrev))
// Start a new MSOACT action list frame
__inline void MsoBeginActSublist(MSOACTTBL *pacttbl, MSOACT **ppactPrev) { *ppactPrev = pacttbl->pactPending; pacttbl->pactPending = (MSOACT *) NULL; }
// End and close a new MSOACT sub-list
__inline void MsoEndActSublist(MSOACTTBL *pacttbl, MSOACT **ppactPrev) { pacttbl->pactPending = *ppactPrev; *ppactPrev = (MSOACT *) NULL; }
// Callback to evaluate the MSOACT
typedef long (WIN_CALLBACK * MSOPFNACT)( MSOACT *pact, MSOACTTBL *pacttbl, long *pdcp, // IN, RETURN
MSOCA *pcaAdjusted, MSOACT **ppactNext, // RETURN
int *pfDiscard // RETURN
);
// Are there pending action records?
#define MsoPendingActions(pacttbl) \
((pacttbl)->pactPending)
// Return value for args 0-7
#define MsoLPact(pact, iarg) \
((pact)->rec1.rgl[iarg])
// Return value for args 8-17
#define MsoLPact2(pact, iarg) \
((pact)->rec1.pactSublist->rglSublist[(iarg) - 8])
// Return value for args 18-27
#define MsoLPact3(pact, iarg) \
((pact)->rec1.pactSublist-> \ ((pact)->rec1.pactSublist->pactNext->rglSublist[(iarg) - 18])
// Return value for args 28-31
#define MsoLPact4(pact, iarg) \
((pact)->rec1.pactSublist->pactNext->pactNext \ ->rglSublist[(iarg) - 28])
MSOCDECLAPI_(MSOACT *) MsoPact( // Build new MSOACT rec
MSOACTTBL *pacttbl, int actt, ... ); MSOCDECLAPI_(MSOACT *) MsoPactNq( // As above, not queued
MSOACTTBL *pacttbl, int actt, ... ); MSOCDECLAPI_(MSOACT *) MsoPactDtk( // Bld MSOACT rec w/tks
MSOACTTBL *pacttbl, int actt, int dtkStart, int dtk, ... ); MSOCDECLAPI_(MSOACT *) MsoPactDtkNq( // As above, not queued
MSOACTTBL *pacttbl, int actt, int dtkStart, int dtk, ... ); MSOCDECLAPI_(MSOACT *) MsoPactPca( // Bld MSOACT rec w/CPs
MSOACTTBL *pacttbl, int actt, MSOCA *pca, ... ); MSOCDECLAPI_(MSOACT *) MsoPactPcaNq( // As above, not queued
MSOACTTBL *pacttbl, int actt, MSOCA *pca, ... ); MSOAPI_(MSOACT *) MsoPactCompositeDtk( // Bld Composite action
MSOACTTBL *pacttbl, int actt, int dtkStart, int dtk, MSOACT **ppactPrev ); void SetPactCaFromSublist(MSOACT *pact); // Set CA of Comp pact
#define MsoReversePactPending(pacttbl) \
MsoReversePact(&pacttbl->pactPending) // Reverse pending acts
MSOAPI_(void) MsoReversePact(MSOACT **ppact); // Reverse ACT list
MSOAPI_(long) MsoDcpDoActs( // Execute ACT list
MSOACT **ppact, MSOACTTBL *pacttbl, long dcp, int fDiscardActs, int dactLim, MSOPFNACT pfnact // MSOACT handler
); MSOAPI_(MSOACT *) MsoPactDtkAp( // Bld MSOACT tks & ap
MSOACTTBL *pacttbl, int actt, int dtkStart, int dtk, va_list ap ); MSOAPI_(MSOACT *) MsoPactPcaAp( // Bld MSOACT CPs & ap
MSOACTTBL *pacttbl, int actt, MSOCA *pca, va_list ap ); MSOAPI_(MSOACT *) MsoPactAp( // Bld MSOACT rec ap
MSOACTTBL *pacttbl, int actt, int cargsOffset, va_list ap ); MSOAPI_(void) MsoInsertPact( // Insert ACT by MSOCA
MSOACT *pact, MSOACT **ppactHead ); MSOAPI_(int) MsoFEnsurePactFirst( // Sort ACT 1st in rng
MSOACT *pact, MSOACTTBL *pacttbl ); MSOAPI_(MSOACT *) MsoFindPactOfActt( // Find rec by actt
short actt, MSOACT *pact, MSOCP cpFirst, MSOCP cpLim ); MSOAPI_(void) MsoDeletePact( // Remove & free act
MSOACT *pact, MSOACTTBL *pacttbl ); MSOAPI_(void) MsoSkipNextPact( // Skip over next ACT
MSOACT **ppactNext, MSOACTTBL *pacttbl ); MSOAPI_(MSOACT *) _MsoPactNew(MSOACTTBL *pacttbl); // Create blk of MSOACT
_inline MSOACT *MsoPactNew(MSOACTTBL *pacttbl) // Return new MSOACT
{ MSOACT *pact;
if ((pact = pacttbl->pactFree)) { pacttbl->pactFree = pact->pactNext; return pact; } return _MsoPactNew(pacttbl); }
void ClearPactPending(MSOACTTBL *pacttbl); // Free pending acts
MSOAPI_(void) MsoFreePact( // Free MSOACT rec
MSOACT *pact, MSOACTTBL *pacttbl );
_inline int MsoFAllocPact(MSOACTTBL *pacttbl) // Pre-alloc ACT list
{ MSOACT *pact;
if ((pact = MsoPactNew(pacttbl)) == NULL) return FALSE; MsoFreePact(pact, pacttbl); return TRUE; }
MSOAPI_(void) MsoFreeActMem(MSOACTTBL *pacttbl); // Free act mem used
#ifdef DEBUG
MSOAPI_(void) MsoMarkActMem(MSOACTTBL *pacttbl); // Mark act mem used
#endif // DEBUG
MSOEXTERN_C_END // ****************** End extern "C" *********************
#endif /* !_EMACT_H */
|