void find_assets(asset_file_builder* afb, const char* root) { char path[MAX_PATH]; _snprintf_s(path, MAX_PATH, _TRUNCATE, "%s/*", root); WIN32_FIND_DATAA wfd; HANDLE f = FindFirstFileA(path, &wfd); if (f != INVALID_HANDLE_VALUE) { do { if ((wfd.cFileName[0] == '.') || (wfd.cFileName[0] == '_')) continue; _snprintf_s(path, MAX_PATH, _TRUNCATE, "%s\\%s", root, wfd.cFileName); if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { find_assets(afb, path); } else { if (strstr(wfd.cFileName, ".png")) import_png(afb, path, wfd.cFileName); else if (strstr(wfd.cFileName, ".wav")) import_wav(afb, path, wfd.cFileName); else if (strstr(wfd.cFileName, ".font")) import_font(afb, path, wfd.cFileName); else if (strstr(wfd.cFileName, ".hlsl")) import_hlsl(afb, path, wfd.cFileName); } } while(FindNextFileA(f, &wfd)); FindClose(f); } }
/* ** cg_read_conf() ** Read the configuration file. */ yerr_t cg_read_conf(cg_t *carta, const char *input, ybool_t initial) { ydom_t *dom; ydom_node_t *root_node; yvect_t array; int i; char *pt = NULL, *pt2 = NULL; if (!(dom = ydom_new())) { YLOG_ADD(YLOG_ERR, "Memory error"); return (YENOMEM); } if (ydom_read_file(dom, input) != YENOERR) { YLOG_ADD(YLOG_ERR, "Problem with file '%s'", input); ydom_del(dom); return (YEINVAL); } if (!(array = ydom_xpath(dom, "/pandocreon:carta-genius")) || !yv_len(array) || !array[0]) { YLOG_ADD(YLOG_ERR, "No configuration"); yv_del(&array, NULL, NULL); ydom_del(dom); return (YEINVAL); } root_node = array[0]; yv_del(&array, NULL, NULL); yv_add(&carta->xml_doms, dom); /* get document info */ if ((array = ydom_node_xpath(root_node, "info")) && yv_len(array) && array[0]) { carta->author = ydom_node_get_attr_value(array[0], "author"); carta->title = ydom_node_get_attr_value(array[0], "title"); carta->subject = ydom_node_get_attr_value(array[0], "subject"); carta->keywords = ydom_node_get_attr_value(array[0], "keywords"); carta->copyright = ydom_node_get_attr_value(array[0], "copyright"); carta->version = ydom_node_get_attr_value(array[0], "version"); carta->language = ydom_node_get_attr_value(array[0], "lang"); carta->note = ydom_node_get_attr_value(array[0], "note"); } yv_del(&array, NULL, NULL); /* get PDF version */ if ((array = ydom_node_xpath(root_node, "pdf")) && yv_len(array) && array[0]) { char *passwd1 = NULL, *passwd2 = NULL; pt = ydom_node_get_attr_value(array[0], "version"); passwd1 = ydom_node_get_attr_value(array[0], "master-password"); passwd2 = ydom_node_get_attr_value(array[0], "user-password"); if (!passwd1 || !passwd2 || !strcmp(passwd1, passwd2)) { free0(passwd1); free0(passwd2); } carta->master_password = passwd1; carta->user_password = passwd2; } if (pt && !strcmp(pt, "1.3")) carta->pdf_version = PDF_13; else if (pt && !strcmp(pt, "1.5")) carta->pdf_version = PDF_15; else carta->pdf_version = PDF_14; free0(pt); yv_del(&array, NULL, NULL); /* get general configuration */ if (initial) { /* get default unit */ if ((array = ydom_node_xpath(root_node, "unit")) && yv_len(array) && array[0] && (pt = ydom_node_get_attr_value(array[0], "base"))) { if (!strcasecmp(pt, "mm") || !strcasecmp(pt, "millimeter")) carta->default_unit = YUNIT_MM; else if (!strcasecmp(pt, "cm") || !strcasecmp(pt, "centimeter")) carta->default_unit = YUNIT_CM; else if (!strcasecmp(pt, "in") || !strcasecmp(pt, "inch")) carta->default_unit = YUNIT_IN; else if (!strcasecmp(pt, "pt") || !strcasecmp(pt, "point")) carta->default_unit = YUNIT_PT; else { YLOG_ADD(YLOG_ERR, "Bad default unit [line %d]", ((ydom_node_t*)array[0])->line_nbr); free0(pt); yv_del(&array, NULL, NULL); ydom_del(dom); return (YEINVAL); } free0(pt); } else { YLOG_ADD(YLOG_INFO, "No default unit. Set to mm."); carta->default_unit = YUNIT_MM; } yv_del(&array, NULL, NULL); /* get cards' back configuration */ if ((array = ydom_node_xpath(root_node, "back")) && yv_len(array) && array[0]) { if ((pt = ydom_node_get_attr_value(array[0], "side"))) { if (!strcasecmp(pt, "width")) carta->do_back = BACK_WIDTH; else if (!strcasecmp(pt, "height")) carta->do_back = BACK_HEIGHT; free0(pt); } else carta->do_back = BACK_NO; if ((pt = ydom_node_get_attr_value(array[0], "reverse")) && (!strcasecmp(pt, "yes") || !strcasecmp(pt, "true"))) carta->reverse = YTRUE; free0(pt); } else carta->do_back = BACK_NO; yv_del(&array, NULL, NULL); } /* get templates */ if ((array = ydom_node_xpath(root_node, "templates/template")) && yv_len(array)) { int i; for (i = 0; i < yv_len(array); ++i) yv_add(&carta->templates, array[i]); } yv_del(&array, NULL, NULL); /* get init variables */ if ((array = ydom_node_xpath(root_node, "variables/var")) && yv_len(array)) { int i; for (i = 0; i < yv_len(array); ++i) yv_add(&carta->variables, array[i]); } yv_del(&array, NULL, NULL); /* get default font */ if ((array = ydom_node_xpath(root_node, "fonts")) && yv_len(array) && array[0]) { char *default_font; if ((default_font = ydom_node_get_attr_value(array[0], "default"))) { free0(carta->default_font); carta->default_font = default_font; } } yv_del(&array, NULL, NULL); /* get fonts */ if ((array = ydom_node_xpath(root_node, "fonts/*")) && yv_len(array) && array[0]) { int i; for (i = 0; i < yv_len(array); ++i) { char *tag_name = ydom_node_get_name(array[i]); if (tag_name && !strcmp(tag_name, "font")) import_font(carta, array[i]); else if (tag_name && !strcmp(tag_name, "path")) { char *dir = ydom_node_get_attr_value(array[i], "dir"); if (dir && strlen(dir)) add_font_paths(carta, dir); else YLOG_ADD(YLOG_WARN, "Path without 'dir' argument [line %d].", ((ydom_node_t*)array[i])->line_nbr); free0(dir); } free0(tag_name); } } yv_del(&array, NULL, NULL); /* get images */ if ((array = ydom_node_xpath(root_node, "images/*")) && yv_len(array) && array[0]) { int i; for (i = 0; i < yv_len(array); ++i) { char *tag_name = ydom_node_get_name(array[i]); if (tag_name && !strcmp(tag_name, "image")) import_image(carta, array[i], YFALSE); else if (tag_name && !strcmp(tag_name, "mask")) import_image(carta, array[i], YTRUE); else if (tag_name && !strcmp(tag_name, "path")) { /* add a directory for path searching */ char *dir = ydom_node_get_attr_value(array[i], "dir"); if (dir && strlen(dir)) add_img_paths(carta, dir); else YLOG_ADD(YLOG_WARN, "Path without 'dir' argument [line %d].", ((ydom_node_t*)array[i])->line_nbr); free0(dir); } free0(tag_name); } } yv_del(&array, NULL, NULL); /* get all decks */ array = ydom_node_xpath(root_node, "deck"); for (i = 0; i < yv_len(array); ++i) { cg_deck_t *deck; ydom_node_t *deck_node = array[i]; yvect_t array2; deck = malloc0(sizeof(cg_deck_t)); deck->line_nbr = deck_node->line_nbr; /* get paper size */ if ((array2 = ydom_node_xpath(deck_node, "paper")) && yv_len(array2) && array2[0]) { cg_expr_var_t e_w = {0}, e_h = {0}; yvalue_t width, height, margin_w, margin_h; /* get width and height */ if ((pt = ydom_node_get_attr_value(array2[0], "type"))) { cg_paper_t paper_type = cg_get_paper(pt); width = cg_get_paper_width(paper_type); height = cg_get_paper_height(paper_type); if ((pt2 = ydom_node_get_attr_value(array2[0], "landscape")) && (!strcasecmp(pt2, "yes") || !strcasecmp(pt2, "true"))) { yvalue_t tmp_val = width; width = height; height = tmp_val; } } else if ((pt = ydom_node_get_attr_value(array2[0], "width")) && cg_expr(carta, pt, &e_w, carta->default_unit) == YENOERR && e_w.type == CG_EXPR_VALUE && (pt2 = ydom_node_get_attr_value(array2[0], "height")) && cg_expr(carta, pt2, &e_h, carta->default_unit) == YENOERR && e_h.type == CG_EXPR_VALUE) { width = e_w.value.value; height = e_h.value.value; } else { YLOG_ADD(YLOG_WARN, "No valid paper size. Set to a4."); width = cg_get_paper_width(A4); height = cg_get_paper_height(A4); } free0(pt); free0(pt2); free_var(&e_w, &e_w); free_var(&e_h, &e_h); /* get margin */ if ((pt = ydom_node_get_attr_value(array2[0], "margin"))) margin_w = margin_h = yvalue_read(pt, carta->default_unit); else margin_w = margin_h = yvalue_read(DEFAULT_MARGIN, carta->default_unit); free0(pt); if ((pt = ydom_node_get_attr_value(array2[0], "margin-width")) && cg_expr(carta, pt, &e_w, carta->default_unit) == YENOERR && e_w.type == CG_EXPR_VALUE) margin_w = e_w.value.value; free0(pt); if ((pt = ydom_node_get_attr_value(array2[0], "margin-height")) && cg_expr(carta, pt, &e_h, carta->default_unit) == YENOERR && e_h.type == CG_EXPR_VALUE) margin_h = e_h.value.value; free0(pt); free_var(&e_w, &e_w); free_var(&e_h, &e_h); deck->paper_width = width; deck->paper_height = height; deck->paper_margin_w = margin_w; deck->paper_margin_h = margin_h; } else { YLOG_ADD(YLOG_INFO, "No paper size, set to default (A4)."); deck->paper_width = cg_get_paper_width(A4); deck->paper_height = cg_get_paper_height(A4); deck->paper_margin_w = deck->paper_margin_h = yvalue_read(DEFAULT_MARGIN, carta->default_unit); } yv_del(&array2, NULL, NULL); /* get hidden ditch config */ if ((array2 = ydom_node_xpath(deck_node, "hidden-ditch")) && yv_len(array2) && array2[0]) { /* get margin */ deck->ditch_even = ydom_node_get_attr_value(array2[0], "even"); deck->ditch_odd = ydom_node_get_attr_value(array2[0], "odd"); } yv_del(&array2, NULL, NULL); /* get card size */ if ((array2 = ydom_node_xpath(deck_node, "cardsize")) && yv_len(array2) && array2[0]) { yvalue_t width, height, space_w, space_h; if ((pt = ydom_node_get_attr_value(array2[0], "type"))) { cg_paper_t paper_type = cg_get_paper(pt); width = cg_get_paper_width(paper_type); height = cg_get_paper_height(paper_type); if ((pt2 = ydom_node_get_attr_value(array2[0], "landscape")) && (!strcasecmp(pt2, "yes") || !strcasecmp(pt2, "true"))) { yvalue_t tmp_val = width; width = height; height = tmp_val; } } else if ((pt = ydom_node_get_attr_value(array2[0], "width")) && (pt2 = ydom_node_get_attr_value(array2[0], "height"))) { width = yvalue_read(pt, carta->default_unit); height = yvalue_read(pt2, carta->default_unit); } else { YLOG_ADD(YLOG_WARN, "No valid card size. Set to a6."); width = cg_get_paper_width(A6); height = cg_get_paper_height(A6); } free0(pt); free0(pt2); deck->card_width = width; deck->card_height = height; if ((pt = ydom_node_get_attr_value(array2[0], "space"))) space_w = space_h = yvalue_read(pt, carta->default_unit); else if ((pt = ydom_node_get_attr_value(array2[0], "space-width")) && (pt2 = ydom_node_get_attr_value(array2[0], "space-height"))) { space_w = yvalue_read(pt, carta->default_unit); space_h = yvalue_read(pt2, carta->default_unit); } else { space_w.unit = space_h.unit = YUNIT_PT; space_w.value = space_h.value = 0.0; } deck->space_width = space_w; deck->space_height = space_h; free0(pt); free0(pt2); } else { YLOG_ADD(YLOG_INFO, "No card size. Set to a6."); deck->card_width = cg_get_paper_width(A6); deck->card_height = cg_get_paper_height(A6); } yv_del(&array2, NULL, NULL); /* get cards */ deck->cards = ydom_node_xpath(deck_node, "card"); yv_add(&carta->decks, deck); } /* get included files */ if ((array = ydom_node_xpath(root_node, "includes/*")) && yv_len(array) && array[0]) { int i; for (i = 0; i < yv_len(array); ++i) { char *tag_name = ydom_node_get_name(array[i]); if (tag_name && !strcmp(tag_name, "include")) { /* include a file */ char *file = ydom_node_get_attr_value(array[i], "file"); if (file && strlen(file)) include_file(carta, file); else YLOG_ADD(YLOG_WARN, "Include without 'file' argument [line %d].", ((ydom_node_t*)array[i])->line_nbr); free0(file); } else if (tag_name && !strcmp(tag_name, "path")) { /* add an include dir */ char *dir = ydom_node_get_attr_value(array[i], "dir"); if (dir && strlen(dir)) add_inc_paths(carta, dir); else YLOG_ADD(YLOG_WARN, "Path without 'dir' argument [line %d].", ((ydom_node_t*)array[i])->line_nbr); free0(dir); } free0(tag_name); } } yv_del(&array, NULL, NULL); return (YENOERR); }