00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef COMPS_DOC_H
00021 #define COMPS_DOC_H
00022
00023 #include "comps_obj.h"
00024 #include "comps_objdict.h"
00025 #include "comps_objlist.h"
00026 #include "comps_log.h"
00027 #include "comps_types.h"
00028 #include "comps_docgroup.h"
00029 #include "comps_doccategory.h"
00030 #include "comps_docenv.h"
00031 #include "comps_validate.h"
00032 #include "comps_default.h"
00033
00044 #define COMPS_DOC_GETOBJLIST(OBJS) COMPS_ObjList* CONCAT(comps_doc_, OBJS)\
00045 (COMPS_Doc *doc){\
00046 COMPS_ObjList *ret;\
00047 ret = (COMPS_ObjList*)comps_objdict_get(doc->objects, #OBJS);\
00048 if (!ret) {\
00049 ret = COMPS_OBJECT_CREATE(COMPS_ObjList, NULL);\
00050 comps_objdict_set_x(doc->objects, #OBJS, (COMPS_Object*)ret);\
00051 ret = (COMPS_ObjList*)comps_object_incref((COMPS_Object*)ret);\
00052 }\
00053 return ret;\
00054 }
00055
00057 #define HEAD_COMPS_DOC_GETOBJLIST(OBJS) COMPS_ObjList* CONCAT(comps_doc_, OBJS)\
00058 (COMPS_Doc *doc);
00059
00061 #define COMPS_DOC_SETOBJLIST(OBJS) void CONCAT(comps_doc_set_, OBJS)\
00062 (COMPS_Doc *doc,\
00063 COMPS_ObjList *list){\
00064 comps_objdict_set(doc->objects, #OBJS, (COMPS_Object*)list);\
00065 }
00066
00067 #define HEAD_COMPS_DOC_SETOBJLIST(OBJS) void CONCAT(comps_doc_set_, OBJS)\
00068 (COMPS_Doc *doc,\
00069 COMPS_ObjList *list);
00070
00072 #define COMPS_DOC_GETOBJDICT(OBJNAME) COMPS_ObjDict* CONCAT(comps_doc_, OBJNAME)\
00073 (COMPS_Doc *doc){\
00074 COMPS_ObjDict *ret;\
00075 ret = (COMPS_ObjDict*)comps_objdict_get(doc->objects, #OBJNAME);\
00076 if (!ret) {\
00077 ret = COMPS_OBJECT_CREATE(COMPS_ObjDict, NULL);\
00078 comps_objdict_set_x(doc->objects, #OBJNAME, (COMPS_Object*)ret);\
00079 ret = (COMPS_ObjDict*)comps_object_incref((COMPS_Object*)ret);\
00080 }\
00081 return ret;\
00082 }
00083
00084 #define HEAD_COMPS_DOC_GETOBJDICT(OBJNAME) COMPS_ObjDict* CONCAT(comps_doc_, OBJNAME)\
00085 (COMPS_Doc *doc);
00086
00088 #define COMPS_DOC_GETOBJMDICT(OBJNAME) COMPS_ObjMDict* CONCAT(comps_doc_, OBJNAME)\
00089 (COMPS_Doc *doc){\
00090 COMPS_ObjMDict *ret;\
00091 ret = (COMPS_ObjMDict*)comps_objdict_get(doc->objects, #OBJNAME);\
00092 if (!ret) {\
00093 ret = COMPS_OBJECT_CREATE(COMPS_ObjMDict, NULL);\
00094 comps_objdict_set_x(doc->objects, #OBJNAME, (COMPS_Object*)ret);\
00095 ret = (COMPS_ObjMDict*)comps_object_incref((COMPS_Object*)ret);\
00096 }\
00097 return ret;\
00098 }
00099
00100 #define HEAD_COMPS_DOC_GETOBJMDICT(OBJNAME) COMPS_ObjMDict* CONCAT(comps_doc_, OBJNAME)\
00101 (COMPS_Doc *doc);
00102
00104 #define COMPS_DOC_SETOBJDICT(OBJS) void CONCAT(comps_doc_set_, OBJS)\
00105 (COMPS_Doc *doc,\
00106 COMPS_ObjDict *dict){\
00107 comps_objdict_set(doc->objects, #OBJS, (COMPS_Object*)dict);\
00108 }
00109
00110 #define HEAD_COMPS_DOC_SETOBJDICT(OBJS) void CONCAT(comps_doc_set_, OBJS)\
00111 (COMPS_Doc *doc,\
00112 COMPS_ObjDict *dict);
00113
00115 #define COMPS_DOC_SETOBJMDICT(OBJS) void CONCAT(comps_doc_set_, OBJS)\
00116 (COMPS_Doc *doc,\
00117 COMPS_ObjMDict *dict){\
00118 comps_objdict_set(doc->objects, #OBJS, (COMPS_Object*)dict);\
00119 }
00120
00121 #define HEAD_COMPS_DOC_SETOBJMDICT(OBJS) void CONCAT(comps_doc_set_, OBJS)\
00122 (COMPS_Doc *doc,\
00123 COMPS_ObjMDict *dict);
00124
00127 #define COMPS_DOC_ADDOBJLIST(OBJS, OBJNAME, OBJTYPE) void CONCAT(comps_doc_add_,\
00128 OBJNAME)\
00129 (COMPS_Doc *doc,\
00130 OBJTYPE *obj){\
00131 COMPS_ObjList *ret;\
00132 ret = (COMPS_ObjList*)comps_objdict_get(doc->objects, #OBJS);\
00133 if (!ret) {\
00134 ret = COMPS_OBJECT_CREATE(COMPS_ObjList, NULL);\
00135 comps_objdict_set(doc->objects, #OBJS, (COMPS_Object*)ret);\
00136 } else {\
00137 }\
00138 comps_objlist_append_x(ret, (COMPS_Object*)obj);\
00139 COMPS_OBJECT_DESTROY(ret);\
00140 }
00141
00142 #define HEAD_COMPS_DOC_ADDOBJLIST(OBJNAME, OBJTYPE) void CONCAT(comps_doc_add_,\
00143 OBJNAME)\
00144 (COMPS_Doc *doc,\
00145 OBJTYPE *obj);
00146
00148 #define COMPS_DOC_ADDOBJDICT(OBJS, OBJNAME) void CONCAT(comps_doc_add_,\
00149 OBJNAME)\
00150 (COMPS_Doc *doc,\
00151 char *key,\
00152 COMPS_Str *obj){\
00153 COMPS_ObjDict *ret;\
00154 ret = (COMPS_ObjDict*)comps_objdict_get(doc->objects, #OBJS);\
00155 if (!ret) {\
00156 ret = COMPS_OBJECT_CREATE(COMPS_ObjDict, NULL);\
00157 comps_objdict_set(doc->objects, #OBJS, (COMPS_Object*)ret);\
00158 }\
00159 comps_objdict_set_x(ret, key, (COMPS_Object*)obj);\
00160 COMPS_OBJECT_DESTROY(ret);\
00161 }
00162
00163 #define HEAD_COMPS_DOC_ADDOBJDICT(OBJNAME) void CONCAT(comps_doc_add_,\
00164 OBJNAME)\
00165 (COMPS_Doc *doc,\
00166 char *key,\
00167 COMPS_Str *obj);
00168
00171 #define COMPS_DOC_ADDOBJMDICT(OBJS, OBJNAME) void CONCAT(comps_doc_add_,\
00172 OBJNAME)\
00173 (COMPS_Doc *doc,\
00174 char *key,\
00175 COMPS_Str *obj){\
00176 COMPS_ObjMDict *ret;\
00177 ret = (COMPS_ObjMDict*)comps_objdict_get(doc->objects, #OBJS);\
00178 if (!ret) {\
00179 ret = COMPS_OBJECT_CREATE(COMPS_ObjMDict, NULL);\
00180 comps_objdict_set(doc->objects, #OBJS, (COMPS_Object*)ret);\
00181 }\
00182 comps_objmdict_set_x(ret, key, (COMPS_Object*)obj);\
00183 COMPS_OBJECT_DESTROY(ret);\
00184 }
00185
00186 #define HEAD_COMPS_DOC_ADDOBJMDICT(OBJNAME) void CONCAT(comps_doc_add_,\
00187 OBJNAME)\
00188 (COMPS_Doc *doc,\
00189 char *key,\
00190 COMPS_Str *obj);
00191
00193 #define COMPS_DOC_GETPROP(OBJ,TYPE) CONCAT(TYPE,CONCAT(* ,CONCAT(comps_doc_, OBJ)))\
00194 (COMPS_Doc *doc){\
00195 TYPE *ret;\
00196 ret = (COMPS_Str*)comps_objdict_get(doc->objects, #OBJ);\
00197 if (!ret) {\
00198 ret = COMPS_OBJECT_CREATE(TYPE, NULL);\
00199 comps_objdict_set_x(doc->objects, #OBJ, (COMPS_Object*)ret);\
00200 ret = (TYPE*)comps_object_incref((COMPS_Object*)ret);\
00201 }\
00202 return ret;\
00203 }
00204
00206 #define HEAD_COMPS_DOC_GETPROP(OBJ, TYPE) CONCAT(TYPE,CONCAT(*,CONCAT(comps_doc_, OBJS)))\
00207 (COMPS_Doc *doc);
00208
00211 #define COMPS_DOC_SETPROP(OBJ, TYPE) void CONCAT(comps_doc_set_, OBJ)\
00212 (COMPS_Doc *doc,\
00213 TYPE *value){\
00214 comps_objdict_set(doc->objects, #OBJ, (COMPS_Object*)value);\
00215 }
00216
00220 #define HEAD_COMPS_DOC_SETPROP(OBJ, TYPE) void CONCAT(comps_doc_set_, OBJ)\
00221 (COMPS_Doc *doc,\
00222 TYPE *value);
00223
00229 typedef struct {
00230 COMPS_Object_HEAD;
00231 COMPS_ObjDict *objects;
00232 COMPS_Log *log;
00235 COMPS_Str *encoding;
00236 COMPS_Str *doctype_name;
00237 COMPS_Str *doctype_sysid;
00238 COMPS_Str *doctype_pubid;
00239 COMPS_Str *lang;
00240 } COMPS_Doc;
00241 COMPS_Object_TAIL(COMPS_Doc);
00242
00243
00244
00245
00246
00255 void comps_doc_create(COMPS_Doc* doc, COMPS_Object **args);
00256
00258 void comps_doc_copy(COMPS_Doc *doc_dst, COMPS_Doc *doc_src);
00259
00262 void comps_doc_destroy(COMPS_Doc *doc);
00263
00265 signed char comps_doc_cmp_u(COMPS_Object *obj1, COMPS_Object *obj2);
00266
00274 HEAD_COMPS_DOC_GETOBJLIST(groups)
00275
00276
00279 HEAD_COMPS_DOC_GETOBJLIST(categories)
00280
00284 HEAD_COMPS_DOC_GETOBJLIST(environments)
00285
00289 HEAD_COMPS_DOC_GETOBJDICT(langpacks)
00290
00294 HEAD_COMPS_DOC_GETOBJMDICT(blacklist)
00295
00299 HEAD_COMPS_DOC_GETOBJMDICT(whiteout)
00300
00313 HEAD_COMPS_DOC_SETOBJLIST(groups)
00314
00321 HEAD_COMPS_DOC_SETOBJLIST(categories)
00322
00329 HEAD_COMPS_DOC_SETOBJLIST(environments)
00330
00337 HEAD_COMPS_DOC_SETOBJDICT(langpacks)
00338
00345 HEAD_COMPS_DOC_SETOBJMDICT(blacklist)
00346
00353 HEAD_COMPS_DOC_SETOBJMDICT(whiteout)
00354
00367 HEAD_COMPS_DOC_ADDOBJLIST(group, COMPS_DocGroup)
00368
00375 HEAD_COMPS_DOC_ADDOBJLIST(category, COMPS_DocCategory)
00376
00383 HEAD_COMPS_DOC_ADDOBJLIST(environment, COMPS_DocEnv)
00384
00393 HEAD_COMPS_DOC_ADDOBJDICT(langpack)
00394
00403 HEAD_COMPS_DOC_ADDOBJMDICT(blacklist)
00404
00413 HEAD_COMPS_DOC_ADDOBJMDICT(whiteout)
00414
00415
00416
00423 HEAD_COMPS_DOC_SETPROP(lang, COMPS_Str)
00424
00431 COMPS_ObjList* comps_doc_get_groups(COMPS_Doc *doc, char *id, char *name,
00432 char *desc, char *lang, int flags);
00433 COMPS_ObjList* comps_doc_get_categories(COMPS_Doc *doc, char *id, char *name,
00434 char *desc, char *lang, int flags);
00435 COMPS_ObjList* comps_doc_get_envs(COMPS_Doc *doc, char *id, char *name,
00436 char *desc, char *lang, int flags);
00437
00440
00441
00442
00443
00444
00453 signed char comps2xml_f(COMPS_Doc * doc, char *filename, char stdoutredirect,
00454 COMPS_XMLOptions *xml_options,
00455 COMPS_DefaultsOptions *def_options);
00456
00461 char* comps2xml_str(COMPS_Doc *doc, COMPS_XMLOptions *options,
00462 COMPS_DefaultsOptions *def_options);
00463
00472 COMPS_Doc* comps_doc_union(COMPS_Doc *c1, COMPS_Doc *c2);
00473 COMPS_Doc* comps_doc_intersect(COMPS_Doc *c1, COMPS_Doc *c2);
00474
00475 COMPS_Doc* comps_doc_arch_filter(COMPS_Doc *source, COMPS_ObjList *arches);
00476
00477 COMPS_Str* comps_doc_doctype_name_get(COMPS_Doc* doc);
00478 COMPS_Str* comps_doc_doctype_pubid_get(COMPS_Doc* doc);
00479 COMPS_Str* comps_doc_doctype_sysid_get(COMPS_Doc* doc);
00480 void comps_doc_doctype_name_set(COMPS_Doc* doc, COMPS_Str *val);
00481 void comps_doc_doctype_sysid_set(COMPS_Doc* doc, COMPS_Str *val);
00482 void comps_doc_doctype_pubid_set(COMPS_Doc* doc, COMPS_Str *val);
00483
00484
00485 extern COMPS_ValRuleGeneric* COMPS_Doc_ValidateRules[];
00486
00487 #endif //COMPS_DOC_H
00488