#include "a.h" /* memory utils */ void* emalloc(ulong n) { void *v; v = malloc(n); if(v == nil) sysfatal("out of memory allocating %lud", n); memset(v, 0, n); setmalloctag(v, getcallerpc(&n)); return v; } void* erealloc(void *v, ulong n) { v = realloc(v, n); if(v == nil) sysfatal("out of memory reallocating %lud", n); setmalloctag(v, getcallerpc(&v)); return v; } char* estrdup(char *s) { char *ns; int len; len=strlen(s)+1; ns = malloc(len); if(ns == 0) return nil; memcpy(ns,s,len); setmalloctag(ns,getcallerpc(&s)); return ns; } /* debugging utils */ int error(int level, char *format, ... ) { va_list args; char lasterror[ERRMAX]; va_start(args, format); vsnprint(lasterror,ERRMAX, format, args); va_end(args); werrstr(lasterror); switch(level) { case DEBUG: fprint(2,"Debug:%r"); return 0; break; case FATAL: sysfatal("Error: %r"); break; case HOLD: fprint(2,"%r"); abort(); break; } return 0; } int printmsg(Message *m, int t) { for(int i=0;iid, m->start, m->end, m->hstart, m->hend, m->bstart, m->bend, m->cache->l); return 1; } int printm(Message *m,int t) { Message *p; for(;m!=nil;m=m->next) { printmsg(m,t); for(p=m->part;p!=nil;p=p->next) { printmsg(p,t+1); if ( p->part != nil ) printm(p->part,t+2); } } return 1; } int printbox(Mailbox *b) { Message *m; m=b->msgs; printm(m,1); return 1; } /* message lists management */ Mailbox* newbox(char *f) { Mailbox *b; char *pt; b=emalloc(sizeof *b); pt=utfrrune(f, '/'); if ( pt == nil ) pt=f; else pt++; b->name=smprint("%s",pt); b->file=smprint("%s",f); return b; } Mailbox* blookup(Mailbox *list, char *name) { for(;list!=nil;list=list->next) if(strncmp(list->name,name,strlen(name))==0) return list; return nil; } Mailbox* btofront(Mailbox *list, Mailbox *new) { new->next=list; return new; } Mailbox* btoend(Mailbox *list, Mailbox *new) { Mailbox *p; if ( list == nil) return new; for(p=list;p->next !=nil;p=p->next) ; p->next=new; return list; } Message* newmsg(vlong start) { Message *m; m=emalloc(sizeof *m); m->start=start; m->next=nil; m->part=nil; m->root=nil; setmalloctag(m,getcallerpc(&start)); return m; } Message* mtofront(Message *list, Message *new) { new->next=list; return new; } Message* mtoend(Message *list, Message *new) { Message *p; if ( list == nil) return new; for(p=list;p->next !=nil;p=p->next) ; p->next=new; return list; } Message* mlookup(Message *list, int id) { for(;list!=nil;list=list->next) if(list->id == id) return list; return nil; } Message* ptofront(Message *list, Message *new) { new->part=list; return new; } Message* ptoend(Message *list, Message *new) { Message *p; if ( list == nil) return new; for(p=list;p->part !=nil;p=p->part) ; p->part=new; return list; } Message* plookup(Message *list, int id) { for(;list!=nil;list=list->part) if(list->id == id) return list; return nil; } void freemime(Mime *m) { free(m->boundary); free(m->type); free(m->charset); free(m->disposition); free(m->filename); free(m->encoding); } void freem(Message *m) { freemime(&m->mime); free(m->cache); free(m); } void freemlist(Message *list) { Message *next; for(;list!=nil;list=next) { next=list->next; freem(list); } } void freeplist(Message *list) { Message *part; for(;list!=nil;list=part) { part=list->part; freem(list); } } Message* delm(Message *list, int id) { Message *p, *prev; prev=nil; for(p=list;p!=nil;p=p->next) { if(id==p->id) { error(DEBUG,"delm(): delete message %d\n",id); if(prev==nil) list=p->next; else prev->next=p->next; freem(p); return list; } prev=p; } return list; } Message* delp(Message *list, int id) { Message *p, *prev; prev=nil; for(p=list;p!=nil;p=p->part) { if(id==p->id) { if(prev==nil) list=p->next; else prev->part=p->part; freem(p); return list; } prev=p; } return list; }