xref: /plan9/acme/mail/src/util.c (revision 5d459b5a09e427ae1acd4e6afcf028853c73946e)
17dd7cddfSDavid du Colombier #include <u.h>
27dd7cddfSDavid du Colombier #include <libc.h>
37dd7cddfSDavid du Colombier #include <bio.h>
47dd7cddfSDavid du Colombier #include <thread.h>
5*5d459b5aSDavid du Colombier #include <plumb.h>
67dd7cddfSDavid du Colombier #include "dat.h"
77dd7cddfSDavid du Colombier 
87dd7cddfSDavid du Colombier void*
emalloc(uint n)97dd7cddfSDavid du Colombier emalloc(uint n)
107dd7cddfSDavid du Colombier {
117dd7cddfSDavid du Colombier 	void *p;
127dd7cddfSDavid du Colombier 
137dd7cddfSDavid du Colombier 	p = malloc(n);
147dd7cddfSDavid du Colombier 	if(p == nil)
157dd7cddfSDavid du Colombier 		error("can't malloc: %r");
167dd7cddfSDavid du Colombier 	memset(p, 0, n);
179a747e4fSDavid du Colombier 	setmalloctag(p, getcallerpc(&n));
189a747e4fSDavid du Colombier 	return p;
199a747e4fSDavid du Colombier }
209a747e4fSDavid du Colombier 
219a747e4fSDavid du Colombier void*
erealloc(void * p,uint n)229a747e4fSDavid du Colombier erealloc(void *p, uint n)
239a747e4fSDavid du Colombier {
249a747e4fSDavid du Colombier 	p = realloc(p, n);
259a747e4fSDavid du Colombier 	if(p == nil)
269a747e4fSDavid du Colombier 		error("can't realloc: %r");
279a747e4fSDavid du Colombier 	setmalloctag(p, getcallerpc(&n));
287dd7cddfSDavid du Colombier 	return p;
297dd7cddfSDavid du Colombier }
307dd7cddfSDavid du Colombier 
317dd7cddfSDavid du Colombier char*
estrdup(char * s)327dd7cddfSDavid du Colombier estrdup(char *s)
337dd7cddfSDavid du Colombier {
347dd7cddfSDavid du Colombier 	char *t;
357dd7cddfSDavid du Colombier 
367dd7cddfSDavid du Colombier 	t = emalloc(strlen(s)+1);
377dd7cddfSDavid du Colombier 	strcpy(t, s);
387dd7cddfSDavid du Colombier 	return t;
397dd7cddfSDavid du Colombier }
407dd7cddfSDavid du Colombier 
417dd7cddfSDavid du Colombier char*
estrstrdup(char * s,char * t)427dd7cddfSDavid du Colombier estrstrdup(char *s, char *t)
437dd7cddfSDavid du Colombier {
447dd7cddfSDavid du Colombier 	char *u;
457dd7cddfSDavid du Colombier 
467dd7cddfSDavid du Colombier 	u = emalloc(strlen(s)+strlen(t)+1);
477dd7cddfSDavid du Colombier 	strcpy(u, s);
487dd7cddfSDavid du Colombier 	strcat(u, t);
497dd7cddfSDavid du Colombier 	return u;
507dd7cddfSDavid du Colombier }
517dd7cddfSDavid du Colombier 
527dd7cddfSDavid du Colombier char*
eappend(char * s,char * sep,char * t)537dd7cddfSDavid du Colombier eappend(char *s, char *sep, char *t)
547dd7cddfSDavid du Colombier {
557dd7cddfSDavid du Colombier 	char *u;
567dd7cddfSDavid du Colombier 
577dd7cddfSDavid du Colombier 	if(t == nil)
587dd7cddfSDavid du Colombier 		u = estrstrdup(s, sep);
597dd7cddfSDavid du Colombier 	else{
607dd7cddfSDavid du Colombier 		u = emalloc(strlen(s)+strlen(sep)+strlen(t)+1);
617dd7cddfSDavid du Colombier 		strcpy(u, s);
627dd7cddfSDavid du Colombier 		strcat(u, sep);
637dd7cddfSDavid du Colombier 		strcat(u, t);
647dd7cddfSDavid du Colombier 	}
657dd7cddfSDavid du Colombier 	free(s);
667dd7cddfSDavid du Colombier 	return u;
677dd7cddfSDavid du Colombier }
687dd7cddfSDavid du Colombier 
697dd7cddfSDavid du Colombier char*
egrow(char * s,char * sep,char * t)707dd7cddfSDavid du Colombier egrow(char *s, char *sep, char *t)
717dd7cddfSDavid du Colombier {
727dd7cddfSDavid du Colombier 	s = eappend(s, sep, t);
737dd7cddfSDavid du Colombier 	free(t);
747dd7cddfSDavid du Colombier 	return s;
757dd7cddfSDavid du Colombier }
767dd7cddfSDavid du Colombier 
777dd7cddfSDavid du Colombier void
error(char * fmt,...)787dd7cddfSDavid du Colombier error(char *fmt, ...)
797dd7cddfSDavid du Colombier {
809a747e4fSDavid du Colombier 	Fmt f;
819a747e4fSDavid du Colombier 	char buf[64];
827dd7cddfSDavid du Colombier 	va_list arg;
837dd7cddfSDavid du Colombier 
849a747e4fSDavid du Colombier 	fmtfdinit(&f, 2, buf, sizeof buf);
859a747e4fSDavid du Colombier 	fmtprint(&f, "Mail: ");
867dd7cddfSDavid du Colombier 	va_start(arg, fmt);
879a747e4fSDavid du Colombier 	fmtvprint(&f, fmt, arg);
887dd7cddfSDavid du Colombier 	va_end(arg);
899a747e4fSDavid du Colombier 	fmtprint(&f, "\n");
909a747e4fSDavid du Colombier 	fmtfdflush(&f);
917dd7cddfSDavid du Colombier 	threadexitsall(fmt);
927dd7cddfSDavid du Colombier }
937dd7cddfSDavid du Colombier 
947dd7cddfSDavid du Colombier void
ctlprint(int fd,char * fmt,...)957dd7cddfSDavid du Colombier ctlprint(int fd, char *fmt, ...)
967dd7cddfSDavid du Colombier {
977dd7cddfSDavid du Colombier 	int n;
987dd7cddfSDavid du Colombier 	va_list arg;
997dd7cddfSDavid du Colombier 
1007dd7cddfSDavid du Colombier 	va_start(arg, fmt);
1019a747e4fSDavid du Colombier 	n = vfprint(fd, fmt, arg);
1027dd7cddfSDavid du Colombier 	va_end(arg);
1039a747e4fSDavid du Colombier 	if(n <= 0)
1047dd7cddfSDavid du Colombier 		error("control file write error: %r");
1057dd7cddfSDavid du Colombier }
106