Skip to content

Commit

Permalink
- comps DOCTYPE read-write-read fix
Browse files Browse the repository at this point in the history
  • Loading branch information
midnightercz committed Mar 13, 2014
1 parent 1780ba5 commit 63b6727
Show file tree
Hide file tree
Showing 12 changed files with 153 additions and 35 deletions.
5 changes: 5 additions & 0 deletions libcomps/src/comps_default.c
Expand Up @@ -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";

5 changes: 5 additions & 0 deletions libcomps/src/comps_default.h
Expand Up @@ -3,6 +3,8 @@

#include <stdbool.h>

#include "comps_obj.h"

typedef struct COMPS_DefaultsOptions {
bool default_uservisible;
bool default_biarchonly;
Expand All @@ -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
82 changes: 53 additions & 29 deletions libcomps/src/comps_doc.c
Expand Up @@ -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>
Expand All @@ -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)
Expand All @@ -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_);
Expand Down Expand Up @@ -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;
}

Expand All @@ -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;
}

Expand Down Expand Up @@ -162,18 +178,19 @@ 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);
free(str);
} 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)
Expand All @@ -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();
Expand All @@ -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)
Expand Down Expand Up @@ -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*)
Expand Down Expand Up @@ -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");
Expand Down Expand Up @@ -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;
Expand Down
10 changes: 10 additions & 0 deletions libcomps/src/comps_doc.h
Expand Up @@ -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);

Expand Down Expand Up @@ -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[];

Expand Down
5 changes: 5 additions & 0 deletions libcomps/src/comps_obj.h
Expand Up @@ -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*)

Expand Down
57 changes: 53 additions & 4 deletions libcomps/src/comps_parse.c
Expand Up @@ -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();
Expand All @@ -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)
Expand All @@ -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);
}
Expand All @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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)
Expand All @@ -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)
Expand Down
9 changes: 9 additions & 0 deletions libcomps/src/comps_parse.h
Expand Up @@ -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();
Expand All @@ -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);
Expand Down
2 changes: 1 addition & 1 deletion libcomps/src/python/docs/doc-sources/conf.py
Expand Up @@ -58,7 +58,7 @@
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.
Expand Down
2 changes: 1 addition & 1 deletion libcomps/src/python/tests/__test.py
Expand Up @@ -1102,7 +1102,7 @@ def test_biarchonly(self):
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)


Expand Down

0 comments on commit 63b6727

Please sign in to comment.