#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;i<t;i++)
print("\t");
print("M 0x%luX id %d s %lld e %lld H s %lld e %lld B s %lld e %lld Clen %d\n",
m,
m->id,
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;
}
|