doprnt.c 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. /* $Header$ */
  2. /* STRING MANIPULATION AND PRINT ROUTINES */
  3. #include <system.h>
  4. #include "ssize.h"
  5. char *long2str();
  6. static
  7. integral(c)
  8. {
  9. switch (c) {
  10. case 'b':
  11. return -2;
  12. case 'd':
  13. return 10;
  14. case 'o':
  15. return -8;
  16. case 'u':
  17. return -10;
  18. case 'x':
  19. return -16;
  20. }
  21. return 0;
  22. }
  23. static int
  24. format(buf, fmt, argp)
  25. char *buf, *fmt;
  26. char *argp;
  27. {
  28. register char *pf = fmt, *pa = argp;
  29. register char *pb = buf;
  30. while (*pf) {
  31. if (*pf == '%') {
  32. register width, base, pad, npad;
  33. char *arg;
  34. char cbuf[2];
  35. char *badformat = "<bad format>";
  36. /* get padder */
  37. if (*++pf == '0') {
  38. pad = '0';
  39. ++pf;
  40. }
  41. else
  42. pad = ' ';
  43. /* get width */
  44. width = 0;
  45. while (*pf >= '0' && *pf <= '9')
  46. width = 10 * width + *pf++ - '0';
  47. /* get text and move pa */
  48. if (*pf == 's') {
  49. arg = *(char **)pa;
  50. pa += sizeof(char *);
  51. }
  52. else
  53. if (*pf == 'c') {
  54. cbuf[0] = * (char *) pa;
  55. cbuf[1] = '\0';
  56. pa += sizeof(int);
  57. arg = &cbuf[0];
  58. }
  59. else
  60. if (*pf == 'l') {
  61. /* alignment ??? */
  62. if (base = integral(*++pf)) {
  63. arg = long2str(*(long *)pa, base);
  64. pa += sizeof(long);
  65. }
  66. else {
  67. pf--;
  68. arg = badformat;
  69. }
  70. }
  71. else
  72. if (base = integral(*pf)) {
  73. arg = long2str((long)*(int *)pa, base);
  74. pa += sizeof(int);
  75. }
  76. else
  77. if (*pf == '%')
  78. arg = "%";
  79. else
  80. arg = badformat;
  81. npad = width - strlen(arg);
  82. while (npad-- > 0)
  83. *pb++ = pad;
  84. while (*pb++ = *arg++);
  85. pb--;
  86. pf++;
  87. }
  88. else
  89. *pb++ = *pf++;
  90. }
  91. return pb - buf;
  92. }
  93. doprnt(fp, fmt, argp)
  94. File *fp;
  95. char *fmt;
  96. int argp[];
  97. {
  98. char buf[SSIZE];
  99. sys_write(fp, buf, format(buf, fmt, (char *)argp));
  100. }
  101. /*VARARGS1*/
  102. printf(fmt, args)
  103. char *fmt;
  104. char args;
  105. {
  106. char buf[SSIZE];
  107. sys_write(STDOUT, buf, format(buf, fmt, &args));
  108. }
  109. /*VARARGS1*/
  110. fprintf(fp, fmt, args)
  111. File *fp;
  112. char *fmt;
  113. char args;
  114. {
  115. char buf[SSIZE];
  116. sys_write(fp, buf, format(buf, fmt, &args));
  117. }
  118. /*VARARGS1*/
  119. char *
  120. sprintf(buf, fmt, args)
  121. char *buf, *fmt;
  122. char args;
  123. {
  124. buf[format(buf, fmt, &args)] = '\0';
  125. return buf;
  126. }