Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include "parc.h"
- #define BUFSIZE 10
- void usage();
- void parse(FILE* in, FILE* out);
- void scheme(FILE* in, FILE* out);
- char* eval(char* expr);
- int main(int argv, char** argc) {
- FILE *in, *out;
- if (argv < 3) {
- usage();
- return 0;
- }
- in = fopen(argc[1], "r");
- out = fopen(argc[2], "w");
- parse(in, out);
- fclose(in);
- fclose(out);
- return 0;
- }
- void usage() {
- printf("2 Args\n");
- }
- void parse(FILE* in, FILE* out) {
- char tmp;
- while ( (tmp = fgetc(in)) != EOF )
- if (tmp == '$')
- scheme(in, out);
- else
- fputc(tmp, out);
- }
- void scheme(FILE* in, FILE* out) {
- char *str=NULL,
- tmp,
- buf[BUFSIZE];
- int i=0, si=0;
- while ( (tmp = fgetc(in)) != EOF &&
- tmp != '$') {
- if (i == BUFSIZE) {
- str = realloc(str, (si+i)*sizeof(char));
- strncat(str+si, buf, i);
- si += i;
- i=0;
- }
- buf[i++] = tmp;
- }
- str = realloc(str, si);
- strncat(str+si, buf, i);
- printf("%s", str);
- for (i=0;str[i] != '\0';i++)
- printf("%d ", (int)str[i]);
- printf("\n");
- fputs(eval(str), out);
- free(str);
- }
- struct margs {
- char** argv;
- int argc;
- };
- struct margs split(char* expr) {
- struct margs args;
- char *cpy, *tmp;
- int i;
- cpy = malloc(20*sizeof(char));
- strcpy(cpy, expr);
- const char delims[] = "( )\t\n\r";
- #define ARGV args.argv
- #define ARGC args.argc
- ARGV = malloc(BUFSIZE*sizeof(char*));
- ARGC=0;
- while ( (tmp = strtok(cpy, delims)) != NULL ) {
- cpy = NULL;
- ARGV[ARGC++] = tmp;
- }
- #undef ARGV
- #undef ARGC
- return args;
- }
- char* eval(char* expr) { /* Need Not Free expr */
- struct margs args = split(expr);
- char* (*func)(int, char**);
- int i;
- char *tmp;
- printf("%s", expr);
- for (i=0;expr[i] != '\0';i++)
- printf("%d ", (int)expr[i]);
- printf("\n");
- tmp = _add(args.argc, args.argv);
- for (i=0;tmp[i] != '\0';i++)
- printf("%d ", (int)tmp[i]);
- printf("\n");
- return tmp;
- }
- /************ FUNCS FROM HEADER ************/
- char* _add(int argc, char** argv) {
- int i, len=0, rlen = 4*argc, slen;
- char* ret = malloc(rlen+sizeof(char));
- for (i=1;i<argc;i++) {
- if (len == 0)
- ret[len++] = '(';
- if (len+ (slen = strlen(argv[i])) >= rlen-2) {
- rlen += (rlen-len)*(argc-i)*4;
- ret = realloc(ret, rlen*sizeof(char));
- }
- strcat(ret+len, argv[i]);
- //free(argv[i]);
- len += slen;
- if (i+1<argc)
- ret[len++] = '+';
- }
- if (len==0) {
- free(ret);
- return NULL;
- }
- ret[len++] = ')';
- ret[len++] = '\0';
- ret = realloc(ret, len*sizeof(char));
- free(argv);
- return ret;
- }
- char* _sub(int argc, char** argv) {
- int i, len=0, rlen = 4*argc, slen;
- char* ret = malloc(rlen+sizeof(char));
- for (i=1;i<argc;i++) {
- if (len == 0)
- ret[len++] = '(';
- if (len+ (slen = strlen(argv[i])) >= rlen-2) {
- rlen += (rlen-len)*(argc-i)*4;
- ret = realloc(ret, rlen*sizeof(char));
- }
- strcat(ret+len, argv[i]);
- len += slen;
- ret[len++] = '-';
- }
- if (len==0) {
- free(ret);
- return NULL;
- }
- ret[len++] = ')';
- ret = realloc(ret, len*sizeof(char));
- return ret;
- }
- char* _mult(int argc, char** argv) {
- int i, len=0, rlen = 4*argc, slen;
- char* ret = malloc(rlen+sizeof(char));
- for (i=1;i<argc;i++) {
- if (len == 0)
- ret[len++] = '(';
- if (len+ (slen = strlen(argv[i])) >= rlen-2) {
- rlen += (rlen-len)*(argc-i)*4;
- ret = realloc(ret, rlen*sizeof(char));
- }
- strcat(ret+len, argv[i]);
- len += slen;
- ret[len++] = '*';
- }
- if (len==0) {
- free(ret);
- return NULL;
- }
- ret[len++] = ')';
- ret = realloc(ret, len*sizeof(char));
- return ret;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement