Index: app/app_procs.c =================================================================== RCS file: /cvs/gnome/dia/app/app_procs.c,v retrieving revision 1.159 diff -u -r1.159 app_procs.c --- app/app_procs.c 20 Mar 2005 22:35:59 -0000 1.159 +++ app/app_procs.c 3 Apr 2005 13:39:16 -0000 @@ -101,7 +101,8 @@ const char *export_file_name, const char *export_file_format, const char *size, - char *show_layers); + char *show_layers, + char *show_layers_range); static void create_user_dirs(void); static PluginInitResult internal_plugin_init(PluginInfo *info); @@ -113,9 +114,11 @@ #endif GSList **files, char **export_file_name, char **export_file_format, char **size, - char **show_layers, gboolean *nosplash); + char **show_layers, char **show_layers_range, + gboolean *nosplash); static gboolean handle_all_diagrams(GSList *files, char *export_file_name, - char *export_file_format, char *size, char *show_layers); + char *export_file_format, char *size, char *show_layers, + char *show_layers_range); static void print_credits(gboolean credits); static gboolean dia_is_interactive = TRUE; @@ -203,6 +206,121 @@ return tmp; } + +/* Handle the string between commas. We have either of: + * + * 1. XX, the number XX + * 2. -XX, every number until XX + * 3. XX-, every number from XX until n_layers + * 4. XX-YY, every number between XX-YY + */ +static void +layer_range_handle_substr(gboolean *visible_layers, gint n_layers, const char *str) +{ + char *p; + unsigned long int low = 0; + unsigned long int high = n_layers; + unsigned long int i; + + if (str == NULL) + return; + + /* Case 2, starts with '-' */ + if (*str == '-') { + str++; + low = 0; + high = strtoul(str, &p, 10)+1; + if (p == str) { + g_error(_("error: Cannot convert %s into a number\n"), str ); + exit(1); + } + } + else { + /* Case 1, 3 or 4 */ + low = strtoul(str, &p, 10); + high = low+1; /* Assume case 1 */ + if (p == str) { + g_error(_("error: Cannot convert %s into a number\n"), str ); + exit(1); + } + if (*p == '-') + { + /* Case 3 or 4 */ + str = p + 1; + if (*str == '\0') /* Case 3 */ + high = n_layers; + else + { + high = strtoul(str, &p, 10)+1; + if (p == str) { + g_error(_("error: Cannot convert %s into a number\n"), str ); + exit(1); + } + } + } + } + + if ( high <= low ) { + g_error(_("error: invalid layer range %lu - %lu\n"), low, high-1 ); + exit(1); + } + if (high > n_layers) + high = n_layers; + + /* Set the visible layers */ + for ( i = low; i < high; i++ ) + visible_layers[i] = TRUE; +} + +static void +layer_range_parse_string(gboolean *visible_layers, gint n_layers, const char *str) +{ + char *p, *dummy; + char *cpy = strdup(str); + + if (!cpy) { + g_error(_("error: strdup failed\n") ); + exit(1); + } + + for (p = strtok_r(cpy, ",", &dummy); + p != NULL; + p = strtok_r(NULL, ",", &dummy)) { + layer_range_handle_substr(visible_layers, n_layers, p); + } + + free(cpy); +} + + +static void +handle_layer_range(DiagramData *diagdata, const char *show_layers_range) +{ + gboolean *visible_layers; + Layer *layer; + int i; + + visible_layers = g_malloc(diagdata->layers->len * sizeof(gboolean)); + /* Assume all layers are non-visible */ + for (i=0;ilayers->len;i++) + visible_layers[i] = FALSE; + + /* Split the layer-range by commas */ + layer_range_parse_string(visible_layers, diagdata->layers->len, + show_layers_range); + + for (i=0;ilayers->len;i++) { + layer = g_ptr_array_index(diagdata->layers, i); + + if (visible_layers[i] == TRUE) + layer->visible = TRUE; + else + layer->visible = FALSE; + } + g_free(visible_layers); +} + + const char *argv0 = NULL; /** Convert infname to outfname, using input filter inf and export filter @@ -213,7 +331,8 @@ do_convert(const char *infname, const char *outfname, DiaExportFilter *ef, const char *size, - char *show_layers) + char *show_layers, + char *show_layers_range) { DiaImportFilter *inf; DiagramData *diagdata = NULL; @@ -248,8 +367,13 @@ exit(1); } + /* Apply --show-layers-range. Should be before --show-layers since it + * assumes all layers are invisible */ + if (show_layers_range) + handle_layer_range(diagdata, show_layers_range); + /* Apply --show-layers=LAYER,LAYER,... switch. 13.3.2004 sampo iki fi */ - + if (show_layers && *show_layers) { GPtrArray *layers = diagdata->layers; if (layers) { @@ -413,7 +537,8 @@ const char *out_file_name, const char *export_file_format, const char *size, - char* show_layers) { + char* show_layers, + char* show_layers_range) { DDisplay *ddisp = NULL; Diagram *diagram = NULL; gboolean made_conversions = FALSE; @@ -443,7 +568,8 @@ } made_conversions |= do_convert(in_file_name, (out_file_name != NULL?out_file_name:export_file_name), - ef, size, show_layers); + ef, size, show_layers, + show_layers_range); g_free(export_file_name); } else if (out_file_name) { DiaExportFilter *ef = NULL; @@ -453,7 +579,7 @@ ef = filter_get_by_name ("png-libart"); made_conversions |= do_convert(in_file_name, out_file_name, ef, - size, show_layers); + size, show_layers, show_layers_range); } else { if (g_file_test(in_file_name, G_FILE_TEST_EXISTS)) { diagram = diagram_load (in_file_name, NULL); @@ -516,6 +642,7 @@ static char *export_file_format = NULL; static char *size = NULL; static char *show_layers = NULL; + static char *show_layers_range = NULL; gboolean made_conversions = FALSE; GSList *files = NULL; @@ -547,6 +674,8 @@ N_("Export graphics size"), N_("WxH")}, {"show-layers", 'L', 0, G_OPTION_ARG_STRING, NULL, N_("Show only specified layers (e.g. when exporting)"), N_("LAYER,LAYER,...")}, + {"show-layers-range", 'R', 0, G_OPTION_ARG_STRING, NULL, + N_("Show only a range of layers (e.g. when exporting), from 0 to the number of layers in the image"), N_("X-Y,Z,...")}, {"nosplash", 'n', 0, G_OPTION_ARG_NONE, &nosplash, N_("Don't show the splash screen"), NULL }, {"log-to-stderr", 'l', 0, G_OPTION_ARG_NONE, &log_to_stderr, @@ -572,6 +701,8 @@ N_("Export graphics size"), N_("WxH")}, {"show-layers", 'L', POPT_ARG_STRING, NULL, 0, /* 13.3.2004 sampo iki fi */ N_("Show only specified layers (e.g. when exporting)"), N_("LAYER,LAYER,...")}, + {"show-layers-range", 'R', POPT_ARG_STRING, NULL, 0, /* 3.4.2005 ska bth se */ + N_("Show only a range of layers (e.g. when exporting), from 0 to the number of layers in the image"), N_("X-Y,Z,...")}, {"nosplash", 'n', POPT_ARG_NONE, &nosplash, 0, N_("Don't show the splash screen"), NULL }, {"log-to-stderr", 'l', POPT_ARG_NONE, &log_to_stderr, 0, @@ -593,11 +724,13 @@ options[1].description = export_format_string; options[2].arg_data = &size; options[3].arg_data = &show_layers; + options[4].arg_data = &show_layers_range; #elif defined HAVE_POPT options[0].arg = &export_file_name; options[1].arg = &export_file_format; options[2].arg = &size; options[3].arg = &show_layers; + options[4].arg = &show_layers_range; #endif argv0 = (argc > 0) ? argv[0] : "(none)"; @@ -613,7 +746,7 @@ context, options, #endif &files, - &export_file_name, &export_file_format, &size, &show_layers, &nosplash); + &export_file_name, &export_file_format, &size, &show_layers, &show_layers_range, &nosplash); #if defined ENABLE_NLS && defined HAVE_BIND_TEXTDOMAIN_CODESET bind_textdomain_codeset(GETTEXT_PACKAGE,"UTF-8"); @@ -767,7 +900,8 @@ } made_conversions = handle_all_diagrams(files, export_file_name, - export_file_format, size, show_layers); + export_file_format, size, show_layers, + show_layers_range); if (dia_is_interactive && files == NULL) { gchar *filename = g_filename_from_utf8(_("Diagram1.dia"), -1, NULL, NULL, NULL); Diagram *diagram = new_diagram (filename); @@ -965,7 +1099,8 @@ #endif GSList **files, char **export_file_name, char **export_file_format, char **size, - char **show_layers, gboolean* nosplash) + char **show_layers, char **show_layers_range, + gboolean* nosplash) { #if defined HAVE_POPT && !GLIB_CHECK_VERSION(2,5,5) int rc = 0; @@ -1047,6 +1182,12 @@ *show_layers = argv[i]; continue; } + } else if (0 == strcmp(argv[i],"-R")) { + if (i < (argc-1)) { + i++; + *show_layers_range = argv[i]; + continue; + } } else if (0 == strcmp(argv[i],"-n")) { *nosplash = 1; continue; @@ -1061,7 +1202,8 @@ static gboolean handle_all_diagrams(GSList *files, char *export_file_name, - char *export_file_format, char *size, char *show_layers) + char *export_file_format, char *size, char *show_layers, + char *show_layers_range) { GSList *node = NULL; gboolean made_conversions = FALSE; @@ -1069,7 +1211,8 @@ for (node = files; node; node = node->next) { made_conversions |= handle_initial_diagram(node->data, export_file_name, - export_file_format, size, show_layers); + export_file_format, size, show_layers, + show_layers_range); } return made_conversions; }