1*8ccd4a63SDavid du Colombier #include <u.h> 2*8ccd4a63SDavid du Colombier #include <libc.h> 3*8ccd4a63SDavid du Colombier #include "fmtdef.h" 4*8ccd4a63SDavid du Colombier 5*8ccd4a63SDavid du Colombier static int 6*8ccd4a63SDavid du Colombier runeFmtStrFlush(Fmt *f) 7*8ccd4a63SDavid du Colombier { 8*8ccd4a63SDavid du Colombier Rune *s; 9*8ccd4a63SDavid du Colombier int n; 10*8ccd4a63SDavid du Colombier 11*8ccd4a63SDavid du Colombier if(f->start == nil) 12*8ccd4a63SDavid du Colombier return 0; 13*8ccd4a63SDavid du Colombier n = (int)f->farg; 14*8ccd4a63SDavid du Colombier n *= 2; 15*8ccd4a63SDavid du Colombier s = f->start; 16*8ccd4a63SDavid du Colombier f->start = realloc(s, sizeof(Rune)*n); 17*8ccd4a63SDavid du Colombier if(f->start == nil){ 18*8ccd4a63SDavid du Colombier f->farg = nil; 19*8ccd4a63SDavid du Colombier f->to = nil; 20*8ccd4a63SDavid du Colombier f->stop = nil; 21*8ccd4a63SDavid du Colombier free(s); 22*8ccd4a63SDavid du Colombier return 0; 23*8ccd4a63SDavid du Colombier } 24*8ccd4a63SDavid du Colombier f->farg = (void*)n; 25*8ccd4a63SDavid du Colombier f->to = (Rune*)f->start + ((Rune*)f->to - s); 26*8ccd4a63SDavid du Colombier f->stop = (Rune*)f->start + n - 1; 27*8ccd4a63SDavid du Colombier return 1; 28*8ccd4a63SDavid du Colombier } 29*8ccd4a63SDavid du Colombier 30*8ccd4a63SDavid du Colombier int 31*8ccd4a63SDavid du Colombier runefmtstrinit(Fmt *f) 32*8ccd4a63SDavid du Colombier { 33*8ccd4a63SDavid du Colombier int n; 34*8ccd4a63SDavid du Colombier 35*8ccd4a63SDavid du Colombier memset(f, 0, sizeof *f); 36*8ccd4a63SDavid du Colombier f->runes = 1; 37*8ccd4a63SDavid du Colombier n = 32; 38*8ccd4a63SDavid du Colombier f->start = malloc(sizeof(Rune)*n); 39*8ccd4a63SDavid du Colombier if(f->start == nil) 40*8ccd4a63SDavid du Colombier return -1; 41*8ccd4a63SDavid du Colombier f->to = f->start; 42*8ccd4a63SDavid du Colombier f->stop = (Rune*)f->start + n - 1; 43*8ccd4a63SDavid du Colombier f->flush = runeFmtStrFlush; 44*8ccd4a63SDavid du Colombier f->farg = (void*)n; 45*8ccd4a63SDavid du Colombier f->nfmt = 0; 46*8ccd4a63SDavid du Colombier return 0; 47*8ccd4a63SDavid du Colombier } 48*8ccd4a63SDavid du Colombier 49*8ccd4a63SDavid du Colombier /* 50*8ccd4a63SDavid du Colombier * print into an allocated string buffer 51*8ccd4a63SDavid du Colombier */ 52*8ccd4a63SDavid du Colombier Rune* 53*8ccd4a63SDavid du Colombier runevsmprint(char *fmt, va_list args) 54*8ccd4a63SDavid du Colombier { 55*8ccd4a63SDavid du Colombier Fmt f; 56*8ccd4a63SDavid du Colombier int n; 57*8ccd4a63SDavid du Colombier 58*8ccd4a63SDavid du Colombier if(runefmtstrinit(&f) < 0) 59*8ccd4a63SDavid du Colombier return nil; 60*8ccd4a63SDavid du Colombier f.args = args; 61*8ccd4a63SDavid du Colombier n = dofmt(&f, fmt); 62*8ccd4a63SDavid du Colombier if(f.start == nil) 63*8ccd4a63SDavid du Colombier return nil; 64*8ccd4a63SDavid du Colombier if(n < 0){ 65*8ccd4a63SDavid du Colombier free(f.start); 66*8ccd4a63SDavid du Colombier return nil; 67*8ccd4a63SDavid du Colombier } 68*8ccd4a63SDavid du Colombier *(Rune*)f.to = '\0'; 69*8ccd4a63SDavid du Colombier return f.start; 70*8ccd4a63SDavid du Colombier } 71