9base

revived minimalist port of Plan 9 userland to Unix
git clone git://git.suckless.org/9base
Log | Files | Refs | README | LICENSE

dorfmt.c (985B)


      1 /* Copyright (c) 2002-2006 Lucent Technologies; see LICENSE */
      2 #include <stdarg.h>
      3 #include <string.h>
      4 #include "plan9.h"
      5 #include "fmt.h"
      6 #include "fmtdef.h"
      7 
      8 /* format the output into f->to and return the number of characters fmted  */
      9 
     10 /* BUG: THIS FILE IS NOT UPDATED TO THE  NEW SPEC */
     11 int
     12 dorfmt(Fmt *f, const Rune *fmt)
     13 {
     14 	Rune *rt, *rs;
     15 	int r;
     16 	char *t, *s;
     17 	int nfmt;
     18 
     19 	nfmt = f->nfmt;
     20 	for(;;){
     21 		if(f->runes){
     22 			rt = (Rune*)f->to;
     23 			rs = (Rune*)f->stop;
     24 			while((r = *fmt++) && r != '%'){
     25 				FMTRCHAR(f, rt, rs, r);
     26 			}
     27 			f->nfmt += rt - (Rune *)f->to;
     28 			f->to = rt;
     29 			if(!r)
     30 				return f->nfmt - nfmt;
     31 			f->stop = rs;
     32 		}else{
     33 			t = (char*)f->to;
     34 			s = (char*)f->stop;
     35 			while((r = *fmt++) && r != '%'){
     36 				FMTRUNE(f, t, f->stop, r);
     37 			}
     38 			f->nfmt += t - (char *)f->to;
     39 			f->to = t;
     40 			if(!r)
     41 				return f->nfmt - nfmt;
     42 			f->stop = s;
     43 		}
     44 
     45 		fmt = (Rune*)__fmtdispatch(f, (Rune*)fmt, 1);
     46 		if(fmt == nil)
     47 			return -1;
     48 	}
     49 	return 0;		/* not reached */
     50 }