Advertisement
Guest User

Untitled

a guest
Jun 26th, 2017
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.81 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include "parc.h"
  5.  
  6. #define BUFSIZE 10
  7.  
  8. void usage();
  9. void parse(FILE* in, FILE* out);
  10. void scheme(FILE* in, FILE* out);
  11. char* eval(char* expr);
  12.  
  13. int main(int argv, char** argc) {
  14. FILE *in, *out;
  15.  
  16. if (argv < 3) {
  17. usage();
  18. return 0;
  19. }
  20.  
  21. in = fopen(argc[1], "r");
  22. out = fopen(argc[2], "w");
  23.  
  24. parse(in, out);
  25.  
  26. fclose(in);
  27. fclose(out);
  28. return 0;
  29. }
  30.  
  31. void usage() {
  32. printf("2 Args\n");
  33. }
  34.  
  35. void parse(FILE* in, FILE* out) {
  36. char tmp;
  37.  
  38. while ( (tmp = fgetc(in)) != EOF )
  39. if (tmp == '$')
  40. scheme(in, out);
  41. else
  42. fputc(tmp, out);
  43. }
  44.  
  45. void scheme(FILE* in, FILE* out) {
  46. char *str=NULL,
  47. tmp,
  48. buf[BUFSIZE];
  49. int i=0, si=0;
  50.  
  51. while ( (tmp = fgetc(in)) != EOF &&
  52. tmp != '$') {
  53. if (i == BUFSIZE) {
  54. str = realloc(str, (si+i)*sizeof(char));
  55. strncat(str+si, buf, i);
  56. si += i;
  57. i=0;
  58. }
  59.  
  60. buf[i++] = tmp;
  61. }
  62. str = realloc(str, si);
  63. strncat(str+si, buf, i);
  64.  
  65. printf("%s", str);
  66. for (i=0;str[i] != '\0';i++)
  67. printf("%d ", (int)str[i]);
  68. printf("\n");
  69.  
  70. fputs(eval(str), out);
  71. free(str);
  72. }
  73.  
  74. struct margs {
  75. char** argv;
  76. int argc;
  77. };
  78.  
  79. struct margs split(char* expr) {
  80. struct margs args;
  81. char *cpy, *tmp;
  82. int i;
  83. cpy = malloc(20*sizeof(char));
  84.  
  85. strcpy(cpy, expr);
  86. const char delims[] = "( )\t\n\r";
  87.  
  88. #define ARGV args.argv
  89. #define ARGC args.argc
  90.  
  91. ARGV = malloc(BUFSIZE*sizeof(char*));
  92. ARGC=0;
  93. while ( (tmp = strtok(cpy, delims)) != NULL ) {
  94. cpy = NULL;
  95.  
  96. ARGV[ARGC++] = tmp;
  97. }
  98.  
  99.  
  100. #undef ARGV
  101. #undef ARGC
  102.  
  103. return args;
  104. }
  105.  
  106. char* eval(char* expr) { /* Need Not Free expr */
  107. struct margs args = split(expr);
  108. char* (*func)(int, char**);
  109. int i;
  110. char *tmp;
  111.  
  112. printf("%s", expr);
  113. for (i=0;expr[i] != '\0';i++)
  114. printf("%d ", (int)expr[i]);
  115. printf("\n");
  116.  
  117.  
  118. tmp = _add(args.argc, args.argv);
  119.  
  120. for (i=0;tmp[i] != '\0';i++)
  121. printf("%d ", (int)tmp[i]);
  122. printf("\n");
  123.  
  124. return tmp;
  125. }
  126.  
  127. /************ FUNCS FROM HEADER ************/
  128.  
  129. char* _add(int argc, char** argv) {
  130. int i, len=0, rlen = 4*argc, slen;
  131. char* ret = malloc(rlen+sizeof(char));
  132.  
  133. for (i=1;i<argc;i++) {
  134. if (len == 0)
  135. ret[len++] = '(';
  136.  
  137. if (len+ (slen = strlen(argv[i])) >= rlen-2) {
  138. rlen += (rlen-len)*(argc-i)*4;
  139. ret = realloc(ret, rlen*sizeof(char));
  140. }
  141.  
  142. strcat(ret+len, argv[i]);
  143. //free(argv[i]);
  144. len += slen;
  145. if (i+1<argc)
  146. ret[len++] = '+';
  147. }
  148. if (len==0) {
  149. free(ret);
  150. return NULL;
  151. }
  152.  
  153. ret[len++] = ')';
  154. ret[len++] = '\0';
  155. ret = realloc(ret, len*sizeof(char));
  156. free(argv);
  157. return ret;
  158. }
  159.  
  160.  
  161. char* _sub(int argc, char** argv) {
  162. int i, len=0, rlen = 4*argc, slen;
  163. char* ret = malloc(rlen+sizeof(char));
  164.  
  165. for (i=1;i<argc;i++) {
  166. if (len == 0)
  167. ret[len++] = '(';
  168. if (len+ (slen = strlen(argv[i])) >= rlen-2) {
  169. rlen += (rlen-len)*(argc-i)*4;
  170. ret = realloc(ret, rlen*sizeof(char));
  171. }
  172.  
  173. strcat(ret+len, argv[i]);
  174. len += slen;
  175. ret[len++] = '-';
  176. }
  177. if (len==0) {
  178. free(ret);
  179. return NULL;
  180. }
  181.  
  182. ret[len++] = ')';
  183. ret = realloc(ret, len*sizeof(char));
  184. return ret;
  185. }
  186.  
  187.  
  188. char* _mult(int argc, char** argv) {
  189. int i, len=0, rlen = 4*argc, slen;
  190. char* ret = malloc(rlen+sizeof(char));
  191.  
  192. for (i=1;i<argc;i++) {
  193. if (len == 0)
  194. ret[len++] = '(';
  195.  
  196. if (len+ (slen = strlen(argv[i])) >= rlen-2) {
  197. rlen += (rlen-len)*(argc-i)*4;
  198. ret = realloc(ret, rlen*sizeof(char));
  199. }
  200.  
  201. strcat(ret+len, argv[i]);
  202. len += slen;
  203. ret[len++] = '*';
  204. }
  205. if (len==0) {
  206. free(ret);
  207. return NULL;
  208. }
  209. ret[len++] = ')';
  210. ret = realloc(ret, len*sizeof(char));
  211. return ret;
  212. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement