diff --git a/main.c b/main.c new file mode 100644 index 0000000..010afd8 --- /dev/null +++ b/main.c @@ -0,0 +1,183 @@ +#include +#include "fs.h" +#include +#include +#include "hashtable.h" + +#define _(x) x + + + +void free_filelist(struct filelist * list) { + if (list == NULL) { + return; + } + + struct filelist * next = list->next; + + while(list->next) { + next = list->next; + free(next->path); + free(next); + + list->next = list->next->next; + } + + free(list->path); + free(list); +} + +int filelist_push(struct filelist * pos, const char * path) { + struct filelist * new = malloc(sizeof(struct filelist)); + if (!new) { + errno = ENOMEM; + return -1; + } + + new->next = pos->next; + new->path = strdup(path); + + pos->next = new; + return 0; +} + +int good(FILE * file) { + return !feof(file); +} + +char fgetc_count(FILE *file, int * line, int * pos) { + char temp = fgetc(file); + if (temp == '\n') { + (*line)++; + *pos = 0; + } else { + (*pos)++; + } + + return temp; +} + + +int add_char(char ** str, char c) { + if (str == NULL || *str == NULL) { + return 0; + } + + int len = strlen(*str); + + char *temp = realloc(*str, len + 1); + if (temp == NULL) { + errno = ENOMEM; + return -1; + } + *str = temp; + + (*str)[len-1] = c; + (*str)[len] = 0; + return 0; +} + +void eval_macro(struct filelist * last, FILE * file) { + char * name = NULL; + strhash_t hash = 0; + + char current = 0; + + // read macro name + while(good(file) && current != '\\') { + + } + + if (!good(file)) { + return; + } +} + +void eval_file(struct filelist * last) { + // open file + FILE * file = fopen(last->path, "r"); + + if (file == NULL) { + fprintf(stderr, _("could not open file \"%s\":%s\n"), last->path, strerror(errno)); + return; + } + + printf("processing file: %s\n", last->path); + + char current = 1; + while(good(file)) { + current = fgetc(file); + + switch(current) { + case '%': + // comment, skip line + do { + current = fgetc(file); + } while(good(file) && current != '\n'); + + break; + case '\\': + // macro + eval_macro(last, file); + break; + default: + printf(_("unrecognized char! %c\n"), current); + break; + } + } + fclose(file); +} + +#include + +struct option long_opts[] = { + {"output", required_argument, NULL, 'o'}, + {"target", required_argument, NULL, 't'}, + {}, // terminator +}; + + +void help(int argc, char ** args) { + printf("%s [OPTIONS] file1 file2...\n" + "--output\n" + "-o\tby default the program will create a depfile for every input\n" + "\tnaming it like the tex file with a .d extension. By giving the -o Option\n" + "\tthe output will instead be put in this file exculsivly\n" + "--target\n" + "-t\tOverride the target name\n", args[0]); +} + +int main(int argc, char ** args) { + int long_index = 0; + int opt = 0; + + const char *outfile, *target; + + while((opt = getopt_long(argc, args, "o:t:", long_opts, &long_index)) != -1) { + switch(opt) { + case 'o': + outfile = optarg; + break; + case 't': + target = optarg; + break; + case '?': + help(argc, args); + return 0; + } + } + + char * current_file = NULL; + + // process all files + for(;optind < argc; ++optind) { + current_file = args[optind]; + + struct filelist list; + list.next = NULL; + list.path = current_file; + + eval_file(&list); + free_filelist(list.next); + } +}