dorfmt.c 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  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 <stdarg.h>
  15. #include <string.h>
  16. #include "utf.h"
  17. #include "fmt.h"
  18. #include "fmtdef.h"
  19. /* format the output into f->to and return the number of characters fmted */
  20. int
  21. dorfmt(Fmt *f, const Rune *fmt)
  22. {
  23. Rune *rt, *rs;
  24. int r;
  25. char *t, *s;
  26. int nfmt;
  27. nfmt = f->nfmt;
  28. for(;;){
  29. if(f->runes){
  30. rt = f->to;
  31. rs = f->stop;
  32. while((r = *fmt++) && r != '%'){
  33. FMTRCHAR(f, rt, rs, r);
  34. }
  35. f->nfmt += rt - (Rune *)f->to;
  36. f->to = rt;
  37. if(!r)
  38. return f->nfmt - nfmt;
  39. f->stop = rs;
  40. }else{
  41. t = f->to;
  42. s = f->stop;
  43. while((r = *fmt++) && r != '%'){
  44. FMTRUNE(f, t, f->stop, r);
  45. }
  46. f->nfmt += t - (char *)f->to;
  47. f->to = t;
  48. if(!r)
  49. return f->nfmt - nfmt;
  50. f->stop = s;
  51. }
  52. fmt = __fmtdispatch(f, fmt, 1);
  53. if(fmt == nil)
  54. return -1;
  55. }
  56. return 0; /* not reached */
  57. }