#ifndef TREE_H
#define TREE_H
#include "comparator.h"
typedef struct Stringlist stringlist_t;
typedef struct Commandlist commandlist_t;
typedef struct Test test_t;
typedef struct Testlist testlist_t;
typedef struct Tag tag_t;
typedef struct Taglist taglist_t;
struct Stringlist {
char *s;
stringlist_t *next;
};
struct Tag {
int type;
char *arg;
};
struct Taglist {
tag_t *t;
taglist_t *next;
};
struct Test {
int type;
union {
testlist_t *tl;
stringlist_t *sl;
struct {
int comptag;
char * comparator;
int relation;
void *comprock;
stringlist_t *sl;
stringlist_t *pl;
} h;
struct {
int comptag;
char * comparator;
int relation;
void *comprock;
stringlist_t *sl;
stringlist_t *pl;
int addrpart;
} ae;
test_t *t;
struct {
int t;
int n;
} sz;
} u;
};
struct Testlist {
test_t *t;
testlist_t *next;
};
struct Commandlist {
int type;
union {
char *str;
stringlist_t *sl;
struct {
test_t *t;
commandlist_t *do_then;
commandlist_t *do_else;
} i;
struct {
char *subject;
int days;
stringlist_t *addresses;
char *message;
int mime;
} v;
struct {
char *method;
char *id;
stringlist_t *options;
int priority;
char *message;
} n;
struct {
int comptag;
int relation;
void *comprock;
void *pattern;
int priority;
} d;
} u;
struct Commandlist *next;
};
stringlist_t *new_sl(char *s, stringlist_t *n);
tag_t *new_tag(int type, char *s);
taglist_t *new_taglist(tag_t *t, taglist_t *n);
test_t *new_test(int type);
testlist_t *new_testlist(test_t *t, testlist_t *n);
commandlist_t *new_command(int type);
commandlist_t *new_if(test_t *t, commandlist_t *y, commandlist_t *n);
void free_sl(stringlist_t *sl);
void free_test(test_t *t);
void free_tree(commandlist_t *cl);
#endif