print.c 2.1 KB

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