spacepaste

  1.  
  2. #include "stdio.h"
  3. #include "stdbool.h"
  4. // A C program to demonstrate linked list based implementation of queue
  5. // A linked list (LL) node to store a queue entry
  6. struct trie_QNode
  7. {
  8. char * rule_name;
  9. int rule_name_index;
  10. char * key;
  11. int index;
  12. char * rule_next;
  13. int rule_next_index;
  14. struct QNode *next;
  15. };
  16. // The queue, front stores the front node of LL and rear stores ths
  17. // last node of LL
  18. struct trie_Queue
  19. {
  20. struct trie_QNode *front, *rear;
  21. };
  22. // A utility function to create a new linked list node.
  23. struct trie_QNode* trie_newNode(char * a, int b, char * c, int d, char * e, int f)
  24. {
  25. struct trie_QNode *temp = (struct trie_QNode*)malloc(sizeof(struct trie_QNode));
  26. temp->rule_name = a;
  27. temp->rule_name_index = b;
  28. temp->key = c;
  29. temp->index = d;
  30. temp->rule_next = e;
  31. temp->rule_next_index = f;
  32. temp->next = NULL;
  33. return temp;
  34. }
  35. // A utility function to create an empty queue
  36. struct trie_Queue *trie_createQueue()
  37. {
  38. struct trie_Queue *q = (struct trie_Queue*)malloc(sizeof(struct trie_Queue));
  39. q->front = q->rear = NULL;
  40. return q;
  41. }
  42. void trie_store_asm(struct trie_Queue *q, char * rule_name, int rule_name_index, char * key, int index, char * rule_next, int rule_next_index)
  43. {
  44. // Create a new LL node
  45. struct trie_QNode *temp = trie_newNode(rule_name,rule_name_index,key,index,rule_next,rule_next_index);
  46. // If queue is empty, then new node is front and rear both
  47. if (q->rear == NULL)
  48. {
  49. q->front = q->rear = temp;
  50. q->rear->rule_next = NULL;
  51. q->rear->rule_next_index = -1;
  52. return;
  53. }
  54. // Add the new node at the end of queue and change rear
  55. if (q->rear) {
  56. q->rear->rule_next = rule_name;
  57. q->rear->rule_next_index = rule_name_index;
  58. }
  59. q->rear->next = temp;
  60. q->rear = temp;
  61. if (q->rear) {
  62. q->rear->rule_next = NULL;
  63. q->rear->rule_next_index = -1;
  64. }
  65. }
  66. void trie_store_asm2(struct trie_Queue *q, char * rule_name, int rule_name_index, char * key, int index, char * rule_next, int rule_next_index)
  67. {
  68. // Create a new LL node
  69. struct trie_QNode *temp = trie_newNode(rule_name,rule_name_index,key,index,rule_next,rule_next_index);
  70. // If queue is empty, then new node is front and rear both
  71. if (q->rear == NULL)
  72. {
  73. q->front = q->rear = temp;
  74. return;
  75. }
  76. // Add the new node at the end of queue and change rear
  77. if (q->rear) {
  78. q->rear->rule_next = rule_name;
  79. q->rear->rule_next_index = rule_name_index;
  80. }
  81. q->rear->next = temp;
  82. q->rear = temp;
  83. }
  84. void trie_store_asm3(struct trie_Queue *q, char * rule_name, int rule_name_index, char * key, int index, char * rule_next, int rule_next_index)
  85. {
  86. // Create a new LL node
  87. struct trie_QNode *temp = trie_newNode(rule_name,rule_name_index,key,index,rule_next,rule_next_index);
  88. // If queue is empty, then new node is front and rear both
  89. if (q->rear == NULL)
  90. {
  91. q->front = q->rear = temp;
  92. return;
  93. }
  94. // Add the new node at the end of queue and change rear
  95. q->rear->next = temp;
  96. q->rear = temp;
  97. }
  98. struct trie_QNode * trie_load_asm(struct trie_Queue **q)
  99. {
  100. // If queue is empty, return NULL.
  101. if ((q) == NULL) return NULL;
  102. if ((*q) == NULL) return NULL;
  103. if ((*q)->front == NULL)
  104. return NULL;
  105. // Store previous front and move front one node ahead
  106. struct trie_QNode *temp = (*q)->front;
  107. (*q)->front = (*q)->front->next;
  108. // If front becomes NULL, then change rear also as NULL
  109. if ((*q)->front == NULL)
  110. (*q)->rear = NULL;
  111. return temp;
  112. }
  113. int trie_queue_add(struct trie_Queue **q, char * rule_name, int rule_name_index, char * key, int index, char * rule_next, int rule_next_index) {
  114. if (!(*q)) (*q) = trie_createQueue();
  115. trie_store_asm((*q), rule_name,rule_name_index,key,index,rule_next,rule_next_index);
  116. return 0;
  117. }
  118. int trie_queue_add2(struct trie_Queue **q, char * rule_name, int rule_name_index, char * key, int index, char * rule_next, int rule_next_index) {
  119. if (!(*q)) (*q) = trie_createQueue();
  120. trie_store_asm2((*q), rule_name,rule_name_index,key,index,rule_next,rule_next_index);
  121. return 0;
  122. }
  123. int trie_queue_add3(struct trie_Queue **q, char * rule_name, int rule_name_index, char * key, int index, char * rule_next, int rule_next_index) {
  124. if (!(*q)) (*q) = trie_createQueue();
  125. trie_store_asm3((*q), rule_name,rule_name_index,key,index,rule_next,rule_next_index);
  126. return 0;
  127. }
  128. char * trie_root = "root";
  129. char * trie_sub_root = "sub_root";
  130. char * trie_rule_prefix = "rule_";
  131. struct trie_Queue * trie_trie = NULL;
  132. int main(int argc, char **argv) {
  133. trie_queue_add(&trie_trie, trie_sub_root, -1, NULL, 0, trie_rule_prefix, 0); // root>0
  134. trie_queue_add(&trie_trie, trie_rule_prefix, 0, NULL, 1, trie_rule_prefix, 1); // 0>1
  135. trie_queue_add(&trie_trie, trie_rule_prefix, 1, NULL, 1, trie_rule_prefix, 2); // 1>2
  136. trie_queue_add2(&trie_trie, trie_rule_prefix, 2, NULL, 1, trie_rule_prefix, 3); // 2>3
  137. trie_queue_add3(&trie_trie, trie_rule_prefix, 0, NULL, 1, trie_rule_prefix, 1); // 0>1
  138. trie_queue_add(&trie_trie, trie_rule_prefix, 1, NULL, 1, trie_rule_prefix, 2); // 1>2
  139. trie_queue_add2(&trie_trie, trie_rule_prefix, 2, NULL, 1, trie_rule_prefix, 3); // 2>3
  140. trie_queue_add3(&trie_trie, trie_rule_prefix, 3, NULL, 1, NULL, -1); // 3>END
  141. struct trie_QNode * node = trie_newNode(NULL,0,NULL,0,NULL,0); // this gets freed anyway
  142. int nodes = 0;
  143. int start_indent = 0;
  144. int i = 0;
  145. for (i = 0; i < start_indent; i++) printf(" ");
  146. printf("struct TrieNode * %s = getNode(); \n", trie_root);
  147. for (i = 0; i < start_indent; i++) printf(" ");
  148. printf("struct TrieNode * %s = getNode(); \n", trie_sub_root);
  149. while (node != NULL) {
  150. // drain the list until empty
  151. if (node->key) free(node->key);
  152. free(node);
  153. node = trie_load_asm(&trie_trie);
  154. if (node == NULL) break;
  155. // pp(node)
  156. // pp(node->rule_name)
  157. // ps(node->rule_name)
  158. // pi(node->rule_name_index)
  159. // pp(node->key)
  160. // ps(node->key)
  161. // pi(node->index)
  162. // pp(node->rule_next)
  163. // ps(node->rule_next)
  164. // pi(node->rule_next_index)
  165. if (node->rule_next && node->rule_next_index != -1) {
  166. bool rule_does_not_exist = false;
  167. bool next_rule_does_not_exist = false;
  168. if (node->rule_name_index == -1) {
  169. // is sub_root
  170. if (rule_does_not_exist) {
  171. for (i = 0; i < start_indent+1; i++) printf(" ");
  172. printf("struct TrieNode * %s%d = getNode(); \n", node->rule_name, node->rule_name_index);
  173. }
  174. if (next_rule_does_not_exist) {
  175. for (i = 0; i < start_indent+1; i++) printf(" ");
  176. printf("struct TrieNode * %s%d = getNode(); \n", node->rule_next, node->rule_next_index);
  177. }
  178. for (i = 0; i < start_indent+1; i++) printf(" ");
  179. printf("insert(%s, \"%s\", %d, %s%d);\n", node->rule_name, node->key, node->index, node->rule_next, node->rule_next_index);
  180. }
  181. else {
  182. // is rule
  183. if (rule_does_not_exist) {
  184. for (i = 0; i < start_indent+2; i++) printf(" ");
  185. printf("struct TrieNode * %s%d = getNode(); \n", node->rule_name, node->rule_name_index);
  186. }
  187. if (next_rule_does_not_exist) {
  188. for (i = 0; i < start_indent+2; i++) printf(" ");
  189. printf("struct TrieNode * %s%d = getNode(); \n", node->rule_next, node->rule_next_index);
  190. }
  191. for (i = 0; i < start_indent+2; i++) printf(" ");
  192. printf("insert(%s%d, \"%s\", %d, %s%d);\n", node->rule_name, node->rule_name_index, node->key, node->index, node->rule_next, node->rule_next_index);
  193. }
  194. } else {
  195. if (node->rule_name_index == -1) {
  196. // is sub_root
  197. for (i = 0; i < start_indent+1; i++) printf(" ");
  198. printf("insert(%s, \"%s\", %d, NULL);\n", node->rule_name, node->key, node->index);
  199. } else {
  200. // is rule
  201. for (i = 0; i < start_indent+2; i++) printf(" ");
  202. printf("insert(%s%d, \"%s\", %d, NULL);\n", node->rule_name, node->rule_name_index, node->key, node->index);
  203. }
  204. }
  205. nodes++;
  206. }
  207. return 0;
  208. }
  209.