Blame


1 85231fd8 2006-05-21 devnull /* Copyright (c) 2002-2006 Lucent Technologies; see LICENSE */
2 91c13e54 2004-02-29 devnull /*
3 fa325e9b 2020-01-10 cross * Plan 9 port version must include libc.h in order to
4 df121a00 2004-12-26 devnull * get Plan 9 debugging malloc, which sometimes returns
5 fa325e9b 2020-01-10 cross * different pointers than the standard malloc.
6 df121a00 2004-12-26 devnull */
7 df121a00 2004-12-26 devnull #ifdef PLAN9PORT
8 df121a00 2004-12-26 devnull #include <u.h>
9 df121a00 2004-12-26 devnull #include <libc.h>
10 eb7f99c5 2004-12-27 devnull #include "fmtdef.h"
11 df121a00 2004-12-26 devnull #else
12 91c13e54 2004-02-29 devnull #include <stdlib.h>
13 78e51a8c 2005-01-14 devnull #include <string.h>
14 e5aa96ac 2004-12-26 devnull #include "plan9.h"
15 91c13e54 2004-02-29 devnull #include "fmt.h"
16 91c13e54 2004-02-29 devnull #include "fmtdef.h"
17 df121a00 2004-12-26 devnull #endif
18 91c13e54 2004-02-29 devnull
19 df121a00 2004-12-26 devnull static int
20 df121a00 2004-12-26 devnull fmtStrFlush(Fmt *f)
21 df121a00 2004-12-26 devnull {
22 df121a00 2004-12-26 devnull char *s;
23 df121a00 2004-12-26 devnull int n;
24 df121a00 2004-12-26 devnull
25 df121a00 2004-12-26 devnull if(f->start == nil)
26 df121a00 2004-12-26 devnull return 0;
27 3d484b0d 2005-12-29 devnull n = (uintptr)f->farg;
28 df121a00 2004-12-26 devnull n *= 2;
29 df121a00 2004-12-26 devnull s = (char*)f->start;
30 df121a00 2004-12-26 devnull f->start = realloc(s, n);
31 df121a00 2004-12-26 devnull if(f->start == nil){
32 df121a00 2004-12-26 devnull f->farg = nil;
33 df121a00 2004-12-26 devnull f->to = nil;
34 df121a00 2004-12-26 devnull f->stop = nil;
35 df121a00 2004-12-26 devnull free(s);
36 df121a00 2004-12-26 devnull return 0;
37 df121a00 2004-12-26 devnull }
38 3d484b0d 2005-12-29 devnull f->farg = (void*)(uintptr)n;
39 df121a00 2004-12-26 devnull f->to = (char*)f->start + ((char*)f->to - s);
40 df121a00 2004-12-26 devnull f->stop = (char*)f->start + n - 1;
41 df121a00 2004-12-26 devnull return 1;
42 df121a00 2004-12-26 devnull }
43 df121a00 2004-12-26 devnull
44 df121a00 2004-12-26 devnull int
45 df121a00 2004-12-26 devnull fmtstrinit(Fmt *f)
46 df121a00 2004-12-26 devnull {
47 df121a00 2004-12-26 devnull int n;
48 df121a00 2004-12-26 devnull
49 df121a00 2004-12-26 devnull memset(f, 0, sizeof *f);
50 df121a00 2004-12-26 devnull f->runes = 0;
51 df121a00 2004-12-26 devnull n = 32;
52 df121a00 2004-12-26 devnull f->start = malloc(n);
53 df121a00 2004-12-26 devnull if(f->start == nil)
54 df121a00 2004-12-26 devnull return -1;
55 df121a00 2004-12-26 devnull f->to = f->start;
56 df121a00 2004-12-26 devnull f->stop = (char*)f->start + n - 1;
57 df121a00 2004-12-26 devnull f->flush = fmtStrFlush;
58 3d484b0d 2005-12-29 devnull f->farg = (void*)(uintptr)n;
59 df121a00 2004-12-26 devnull f->nfmt = 0;
60 85231fd8 2006-05-21 devnull fmtlocaleinit(f, nil, nil, nil);
61 df121a00 2004-12-26 devnull return 0;
62 df121a00 2004-12-26 devnull }
63 df121a00 2004-12-26 devnull
64 91c13e54 2004-02-29 devnull /*
65 91c13e54 2004-02-29 devnull * print into an allocated string buffer
66 91c13e54 2004-02-29 devnull */
67 91c13e54 2004-02-29 devnull char*
68 91c13e54 2004-02-29 devnull vsmprint(char *fmt, va_list args)
69 91c13e54 2004-02-29 devnull {
70 91c13e54 2004-02-29 devnull Fmt f;
71 91c13e54 2004-02-29 devnull int n;
72 91c13e54 2004-02-29 devnull
73 91c13e54 2004-02-29 devnull if(fmtstrinit(&f) < 0)
74 91c13e54 2004-02-29 devnull return nil;
75 df121a00 2004-12-26 devnull VA_COPY(f.args,args);
76 91c13e54 2004-02-29 devnull n = dofmt(&f, fmt);
77 df121a00 2004-12-26 devnull VA_END(f.args);
78 df121a00 2004-12-26 devnull if(n < 0){
79 df121a00 2004-12-26 devnull free(f.start);
80 91c13e54 2004-02-29 devnull return nil;
81 df121a00 2004-12-26 devnull }
82 d1b4cfde 2004-06-09 devnull return fmtstrflush(&f);
83 91c13e54 2004-02-29 devnull }