- comps DOCTYPE read-write-read fix

This commit is contained in:
Jindrich Luza 2014-03-13 13:37:04 +01:00
parent 1780ba5a0f
commit 63b6727cca
12 changed files with 153 additions and 35 deletions

View File

@ -7,3 +7,8 @@ COMPS_DefaultsOptions COMPS_DDefaultsOptions = {
.default_default = false,
.default_pkgtype = COMPS_PACKAGE_MANDATORY
};
char* comps_default_doctype_name = "comps";
char* comps_default_doctype_sysid = "comps.dtd";
char* comps_default_doctype_pubid = "-//Red Hat, Inc.//DTD Comps info//EN";

View File

@ -3,6 +3,8 @@
#include <stdbool.h>
#include "comps_obj.h"
typedef struct COMPS_DefaultsOptions {
bool default_uservisible;
bool default_biarchonly;
@ -11,5 +13,8 @@ typedef struct COMPS_DefaultsOptions {
} COMPS_DefaultsOptions;
extern COMPS_DefaultsOptions COMPS_DDefaultsOptions;
extern char* comps_default_doctype_name;
extern char* comps_default_doctype_pubid;
extern char* comps_default_doctype_sysid;
#endif

View File

@ -21,6 +21,7 @@
#include "comps_set.h"
//#include "comps_types.h"
#include "comps_utils.h"
#include "comps_default.h"
#include <stdio.h>
#include <assert.h>
@ -37,20 +38,29 @@ void comps_doc_create(COMPS_Doc* doc, COMPS_Object **args) {
} else {
doc->encoding = NULL;
}
doc->doctype_name = comps_str(comps_default_doctype_name);
doc->doctype_sysid = comps_str(comps_default_doctype_sysid);
doc->doctype_pubid = comps_str(comps_default_doctype_pubid);
}
COMPS_CREATE_u(doc, COMPS_Doc)
void comps_doc_copy(COMPS_Doc *doc_dst, COMPS_Doc *doc_src) {
doc_dst->encoding = (COMPS_Str*) comps_object_copy((COMPS_Object*)doc_src->encoding);
doc_dst->objects = (COMPS_ObjDict*) comps_object_copy((COMPS_Object*)doc_src->objects);
doc_dst->encoding = (COMPS_Str*) COMPS_OBJECT_COPY(doc_src->encoding);
doc_dst->doctype_name = (COMPS_Str*) COMPS_OBJECT_COPY(doc_src->doctype_name);
doc_dst->doctype_sysid = (COMPS_Str*) COMPS_OBJECT_COPY(doc_src->doctype_sysid);
doc_dst->doctype_pubid = (COMPS_Str*) COMPS_OBJECT_COPY(doc_src->doctype_pubid);
doc_dst->objects = (COMPS_ObjDict*) COMPS_OBJECT_COPY(doc_src->objects);
}
COMPS_COPY_u(doc, COMPS_Doc)
void comps_doc_destroy(COMPS_Doc *doc) {
if (doc != NULL) {
COMPS_OBJECT_DESTROY(doc->log);
COMPS_OBJECT_DESTROY((COMPS_Object*)doc->objects);
COMPS_OBJECT_DESTROY((COMPS_Object*)doc->encoding);
COMPS_OBJECT_DESTROY(doc->log);
COMPS_OBJECT_DESTROY(doc->objects);
COMPS_OBJECT_DESTROY(doc->encoding);
COMPS_OBJECT_DESTROY(doc->doctype_name);
COMPS_OBJECT_DESTROY(doc->doctype_sysid);
COMPS_OBJECT_DESTROY(doc->doctype_pubid);
}
}
COMPS_DESTROY_u(doc, COMPS_Doc)
@ -62,8 +72,16 @@ signed char comps_doc_cmp_u(COMPS_Object *obj1, COMPS_Object *obj2) {
#define _doc1_ ((COMPS_Doc*)obj1)
#define _doc2_ ((COMPS_Doc*)obj2)
if (!comps_object_cmp((COMPS_Object*)_doc1_->encoding,
(COMPS_Object*)_doc2_->encoding)) {
if (!COMPS_OBJECT_CMP(_doc1_->encoding, _doc2_->encoding)) {
return 0;
}
if (!COMPS_OBJECT_CMP(_doc1_->doctype_name, _doc2_->doctype_name)) {
return 0;
}
if (!COMPS_OBJECT_CMP(_doc1_->doctype_sysid, _doc2_->doctype_sysid)) {
return 0;
}
if (!COMPS_OBJECT_CMP(_doc1_->doctype_pubid, _doc2_->doctype_pubid)) {
return 0;
}
tmp1 = (COMPS_Object*) comps_doc_categories(_doc1_);
@ -92,7 +110,6 @@ signed char comps_doc_cmp_u(COMPS_Object *obj1, COMPS_Object *obj2) {
COMPS_OBJECT_DESTROY(tmp1);
COMPS_OBJECT_DESTROY(tmp2);
if (!ret) {
printf("envs cmp fail\n");
return ret;
}
@ -102,7 +119,6 @@ signed char comps_doc_cmp_u(COMPS_Object *obj1, COMPS_Object *obj2) {
COMPS_OBJECT_DESTROY(tmp1);
COMPS_OBJECT_DESTROY(tmp2);
if (!ret) {
//printf("langpacks cmp fail\n");
return ret;
}
@ -162,8 +178,9 @@ signed char comps2xml_f(COMPS_Doc * doc, char *filename, char stdoutredirect,
char *str;
signed char genret;
//doc->log->redirect2output = stdoutredirect;
doc->log->std_out = stdoutredirect;
xmlTextWriterPtr writer = xmlNewTextWriterDoc(&xmldoc, 0);
if ((COMPS_Object*)doc->encoding) {
str = comps_object_tostr((COMPS_Object*)doc->encoding);
retc = xmlTextWriterStartDocument(writer, NULL, str, NULL);
@ -171,9 +188,9 @@ signed char comps2xml_f(COMPS_Doc * doc, char *filename, char stdoutredirect,
} else {
retc = xmlTextWriterStartDocument(writer, NULL, "UTF-8", NULL);
}
doc->log->std_out = stdoutredirect;
if (retc<0)
comps_log_error(doc->log, COMPS_ERR_XMLGEN, 0);
if (!xml_options)
xml_options = &COMPS_XMLDefaultOptions;
if (!def_options)
@ -200,8 +217,7 @@ char* comps2xml_str(COMPS_Doc *doc, COMPS_XMLOptions *xml_options,
xmlDocPtr xmldoc;
const char *xmlstr;
signed char genret;
char *str;
char *ret;
char *str, *ret;
int retc;
xmlBuffer *xmlbuff = xmlBufferCreate();
@ -216,6 +232,7 @@ char* comps2xml_str(COMPS_Doc *doc, COMPS_XMLOptions *xml_options,
retc = xmlTextWriterStartDocument(writer, NULL, "UTF-8", NULL);
}
if (retc<0) comps_log_error(doc->log, COMPS_ERR_XMLGEN, 0);
if (!xml_options)
xml_options = &COMPS_XMLDefaultOptions;
if (!def_options)
@ -260,18 +277,6 @@ COMPS_Doc* comps_doc_union(COMPS_Doc *c1, COMPS_Doc *c2) {
COMPS_ObjList *groups = comps_doc_groups(c1);
COMPS_ObjList *categories = comps_doc_categories(c1);
COMPS_ObjList *envs = comps_doc_environments(c1);
/*COMPS_ObjList* (*getter[])(COMPS_Doc*) = {&comps_doc_groups,
&comps_doc_categories,
&comps_doc_environments};
void (*adder[])(COMPS_Doc*, COMPS_Object*) = {
(void (*)(COMPS_Doc*, COMPS_Object*))&comps_doc_add_group,
(void (*)(COMPS_Doc*, COMPS_Object*))&comps_doc_add_category,
(void (*)(COMPS_Doc*, COMPS_Object*))&comps_doc_add_environment};
COMPS_Object* (*_union[])(COMPS_Object*, COMPS_Object*) = {
&comps_docgroup_union,
&comps_doccategory_union,
&comps_docenv_union};
*/
void *tmpdata;
res = COMPS_OBJECT_CREATE(COMPS_Doc, (COMPS_Object*[]){(COMPS_Object*)
@ -515,10 +520,10 @@ static signed char comps_doc_xml(COMPS_Doc *doc, xmlTextWriterPtr writer,
int retc;
signed char ret = 0, tmpret;
retc = xmlTextWriterWriteDTD(writer, BAD_CAST "comps",
BAD_CAST "-//Red Hat, Inc.//DTD Comps"
" info//EN",
BAD_CAST "comps.dtd", NULL);
retc = xmlTextWriterStartDTD(writer, (const xmlChar*)doc->doctype_name->val,
(const xmlChar*)doc->doctype_pubid->val,
(const xmlChar*)doc->doctype_sysid->val);
xmlTextWriterEndDTD(writer);
if (__comps_check_xml_get(retc, (COMPS_Object*)doc->log) < 0) return -1;
retc = xmlTextWriterStartElement(writer, BAD_CAST "comps");
@ -687,6 +692,25 @@ static signed char comps_doc_xml(COMPS_Doc *doc, xmlTextWriterPtr writer,
return ret;
}
COMPS_Str* comps_doc_doctype_name_get(COMPS_Doc* doc) {
return (COMPS_Str*)COMPS_OBJECT_INCREF(doc->doctype_name);
}
COMPS_Str* comps_doc_doctype_pubid_get(COMPS_Doc* doc) {
return (COMPS_Str*)COMPS_OBJECT_INCREF(doc->doctype_pubid);
}
COMPS_Str* comps_doc_doctype_sysid_get(COMPS_Doc* doc) {
return (COMPS_Str*)COMPS_OBJECT_INCREF(doc->doctype_sysid);
}
void comps_doc_doctype_name_set(COMPS_Doc* doc, COMPS_Str *val) {
COMPS_OBJECT_REPLACE(doc->doctype_name, COMPS_Str, val);
}
void comps_doc_doctype_sysid_set(COMPS_Doc* doc, COMPS_Str *val) {
COMPS_OBJECT_REPLACE(doc->doctype_name, COMPS_Str, val);
}
void comps_doc_doctype_pubid_set(COMPS_Doc* doc, COMPS_Str *val) {
COMPS_OBJECT_REPLACE(doc->doctype_name, COMPS_Str, val);
}
COMPS_Doc* comps_doc_arch_filter(COMPS_Doc *source, COMPS_ObjList *arches) {
COMPS_ObjList *list, *arches2;

View File

@ -201,6 +201,9 @@ typedef struct {
/**< COMPS_Log object to store log messages evoked
* by parsing and xml generating */
COMPS_Str *encoding; /**< comps.xml document encoding */
COMPS_Str *doctype_name;
COMPS_Str *doctype_sysid;
COMPS_Str *doctype_pubid;
} COMPS_Doc;
COMPS_Object_TAIL(COMPS_Doc);
@ -417,6 +420,13 @@ COMPS_Doc* comps_doc_union(COMPS_Doc *c1, COMPS_Doc *c2);
COMPS_Doc* comps_doc_arch_filter(COMPS_Doc *source, COMPS_ObjList *arches);
COMPS_Str* comps_doc_doctype_name_get(COMPS_Doc* doc);
COMPS_Str* comps_doc_doctype_pubid_get(COMPS_Doc* doc);
COMPS_Str* comps_doc_doctype_sysid_get(COMPS_Doc* doc);
void comps_doc_doctype_name_set(COMPS_Doc* doc, COMPS_Str *val);
void comps_doc_doctype_sysid_set(COMPS_Doc* doc, COMPS_Str *val);
void comps_doc_doctype_pubid_set(COMPS_Doc* doc, COMPS_Str *val);
//extern COMPS_ObjectInfo COMPS_Doc_ObjInfo;
extern COMPS_ValRuleGeneric* COMPS_Doc_ValidateRules[];

View File

@ -72,6 +72,11 @@
#define COMPS_OBJECT_INCREF(obj)\
comps_object_incref(((COMPS_Object*)obj))
#define COMPS_OBJECT_REPLACE(oldobj, TYPE, new_obj)\
COMPS_OBJECT_DESTROY(oldobj);\
oldobj = (TYPE*)COMPS_OBJECT_INCREF(new_obj);
#define COMPS_CAST_CONSTR void (*)(COMPS_Object*, COMPS_Object**)
#define COMPS_CAST_DESTR void (*)(COMPS_Object*)

View File

@ -55,6 +55,7 @@ unsigned comps_parse_parsed_init(COMPS_Parsed * parsed, const char * encoding,
XML_SetElementHandler(parsed->parser, &comps_parse_start_elem_handler,
&comps_parse_end_elem_handler);
XML_SetCharacterDataHandler(parsed->parser, &comps_parse_char_data_handler);
XML_SetStartDoctypeDeclHandler(parsed->parser, &comps_parse_start_doctype);
parsed->enc = encoding;
parsed->elem_stack = comps_hslist_create();
@ -65,6 +66,9 @@ unsigned comps_parse_parsed_init(COMPS_Parsed * parsed, const char * encoding,
parsed->log = COMPS_OBJECT_CREATE(COMPS_Log, NULL);
parsed->log->std_out = log_stdout;
parsed->comps_doc = NULL;
parsed->doctype_name = NULL;
parsed->doctype_sysid = NULL;
parsed->doctype_pubid = NULL;
parsed->fatal_error = 0;
if (parsed->elem_stack == NULL || parsed->text_buffer == NULL) {
if (!parsed->elem_stack)
@ -88,22 +92,30 @@ void comps_parse_parsed_reinit(COMPS_Parsed *parsed) {
XML_SetElementHandler(parsed->parser, &comps_parse_start_elem_handler,
&comps_parse_end_elem_handler);
XML_SetCharacterDataHandler(parsed->parser, &comps_parse_char_data_handler);
XML_SetStartDoctypeDeclHandler(parsed->parser, &comps_parse_start_doctype);
XML_SetUserData(parsed->parser, parsed);
comps_hslist_clear(parsed->elem_stack);
comps_hslist_clear(parsed->text_buffer);
comps_hslist_clear(parsed->log->entries);
COMPS_OBJECT_DESTROY(parsed->comps_doc);
//comps_doc_destroy(&parsed->comps_doc);
COMPS_OBJECT_DESTROY(parsed->doctype_name);
COMPS_OBJECT_DESTROY(parsed->doctype_sysid);
COMPS_OBJECT_DESTROY(parsed->doctype_pubid);
parsed->doctype_name = NULL;
parsed->doctype_sysid = NULL;
parsed->doctype_pubid = NULL;
}
void comps_parse_parsed_destroy(COMPS_Parsed *parsed) {
comps_hslist_destroy(&parsed->elem_stack);
comps_hslist_destroy(&parsed->text_buffer);
COMPS_OBJECT_DESTROY(parsed->log);
//if (parsed->log)
// comps_log_destroy(parsed->log);
COMPS_OBJECT_DESTROY(parsed->comps_doc);
//comps_doc_destroy(&parsed->comps_doc);
COMPS_OBJECT_DESTROY(parsed->doctype_name);
COMPS_OBJECT_DESTROY(parsed->doctype_sysid);
COMPS_OBJECT_DESTROY(parsed->doctype_pubid);
XML_ParserFree(parsed->parser);
free(parsed);
}
@ -113,6 +125,18 @@ void empty_xmlGenericErrorFunc(void * ctx, const char * msg, ...) {
(void) msg;
}
void comps_parse_start_doctype(void *userData,
const XML_Char *doctypeName,
const XML_Char *sysid,
const XML_Char *pubid,
int standalone) {
#define parsed ((COMPS_Parsed*)userData)
parsed->doctype_name = comps_str(doctypeName);
parsed->doctype_sysid = comps_str(sysid);
parsed->doctype_pubid = comps_str(pubid);
#undef parsed
}
int comps_parse_validate_dtd(char *filename, char *dtd_file) {
xmlDocPtr fptr;
xmlDtdPtr dtd_ptr;
@ -152,6 +176,27 @@ int comps_parse_validate_dtd(char *filename, char *dtd_file) {
return ret;
}
void __comps_after_parse(COMPS_Parsed *parsed) {
if (parsed->doctype_name) {
parsed->comps_doc->doctype_name = (COMPS_Str*)
COMPS_OBJECT_INCREF(parsed->doctype_name);
} else {
parsed->comps_doc->doctype_name = comps_str(comps_default_doctype_name);
}
if (parsed->doctype_sysid) {
parsed->comps_doc->doctype_sysid = (COMPS_Str*)
COMPS_OBJECT_INCREF(parsed->doctype_sysid);
} else {
parsed->comps_doc->doctype_sysid = comps_str(comps_default_doctype_sysid);
}
if (parsed->doctype_pubid) {
parsed->comps_doc->doctype_pubid = (COMPS_Str*)
COMPS_OBJECT_INCREF(parsed->doctype_pubid);
} else {
parsed->comps_doc->doctype_pubid = comps_str(comps_default_doctype_pubid);
}
}
signed char comps_parse_file(COMPS_Parsed *parsed, FILE *f,
COMPS_DefaultsOptions *options) {
void *buff;
@ -189,6 +234,8 @@ signed char comps_parse_file(COMPS_Parsed *parsed, FILE *f,
if (bytes_read == 0) break;
}
fclose(f);
__comps_after_parse(parsed);
if (parsed->fatal_error == 0 && parsed->log->entries->first == NULL)
return 0;
else if (parsed->fatal_error != 1)
@ -212,6 +259,8 @@ signed char comps_parse_str(COMPS_Parsed *parsed, char *str,
XML_GetErrorCode(parsed->parser))));
parsed->fatal_error = 1;
}
__comps_after_parse(parsed);
if (parsed->fatal_error == 0 && parsed->log->entries->first == NULL)
return 0;
else if (parsed->fatal_error != 1)

View File

@ -44,6 +44,10 @@ typedef struct COMPS_Parsed {
XML_Parser parser;
const char *enc;
COMPS_DefaultsOptions *def_options;
COMPS_Str *doctype_name;
COMPS_Str *doctype_sysid;
COMPS_Str *doctype_pubid;
} COMPS_Parsed;
COMPS_Parsed* comps_parse_parsed_create();
@ -62,6 +66,11 @@ void comps_parse_start_elem_handler(void *userData,
void comps_parse_char_data_handler(void *userData,
const XML_Char *s,
int len);
void comps_parse_start_doctype(void *userData,
const XML_Char *doctypeName,
const XML_Char *sysid,
const XML_Char *pubid,
int standalone);
signed char comps_parse_file(COMPS_Parsed *parsed, FILE *f,
COMPS_DefaultsOptions *options);

View File

@ -58,7 +58,7 @@ copyright = u'RedHat 2013'
version = '0.1.6'
# The full version, including alpha/beta/rc tags.
release = ("0." "1."
"6-" "5")
"6-" "7")
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.

View File

@ -1102,7 +1102,7 @@ class COMPSTest(unittest.TestCase):
self.assertTrue(comps.groups[2].biarchonly == True)
xmlstr = comps.toxml_str(xml_options={"biarchonly_explicit": True})
comps2 = libcomps.Comps()
comps2.fromxml_str(xmlstr)
comps2.fromxml_str(xmlstr, options={"default_biarchonly": True})
self.assertTrue(comps == comps2)

View File

@ -695,6 +695,7 @@ START_TEST(test_doc_defaults) {
comps_doc_add_group(doc, g);
tmp = comps2xml_str(doc, NULL, NULL);
//printf("tmp %s\n", tmp);
parsed = comps_parse_parsed_create();
comps_parse_parsed_init(parsed, "UTF-8", 1);
comps_parse_str(parsed, tmp, NULL);

5
version.cmake Normal file
View File

@ -0,0 +1,5 @@
set (libcomps_VERSION_MAJOR 0)
set (libcomps_VERSION_MINOR 1)
set (libcomps_VERSION_PATCH 6)
set (libcomps_RELEASE 4)

5
version.cmake.in Normal file
View File

@ -0,0 +1,5 @@
set (libcomps_VERSION_MAJOR ${libcomps_VERSION_MAJOR})
set (libcomps_VERSION_MINOR ${libcomps_VERSION_MINOR})
set (libcomps_VERSION_PATCH ${libcomps_VERSION_PATCH})
set (libcomps_RELEASE ${libcomps_RELEASE})