2020-10-29 20:22:03 -04:00
|
|
|
#include <stdio.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include <errno.h>
|
2020-10-31 18:00:09 -04:00
|
|
|
#include <stdlib.h>
|
2020-10-29 20:22:03 -04:00
|
|
|
#include "parser.h"
|
2020-10-30 13:06:02 -04:00
|
|
|
#include "translator.h"
|
2020-10-29 20:22:03 -04:00
|
|
|
|
2020-10-31 18:00:09 -04:00
|
|
|
char* verfname(char* fname) {
|
|
|
|
int len = strlen(fname);
|
|
|
|
if(len > 3) {
|
|
|
|
int extind = len - 3;
|
|
|
|
char* extstr = fname + (sizeof(char)*extind);
|
|
|
|
if(strcmp(extstr, ".vm") == 0) {
|
|
|
|
int startind = 0;
|
|
|
|
for(int i = extind-1; i >= 0; i--) {
|
|
|
|
if(fname[i] == '/') {
|
|
|
|
startind = i+1;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2020-10-31 19:25:00 -04:00
|
|
|
int size = sizeof(char)*(extind - startind + 1);
|
2020-10-31 18:00:09 -04:00
|
|
|
char* startstr = fname + (sizeof(char)*startind);
|
|
|
|
char* retstr = (char*)malloc(size);
|
2020-10-31 19:25:00 -04:00
|
|
|
snprintf(retstr, size, "%s", startstr);
|
2020-10-31 18:00:09 -04:00
|
|
|
return retstr;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
fprintf(stderr, "Name format must be Xxx.vm\n");
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
|
2020-10-29 20:22:03 -04:00
|
|
|
int main(int argc, char* argv[]) {
|
|
|
|
if(argc < 2) {
|
|
|
|
fprintf(stderr, "Usage: %s {file}\n", argv[0]);
|
|
|
|
return 1;
|
|
|
|
}
|
2020-10-31 18:00:09 -04:00
|
|
|
// file name validating
|
|
|
|
char* fname = verfname(argv[1]);
|
2020-10-29 20:22:03 -04:00
|
|
|
|
|
|
|
FILE* input = fopen(argv[1], "r");
|
|
|
|
|
|
|
|
if(input == NULL) {
|
|
|
|
fprintf(stderr, "%s\n", strerror(errno));
|
|
|
|
return errno;
|
|
|
|
}
|
|
|
|
|
2020-10-29 21:06:33 -04:00
|
|
|
// info gathering
|
2020-10-29 20:22:03 -04:00
|
|
|
int lncount, widestln, maxtokens;
|
|
|
|
getinfo(input, &lncount, &widestln, &maxtokens);
|
2020-10-29 21:06:33 -04:00
|
|
|
|
|
|
|
// parsing
|
2020-10-29 20:22:03 -04:00
|
|
|
struct line** lns = parse(input, lncount, widestln, maxtokens);
|
2020-10-29 21:06:33 -04:00
|
|
|
fclose(input);
|
2020-10-30 13:06:02 -04:00
|
|
|
|
|
|
|
// translating
|
2020-10-31 11:40:06 -04:00
|
|
|
int asmcount = 0;
|
2020-10-31 19:25:00 -04:00
|
|
|
struct asmln** asmlns = translate(lns, lncount, &asmcount, fname);
|
2020-10-31 11:40:06 -04:00
|
|
|
|
|
|
|
// freeing lns
|
|
|
|
freelns(lns, lncount);
|
2020-10-29 20:22:03 -04:00
|
|
|
|
2020-10-29 21:06:33 -04:00
|
|
|
// printing
|
2020-10-31 11:40:06 -04:00
|
|
|
for(int i = 0; i < asmcount; i++) {
|
2020-10-30 13:06:02 -04:00
|
|
|
printf("%s\n", asmlns[i]->instr);
|
|
|
|
}
|
2020-10-29 20:22:03 -04:00
|
|
|
|
2020-10-31 11:40:06 -04:00
|
|
|
// freeing asmlns
|
2020-10-31 19:25:00 -04:00
|
|
|
free(fname);
|
2020-10-31 11:40:06 -04:00
|
|
|
freeasmlns(asmlns, asmcount);
|
2020-10-29 21:06:33 -04:00
|
|
|
|
2020-10-29 20:22:03 -04:00
|
|
|
return 0;
|
|
|
|
}
|