Advertisement
Guest User

Untitled

a guest
Mar 6th, 2015
229
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.53 KB | None | 0 0
  1. // list.c
  2. typedef struct list list;
  3. struct node {
  4. struct node *prev;
  5. int val;
  6. struct node *jump;
  7. struct node *next;
  8. };
  9. typedef struct node node;
  10. node *newnode();
  11. node *append(node *n);
  12. node *prepend(node *n);
  13. void erase(node *n);
  14. int pop(node *n);
  15. // op.c
  16. void doop(node *n);
  17. node *link(node *n);
  18.  
  19. #include <stdlib.h>
  20. #include "bf.h"
  21.  
  22. node *newnode() {
  23. node *n = malloc(sizeof(node));
  24. n->prev = n->next = 0;
  25. n->jump = n->val = 0;
  26. return n;
  27. }
  28.  
  29. node *append(node *n) {
  30. n->next = newnode();
  31. n->next->prev = n;
  32. return n->next;
  33. }
  34.  
  35. node *prepend(node *n) {
  36. n->prev = newnode();
  37. n->prev->next = n;
  38. return n->prev;
  39. }
  40.  
  41. void erase(node *n) {
  42. node *m;
  43. while (n->prev)
  44. n = n->prev;
  45. while (n->next) {
  46. m = n->next;
  47. free(n);
  48. n = m;
  49. }
  50. }
  51.  
  52. int pop(node *n) {
  53. int ret;
  54. if (n->prev)
  55. n->prev->next = n->next;
  56. if (n->next)
  57. n->next->prev = n->prev;
  58. ret = n->val;
  59. free(n);
  60. return ret;
  61. }
  62.  
  63. #include <stdio.h>
  64. #include "bf.h"
  65.  
  66. #define LSEEK '<'
  67. #define RSEEK '>'
  68. #define INCREMENT '+'
  69. #define DECREMENT '-'
  70. #define STDOUT '.'
  71. #define STDIN ','
  72. #define LBRACKET '['
  73. #define RBRACKET ']'
  74.  
  75. char mem[30000] = { 0 };
  76. char *ptr = mem;
  77.  
  78. void doop(node *n) {
  79. node *m = n;
  80. while (m) {
  81. switch (m->val) {
  82. case LSEEK:
  83. ptr--;
  84. break;
  85. case RSEEK:
  86. ptr++;
  87. break;
  88. case INCREMENT:
  89. (*ptr)++;
  90. break;
  91. case DECREMENT:
  92. (*ptr)--;
  93. break;
  94. case STDOUT:
  95. printf("%c", *ptr);
  96. fflush(stdout);
  97. break;
  98. case STDIN:
  99. *ptr = getchar();
  100. break;
  101. case LBRACKET:
  102. if (!*ptr)
  103. m = m->jump;
  104. break;
  105. case RBRACKET:
  106. if (*ptr)
  107. m = m->jump;
  108. break;
  109. }
  110. m = m->next;
  111. }
  112. }
  113.  
  114. node *link(node *n) {
  115. node *m = n;
  116. node *links = newnode();
  117. while (m) {
  118. switch (m->val) {
  119. case LBRACKET:
  120. if (links->jump)
  121. links = append(links);
  122. links->jump = m;
  123. break;
  124. case RBRACKET:
  125. m->jump = links->jump;
  126. links->jump->jump = m;
  127. if (links->prev) {
  128. links = links->prev;
  129. pop(links->next);
  130. }
  131. break;
  132. }
  133. m = m->next;
  134. }
  135. erase(links);
  136. return n;
  137. }
  138.  
  139. #include <stdio.h>
  140. #include <stdlib.h>
  141. #include <signal.h>
  142. #include "bf.h"
  143.  
  144. int run = 1;
  145.  
  146. void quit(int val) {
  147. run = 0;
  148. }
  149.  
  150. int main(int argc, char** argv) {
  151. signal(SIGINT, quit);
  152. int c;
  153. node *text, *text_start;
  154. if (argc > 1) {
  155. printf("%sn", argv[1]);
  156. FILE *f = fopen(argv[1], "r");
  157. if (f == NULL) return 1;
  158. text = text_start = newnode();
  159. while ((c = fgetc(f)) != EOF) {
  160. if (text->val)
  161. text = append(text);
  162. text->val = c;
  163. }
  164. doop(link(text_start));
  165. erase(text_start);
  166. run = 0;
  167. }
  168. while (run) {
  169. text = text_start = newnode();
  170. while ((c = getchar()) != 'n') {
  171. if (text->val)
  172. text = append(text);
  173. text->val = c;
  174. }
  175. doop(link(text_start));
  176. erase(text_start);
  177. }
  178. return 0;
  179. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement