1 85231fd8 2006-05-21 devnull /* Copyright (c) 2002-2006 Lucent Technologies; see LICENSE */
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.
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"
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"
19 df121a00 2004-12-26 devnull static int
20 df121a00 2004-12-26 devnull runeFmtStrFlush(Fmt *f)
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;
29 df121a00 2004-12-26 devnull s = (Rune*)f->start;
30 df121a00 2004-12-26 devnull f->start = realloc(s, sizeof(Rune)*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;
36 df121a00 2004-12-26 devnull return 0;
38 3d484b0d 2005-12-29 devnull f->farg = (void*)(uintptr)n;
39 df121a00 2004-12-26 devnull f->to = (Rune*)f->start + ((Rune*)f->to - s);
40 df121a00 2004-12-26 devnull f->stop = (Rune*)f->start + n - 1;
41 df121a00 2004-12-26 devnull return 1;
45 df121a00 2004-12-26 devnull runefmtstrinit(Fmt *f)
49 df121a00 2004-12-26 devnull memset(f, 0, sizeof *f);
50 df121a00 2004-12-26 devnull f->runes = 1;
52 df121a00 2004-12-26 devnull f->start = malloc(sizeof(Rune)*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 = (Rune*)f->start + n - 1;
57 df121a00 2004-12-26 devnull f->flush = runeFmtStrFlush;
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;
65 91c13e54 2004-02-29 devnull * print into an allocated string buffer
68 91c13e54 2004-02-29 devnull runevsmprint(char *fmt, va_list args)
73 91c13e54 2004-02-29 devnull if(runefmtstrinit(&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(f.start == nil)
79 91c13e54 2004-02-29 devnull return nil;
80 df121a00 2004-12-26 devnull if(n < 0){
81 df121a00 2004-12-26 devnull free(f.start);
82 df121a00 2004-12-26 devnull return nil;
84 91c13e54 2004-02-29 devnull *(Rune*)f.to = '\0';
85 91c13e54 2004-02-29 devnull return (Rune*)f.start;