18ccd4a63SDavid du Colombier #include <u.h> 28ccd4a63SDavid du Colombier #include <libc.h> 38ccd4a63SDavid du Colombier #include "fmtdef.h" 48ccd4a63SDavid du Colombier 58ccd4a63SDavid du Colombier static int fmtStrFlush(Fmt * f)68ccd4a63SDavid du ColombierfmtStrFlush(Fmt *f) 78ccd4a63SDavid du Colombier { 88ccd4a63SDavid du Colombier char *s; 98ccd4a63SDavid du Colombier int n; 108ccd4a63SDavid du Colombier 118ccd4a63SDavid du Colombier if(f->start == nil) 128ccd4a63SDavid du Colombier return 0; 13*0d601874SDavid du Colombier n = (uintptr)f->farg; 148ccd4a63SDavid du Colombier n *= 2; 15*0d601874SDavid du Colombier s = (char*)f->start; 168ccd4a63SDavid du Colombier f->start = realloc(s, n); 178ccd4a63SDavid du Colombier if(f->start == nil){ 188ccd4a63SDavid du Colombier f->farg = nil; 198ccd4a63SDavid du Colombier f->to = nil; 208ccd4a63SDavid du Colombier f->stop = nil; 218ccd4a63SDavid du Colombier free(s); 228ccd4a63SDavid du Colombier return 0; 238ccd4a63SDavid du Colombier } 24*0d601874SDavid du Colombier f->farg = (void*)(uintptr)n; 258ccd4a63SDavid du Colombier f->to = (char*)f->start + ((char*)f->to - s); 268ccd4a63SDavid du Colombier f->stop = (char*)f->start + n - 1; 278ccd4a63SDavid du Colombier return 1; 288ccd4a63SDavid du Colombier } 298ccd4a63SDavid du Colombier 308ccd4a63SDavid du Colombier int fmtstrinit(Fmt * f)318ccd4a63SDavid du Colombierfmtstrinit(Fmt *f) 328ccd4a63SDavid du Colombier { 338ccd4a63SDavid du Colombier int n; 348ccd4a63SDavid du Colombier 358ccd4a63SDavid du Colombier memset(f, 0, sizeof *f); 368ccd4a63SDavid du Colombier f->runes = 0; 378ccd4a63SDavid du Colombier n = 32; 388ccd4a63SDavid du Colombier f->start = malloc(n); 398ccd4a63SDavid du Colombier if(f->start == nil) 408ccd4a63SDavid du Colombier return -1; 418ccd4a63SDavid du Colombier f->to = f->start; 428ccd4a63SDavid du Colombier f->stop = (char*)f->start + n - 1; 438ccd4a63SDavid du Colombier f->flush = fmtStrFlush; 44*0d601874SDavid du Colombier f->farg = (void*)(uintptr)n; 458ccd4a63SDavid du Colombier f->nfmt = 0; 468ccd4a63SDavid du Colombier return 0; 478ccd4a63SDavid du Colombier } 488ccd4a63SDavid du Colombier 498ccd4a63SDavid du Colombier /* 508ccd4a63SDavid du Colombier * print into an allocated string buffer 518ccd4a63SDavid du Colombier */ 528ccd4a63SDavid du Colombier char* vsmprint(char * fmt,va_list args)538ccd4a63SDavid du Colombiervsmprint(char *fmt, va_list args) 548ccd4a63SDavid du Colombier { 558ccd4a63SDavid du Colombier Fmt f; 568ccd4a63SDavid du Colombier int n; 578ccd4a63SDavid du Colombier 588ccd4a63SDavid du Colombier if(fmtstrinit(&f) < 0) 598ccd4a63SDavid du Colombier return nil; 60*0d601874SDavid du Colombier VA_COPY(f.args,args); 618ccd4a63SDavid du Colombier n = dofmt(&f, fmt); 62*0d601874SDavid du Colombier VA_END(f.args); 638ccd4a63SDavid du Colombier if(n < 0){ 648ccd4a63SDavid du Colombier free(f.start); 658ccd4a63SDavid du Colombier return nil; 668ccd4a63SDavid du Colombier } 67*0d601874SDavid du Colombier return fmtstrflush(&f); 688ccd4a63SDavid du Colombier } 69