Skip to content

Commit

Permalink
remove expat xml library in favor of libxml2
Browse files Browse the repository at this point in the history
  • Loading branch information
kontura authored and Conan-Kudo committed Mar 10, 2020
1 parent a14224c commit 7fbb4f9
Show file tree
Hide file tree
Showing 13 changed files with 129 additions and 111 deletions.
2 changes: 0 additions & 2 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,6 @@ SET(G_LOG_DOMAIN "C_CREATEREPOLIB")

find_package(BZip2 REQUIRED)
find_package(CURL REQUIRED)
find_package(EXPAT REQUIRED)
find_package(GLIB2 REQUIRED)
find_package(GTHREAD2 REQUIRED)
find_package(Libmagic REQUIRED)
Expand All @@ -49,7 +48,6 @@ find_package(ZLIB REQUIRED)

include_directories(${BZIP2_INCLUDE_DIRS})
include_directories(${CURL_INCLUDE_DIRS})
include_directories(${EXPAT_INCLUDE_DIRS})
include_directories(${GLIB2_INCLUDE_DIRS})
include_directories(${LIBXML2_INCLUDE_DIR})
include_directories(${OPENSSL_INCLUDE_DIR})
Expand Down
1 change: 0 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ Package build requires - Pkg name in Fedora/Ubuntu:
* bzip2 (http://bzip.org/) - bzip2-devel/libbz2-dev
* cmake (http://www.cmake.org/) - cmake/cmake
* drpm (https://github.com/rpm-software-management/drpm) - drpm-devel/
* expat (http://expat.sourceforge.net/) - expat-devel/libexpat1-dev
* file (http://www.darwinsys.com/file/) - file-devel/libmagic-dev
* glib2 (http://developer.gnome.org/glib/) - glib2-devel/libglib2.0-dev
* libcurl (http://curl.haxx.se/libcurl/) - libcurl-devel/libcurl4-openssl-dev
Expand Down
1 change: 0 additions & 1 deletion createrepo_c.spec
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,6 @@ BuildRequires: cmake
BuildRequires: gcc
BuildRequires: bzip2-devel
BuildRequires: doxygen
BuildRequires: expat-devel
BuildRequires: file-devel
BuildRequires: glib2-devel >= 2.22.0
BuildRequires: libcurl-devel
Expand Down
1 change: 0 additions & 1 deletion src/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,6 @@ ENDIF ()
ADD_LIBRARY(libcreaterepo_c ${createrepo_c_library_type} ${createrepo_c_SRCS})
TARGET_LINK_LIBRARIES(libcreaterepo_c ${BZIP2_LIBRARIES})
TARGET_LINK_LIBRARIES(libcreaterepo_c ${CURL_LIBRARY})
TARGET_LINK_LIBRARIES(libcreaterepo_c ${EXPAT_LIBRARIES})
TARGET_LINK_LIBRARIES(libcreaterepo_c ${GLIB2_LIBRARIES})
TARGET_LINK_LIBRARIES(libcreaterepo_c ${Libmagic_LIBRARY})
TARGET_LINK_LIBRARIES(libcreaterepo_c ${LIBMODULEMD_LIBRARIES})
Expand Down
2 changes: 1 addition & 1 deletion src/createrepo_c.pc.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,5 @@ Version: @VERSION@
Requires: glib-2.0 rpm libcurl sqlite3
Requires.private: zlib libxml-2.0
Libs: -L${libdir} -lcreaterepo_c
Libs.private: -lmagic -lexpat -lbz2 -lzma
Libs.private: -lmagic -lbz2 -lzma
Cflags: -I${includedir}
1 change: 0 additions & 1 deletion src/python/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,6 @@ SET_TARGET_PROPERTIES(_createrepo_c PROPERTIES PREFIX "")
SET_TARGET_PROPERTIES(_createrepo_c PROPERTIES LIBRARY_OUTPUT_DIRECTORY "./createrepo_c")
TARGET_LINK_LIBRARIES(_createrepo_c libcreaterepo_c)
TARGET_LINK_LIBRARIES(_createrepo_c
${EXPAT_LIBRARIES}
${CURL_LIBRARY}
)

Expand Down
42 changes: 18 additions & 24 deletions src/xml_parser.c
Original file line number Diff line number Diff line change
Expand Up @@ -50,8 +50,8 @@ cr_xml_parser_data_free(cr_ParserData *pd)
g_free(pd);
}

void XMLCALL
cr_char_handler(void *pdata, const XML_Char *s, int len)
void
cr_char_handler(void *pdata, const xmlChar *s, int len)
{
int l;
char *c;
Expand Down Expand Up @@ -158,7 +158,7 @@ cr_newpkgcb(cr_Package **pkg,
}

int
cr_xml_parser_generic(XML_Parser parser,
cr_xml_parser_generic(xmlParserCtxtPtr parser,
cr_ParserData *pd,
const char *path,
GError **err)
Expand All @@ -168,6 +168,7 @@ cr_xml_parser_generic(XML_Parser parser,
int ret = CRE_OK;
CR_FILE *f;
GError *tmp_err = NULL;
char buf[XML_BUFFER_SIZE];

assert(parser);
assert(pd);
Expand All @@ -183,15 +184,6 @@ cr_xml_parser_generic(XML_Parser parser,

while (1) {
int len;
void *buf = XML_GetBuffer(parser, XML_BUFFER_SIZE);
if (!buf) {
ret = CRE_MEMORY;
g_set_error(err, ERR_DOMAIN, CRE_MEMORY,
"Out of memory: Cannot allocate buffer for xml parser '%s'",
path);
break;
}

len = cr_read(f, buf, XML_BUFFER_SIZE, &tmp_err);
if (tmp_err) {
ret = tmp_err->code;
Expand All @@ -201,17 +193,18 @@ cr_xml_parser_generic(XML_Parser parser,
break;
}

if (!XML_ParseBuffer(parser, len, len == 0)) {
if (xmlParseChunk(parser, buf, len, len == 0)) {
ret = CRE_XMLPARSER;
xmlErrorPtr xml_err = xmlCtxtGetLastError(parser);
g_critical("%s: parsing error '%s': %s",
__func__,
path,
XML_ErrorString(XML_GetErrorCode(parser)));
xml_err->message);
g_set_error(err, ERR_DOMAIN, CRE_XMLPARSER,
"Parse error '%s' at line: %d (%s)",
path,
(int) XML_GetCurrentLineNumber(parser),
(char *) XML_ErrorString(XML_GetErrorCode(parser)));
(int) xml_err->line,
(char *) xml_err->message);
break;
}

Expand Down Expand Up @@ -242,10 +235,10 @@ cr_xml_parser_generic(XML_Parser parser,
}

int
cr_xml_parser_generic_from_string(XML_Parser parser,
cr_ParserData *pd,
const char *xml_string,
GError **err)
cr_xml_parser_generic_from_string(xmlParserCtxtPtr parser,
cr_ParserData *pd,
const char *xml_string,
GError **err)
{
/* Note: This function uses .err members of cr_ParserData! */

Expand All @@ -256,17 +249,18 @@ cr_xml_parser_generic_from_string(XML_Parser parser,
assert(xml_string);
assert(!err || *err == NULL);

if (!XML_Parse(parser, xml_string, strlen(xml_string), 1)) {
if (xmlParseChunk(parser, xml_string, strlen(xml_string), 1)) {
ret = CRE_XMLPARSER;
xmlErrorPtr xml_err = xmlCtxtGetLastError(parser);
g_critical("%s: parsing error '%s': %s",
__func__,
xml_string,
XML_ErrorString(XML_GetErrorCode(parser)));
xml_err->message);
g_set_error(err, ERR_DOMAIN, CRE_XMLPARSER,
"Parse error '%s' at line: %d (%s)",
xml_string,
(int) XML_GetCurrentLineNumber(parser),
(char *) XML_ErrorString(XML_GetErrorCode(parser)));
(int) xml_err->line,
(char *) xml_err->message);
}

if (pd->err) {
Expand Down
34 changes: 20 additions & 14 deletions src/xml_parser_filelists.c
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@
#include <string.h>
#include <assert.h>
#include <errno.h>
#include <expat.h>
#include "xml_parser_internal.h"
#include "xml_parser.h"
#include "error.h"
Expand Down Expand Up @@ -56,7 +55,7 @@ static cr_StatesSwitch stateswitches[] = {
};

static void XMLCALL
cr_start_handler(void *pdata, const char *element, const char **attr)
cr_start_handler(void *pdata, const xmlChar *element, const xmlChar **attr)
{
GError *tmp_err = NULL;
cr_ParserData *pd = pdata;
Expand All @@ -82,7 +81,7 @@ cr_start_handler(void *pdata, const char *element, const char **attr)

// Find current state by its name
for (sw = pd->swtab[pd->state]; sw->from == pd->state; sw++)
if (!strcmp(element, sw->ename))
if (!strcmp((char *) element, sw->ename))
break;
if (sw->from != pd->state) {
// No state for current element (unknown element)
Expand All @@ -100,6 +99,11 @@ cr_start_handler(void *pdata, const char *element, const char **attr)

const char *val;

if (!attr){
static const char *nullattr;
attr = (const xmlChar **) &nullattr;
}

switch(pd->state) {
case STATE_START:
break;
Expand Down Expand Up @@ -201,7 +205,7 @@ cr_start_handler(void *pdata, const char *element, const char **attr)
}

static void XMLCALL
cr_end_handler(void *pdata, G_GNUC_UNUSED const char *element)
cr_end_handler(void *pdata, G_GNUC_UNUSED const xmlChar *element)
{
cr_ParserData *pd = pdata;
GError *tmp_err = NULL;
Expand Down Expand Up @@ -287,12 +291,11 @@ cr_xml_parse_filelists_internal(const char *target,
void *pkgcb_data,
cr_XmlParserWarningCb warningcb,
void *warningcb_data,
int (*parser_func)(XML_Parser, cr_ParserData *, const char *, GError**),
int (*parser_func)(xmlParserCtxtPtr, cr_ParserData *, const char *, GError**),
GError **err)
{
int ret = CRE_OK;
cr_ParserData *pd;
XML_Parser parser;
GError *tmp_err = NULL;

assert(target);
Expand All @@ -303,13 +306,18 @@ cr_xml_parse_filelists_internal(const char *target,
newpkgcb = cr_newpkgcb;

// Init

parser = XML_ParserCreate(NULL);
XML_SetElementHandler(parser, cr_start_handler, cr_end_handler);
XML_SetCharacterDataHandler(parser, cr_char_handler);
xmlSAXHandler sax;
memset(&sax, 0, sizeof(sax));
sax.startElement = cr_start_handler;
sax.endElement = cr_end_handler;
sax.characters = cr_char_handler;

pd = cr_xml_parser_data(NUMSTATES);
pd->parser = &parser;

xmlParserCtxtPtr parser;
parser = xmlCreatePushParserCtxt(&sax, pd, NULL, 0, NULL);

pd->parser = parser;
pd->state = STATE_START;
pd->newpkgcb_data = newpkgcb_data;
pd->newpkgcb = newpkgcb;
Expand All @@ -323,8 +331,6 @@ cr_xml_parse_filelists_internal(const char *target,
pd->sbtab[sw->to] = sw->from;
}

XML_SetUserData(parser, pd);

// Parsing

ret = parser_func(parser, pd, target, &tmp_err);
Expand Down Expand Up @@ -353,7 +359,7 @@ cr_xml_parse_filelists_internal(const char *target,
}

cr_xml_parser_data_free(pd);
XML_ParserFree(parser);
xmlFreeParserCtxt(parser);

return ret;
}
Expand Down
16 changes: 8 additions & 8 deletions src/xml_parser_internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ extern "C" {
#endif

#include <string.h>
#include <expat.h>
#include <libxml/parser.h>
#include "xml_parser.h"
#include "error.h"
#include "package.h"
Expand Down Expand Up @@ -78,7 +78,7 @@ typedef struct _cr_ParserData {
int lcontent; /*!< The content lenght */
int acontent; /*!< Available bytes in the content */

XML_Parser *parser; /*!< The parser */
xmlParserCtxtPtr parser; /*!< The parser */
cr_StatesSwitch **swtab; /*!< Pointers to statesswitches table */
unsigned int *sbtab; /*!< stab[to_state] = from_state */

Expand Down Expand Up @@ -172,11 +172,11 @@ void cr_xml_parser_data_free(cr_ParserData *pd);
* @return Value or NULL
*/
static inline const char *
cr_find_attr(const char *name, const char **attr)
cr_find_attr(const char *name, const xmlChar **attr)
{
while (*attr) {
if (!strcmp(name, *attr))
return attr[1];
if (!strcmp(name, (char *) *attr))
return (const char *) attr[1];
attr += 2;
}

Expand All @@ -185,7 +185,7 @@ cr_find_attr(const char *name, const char **attr)

/** XML character handler
*/
void XMLCALL cr_char_handler(void *pdata, const XML_Char *s, int len);
void cr_char_handler(void *pdata, const xmlChar *s, int len);

/** Wrapper for user warning cb.
* It checks if warningcb is defined, if defined, it build warning msg from
Expand Down Expand Up @@ -214,12 +214,12 @@ int cr_newpkgcb(cr_Package **pkg,
/** Generic parser.
*/
int
cr_xml_parser_generic(XML_Parser parser,
cr_xml_parser_generic(xmlParserCtxtPtr parser,
cr_ParserData *pd,
const char *path,
GError **err);
int
cr_xml_parser_generic_from_string(XML_Parser parser,
cr_xml_parser_generic_from_string(xmlParserCtxtPtr parser,
cr_ParserData *pd,
const char *xml_string,
GError **err);
Expand Down
Loading

0 comments on commit 7fbb4f9

Please sign in to comment.