X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=gtk%2Fsrc%2Fcreate_resources.c;h=b91def6f2ddedb519bf8937b7a88f9b9e11c03ad;hb=9460d9624a5cf24126bc39605bc47d43330fcdf4;hp=70d2b0fdc23eb4fbc30097e3b2f1173546978989;hpb=d96cade527eefbe66e77e46088f26f97c14d7eeb;p=handbrake-jp%2Fhandbrake-jp-git.git diff --git a/gtk/src/create_resources.c b/gtk/src/create_resources.c index 70d2b0fd..b91def6f 100644 --- a/gtk/src/create_resources.c +++ b/gtk/src/create_resources.c @@ -1,4 +1,6 @@ +#include #include +#include #include #include #include @@ -13,6 +15,7 @@ enum R_SECTION, R_ICON, R_PLIST, + R_STRING, }; typedef struct @@ -27,6 +30,7 @@ static tag_map_t tag_map[] = {"section", R_SECTION}, {"icon", R_ICON}, {"plist", R_PLIST}, + {"string", R_STRING}, }; #define TAG_MAP_SZ (sizeof(tag_map)/sizeof(tag_map_t)) @@ -40,6 +44,34 @@ typedef struct gboolean closed_top; } parse_data_t; +GList *inc_list = NULL; + +static gchar* +find_file(GList *list, const gchar *name) +{ + gchar *str; + GList *link = list; + + while (link != NULL) + { + gchar *inc; + + inc = (gchar*)link->data; + str = g_strdup_printf("%s/%s", inc, name); + if (g_file_test(str, G_FILE_TEST_IS_REGULAR)) + { + return str; + } + g_free(str); + link = g_list_next(link); + } + if (g_file_test(name, G_FILE_TEST_IS_REGULAR)) + { + return g_strdup(name); + } + return NULL; +} + static const gchar* lookup_attr_value( const gchar *name, @@ -57,10 +89,33 @@ lookup_attr_value( return NULL; } +static GValue* +read_string_from_file(const gchar *filename) +{ + gchar *buffer; + size_t size; + GValue *gval; + FILE *fd; + + fd = g_fopen(filename, "r"); + if (fd == NULL) + return NULL; + fseek(fd, 0, SEEK_END); + size = ftell(fd); + fseek(fd, 0, SEEK_SET); + buffer = g_malloc(size+1); + size = fread(buffer, 1, size, fd); + buffer[size] = 0; + gval = ghb_value_new(G_TYPE_STRING); + g_value_take_string(gval, buffer); + fclose(fd); + return gval; +} + static void start_element( GMarkupParseContext *ctx, - const gchar *name, + const gchar *tag, const gchar **attr_names, const gchar **attr_values, gpointer ud, @@ -81,7 +136,7 @@ start_element( for (ii = 0; ii < TAG_MAP_SZ; ii++) { - if (strcmp(name, tag_map[ii].tag) == 0) + if (strcmp(tag, tag_map[ii].tag) == 0) { id.id = tag_map[ii].id; break; @@ -89,7 +144,7 @@ start_element( } if (ii == TAG_MAP_SZ) { - g_warning("Unrecognized start tag (%s)", name); + g_warning("Unrecognized start tag (%s)", tag); return; } g_queue_push_head(pd->tag_stack, id.pid); @@ -100,24 +155,26 @@ start_element( { case R_SECTION: { - const gchar *sect; + const gchar *name; - sect = lookup_attr_value("name", attr_names, attr_values); - if (sect && strcmp(sect, "icons") == 0) + name = lookup_attr_value("name", attr_names, attr_values); + if (name && strcmp(name, "icons") == 0) { gval = ghb_dict_value_new(); if (pd->key) g_free(pd->key); - pd->key = g_strdup(sect); + pd->key = g_strdup(name); g_queue_push_head(pd->stack, gval); } } break; case R_ICON: { - const gchar *filename, *icon; + gchar *filename; + const gchar *name; - filename = lookup_attr_value("file", attr_names, attr_values); - icon = lookup_attr_value("name", attr_names, attr_values); - if (filename && icon) + name = lookup_attr_value("file", attr_names, attr_values); + filename = find_file(inc_list, name); + name = lookup_attr_value("name", attr_names, attr_values); + if (filename && name) { ghb_rawdata_t *rd; guint size; @@ -127,28 +184,55 @@ start_element( rd->size = size; gval = ghb_rawdata_value_new(rd); if (pd->key) g_free(pd->key); - pd->key = g_strdup(icon); + pd->key = g_strdup(name); + g_free(filename); } else { g_warning("%s:missing a requried attribute", name); + exit(EXIT_FAILURE); } } break; case R_PLIST: { - const gchar *filename, *plist; + gchar *filename; + const gchar *name; - filename = lookup_attr_value("file", attr_names, attr_values); - plist = lookup_attr_value("name", attr_names, attr_values); - if (filename && plist) + name = lookup_attr_value("file", attr_names, attr_values); + filename = find_file(inc_list, name); + name = lookup_attr_value("name", attr_names, attr_values); + if (filename && name) { gval = ghb_plist_parse_file(filename); if (pd->key) g_free(pd->key); - pd->key = g_strdup(plist); + pd->key = g_strdup(name); + g_free(filename); } else { g_warning("%s:missing a requried attribute", name); + exit(EXIT_FAILURE); + } + } break; + case R_STRING: + { + gchar *filename; + const gchar *name; + + name = lookup_attr_value("file", attr_names, attr_values); + filename = find_file(inc_list, name); + name = lookup_attr_value("name", attr_names, attr_values); + if (filename && name) + { + gval = read_string_from_file(filename); + if (pd->key) g_free(pd->key); + pd->key = g_strdup(name); + g_free(filename); + } + else + { + g_warning("%s:missing a requried attribute", name); + exit(EXIT_FAILURE); } } break; } @@ -358,25 +442,63 @@ ghb_resource_parse_file(FILE *fd) return gval; } +static void +usage(char *cmd) +{ + fprintf(stderr, +"Usage: %s [-I ] \n" +"Summary:\n" +" Creates a resource plist from a resource list\n" +"Options:\n" +" I - Include path to search for files\n" +" Input resources file\n" +" Output resources plist file\n" +, cmd); + + exit(EXIT_FAILURE); +} + +#define OPTS "I:" gint main(gint argc, gchar *argv[]) { FILE *file; GValue *gval; - - if (argc < 3) + int opt; + const gchar *src, *dst; + + do + { + opt = getopt(argc, argv, OPTS); + switch (opt) + { + case -1: break; + + case 'I': + inc_list = g_list_prepend(inc_list, g_strdup(optarg)); + break; + } + } while (opt != -1); + + if (optind != argc - 2) { - fprintf(stderr, "Usage: \n"); - return 1; + usage(argv[0]); + return EXIT_FAILURE; } + src = argv[optind++]; + dst = argv[optind++]; + g_type_init(); - file = g_fopen(argv[1], "r"); + file = g_fopen(src, "r"); if (file == NULL) - return 1; + { + fprintf(stderr, "Error: failed to open %s\n", src); + return EXIT_FAILURE; + } gval = ghb_resource_parse_file(file); - ghb_plist_write_file(argv[2], gval); + ghb_plist_write_file(dst, gval); return 0; }