plan9port/src/lib9/fmt/vsmprint.c

84 lines
1.4 KiB
C
Raw Normal View History

2006-05-21 20:49:16 +00:00
/* Copyright (c) 2002-2006 Lucent Technologies; see LICENSE */
2004-12-26 23:07:37 +00:00
/*
* Plan 9 port version must include libc.h in order to
2004-12-26 23:07:37 +00:00
* get Plan 9 debugging malloc, which sometimes returns
* different pointers than the standard malloc.
2004-12-26 23:07:37 +00:00
*/
#ifdef PLAN9PORT
#include <u.h>
#include <libc.h>
2004-12-27 00:11:32 +00:00
#include "fmtdef.h"
2004-12-26 23:07:37 +00:00
#else
#include <stdlib.h>
2005-01-14 03:45:44 +00:00
#include <string.h>
2004-12-26 21:50:14 +00:00
#include "plan9.h"
#include "fmt.h"
#include "fmtdef.h"
2004-12-26 23:07:37 +00:00
#endif
static int
fmtStrFlush(Fmt *f)
{
char *s;
int n;
if(f->start == nil)
return 0;
2005-12-29 21:41:54 +00:00
n = (uintptr)f->farg;
2004-12-26 23:07:37 +00:00
n *= 2;
s = (char*)f->start;
f->start = realloc(s, n);
if(f->start == nil){
f->farg = nil;
f->to = nil;
f->stop = nil;
free(s);
return 0;
}
2005-12-29 21:41:54 +00:00
f->farg = (void*)(uintptr)n;
2004-12-26 23:07:37 +00:00
f->to = (char*)f->start + ((char*)f->to - s);
f->stop = (char*)f->start + n - 1;
return 1;
}
int
fmtstrinit(Fmt *f)
{
int n;
memset(f, 0, sizeof *f);
f->runes = 0;
n = 32;
f->start = malloc(n);
if(f->start == nil)
return -1;
f->to = f->start;
f->stop = (char*)f->start + n - 1;
f->flush = fmtStrFlush;
2005-12-29 21:41:54 +00:00
f->farg = (void*)(uintptr)n;
2004-12-26 23:07:37 +00:00
f->nfmt = 0;
2006-05-21 20:49:16 +00:00
fmtlocaleinit(f, nil, nil, nil);
2004-12-26 23:07:37 +00:00
return 0;
}
/*
* print into an allocated string buffer
*/
char*
vsmprint(char *fmt, va_list args)
{
Fmt f;
int n;
if(fmtstrinit(&f) < 0)
return nil;
2004-12-26 23:07:37 +00:00
VA_COPY(f.args,args);
n = dofmt(&f, fmt);
2004-12-26 23:07:37 +00:00
VA_END(f.args);
if(n < 0){
free(f.start);
return nil;
2004-12-26 23:07:37 +00:00
}
2004-06-09 14:12:04 +00:00
return fmtstrflush(&f);
}