16 #define INT_TO_STRING_LEN ((sizeof(int)*4*CHAR_BIT)/10 + 6)
26 set_var(int var, char* value)
29 var_tab[var] = xstrdup(value);
37 return const_tab[-var];
41 /* return var struct or NULL if not found */
42 static struct variable*
43 get_var_struct(char* name, struct list* hash)
48 n = get_bucket_number(name);
49 int nocase = isupper(*name);
50 LIST_FOREACH(p, hash + n)
51 if (!(nocase ? strcasecmp : strcmp)(p->name,name))
58 regex_cmp(char* s, char* r)
63 int ovector[OVECCOUNT];
65 brum = pcre_compile(r,0,&error,&erroroffset,NULL);
69 int res = pcre_exec(brum,NULL,s,strlen(s),0,0,ovector,OVECCOUNT);
75 #define UPPER(a) ((a) >> 8)
76 #define LOWER(a) ((a) & 0xFF)
79 xcat(char* left, char* right)
81 char* res = xmalloc(strlen(left) + strlen(right) + 1);
93 modify_headers(struct list* headers, struct list* hash)
100 LIST_FOREACH(p, headers){
101 pv = get_var_struct(p->name, hash);
107 p->value = xstrdup(get_var(pv->varcode)); //FIXME: fold it
112 for (i = 0; i < HASHSIZE; i++){
113 LIST_FOREACH(pv, hash + i){
114 if (isupper(pv->name[0]) && pv->modified){
117 p = xmalloc(sizeof(struct hlist));
118 p->name = xstrdup(pv->name);
119 p->value = xstrdup(get_var(pv->varcode));
121 list_add_last(headers,&p->car);
128 copy_headers(struct list* orig)
130 struct list* new = xmalloc(sizeof(struct list));
131 struct hlist* po, *pn;
135 LIST_FOREACH(po, orig){
136 pn = xmalloc(sizeof(struct hlist));
137 pn->name = xstrdup(po->name);
138 pn->value = xstrdup(po->value);
141 list_add_last(new, &pn->car);
148 prepare_email(struct list* hash)
152 modify_headers(current_headers, hash);
153 em.headers = copy_headers(current_headers);
154 em.body_len = current_body->body_len;
155 em.body = xmalloc(em.body_len);
156 memcpy(em.body, current_body->body, em.body_len);
162 do_string_ternary_op(struct code* p)
164 char* l = get_var(p->u.tpop.l);
165 char* r = get_var(p->u.tpop.r);
170 result = xmalloc(INT_TO_STRING_LEN);
171 sprintf(result, "%d", regex_cmp(l, r));
173 result = xmalloc(INT_TO_STRING_LEN);
174 sprintf(result, "%d", !regex_cmp(l, r));
181 set_var(p->u.tpop.res, result);
185 do_num_ternary_op(struct code* p)
188 char* result = xmalloc(INT_TO_STRING_LEN);
190 sscanf(get_var(p->u.tpop.l),"%d", &l);
191 sscanf(get_var(p->u.tpop.r),"%d", &r);
219 res = ((l || r) && !(l && r));
237 sprintf(result, "%d", res);
238 set_var(p->u.tpop.res, result);
244 char* val = get_var(var);
251 sscanf(val, "%d", &v);
257 deliver(char* where, int copy, struct list* hash)
260 struct email em = prepare_email(hash);
262 res = deliver_local_email(where, &em);
269 interp(struct list* ins, struct list* hash)
275 var_tab = xmalloc(max_varcode * sizeof(char*));
277 LIST_FOREACH(p, ins) {
280 set_var(p->u.set.l, get_var(p->u.set.r));
283 p = p->u.jump.target;
287 if (eval_cond(p->u.jump_if.cond))
288 p = p->u.jump_if.target;
291 case OPC_JUMP_UNLESS:
292 if (!eval_cond(p->u.jump_unless.cond))
293 p = p->u.jump_unless.target;
312 do_num_ternary_op(p);
315 result = xmalloc(INT_TO_STRING_LEN);
316 sscanf(get_var(p->u.tpop.l),"%d", &v);
317 sprintf(result, "%d", !v);
318 set_var(p->u.tpop.res, result);
322 do_string_ternary_op(p);
329 deliver(get_var(p->u.arrow.what),
330 p->u.arrow.copy, hash);
338 deliver(default_mailbox, 0, hash);
342 print_vars(struct list* hash)
347 for (i=0; i<HASHSIZE; i++){
348 LIST_FOREACH(p, hash + i)
349 printf("%s=%s\n",p->name, get_var(p->varcode));
360 new = xmalloc(strlen(u)+1);
363 #define IS_WHITE(c) ((c) == '\t' || (c)==' ' || c=='\n')
365 while (IS_WHITE(*pu))
370 while (IS_WHITE(*pu))
383 save_current_headers(struct list* hash)
389 LIST_FOREACH(p, current_headers){
390 pv = get_var_struct(p->name, hash);
393 u = unfold(p->value);
394 set_var(pv->varcode, u);