void Init_fastxml() { if (xmlHasFeature(XML_WITH_TREE) == 0) rb_raise( rb_eRuntimeError, "libxml not built with tree support" ); if (xmlHasFeature(XML_WITH_XPATH) == 0) rb_raise( rb_eRuntimeError, "libxml not built with xpath support" ); s_readlines = rb_intern("readlines"); s_to_s = rb_intern("to_s"); xmlInitParser(); xmlXPathInit(); xsltInit(); rb_mFastXml = rb_define_module( "FastXml" ); rb_define_const( rb_mFastXml, "LIBXML_VERSION", rb_str_new2( LIBXML_DOTTED_VERSION ) ); /* setting symbols */ rb_sValidateDtd = ID2SYM( rb_intern("validate") ); rb_sForgivingParse = ID2SYM( rb_intern("forgiving") ); rb_sHtmlParse = ID2SYM( rb_intern("html") ); Init_fastxml_doc(); /* Doc */ Init_fastxml_node(); /* Node */ Init_fastxml_nodelist(); /* NodeList */ Init_fastxml_attrlist(); /* AttrList */ /* pull in the ruby side of things */ rb_require( "fastxml/fastxml_lib" ); // ruby-side methods for the FastXml classes rb_require( "fastxml/fastxml_helpers" ); // FastXml and FastHtml methods }
BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpv) { switch(fdwReason) { case DLL_PROCESS_ATTACH: #ifdef HAVE_LIBXML2 xmlInitParser(); #endif #ifdef HAVE_XSLTINIT xsltInit(); #endif hInstance = hInstDLL; DisableThreadLibraryCalls(hInstDLL); break; case DLL_PROCESS_DETACH: #ifdef HAVE_LIBXSLT xsltCleanupGlobals(); #endif #ifdef HAVE_LIBXML2 xmlCleanupParser(); process_detach(); #endif break; } return TRUE; }
void xslt::init::init_library() { xsltInit(); // set some defautls process_xincludes(true); set_allow_extension_functions_leak(false); // keep libxslt silent xsltSetGenericErrorFunc(0, xslt_error); xsltSetGenericDebugFunc(0, xslt_error); #ifdef HAVE_LIBEXSLT // load EXSLT exsltRegisterAll(); #endif }
/** * Transform a document and return it. * @param in document to transform. * @return transformed document. */ Document *XSLTransform::transformDocument(Document *in) throw(XSLException) { xsltInit(); // prepare parameters const char **aparams = new const char *[params.count() * 2 + 1]; ASSERT(aparams); int i = 0; for(genstruct::AssocList<string, string>::PairIterator iter(params); iter; iter++) { aparams[i] = new char[(*iter).fst.length() + 1]; strcpy((char *)aparams[i], &(*iter).fst); i++; aparams[i] = new char[(*iter).snd.length() + 1]; strcpy((char *)aparams[i], &(*iter).snd); i++; } aparams[params.count() * 2] = 0; // perform the transformation xsltSetGenericErrorFunc(this, handle_error); xmlDoc *new_doc = xmlCopyDoc(DOC(ss->getNode()), 1); xsltStylesheetPtr stylesheet = xsltParseStylesheetDoc(new_doc); if(!stylesheet) throw XSLException("can not compile stylesheet"); xmlDoc *res = xsltApplyStylesheet(stylesheet, DOC(in->getNode()), aparams); // clean up for(int i = 0; aparams[i]; i++) delete [] aparams[i]; delete [] aparams; xmlSetStructuredErrorFunc(0, 0); xsltFreeStylesheet(stylesheet); if(!res) throw XSLException("error during XSLT transformation"); // return result return fact->makeDocument(res); }
int xmi_xmso_to_xmsi_xslt(char *xmsofile, char *xmsifile , char *outputfile ) { xsltStylesheetPtr cur = NULL; xmlDocPtr doc, res; xmlParserCtxtPtr ctx; const char *params[1] = {NULL}; xmlXPathContextPtr xpathCtx; xmlXPathObjectPtr xpathObj; #ifdef G_OS_WIN32 xmlChar *xsltfile; if (xmi_registry_win_query(XMI_REGISTRY_WIN_XMSO2XMSI,(char **) &xsltfile) == 0) return 0; #elif defined(MAC_INTEGRATION) xmlChar *xsltfile; if (xmi_resources_mac_query(XMI_RESOURCES_MAC_XMSO2XMSI,(char **) &xsltfile) == 0) return 0; #else const xmlChar xsltfile[] = XMI_XMSO2XMSI_XSLT; #endif xsltInit(); cur = xsltParseStylesheetFile(xsltfile); if (cur == NULL) return 0; #if defined(G_OS_WIN32) || defined (MAC_INTEGRATION) free(xsltfile); #endif if ((ctx=xmlNewParserCtxt()) == NULL) { fprintf(stderr,"xmlNewParserCtxt error\n"); return 0; } if ((doc = xmlCtxtReadFile(ctx,xmsofile,NULL,XML_PARSE_DTDVALID | XML_PARSE_NOBLANKS | XML_PARSE_DTDATTR)) == NULL) { fprintf(stderr,"xmlCtxtReadFile error for %s\n",xmsofile); xmlFreeParserCtxt(ctx); return 0; } if (ctx->valid == 0) { fprintf(stderr,"Error validating %s\n",xmsofile); xmlFreeDoc(doc); return 0; } xmlFreeParserCtxt(ctx); res = xsltApplyStylesheet(cur, doc, params); if (res == NULL) return 0; if (outputfile != NULL) { xpathCtx = xmlXPathNewContext(res); if(xpathCtx == NULL) { fprintf(stderr,"Error: unable to create new XPath context\n"); return 0; } xpathObj = xmlXPathEvalExpression((const xmlChar *) "/xmimsim/general/outputfile", xpathCtx); if(xpathObj == NULL) { fprintf(stderr,"Error: unable to evaluate xpath expression \"%s\"\n","xmimsim/general/outputfile" ); xmlXPathFreeContext(xpathCtx); return 0; } update_xpath_nodes(xpathObj->nodesetval, (const xmlChar *) outputfile); xmlXPathFreeObject(xpathObj); xmlXPathFreeContext(xpathCtx); } xsltSaveResultToFilename(xmsifile, res, cur, 0); xsltFreeStylesheet(cur); xmlFreeDoc(res); xmlFreeDoc(doc); xsltCleanupGlobals(); return 1; }
int xmi_xmso_to_htm_xslt(char *xmsofile, char *xmsifile, unsigned convoluted) { xsltStylesheetPtr cur = NULL; xmlDocPtr doc, res; xmlParserCtxtPtr ctx; const char *params[3]; char catalog[] = XMI_CATALOG; xmlXPathContextPtr xpathCtx; xmlXPathObjectPtr xpathObj; char parm_name[] = "type1"; char s_convoluted[] = "'convoluted'"; char s_unconvoluted[] = "'unconvoluted'"; #ifdef G_OS_WIN32 xmlChar *xsltfile; if (xmi_registry_win_query(XMI_REGISTRY_WIN_XMSO2HTM,(char **) &xsltfile) == 0) return 0; #elif defined(MAC_INTEGRATION) xmlChar *xsltfile; if (xmi_resources_mac_query(XMI_RESOURCES_MAC_XMSO2HTM,(char **) &xsltfile) == 0) return 0; #else const xmlChar xsltfile[] = XMI_XMSO2HTM_XSLT; #endif xsltInit(); params[0] = parm_name; if ( convoluted ) params[1] = s_convoluted; else params[1] = s_unconvoluted; params[2] = NULL; //fprintf(stdout, "parm 0 = %s \n", params[0] ); //fprintf(stdout, "parm 1 = %s \n", params[1] ); //fprintf(stdout, "parm 2 = %s \n", params[2] ); cur = xsltParseStylesheetFile(xsltfile); if (cur == NULL) return 0; #if defined(G_OS_WIN32) || defined (MAC_INTEGRATION) free(xsltfile); #endif if ((ctx=xmlNewParserCtxt()) == NULL) { fprintf(stderr,"xmlNewParserCtxt error\n"); return 0; } if ((doc = xmlCtxtReadFile(ctx,xmsofile,NULL,XML_PARSE_DTDVALID | XML_PARSE_NOBLANKS | XML_PARSE_DTDATTR)) == NULL) { fprintf(stderr,"xmlCtxtReadFile error for %s\n",xmsofile); xmlFreeParserCtxt(ctx); return 0; } if (ctx->valid == 0) { fprintf(stderr,"Error validating %s\n",xmsofile); xmlFreeDoc(doc); return 0; } xmlFreeParserCtxt(ctx); res = xsltApplyStylesheet(cur, doc, params); if (res == NULL) return 0; xsltSaveResultToFilename(xmsifile, res, cur, 0); xsltFreeStylesheet(cur); xmlFreeDoc(res); xmlFreeDoc(doc); xsltCleanupGlobals(); return 1; }
/** * rtevald_parser main function. * * @param argc * @param argv * * @return Returns the result of the process_submission_queue() function. */ int main(int argc, char **argv) { eurephiaVALUES *config = NULL, *prgargs = NULL; char xsltfile[2050], *reportdir = NULL; xsltStylesheet *xslt = NULL; dbconn *dbc = NULL; pthread_t **threads = NULL; pthread_attr_t **thread_attrs = NULL; pthread_mutex_t mtx_sysreg = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_t mtx_thrcnt = PTHREAD_MUTEX_INITIALIZER; threadData_t **thrdata = NULL; struct mq_attr msgq_attr; mqd_t msgq = 0; int i,rc, mq_init = 0, max_threads = 0, started_threads = 0, activethreads = 0; unsigned int max_report_size = 0; // Initialise XML and XSLT libraries xsltInit(); xmlInitParser(); prgargs = parse_arguments(argc, argv); if( prgargs == NULL ) { fprintf(stderr, "** ERROR ** Failed to parse program arguments\n"); rc = 2; goto exit; } // Setup a log context logctx = init_log(eGet_value(prgargs, "log"), eGet_value(prgargs, "loglevel")); if( !logctx ) { fprintf(stderr, "** ERROR ** Could not setup a log context\n"); eFree_values(prgargs); rc = 2; goto exit; } // Fetch configuration config = read_config(logctx, prgargs, "xmlrpc_parser"); eFree_values(prgargs); // read_config() copies prgargs into config, we don't need prgargs anymore // Daemonise process if requested if( atoi_nullsafe(eGet_value(config, "daemon")) == 1 ) { if( daemonise(logctx) < 1 ) { rc = 3; goto exit; } } // Parse XSLT template snprintf(xsltfile, 512, "%s/%s", eGet_value(config, "xsltpath"), XMLPARSER_XSL); writelog(logctx, LOG_DEBUG, "Parsing XSLT file: %s", xsltfile); xslt = xsltParseStylesheetFile((xmlChar *) xsltfile); if( !xslt ) { writelog(logctx, LOG_EMERG, "Could not parse XSLT template: %s", xsltfile); rc = 2; goto exit; } // Open a POSIX MQ writelog(logctx, LOG_DEBUG, "Preparing POSIX MQ queue: /rteval_parsequeue"); memset(&msgq, 0, sizeof(mqd_t)); msgq_attr.mq_maxmsg = get_mqueue_msg_max(logctx); msgq_attr.mq_msgsize = sizeof(parseJob_t); msgq_attr.mq_flags = O_NONBLOCK; msgq = mq_open("/rteval_parsequeue", O_RDWR | O_CREAT, 0600, &msgq_attr); if( msgq < 0 ) { writelog(logctx, LOG_EMERG, "Could not open message queue: %s", strerror(errno)); rc = 2; goto exit; } mq_init = 1; // Get the number of worker threads max_threads = atoi_nullsafe(eGet_value(config, "threads")); if( max_threads == 0 ) { max_threads = 4; } // Get a database connection for the main thread dbc = db_connect(config, max_threads, logctx); if( !dbc ) { rc = 4; goto exit; } // Prepare all threads threads = calloc(max_threads + 1, sizeof(pthread_t *)); thread_attrs = calloc(max_threads + 1, sizeof(pthread_attr_t *)); thrdata = calloc(max_threads + 1, sizeof(threadData_t *)); assert( (threads != NULL) && (thread_attrs != NULL) && (thrdata != NULL) ); reportdir = eGet_value(config, "reportdir"); writelog(logctx, LOG_INFO, "Starting %i worker threads", max_threads); max_report_size = defaultIntValue(atoi_nullsafe(eGet_value(config, "max_report_size")), 1024*1024); for( i = 0; i < max_threads; i++ ) { // Prepare thread specific data thrdata[i] = malloc_nullsafe(logctx, sizeof(threadData_t)); if( !thrdata[i] ) { writelog(logctx, LOG_EMERG, "Could not allocate memory for thread data"); rc = 2; goto exit; } // Get a database connection for the thread thrdata[i]->dbc = db_connect(config, i, logctx); if( !thrdata[i]->dbc ) { writelog(logctx, LOG_EMERG, "Could not connect to the database for thread %i", i); rc = 2; shutdown = 1; goto exit; } thrdata[i]->shutdown = &shutdown; thrdata[i]->threadcount = &activethreads; thrdata[i]->mtx_thrcnt = &mtx_thrcnt; thrdata[i]->id = i; thrdata[i]->msgq = msgq; thrdata[i]->mtx_sysreg = &mtx_sysreg; thrdata[i]->xslt = xslt; thrdata[i]->destdir = reportdir; thrdata[i]->max_report_size = max_report_size; thread_attrs[i] = malloc_nullsafe(logctx, sizeof(pthread_attr_t)); if( !thread_attrs[i] ) { writelog(logctx, LOG_EMERG, "Could not allocate memory for thread attributes"); rc = 2; goto exit; } pthread_attr_init(thread_attrs[i]); pthread_attr_setdetachstate(thread_attrs[i], PTHREAD_CREATE_JOINABLE); threads[i] = malloc_nullsafe(logctx, sizeof(pthread_t)); if( !threads[i] ) { writelog(logctx, LOG_EMERG, "Could not allocate memory for pthread_t"); rc = 2; goto exit; } } // Setup signal catching signal(SIGINT, sigcatch); signal(SIGTERM, sigcatch); signal(SIGHUP, SIG_IGN); signal(SIGUSR1, sigcatch); signal(SIGUSR2, SIG_IGN); // Start the threads for( i = 0; i < max_threads; i++ ) { int thr_rc = pthread_create(threads[i], thread_attrs[i], parsethread, thrdata[i]); if( thr_rc < 0 ) { writelog(logctx, LOG_EMERG, "** ERROR ** Failed to start thread %i: %s", i, strerror(thr_rc)); rc = 3; goto exit; } started_threads++; } // Main routine // // checks the submission queue and puts unprocessed records on the POSIX MQ // to be parsed by one of the threads // sleep(3); // Allow at least a few parser threads to settle down first before really starting writelog(logctx, LOG_DEBUG, "Starting submission queue checker"); rc = process_submission_queue(dbc, msgq, &activethreads); writelog(logctx, LOG_DEBUG, "Submission queue checker shut down"); exit: // Clean up all threads for( i = 0; i < max_threads; i++ ) { // Wait for all threads to exit if( (i < started_threads) && threads && threads[i] ) { void *thread_rc; int j_rc; if( (j_rc = pthread_join(*threads[i], &thread_rc)) != 0 ) { writelog(logctx, LOG_CRIT, "Failed to join thread %i: %s", i, strerror(j_rc)); } pthread_attr_destroy(thread_attrs[i]); } if( threads ) { free_nullsafe(threads[i]); } if( thread_attrs ) { free_nullsafe(thread_attrs[i]); } // Disconnect threads database connection if( thrdata && thrdata[i] ) { db_disconnect(thrdata[i]->dbc); free_nullsafe(thrdata[i]); } } free_nullsafe(thrdata); free_nullsafe(threads); free_nullsafe(thread_attrs); // Close message queue if( mq_init == 1 ) { errno = 0; if( mq_close(msgq) < 0 ) { writelog(logctx, LOG_CRIT, "Failed to close message queue: %s", strerror(errno)); } errno = 0; if( mq_unlink("/rteval_parsequeue") < 0 ) { writelog(logctx, LOG_ALERT, "Failed to remove the message queue: %s", strerror(errno)); } } // Disconnect from database, main thread connection db_disconnect(dbc); // Free up the rest eFree_values(config); xsltFreeStylesheet(xslt); xmlCleanupParser(); xsltCleanupGlobals(); writelog(logctx, LOG_EMERG, "rteval-parserd is stopped"); close_log(logctx); return rc; }
void oscap_init(void) { xmlInitParser(); xsltInit(); exsltRegisterAll(); }