calc.c
资源名称:c.rar [点击查看]
上传用户:shmaik
上传日期:2014-06-01
资源大小:45093k
文件大小:3k
源码类别:

VC书籍

开发平台:

C/C++

  1. static char rcsid[] = "$Id: H:/drh/idioms/book/RCS/ap.doc,v 1.11 1996/06/26 23:02:01 drh Exp $";
  2. #include <ctype.h>
  3. #include <stdio.h>
  4. #include <string.h>
  5. #include <stdlib.h>
  6. #include "stack.h"
  7. #include "ap.h"
  8. #include "fmt.h"
  9. Stack_T sp;
  10. AP_T pop(void) {
  11. if (!Stack_empty(sp))
  12. return Stack_pop(sp);
  13. else {
  14. Fmt_fprint(stderr, "?stack underflown");
  15. return AP_new(0);
  16. }
  17. }
  18. int main(int argc, char *argv[]) {
  19. int c;
  20. sp = Stack_new();
  21. Fmt_register('D', AP_fmt);
  22. while ((c = getchar()) != EOF)
  23. switch (c) {
  24. case ' ': case 't': case 'n': case 'f': case 'r':
  25. break;
  26. case '0': case '1': case '2': case '3': case '4':
  27. case '5': case '6': case '7': case '8': case '9': {
  28. char buf[512];
  29. {
  30. int i = 0;
  31. for ( ; c != EOF && isdigit(c); c = getchar(), i++)
  32. if (i < (int)sizeof (buf) - 1)
  33. buf[i] = c;
  34. if (i > (int)sizeof (buf) - 1) {
  35. i = (int)sizeof (buf) - 1;
  36. Fmt_fprint(stderr,
  37. "?integer constant exceeds %d digitsn", i);
  38. }
  39. buf[i] = 0;
  40. if (c != EOF)
  41. ungetc(c, stdin);
  42. }
  43. Stack_push(sp, AP_fromstr(buf, 10, NULL));
  44. break;
  45. }
  46. case '+': {
  47. AP_T y = pop(), x = pop();
  48. Stack_push(sp, AP_add(x, y));
  49. AP_free(&x);
  50. AP_free(&y);
  51. break;
  52. }
  53. case '-': {
  54. AP_T y = pop(), x = pop();
  55. Stack_push(sp, AP_sub(x, y));
  56. AP_free(&x);
  57. AP_free(&y);
  58. break;
  59. }
  60. case '*': {
  61. AP_T y = pop(), x = pop();
  62. Stack_push(sp, AP_mul(x, y));
  63. AP_free(&x);
  64. AP_free(&y);
  65. break;
  66. }
  67. case '/': {
  68. AP_T y = pop(), x = pop();
  69. if (AP_cmpi(y, 0) == 0) {
  70. Fmt_fprint(stderr, "?/ by 0n");
  71. Stack_push(sp, AP_new(0));
  72. } else
  73. Stack_push(sp, AP_div(x, y));
  74. AP_free(&x);
  75. AP_free(&y);
  76. break;
  77. }
  78. case '%': {
  79. AP_T y = pop(), x = pop();
  80. if (AP_cmpi(y, 0) == 0) {
  81. Fmt_fprint(stderr, "?%% by 0n");
  82. Stack_push(sp, AP_new(0));
  83. } else
  84. Stack_push(sp, AP_mod(x, y));
  85. AP_free(&x);
  86. AP_free(&y);
  87. break;
  88. }
  89. case '^': {
  90. AP_T y = pop(), x = pop();
  91. if (AP_cmpi(y, 0) <= 0) {
  92. Fmt_fprint(stderr, "?nonpositive powern");
  93. Stack_push(sp, AP_new(0));
  94. } else
  95. Stack_push(sp, AP_pow(x, y, NULL));
  96. AP_free(&x);
  97. AP_free(&y);
  98. break;
  99. }
  100. case 'd': {
  101. AP_T x = pop();
  102. Stack_push(sp, x);
  103. Stack_push(sp, AP_addi(x, 0));
  104. break;
  105. }
  106. case 'p': {
  107. AP_T x = pop();
  108. Fmt_print("%Dn", x);
  109. Stack_push(sp, x);
  110. break;
  111. }
  112. case 'f':
  113. if (!Stack_empty(sp)) {
  114. Stack_T tmp = Stack_new();
  115. while (!Stack_empty(sp)) {
  116. AP_T x = pop();
  117. Fmt_print("%Dn", x);
  118. Stack_push(tmp, x);
  119. }
  120. while (!Stack_empty(tmp))
  121. Stack_push(sp, Stack_pop(tmp));
  122. Stack_free(&tmp);
  123. }
  124. break;
  125. case '~': {
  126. AP_T x = pop();
  127. Stack_push(sp, AP_neg(x));
  128. AP_free(&x);
  129. break;
  130. }
  131. case 'c': while (!Stack_empty(sp)) {
  132.    AP_T x = Stack_pop(sp);
  133.    AP_free(&x);
  134.   } break;
  135. case 'q': while (!Stack_empty(sp)) {
  136.    AP_T x = Stack_pop(sp);
  137.    AP_free(&x);
  138.   }
  139.   Stack_free(&sp);
  140.   return EXIT_SUCCESS;
  141. default:
  142. if (isprint(c))
  143. Fmt_fprint(stderr, "?'%c'", c);
  144. else
  145. Fmt_fprint(stderr, "?'\%03o'", c);
  146. Fmt_fprint(stderr, " is unimplementedn");
  147. break;
  148. }
  149. while (!Stack_empty(sp)) {
  150. AP_T x = Stack_pop(sp);
  151. AP_free(&x);
  152. }
  153. Stack_free(&sp);
  154. return EXIT_SUCCESS;
  155. }