1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
|
/* (C) Marcin Kwadrans <quarter@users.sourceforge.net> */
/*! \file command.h
\brief Obsługa poleceń
*/
#ifndef __LW_COMMAND_H
#define __LW_COMMAND_H
#include "symbol.h"
#include "value.h"
#include "wizard.h"
enum LWLink {
LW_LINK_LEFT=0,
LW_LINK_RIGHT=1
};
enum LWResume {
LW_RESUME_IDLE=1,
LW_RESUME_TIMEOUT=2,
LW_RESUME_KEYPRESS=4
};
/*! \struct LWContext
\brief Struktura kontekstu
Zawiera wskaźniki do bierzącej instrukcji, stosu i obiektu czarodzieja
w środowisku z niej dziedziczy.
*/
struct LWContext {
GNode *instrPtr;
GQueue *stack;
GQueue *queue_keys;
LWWizard *wizard;
guint wait_time;
guint wait_for;
gboolean resume;
};
/*! \class LWCommand
\brief Klasa polecenia
Abstrakcyjna klasa polecenia. Każde polecenie zdefiniowane
w środowisku z niej dziedziczy.
*/
class LWCommand: public LWSymbol {
private:
LWValue *arg[2];
guint argc;
void getArguments (LWValue *args[], GQueue *stack);
void pushArguments (LWValue *args[], GQueue *stack);
void freeArguments (LWValue *args[]);
void setReturn (LWValue *value, GQueue *stack);
protected:
LWCommand ();
virtual void checkArgument (guint n, LWValue *value);
virtual void checkArgc (guint argc);
virtual LWValue *execute1 (LWContext *context, guint argc, LWValue *args[]) = 0;
virtual LWValue *resume1 (LWContext *context, guint argc, LWValue *args[]);
virtual void reset1 ();
public:
void reset();
void execute (LWContext *context, gboolean resume);
void setArgument (guint n, LWValue *value);
void setArgc (guint n);
virtual gboolean hasReturn ();
virtual gboolean isLoop();
virtual gboolean isSegment();
virtual gboolean canBeSkiped ();
virtual gboolean requiresLogicBlock ();
virtual guint getPriority ();
virtual LWLink getLinkType ();
gboolean canClone ();
gboolean isCommand ();
};
#endif
|