///////////
typedef struct{
char name[20];
int code;
} Tag;
enum TagFlags{
// these are not used as return status for join,
// but it is reasonable to make one list because
// their menings are related.
TagNull,
TagEmit, // emit generically means selected for output
TagStop, // Not sure, probably immediate halt
TagClose, // Indicates closure of a sequence, not necessarily matched
TagText, // generally means we are dealing with readable chars
TagSingle,
TagSkip,
TagDone
};
extern Tag tags[];
#define NUMTAGS 40
////////////
Begin /////////////////
enum {TEST=0,TEXT,MEM,LAZYJ,CONSOLE,STRING};
int init_join(void);
enum { Match_All = 16,Match_Once,Match_Not,Match_Some,Debug};
//int type_from_name(char* name);// spaghetti macros
//int mode_from_name(char*);
#define next_white(p) while(!isspace(*p)) p++
#define skip_white(p) while(isspace(*p)) p++
#define skip_alpha(p) while(*p && isalpha(*p)) p++
#define skip_alnum(p) while(*p && isalnum(*p)) p++
#define skip_non_alpha(p) while(*p && !isalpha(*p)) p++
#define skip_eol(p) while(*p && *p != '\n') p++
#define collect_alpha(p,q) while(*p && isalpha(*p)){*q=*p; p++;q++;}
#define skip_arg(p) skip_white(p);skip_alnum(p)
// The app, debug and executive signal return status
//from their loop usingthese
///////////
Begin, cursor definition:
///////////
// cursor.h
// All the graph manipulations done through exec call in the Cursor
//
// requests for action from the join back to the attachment
// the attachment has an 'exec' function for this,
// unique to the attachment
#define version 1.0
enum CursorMethods{
Reset=0, // This is a pop notification
Set, // a push notification
Fetch, // next node request
Step, // step one node forward
Skip, // Skip to end of sequence
// Outpout methods
Append, //output is a graph
Descend, // Start new sequence
Branch, // Close current sequence
Init, // initialize
};
// Resuts from a method cll back.
// These determine the next action taken by join.
enum CursorStatus {
Null =0, // normal result
End, // end of sequence
Done, // forces a break in the main loop
Pause, // attachment yields to another join instance
Break, // exit current sequence if matched
Match,
Push, // push and recurse
Singleton, // A sequene wiht one element
Output, // Selected for output.
LastStatus // Attachment specific codes
};
// Key and op, the content of a node
// Note, the null node is valid throughout,
// it is a terminator; a clearing node.
//
typedef struct {
char op; //
char* key; // Basic text held at the node
} Element;
// Cursor holds everything needed to traverse a graph
// eval
// a call back that executes whatever context
// specific binary grammar forms the application
// exec
// generally selects one of the graph methods.
//
// join controls cursors but the attachment keeps some
// state variable in it
//the first five values are used only by the attachment
// and are here mainly for convenience of working
// with text char files
// they need pushing aand popping somust be retained in a cursor.
//
typedef struct Cursor Cursor;
typedef Cursor* PCursor;
typedef int (*EvalCallback)(Cursor*,Cursor*);
typedef int (*ExecCallback)(Cursor* ,int,void *);
typedef struct Cursor{
void * start; // to free the memory
void *current; // Pointer to current node
void *state; // Maintains pointer during recursion
char prevOp; // Needed for some attachments with inconsistent grammar
int key_size; // maximum key size
int mode; // Carries the match modifier for match function
int index; // stacking multiple joins
int type; // Type of attachment
Element element; // current node value
ExecCallback exec;
EvalCallback eval;
} Cursor;
int AddHandlers(ExecCallback,EvalCallback,char *);
// Exported by the join engine, mostly cursor utilities
int join_cursor(PCursor left, PCursor right, PCursor result);
PCursor new_cursor(int);
PCursor dup_cursor(PCursor);
PCursor get_cursor(int);
//PCursor * CreateCurse(int type,char * args[]);
void del_cursor(PCursor);
int NextInstance(PCursor *l, PCursor *r,PCursor *o);
int CurrentTriple(PCursor *l, PCursor *r,PCursor *o);
char * element_from_string(char*,Element*);
PCursor init_cursor(ExecCallback, EvalCallback,int,void*) ;
// from the cursor stack mehods
//void remove_cursors(PCursor m); // remove all three triples
void ReplaceCursor(PCursor); //Replace one
int GetCursorFile(PCursor self,void * args[]); // put file contents into cursor buff
//Standard match routine with match modifiers
// designed to share return space with callback status
int MatchKey(Element* p, Element* q);
#define Matched(p,q) (p==Match || p == Break) && (q == Match || q == Break)
///////////////
No comments:
Post a Comment