kxslt1.c
最終更新:2009/12/19
001: /* 002: * kxslt1.c 003: */ 004: 005: #define USAGE "Usage: kxslt1 <in_file> <xsl_file> <out_file>" 006: 007: #include "mystab.h" 008: #include "myio_apr.h" 009: #include "myio_xml.h" 010: 011: int apr_my_main ( 012: int ac 013: , char **av 014: , apr_file_t * astdin 015: , apr_file_t * astdout 016: , apr_file_t * astderr 017: , apr_pool_t * pool 018: ) { 019: 020: int error_flag = 0; 021: 022: char *in_filename = NULL; 023: char *xsl_filename = NULL; 024: char *out_filename = NULL; 025: 026: MYIO *in = NULL; 027: MYIO *out = NULL; 028: 029: xmlDocPtr srcDom = NULL; 030: xsltStylesheetPtr style = NULL; 031: xmlDocPtr res = NULL; 032: 033: if (ac < 3) { 034: apr_file_printf(astderr, "%s\n", USAGE); 035: error_flag = 1; 036: goto _FINALLY_; 037: } 038: 039: in_filename = av[1]; 040: xsl_filename = av[2]; 041: out_filename = av[3]; 042: 043: /* 入力ファイルのオープン */ 044: 045: in = MYIO_fp_open(in_filename, APR_FOPEN_READ|APR_FOPEN_BINARY, APR_OS_DEFAULT, pool); 046: if (! in) { 047: apr_file_printf(astderr, "ERROR: MYIO_fp_open: %s ", in_filename); 048: error_flag = 1; 049: goto _FINALLY_; 050: } 051: 052: out = MYIO_fp_open(out_filename, 053: APR_FOPEN_WRITE|APR_FOPEN_CREATE|APR_FOPEN_BINARY|APR_FOPEN_TRUNCATE, 054: APR_OS_DEFAULT, pool); 055: if (!out) { 056: apr_file_printf(astderr, "ERROR: file open [%s] ", out_filename); 057: error_flag = 1; 058: goto _FINALLY_; 059: } 060: 061: srcDom = my_xml_read(in); 062: if (!srcDom) { 063: apr_file_printf(astderr, "ERROR: my_xml_read [%s] ", in_filename); 064: error_flag = 1; 065: goto _FINALLY_; 066: } 067: 068: style = xsltParseStylesheetFile ((const xmlChar*)xsl_filename); 069: if (!style) { 070: apr_file_printf(astderr, "ERROR: xsltParseStylesheetFile [%s] ", xsl_filename); 071: error_flag = 1; 072: goto _FINALLY_; 073: } 074: 075: res = my_xml_transform(srcDom, style); 076: if (!res) { 077: apr_file_printf(astderr, "ERROR: my_xml_transform "); 078: error_flag = 1; 079: goto _FINALLY_; 080: } 081: 082: { 083: int wrote_size = MYIO_xslt_write(out, res, style); 084: if (wrote_size<0) { 085: error_flag = 1; 086: apr_file_printf(astderr, "ERROR: MYIO_xslt_write "); 087: } else { 088: apr_file_printf(astderr, "%d bytes saved to %s.\n", wrote_size, out_filename); 089: } 090: } 091: 092: _FINALLY_: 093: 094: if (style) { 095: xsltFreeStylesheet(style); 096: style = NULL; 097: } 098: if (srcDom) { 099: xmlFreeDoc(srcDom); 100: srcDom = NULL; 101: } 102: if (res) { 103: xmlFreeDoc(res); 104: res = NULL; 105: } 106: xmlCleanupParser(); 107: xsltCleanupGlobals(); 108: xmlMemoryDump(); 109: 110: if (in) { 111: MYIO_fp_close(in); 112: in = NULL; 113: } 114: 115: if (out) { 116: MYIO_fp_close(out); 117: out = NULL; 118: } 119: 120: if (error_flag) { 121: apr_file_printf(astderr, "failed.\n"); 122: return 1; /* 異常終了 */ 123: } 124: 125: apr_file_printf(astdout, "done.\n"); 126: return 0; /* 正常終了 */ 127: 128: }
KAKU PROJECT (2009) |