+#include <setjmp.h>
#include "lists.h"
+/* definitions of internal variables */
+#define INT_VAR_MAIL_LEN "MAIL_LEN"
+#define INT_VAR_LAST_EXIT "LAST_EXIT_CODE"
+#define INT_VAR_PIPE_RES "LAST_OUTPUT"
+
+/* umpf.c */
+jmp_buf env;
+
/* cond.h */
int yylex (void);
void yyerror (char const *);
+enum keyword {
+ K_DISCARD,
+ K_COPY,
+ K_MAIL,
+ K_PIPE,
+ K_EMPTY,
+ K_FILTER
+};
+
+enum var_type {
+ VAR_HEADER,
+ VAR_INTERN,
+ VAR_USER
+};
+
struct tree {
enum {
ST_IF,
} tif;
struct {
- int op;
enum {
OP_REL,
- OP_BOOL
+ OP_BOOL,
+ JUST_BOOL /* value only in left, no op */
} type;
+ int op;
struct tree* left;
struct tree* right;
} cond; /* binary operator */
L_CONST,
} type;
char* value;
+ int n;
} leaf;
struct {
- char* kw_left;
- char* kw_right;
+ enum keyword left;
+ enum keyword right;
struct tree* s;
} arrow;
#define CC(a,b) ((a<<8)|b)
void* xmalloc(size_t size);
void* xrealloc(void* buf, size_t size);
-char* xstrdup(char* s);
+char* xstrdup(const char* s);
void __attribute__ ((noreturn)) die(char* msg, ...);
void read_conf(char* filename);
int line;
FILE* conf;
+/* code.c */
+#define BUFSIZE 4096
+#define HASHSIZE 103
+#define MAGIC 19
+
+struct code {
+ struct node car;
+ enum {
+ OPC_SET,
+ OPC_JUMP,
+ OPC_JUMP_IF,
+ OPC_JUMP_UNLESS,
+ OPC_DELIVER,
+ OPC_NOP,
+ OPC_CAT,
+ OPC_GT,
+ OPC_LT,
+ OPC_LE,
+ OPC_GE,
+ OPC_EQ,
+ OPC_NEQ,
+ OPC_RE,
+ OPC_NRE,
+ OPC_AND,
+ OPC_OR,
+ OPC_XOR,
+ OPC_NOT,
+ OPC_PLUS,
+ OPC_MINUS,
+ OPC_MUL,
+ OPC_DIV,
+ OPC_PIPE,
+ OPC_MAIL,
+ OPC_FILTER,
+ OPC_DISCARD
+ } opcode;
+
+ union {
+ struct {
+ struct code* target;
+ } jump;
+ struct {
+ struct code* target;
+ int cond;
+ } jump_if;
+ struct {
+ struct code* target;
+ int cond;
+ } jump_unless;
+ struct {
+ int l;
+ int r;
+ } set;
+ struct {
+ int l;
+ int r;
+ int res; /* result */
+ } tpop;
+ struct {
+ int par;
+ int res; /* result */
+ } dpop;
+ struct {
+ int copy;
+ int what;
+ } arrow;
+ struct {
+ } nop;
+ } u;
+};
+
+struct variable {
+ struct node car;
+ char* name;
+ int varcode;
+ int modified;
+ enum var_type type;
+};
+
+struct list input_code;
+struct list* var_hash;
+int current_varcode;
+int max_varcode;
+int temp_varcode_start;
+char** var_tab;
+char** const_tab;
+int cur_const_n;
+int cur_const_s;
+char* empty;
+
+void init(void);
+void compile(struct tree* t, struct list* where);
+int find_var(char* name, enum var_type type, struct list* hash);
+struct variable* get_var_struct(char* name, enum var_type type, struct list* hash);
+int store_const(char* c);
+struct list* new_var_hash(void);
+int get_bucket_number(char* name);
+void print_code(void);
+
/* int.c */
struct hlist {
struct node car;
char* name;
char* value;
+ int have_var;
};
struct email {
struct list* headers;
char* body;
+ char* tmpfile;
+ int fd;
int body_len;
};
-struct action {
- char* l;
- char* r;
- char* s;
- struct email e;
-};
+void save_current_headers(struct list* hash);
+void print_vars(struct list* hash);
+void interp(struct list* ins, struct list* hash);
+void free_string(char* c);
+void __attribute__ ((noreturn)) bye(int code, char* msg, ...);
+void set_cur_mail_length_var(int len, struct list* hash);
/* ham.c */
char* default_mailbox;
+int chars_written;
+int curr_email_len;
struct list* current_headers;
struct email* current_body;
-struct list* make_hlist(void);
+struct list* make_hlist(int fd);
+void new_header(char* buf, struct list* h);
void print_headers(struct list* l);
-void do_action(struct action* a);
-struct email* get_body(void);
+struct email* get_body(int fd);
+int deliver_local_email(char* folder, struct email* email);
+int write_email_to_fd(int fd, struct email* email);
+char* read_email(struct email* em);
+void open_email(void);
/* lock.c */
void save_gids(void);
int open_mailbox(char* path, int is_default_mailbox);
char* cat(char* l, char* r);
-/* code.c */
-
-struct code {
- struct node car;
- enum {
- SET,
- JUMP,
- JUMP_IF,
- JUMP_UNLESS,
- DELIVER,
- CALL_EXT,
- NOP
- } opcode;
-
- union {
- struct {
- int l;
- int r;
- } set;
- } u;
-};
-
-struct variable {
- struct node car;
- char* name;
- int varcode;
-};
-
-struct list input_code;
-struct list* var_hash;
-int current_varcode;
-char** var_tab;
-char** const_tab;
-int cur_const_n, cur_const_s;
-void init(void);
-void compile(struct tree* t);
-void print_code(struct tree* t);