Exemplo n.º 1
0
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);
	}
}
Exemplo n.º 2
0
/*
** 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);
}