Advertisement
Guest User

Untitled

a guest
Mar 5th, 2015
171
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.74 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. typedef char bool;
  6. #define true 1
  7. #define false 0
  8. /* compare strings via pointers */
  9. bool pstrcmp(const void *p1, const void *p2)
  10. {
  11. return strcmp(*(char * const *)p1, *(char * const *)p2);
  12. }
  13.  
  14. bool isChar(char c) {
  15. return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z');
  16. }
  17.  
  18. void addSymb(char** strings, int idMain, int* id, int* allocatedSize, char c) {
  19. // printf("%s %d %d %d %c\n", "addSymb:", idMain, *id, *allocatedSize, c);
  20. if (*id == 0)
  21. strings[idMain] = malloc(sizeof(char*));
  22. if (*id == *allocatedSize - 1) {
  23. *allocatedSize = 2 * *allocatedSize + 1;
  24. strings[idMain] = realloc(strings[idMain], (*allocatedSize) * sizeof(char));
  25. }
  26. strings[idMain][*id] = c;
  27. (*id)++;
  28. }
  29.  
  30. void addString(char*** strings, int* idMain, int* id, int* allocatedSizeMain, int* allocatedSize, bool* toPushString) {
  31. *toPushString = false;
  32. // printf("%s %d %d %d %d\n", "addString:", *idMain, *id, *allocatedSizeMain, *allocatedSize);
  33. (*strings)[*idMain][*id] = 0;
  34. // printf("%s\n", (*strings)[*idMain]);
  35. if (*idMain == *allocatedSizeMain - 1) {
  36. *allocatedSizeMain = 2 * *allocatedSizeMain + 1;
  37. *strings = realloc(*strings, *allocatedSizeMain * sizeof(char*));
  38. }
  39. *allocatedSize = 0;
  40. *id = 0;
  41. (*idMain)++;
  42. (*strings)[*idMain] = malloc(sizeof(char*));
  43. }
  44.  
  45. void freeMemory(char** strings, int n) {
  46. for (int i =0 ; i < n; i++)
  47. free(strings[i]);
  48. free(strings);
  49. }
  50.  
  51. void print(char** strings, int idMain) {
  52. printf("%s\n", "_________->");
  53. for (int i = 0; i < idMain; i++) {
  54. printf("%s\n", strings[i]);
  55. }
  56. printf("%s\n", "<-_________");
  57. }
  58.  
  59. int main(int argc, const char * argv[]) {
  60. char** strings = malloc(1 * sizeof(char*));
  61. char c = ' ';
  62. int idMain = 0;
  63. int id = 0;
  64. int allocatedSize = 0;
  65. int allocatedSizeMain = 1;
  66. // fp = fopen(stdin, "r");
  67. // if (fp != NULL)
  68. // printf("%s\n", "file loaded");
  69. // else
  70. // printf("%s", "bad");
  71. int state = 0;
  72. bool eofFinded = false;
  73. bool toPushString = false;
  74. while (true) {
  75. // print(strings, idMain);
  76. switch(state) {
  77. //begin-space state
  78. case 0:
  79. if (isspace(c) || c == '\n') {
  80. state = 0;
  81. break;
  82. }
  83. if (isChar(c)) {
  84. state = 1;
  85. addSymb(strings, idMain, &id, &allocatedSize, c);
  86. break;
  87. }
  88. if (c == ';') {
  89. addSymb(strings, idMain, &id, &allocatedSize, c);
  90. addString(&strings, &idMain, &id, &allocatedSizeMain, &allocatedSize, &toPushString);
  91. state = 0;
  92. break;
  93. }
  94. if (c == '&') {
  95. state = 2;
  96. addSymb(strings, idMain, &id, &allocatedSize, c);
  97. break;
  98. }
  99. if (c == '|') {
  100. state = 3;
  101. addSymb(strings, idMain, &id, &allocatedSize, c);
  102. break;
  103. }
  104. break;
  105. //word state
  106. case 1:
  107. if (isspace(c) || c == '\n') {
  108. addString(&strings, &idMain, &id, &allocatedSizeMain, &allocatedSize, &toPushString);
  109. state = 0;
  110. break;
  111. }
  112. if (isChar(c)) {
  113. addSymb(strings, idMain, &id, &allocatedSize, c);
  114. break;
  115. }
  116. if (c == ';') {
  117. addString(&strings, &idMain, &id, &allocatedSizeMain, &allocatedSize, &toPushString);
  118. state = 0;
  119. addSymb(strings, idMain, &id, &allocatedSize, c);
  120. addString(&strings, &idMain, &id, &allocatedSizeMain, &allocatedSize, &toPushString);
  121. break;
  122. }
  123. if (c == '&') {
  124. addString(&strings, &idMain, &id, &allocatedSizeMain, &allocatedSize, &toPushString);
  125. state = 2;
  126. addSymb(strings, idMain, &id, &allocatedSize, c);
  127. break;
  128. }
  129. if (c == '|') {
  130. addString(&strings, &idMain, &id, &allocatedSizeMain, &allocatedSize, &toPushString);
  131. state = 3;
  132. addSymb(strings, idMain, &id, &allocatedSize, c);
  133. break;
  134. }
  135. break;
  136. //& state
  137. case 2:
  138. if (isspace(c) || c == '\n') {
  139. addString(&strings, &idMain, &id, &allocatedSizeMain, &allocatedSize, &toPushString);
  140. state = 0;
  141. break;
  142. }
  143. if (isChar(c)) {
  144. addString(&strings, &idMain, &id, &allocatedSizeMain, &allocatedSize, &toPushString);
  145. addSymb(strings, idMain, &id, &allocatedSize, c);
  146. state = 1;
  147. break;
  148. }
  149. if (c == ';') {
  150. addString(&strings, &idMain, &id, &allocatedSizeMain, &allocatedSize, &toPushString);
  151. state = 0;
  152. addSymb(strings, idMain, &id, &allocatedSize, ';');
  153. addString(&strings, &idMain, &id, &allocatedSizeMain, &allocatedSize, &toPushString);
  154. }
  155. if (c == '&') {
  156. //addString(strings, &idMain, &id, &allocatedSizeMain, &allocatedSize);
  157. state = 0;
  158. addSymb(strings, idMain, &id, &allocatedSize, c);
  159. addString(&strings, &idMain, &id, &allocatedSizeMain, &allocatedSize, &toPushString);
  160. }
  161. if (c == '|') {
  162. addString(&strings, &idMain, &id, &allocatedSizeMain, &allocatedSize, &toPushString);
  163. addSymb(strings, idMain, &id, &allocatedSize, c);
  164. state = 3;
  165. }
  166. break;
  167. // | state
  168. case 3:
  169. if (isspace(c) || c == '\n') {
  170. addString(&strings, &idMain, &id, &allocatedSizeMain, &allocatedSize, &toPushString);
  171. state = 0;
  172. break;
  173. }
  174. if (isChar(c)) {
  175. addString(&strings, &idMain, &id, &allocatedSizeMain, &allocatedSize, &toPushString);
  176. addSymb(strings, idMain, &id, &allocatedSize, c);
  177. state = 1;
  178. break;
  179. }
  180. if (c == ';') {
  181. addString(&strings, &idMain, &id, &allocatedSizeMain, &allocatedSize, &toPushString);
  182. state = 0;
  183. addSymb(strings, idMain, &id, &allocatedSize, c);
  184. addString(&strings, &idMain, &id, &allocatedSizeMain, &allocatedSize, &toPushString);
  185. }
  186. if (c == '|') {
  187. addSymb(strings, idMain, &id, &allocatedSize, c);
  188. addString(&strings, &idMain, &id, &allocatedSizeMain, &allocatedSize, &toPushString);
  189. state = 0;
  190. }
  191. if (c == '&') {
  192. addString(&strings, &idMain, &id, &allocatedSizeMain, &allocatedSize, &toPushString);
  193. addSymb(strings, idMain, &id, &allocatedSize, c);
  194. state = 2;
  195. }
  196. break;
  197. }
  198. if (state == 4) {
  199. if (c == EOF || eofFinded) {
  200. printf("%s\n", "right \" not found");
  201. freeMemory(strings, idMain);
  202. return 0;
  203. }
  204. if (c == '\"') {
  205. //addString(&strings, &idMain, &id, &allocatedSizeMain, &allocatedSize);
  206. toPushString = true;
  207. state = 0;
  208. // c = fgetc(fp);
  209. scanf("%c", &c);
  210. if (c == EOF) {
  211. eofFinded = true;
  212. c = ' ';
  213. }
  214. continue;
  215. }
  216. else
  217. addSymb(strings, idMain, &id, &allocatedSize, c);
  218. }
  219. if (state == 5) {
  220. if (c == EOF || eofFinded) {
  221. printf("%s\n", "right \' not found");
  222. freeMemory(strings, idMain);
  223. return 0;
  224. }
  225. if (c == '\'') {
  226. toPushString = true;
  227. //addString(&strings, &idMain, &id, &allocatedSizeMain, &allocatedSize);
  228. state = 0;
  229. // c = fgetc(fp);
  230. scanf("%c", &c);
  231. if (c == EOF) {
  232. eofFinded = true;
  233. c = ' ';
  234. }
  235. continue;
  236. }
  237. else
  238. addSymb(strings, idMain, &id, &allocatedSize, c);
  239. }
  240. if (eofFinded)
  241. break;
  242. if (c == '\"') {
  243. state = 4;
  244. }
  245. if (c == '\'') {
  246. state = 5;
  247. }
  248.  
  249. // c = fgetc(fp);
  250. scanf("%c", &c);
  251. printf("%c\n", c);
  252. if (c == '#') {
  253. eofFinded = true;
  254. c = ' ';
  255. }
  256. }
  257. if (toPushString)
  258. addString(&strings, &idMain, &id, &allocatedSizeMain, &allocatedSize, &toPushString);
  259. printf("%s\n", "------");
  260. qsort(strings, idMain - 1, sizeof(char*) , pstrcmp);
  261. for (int i = 0; i < idMain; i++) {
  262. printf("\"%s\"\n", strings[i]);
  263. }
  264. return 0;
  265. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement