static int cXML2WBXML_proc_setting(VALUE key, VALUE value, VALUE self) { ID key_id = 0, value_id = 0; WBXMLConvXML2WBXML *conv = NULL; mWBXML2_validate_setting(key, value, &key_id, &value_id); Data_Get_Struct(self, WBXMLConvXML2WBXML, conv); if (rb_intern("version") == key_id) { WBXMLVersion version = WBXML_VERSION_UNKNOWN; if (rb_intern("v1_0") == value_id) { version = WBXML_VERSION_10; } else if (rb_intern("v1_1") == value_id) { version = WBXML_VERSION_11; } else if (rb_intern("v1_2") == value_id) { version = WBXML_VERSION_12; } else if (rb_intern("v1_3") == value_id) { version = WBXML_VERSION_13; } else { rb_raise(rb_eTypeError, "unknown :version value."); } wbxml_conv_xml2wbxml_set_version(conv, version); } else if (rb_intern("preserve_whitespaces") == key_id && rb_intern("true") == value_id) { wbxml_conv_xml2wbxml_enable_preserve_whitespaces(conv); } else if (rb_intern("string_table") == key_id && rb_intern("false") == value_id) { wbxml_conv_xml2wbxml_disable_string_table(conv); } else if (rb_intern("public_id") == key_id && rb_intern("false") == value_id) { wbxml_conv_xml2wbxml_disable_public_id(conv); } else { rb_raise(rb_eTypeError, "unknown directive passed to new."); } return ST_CONTINUE; }
WB_LONG main(WB_LONG argc, WB_TINY **argv) { WB_UTINY *wbxml = NULL, *output = NULL, *xml = NULL; FILE *input_file = NULL, *output_file = NULL; WB_ULONG wbxml_len = 0; WB_LONG count = 0, xml_len = 0, total = 0; WB_TINY opt; WBXMLError ret = WBXML_OK; WB_UTINY input_buffer[INPUT_BUFFER_SIZE + 1]; WBXMLConvXML2WBXML *conv = NULL; ret = wbxml_conv_xml2wbxml_create(&conv); if (ret != WBXML_OK) { fprintf(stderr, "xml2wbxml failed: %s\n", wbxml_errors_string(ret)); goto clean_up; } while ((opt = (WB_TINY) wbxml_getopt(argc, argv, "nkah?o:v:")) != EOF) { switch (opt) { case 'v': wbxml_conv_xml2wbxml_set_version(conv, get_version((const WB_TINY*)optarg)); break; case 'n': wbxml_conv_xml2wbxml_disable_string_table(conv); break; case 'k': wbxml_conv_xml2wbxml_enable_preserve_whitespaces(conv); break; case 'a': wbxml_conv_xml2wbxml_disable_public_id(conv); break; case 'o': output = (WB_UTINY*) optarg; break; case 'h': case '?': default: help(); return 0; } } if (optind >= argc) { fprintf(stderr, "Missing arguments\n"); help(); return 0; } #ifdef WBXML_USE_LEAKTRACKER lt_init_mem(); lt_log_open_file("xml2wbxml.log"); lt_log(0, "\n***************************\n Converting file: %s", argv[optind]); #endif /********************************** * Read the XML Document */ if (WBXML_STRCMP(argv[optind], "-") == 0) { input_file = stdin; } else { /* Open XML document */ input_file = fopen(argv[optind], "r"); if (input_file == NULL) { printf("Failed to open %s\n", argv[optind]); goto clean_up; } } /* Read XML document */ while(!feof(input_file)) { count = fread(input_buffer, sizeof(WB_UTINY), INPUT_BUFFER_SIZE, input_file); if (ferror(input_file)) { fprintf(stderr, "Error while reading from file %s\n", argv[1]); if (input_file != stdin) fclose(input_file); if (xml != NULL) #ifdef WBXML_USE_LEAKTRACKER wbxml_free(xml); #else free(xml); #endif goto clean_up; } total += count; #ifdef WBXML_USE_LEAKTRACKER xml = wbxml_realloc(xml, total + 1); #else xml = realloc(xml, total + 1); #endif if (xml == NULL) { fprintf(stderr, "Not enought memory\n"); if (input_file != stdin) fclose(input_file); goto clean_up; } memcpy(xml + xml_len, input_buffer, count); xml_len += count; } if (input_file != stdin) fclose(input_file); xml[xml_len] = '\0'; /* Convert XML document */ ret = wbxml_conv_xml2wbxml_run(conv, xml, xml_len, &wbxml, &wbxml_len); if (ret != WBXML_OK) { fprintf(stderr, "xml2wbxml failed: %s\n", wbxml_errors_string(ret)); } else { fprintf(stderr, "xml2wbxml succeded\n"); if (output != NULL) { if (WBXML_STRCMP(output, "-") == 0) { output_file = stdout; } else { /* Open Output File */ output_file = fopen((const WB_TINY*) output, "wb"); } if (output_file == NULL) { fprintf(stderr, "Failed to open output file: %s\n", output); } else { /* Write to Output File */ if (fwrite(wbxml, sizeof(WB_UTINY), wbxml_len, output_file) < wbxml_len) fprintf(stderr, "Error while writing to file: %s\n", output); /* else fprintf(stderr, "Written %u bytes to file: %s\n", wbxml_len, output); */ if (output_file != stdout) fclose(output_file); } } /* Clean-up */ if (wbxml != NULL) #ifdef WBXML_USE_LEAKTRACKER wbxml_free(wbxml); #else free(wbxml); #endif } if (xml != NULL) #ifdef WBXML_USE_LEAKTRACKER wbxml_free(xml); #else free(xml); #endif clean_up: if (conv != NULL) wbxml_conv_xml2wbxml_destroy(conv); #ifdef WBXML_USE_LEAKTRACKER lt_check_leaks(); lt_shutdown_mem(); lt_log_close_file(); #endif return ret; }