dorfmt.c 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. /*
  2. * The authors of this software are Rob Pike and Ken Thompson.
  3. * Copyright (c) 2002 by Lucent Technologies.
  4. * Permission to use, copy, modify, and distribute this software for any
  5. * purpose without fee is hereby granted, provided that this entire notice
  6. * is included in all copies of any software which is or includes a copy
  7. * or modification of this software and in all copies of the supporting
  8. * documentation for such software.
  9. * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
  10. * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE ANY
  11. * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
  12. * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
  13. */
  14. #include "lib9.h"
  15. #include "fmtdef.h"
  16. /* format the output into f->to and return the number of characters fmted */
  17. int
  18. dorfmt(Fmt *f, Rune *fmt)
  19. {
  20. Rune *rt, *rs;
  21. int r;
  22. char *t, *s;
  23. int nfmt;
  24. nfmt = f->nfmt;
  25. for(;;){
  26. if(f->runes){
  27. rt = f->to;
  28. rs = f->stop;
  29. while((r = *fmt++) && r != '%'){
  30. FMTRCHAR(f, rt, rs, r);
  31. }
  32. f->nfmt += rt - (Rune *)f->to;
  33. f->to = rt;
  34. if(!r)
  35. return f->nfmt - nfmt;
  36. f->stop = rs;
  37. }else{
  38. t = f->to;
  39. s = f->stop;
  40. while((r = *fmt++) && r != '%'){
  41. FMTRUNE(f, t, f->stop, r);
  42. }
  43. f->nfmt += t - (char *)f->to;
  44. f->to = t;
  45. if(!r)
  46. return f->nfmt - nfmt;
  47. f->stop = s;
  48. }
  49. fmt = _fmtdispatch(f, fmt, 1);
  50. if(fmt == nil)
  51. return -1;
  52. }
  53. return 0; /* not reached */
  54. }