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 runeFmtStrFlush(Fmt * f)68ccd4a63SDavid du ColombierruneFmtStrFlush(Fmt *f) 78ccd4a63SDavid du Colombier { 88ccd4a63SDavid du Colombier Rune *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 = (Rune*)f->start; 168ccd4a63SDavid du Colombier f->start = realloc(s, sizeof(Rune)*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 = (Rune*)f->start + ((Rune*)f->to - s); 268ccd4a63SDavid du Colombier f->stop = (Rune*)f->start + n - 1; 278ccd4a63SDavid du Colombier return 1; 288ccd4a63SDavid du Colombier } 298ccd4a63SDavid du Colombier 308ccd4a63SDavid du Colombier int runefmtstrinit(Fmt * f)318ccd4a63SDavid du Colombierrunefmtstrinit(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 = 1; 378ccd4a63SDavid du Colombier n = 32; 388ccd4a63SDavid du Colombier f->start = malloc(sizeof(Rune)*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 = (Rune*)f->start + n - 1; 438ccd4a63SDavid du Colombier f->flush = runeFmtStrFlush; 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 Rune* runevsmprint(char * fmt,va_list args)538ccd4a63SDavid du Colombierrunevsmprint(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(runefmtstrinit(&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(f.start == nil) 648ccd4a63SDavid du Colombier return nil; 658ccd4a63SDavid du Colombier if(n < 0){ 668ccd4a63SDavid du Colombier free(f.start); 678ccd4a63SDavid du Colombier return nil; 688ccd4a63SDavid du Colombier } 698ccd4a63SDavid du Colombier *(Rune*)f.to = '\0'; 70*0d601874SDavid du Colombier return (Rune*)f.start; 718ccd4a63SDavid du Colombier } 72