spacepaste

  1.  
  2. #include <stdbool.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. // A C program to demonstrate linked list based implementation of queue
  7. // A linked list (LL) node to store a queue entry
  8. struct trie_QNode
  9. {
  10. char * rule_name;
  11. int rule_name_index;
  12. char * key;
  13. int index;
  14. char * rule_next;
  15. int rule_next_index;
  16. struct trie_QNode *next;
  17. };
  18. // The queue, front stores the front node of LL and rear stores ths
  19. // last node of LL
  20. struct trie_Queue
  21. {
  22. struct trie_QNode *front, *rear;
  23. };
  24. // A utility function to create a new linked list node.
  25. struct trie_QNode* trie_newNode(char * a, int b, char * c, int d, char * e, int f)
  26. {
  27. struct trie_QNode *temp = (struct trie_QNode*)malloc(sizeof(struct trie_QNode));
  28. temp->rule_name = a;
  29. temp->rule_name_index = b;
  30. temp->key = c;
  31. temp->index = d;
  32. temp->rule_next = e;
  33. temp->rule_next_index = f;
  34. temp->next = NULL;
  35. return temp;
  36. }
  37. // A utility function to create an empty queue
  38. struct trie_Queue *trie_createQueue()
  39. {
  40. struct trie_Queue *q = (struct trie_Queue*)malloc(sizeof(struct trie_Queue));
  41. q->front = q->rear = NULL;
  42. return q;
  43. }
  44. 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)
  45. {
  46. // Create a new LL node
  47. struct trie_QNode *temp = trie_newNode(rule_name,rule_name_index,key,index,rule_next,rule_next_index);
  48. // If queue is empty, then new node is front and rear both
  49. if (q->rear == NULL)
  50. {
  51. q->front = q->rear = temp;
  52. q->rear->rule_next = NULL;
  53. q->rear->rule_next_index = -1;
  54. return;
  55. }
  56. // Add the new node at the end of queue and change rear
  57. if (q->rear) {
  58. q->rear->rule_next = rule_name;
  59. q->rear->rule_next_index = rule_name_index;
  60. }
  61. q->rear->next = temp;
  62. q->rear = temp;
  63. if (q->rear) {
  64. q->rear->rule_next = NULL;
  65. q->rear->rule_next_index = -1;
  66. }
  67. }
  68. 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)
  69. {
  70. // Create a new LL node
  71. struct trie_QNode *temp = trie_newNode(rule_name,rule_name_index,key,index,rule_next,rule_next_index);
  72. // If queue is empty, then new node is front and rear both
  73. if (q->rear == NULL)
  74. {
  75. q->front = q->rear = temp;
  76. return;
  77. }
  78. // Add the new node at the end of queue and change rear
  79. if (q->rear) {
  80. q->rear->rule_next = rule_name;
  81. q->rear->rule_next_index = rule_name_index;
  82. }
  83. q->rear->next = temp;
  84. q->rear = temp;
  85. }
  86. 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)
  87. {
  88. // Create a new LL node
  89. struct trie_QNode *temp = trie_newNode(rule_name,rule_name_index,key,index,rule_next,rule_next_index);
  90. // If queue is empty, then new node is front and rear both
  91. if (q->rear == NULL)
  92. {
  93. q->front = q->rear = temp;
  94. return;
  95. }
  96. // Add the new node at the end of queue and change rear
  97. q->rear->next = temp;
  98. q->rear = temp;
  99. }
  100. struct trie_QNode * trie_load_asm(struct trie_Queue **q)
  101. {
  102. // If queue is empty, return NULL.
  103. if ((q) == NULL) return NULL;
  104. if ((*q) == NULL) return NULL;
  105. if ((*q)->front == NULL)
  106. return NULL;
  107. // Store previous front and move front one node ahead
  108. struct trie_QNode *temp = (*q)->front;
  109. (*q)->front = (*q)->front->next;
  110. // If front becomes NULL, then change rear also as NULL
  111. if ((*q)->front == NULL)
  112. (*q)->rear = NULL;
  113. return temp;
  114. }
  115. 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) {
  116. if (!(*q)) (*q) = trie_createQueue();
  117. trie_store_asm((*q), rule_name,rule_name_index,key,index,rule_next,rule_next_index);
  118. return 0;
  119. }
  120. 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) {
  121. if (!(*q)) (*q) = trie_createQueue();
  122. trie_store_asm2((*q), rule_name,rule_name_index,key,index,rule_next,rule_next_index);
  123. return 0;
  124. }
  125. 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) {
  126. if (!(*q)) (*q) = trie_createQueue();
  127. trie_store_asm3((*q), rule_name,rule_name_index,key,index,rule_next,rule_next_index);
  128. return 0;
  129. }
  130. char * trie_root = "root";
  131. char * trie_sub_root = "sub_root";
  132. char * trie_rule_prefix = "rule_";
  133. struct trie_Queue * trie_trie = NULL;
  134. int rule_index = -1;
  135. int actual_index = 0;
  136. bool passed_first = false;
  137. bool passed_next = false;
  138. int update_on_next_pass = false;
  139. int final_rule = 0;
  140. int rule_index_tmp = 0;
  141. int actual_index_tmp = 0;
  142. bool part_of_branch = false;
  143. int itterations = 0;
  144. char co[5];
  145. void getbranchcontents(char * s) {
  146. memset(co,0,5);
  147. int ci = 0;
  148. for(; *s; s++) {
  149. if (*s == 'b') {
  150. continue;
  151. }
  152. if (*s == 'e' || *s == 'C') {
  153. break;
  154. }
  155. if (*s == ' ' || *s == '\n' || *s == '\t') continue;
  156. if (*s == 's') {
  157. s++;
  158. co[0] = *s;
  159. ci++;
  160. }
  161. }
  162. printf("c = %s\n", co);
  163. }
  164. void parse_branch(char * co) {
  165. itterations++;
  166. int actual_index_tmp = 0;
  167. char * zrule_name;
  168. int zrule_name_index;
  169. char * zkey;
  170. int zindex;
  171. if (itterations == 1) {
  172. zrule_name = trie_trie->rear->rule_name;
  173. zrule_name_index = trie_trie->rear->rule_name_index;
  174. zkey = trie_trie->rear->key;
  175. zindex = trie_trie->rear->index;
  176. rule_index_tmp = rule_index+1;
  177. final_rule = rule_index_tmp;
  178. }
  179. else if (itterations == 2) rule_index_tmp++;
  180. actual_index_tmp = actual_index+1;
  181. printf("zrule_name = %s\n", zrule_name);
  182. printf("zkey = %s\n", zkey);
  183. printf("insert(%s%d, \"%s\", %d, %s%d);\n", zrule_name, zrule_name_index, zkey, zindex, trie_rule_prefix, rule_index_tmp-(itterations==1?0:1));
  184. trie_queue_add3(&trie_trie, zrule_name, zrule_name_index, strdup(zkey), zindex, trie_rule_prefix, rule_index_tmp-(itterations==1?0:1));
  185. for (int level = 0; co[level]; level++) {
  186. char tmp[2];
  187. tmp[0] = co[level];
  188. tmp[1] = '\0';
  189. printf("insert(%s%d, \"%s\", %d, %s%d);\n", trie_rule_prefix, rule_index_tmp-1, tmp, actual_index_tmp, trie_rule_prefix, co[level+1]?rule_index_tmp:final_rule);
  190. if (itterations == 1) {
  191. if (co[level+1]) {
  192. puts("RULE");
  193. trie_queue_add(&trie_trie, trie_rule_prefix, rule_index_tmp-1, strdup(tmp), actual_index_tmp, trie_rule_prefix, rule_index_tmp);
  194. } else {
  195. puts("FINAL");
  196. trie_queue_add2(&trie_trie, trie_rule_prefix, rule_index_tmp-1, strdup(tmp), actual_index_tmp, trie_rule_prefix, final_rule);
  197. }
  198. } else {
  199. puts("RULE FINAL");
  200. trie_queue_add3(&trie_trie, trie_rule_prefix, rule_index_tmp-1, strdup(tmp), actual_index_tmp, trie_rule_prefix, co[level+1]?rule_index_tmp:final_rule);
  201. }
  202. rule_index_tmp++;
  203. if (itterations == 1 && co[level+1]) final_rule++;
  204. actual_index_tmp++;
  205. }
  206. }
  207. int main(int argc, char **argv) {
  208. /*
  209. def0:
  210. 35:NULL
  211. 85:NULL
  212. rule1 : |1|2|def0|6|
  213. */
  214. char * s = "\
  215. i:\
  216. s1\
  217. s2\
  218. b\
  219. C\
  220. s3\
  221. s5\
  222. C\
  223. s8\
  224. s5\
  225. e\
  226. s6"; // for the sake of simplicity branches contain full strings only, not individual characters
  227. rule_index++;
  228. for(; *s; s++) {
  229. if (*s == 'b') {
  230. puts("branch start");
  231. part_of_branch = true;
  232. itterations = 0;
  233. for(; *s; s++) {
  234. if (*s == 'C') {
  235. s++;
  236. getbranchcontents(s);
  237. parse_branch(co);
  238. memset(co,0,5);
  239. };
  240. if (*s == 'e') break;
  241. }
  242. if (*s == 'e') s--;
  243. continue;
  244. }
  245. if (*s == 'e') {
  246. puts("branch end");
  247. part_of_branch = false;
  248. itterations = 0;
  249. if (final_rule) {
  250. rule_index = final_rule;
  251. update_on_next_pass = true;
  252. final_rule = 0;
  253. }
  254. continue;
  255. }
  256. if (*s == ' ' || *s == '\n' || *s == '\t') continue;
  257. if (*s == 'i') {
  258. passed_first = true;
  259. continue;
  260. }
  261. if (*s == 's' || *s == ':') {
  262. s++;
  263. printf("key: %c\n", *s);
  264. if (!part_of_branch) {
  265. if (!passed_first) {
  266. if (passed_next) {
  267. if (update_on_next_pass/* && (tmp.type & STR_TYPE_DIGIT || tmp.type & STR_TYPE_BINARY)*/) {
  268. rule_index = rule_index_tmp-1;
  269. update_on_next_pass = false;
  270. }
  271. actual_index = 0;
  272. passed_next = false;
  273. char tmp[2];
  274. tmp[0] = *s;
  275. tmp[1] = '\0';
  276. trie_queue_add(&trie_trie, trie_sub_root, -1, strdup(tmp), actual_index, trie_rule_prefix, rule_index);
  277. }
  278. else {
  279. rule_index++;
  280. actual_index++;
  281. char tmp[2];
  282. tmp[0] = *s;
  283. tmp[1] = '\0';
  284. trie_queue_add(&trie_trie, trie_rule_prefix, rule_index-1, strdup(tmp), actual_index, trie_rule_prefix, rule_index);
  285. }
  286. } else {
  287. passed_first = false;
  288. passed_next = true;
  289. }
  290. }
  291. }
  292. }
  293. // trie_queue_add(&trie_trie, trie_sub_root, -1, NULL, 0, trie_rule_prefix, 0); // root>0
  294. // trie_queue_add(&trie_trie, trie_rule_prefix, 0, NULL, 1, trie_rule_prefix, 1); // 0>1
  295. // trie_queue_add(&trie_trie, trie_rule_prefix, 1, NULL, 1, trie_rule_prefix, 2); // 1>2
  296. // trie_queue_add2(&trie_trie, trie_rule_prefix, 2, NULL, 1, trie_rule_prefix, 3); // 2>3
  297. // trie_queue_add3(&trie_trie, trie_rule_prefix, 0, NULL, 1, trie_rule_prefix, 1); // 0>1
  298. // trie_queue_add(&trie_trie, trie_rule_prefix, 1, NULL, 1, trie_rule_prefix, 2); // 1>2
  299. // trie_queue_add2(&trie_trie, trie_rule_prefix, 2, NULL, 1, trie_rule_prefix, 3); // 2>3
  300. // trie_queue_add3(&trie_trie, trie_rule_prefix, 3, NULL, 1, NULL, -1); // 3>END
  301. struct trie_QNode * node = trie_newNode(NULL,0,NULL,0,NULL,0); // this gets freed anyway
  302. int nodes = 0;
  303. int start_indent = 0;
  304. int i = 0;
  305. for (i = 0; i < start_indent; i++) printf(" ");
  306. printf("struct TrieNode * %s = getNode(); \n", trie_root);
  307. for (i = 0; i < start_indent; i++) printf(" ");
  308. printf("struct TrieNode * %s = getNode(); \n", trie_sub_root);
  309. while (node != NULL) {
  310. // drain the list until empty
  311. if (node->key) free(node->key);
  312. free(node);
  313. node = trie_load_asm(&trie_trie);
  314. if (node == NULL) break;
  315. // pp(node)
  316. // pp(node->rule_name)
  317. // ps(node->rule_name)
  318. // pi(node->rule_name_index)
  319. // pp(node->key)
  320. // ps(node->key)
  321. // pi(node->index)
  322. // pp(node->rule_next)
  323. // ps(node->rule_next)
  324. // pi(node->rule_next_index)
  325. if (node->rule_next && node->rule_next_index != -1) {
  326. bool rule_does_not_exist = false;
  327. bool next_rule_does_not_exist = false;
  328. if (node->rule_name_index == -1) {
  329. // is sub_root
  330. if (rule_does_not_exist) {
  331. for (i = 0; i < start_indent+1; i++) printf(" ");
  332. printf("struct TrieNode * %s%d = getNode(); \n", node->rule_name, node->rule_name_index);
  333. }
  334. if (next_rule_does_not_exist) {
  335. for (i = 0; i < start_indent+1; i++) printf(" ");
  336. printf("struct TrieNode * %s%d = getNode(); \n", node->rule_next, node->rule_next_index);
  337. }
  338. for (i = 0; i < start_indent+1; i++) printf(" ");
  339. printf("insert(%s, \"%s\", %d, %s%d);\n", node->rule_name, node->key, node->index, node->rule_next, node->rule_next_index);
  340. }
  341. else {
  342. // is rule
  343. if (rule_does_not_exist) {
  344. for (i = 0; i < start_indent+2; i++) printf(" ");
  345. printf("struct TrieNode * %s%d = getNode(); \n", node->rule_name, node->rule_name_index);
  346. }
  347. if (next_rule_does_not_exist) {
  348. for (i = 0; i < start_indent+2; i++) printf(" ");
  349. printf("struct TrieNode * %s%d = getNode(); \n", node->rule_next, node->rule_next_index);
  350. }
  351. for (i = 0; i < start_indent+2; i++) printf(" ");
  352. 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);
  353. }
  354. } else {
  355. if (node->rule_name_index == -1) {
  356. // is sub_root
  357. for (i = 0; i < start_indent+1; i++) printf(" ");
  358. printf("insert(%s, \"%s\", %d, NULL);\n", node->rule_name, node->key, node->index);
  359. } else {
  360. // is rule
  361. for (i = 0; i < start_indent+2; i++) printf(" ");
  362. printf("insert(%s%d, \"%s\", %d, NULL);\n", node->rule_name, node->rule_name_index, node->key, node->index);
  363. }
  364. }
  365. nodes++;
  366. }
  367. return 0;
  368. }
  369.