dorfmt.c 777 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. #include <u.h>
  2. #include <libc.h>
  3. #include "fmtdef.h"
  4. /* format the output into f->to and return the number of characters fmted */
  5. int
  6. dorfmt(Fmt *f, Rune *fmt)
  7. {
  8. Rune *rt, *rs;
  9. int r;
  10. char *t, *s;
  11. int nfmt;
  12. nfmt = f->nfmt;
  13. for(;;){
  14. if(f->runes){
  15. rt = f->to;
  16. rs = f->stop;
  17. while((r = *fmt++) && r != '%'){
  18. FMTRCHAR(f, rt, rs, r);
  19. }
  20. f->nfmt += rt - (Rune *)f->to;
  21. f->to = rt;
  22. if(!r)
  23. return f->nfmt - nfmt;
  24. f->stop = rs;
  25. }else{
  26. t = f->to;
  27. s = f->stop;
  28. while((r = *fmt++) && r != '%'){
  29. FMTRUNE(f, t, f->stop, r);
  30. }
  31. f->nfmt += t - (char *)f->to;
  32. f->to = t;
  33. if(!r)
  34. return f->nfmt - nfmt;
  35. f->stop = s;
  36. }
  37. fmt = _fmtdispatch(f, fmt, 1);
  38. if(fmt == nil)
  39. return -1;
  40. }
  41. return 0; /* not reached */
  42. }