#include #include #include #include "parsers/json.h" typedef enum { music = 0, art = 1, blog = 2, } MediaType; MediaType read_media_type(char *name) { char *type_names[] = {"music", "art", "blog"}; for (int i = 0; i < sizeof(type_names) / sizeof(char*); i++) { if (strcmp(name, type_names[i]) == 0) return i; } return -1; } void print_help() { printf("usage: compile <-t media_type> <-i input_file> [output_file]\n"); printf("valid media types: music, art, blog\n"); printf("if output_file is not specified, the output will be written to stdout.\n"); } int main(int argc, char **argv) { if (argc <= 1) { print_help(); return 0; } MediaType media_type = -1; FILE *input_file = NULL; size_t optind = 0; for (optind = 1; optind < argc && argv[optind][0] == '-'; optind++) { switch (argv[optind][1]) { case 't': media_type = read_media_type(argv[++optind]); if (media_type < 0) { fprintf(stderr, "media type `%s` is not implemented!\n\n", argv[optind]); print_help(); exit(EXIT_FAILURE); } break; case 'i': if (optind++ >= argc) { fprintf(stderr, "-i was passed, but no file path was given!\n\n"); exit(EXIT_FAILURE); } input_file = fopen(argv[optind], "r"); if (input_file == NULL) { fprintf(stderr, "failed to open file %s!\n\n", argv[optind]); exit(EXIT_FAILURE); } break; default: print_help(); exit(EXIT_FAILURE); } } if (media_type < 0) { fprintf(stderr, "media type not provided!\n\n"); print_help(); exit(EXIT_FAILURE); } if (input_file == NULL) { fprintf(stderr, "input file not provided!\n\n"); print_help(); exit(EXIT_FAILURE); } // get length of file fseek(input_file, (long)-sizeof(char), SEEK_END); size_t length = ftell(input_file); fseek(input_file, 0, SEEK_SET); // read file to buffer char buf[length + 1]; fread(buf, 1, length, input_file); buf[length] = '\0'; // parse the file size_t offset = 0; JsonObject *json = json_parse(buf, &offset); if (json == NULL) { fprintf(stderr, "failed to parse input file!\n"); exit(EXIT_FAILURE); } printf("title: %s\n", (char*)((JsonObject*)json_get(json, "title"))->value); printf("type: %s\n", (char*)((JsonObject*)json_get(json, "type"))->value); printf("year: %.0f\n", *(float*)((JsonObject*)json_get(json, "year"))->value); printf("artwork: %s\n", (char*)((JsonObject*)json_get(json, "artwork"))->value); printf("buylink: %s\n", (char*)((JsonObject*)json_get(json, "buylink"))->value); JsonObject *links = (JsonObject*)json_get(json, "links"); for (size_t i = 0; i < links->length; i++) { char path[256]; sprintf(path, "links.%zu.title", i); printf("%s: %s\n", path, (char*)((JsonObject*)json_get(json, path))->value); sprintf(path, "links.%zu.url", i); printf("%s: %s\n", path, (char*)((JsonObject*)json_get(json, path))->value); } return 0; }