1 /* libcomps - C alternative to yum.comps library
2 * Copyright (C) 2013 Jindrich Luza
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but
10 * WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
17 * USA
18 */
19
20 #include "comps_utils.h"
21 #include "comps_log.h"
22
__comps_str_clone(void * str)23 void* __comps_str_clone(void *str) {
24 char *ret;
25 if (str == NULL)
26 return NULL;
27 ret = malloc(sizeof(char) * (strlen((char*)str)+1));
28 if (ret==NULL) return NULL;
29 memcpy(ret, str, sizeof(char) * (strlen((char*)str)+1));
30 return ret;
31 }
32
__comps_strcmp(void * s1,void * s2)33 inline char __comps_strcmp(void *s1, void *s2) {
34 if (s1 == NULL && s2 == NULL) return 1;
35 else if ((s1 == NULL && s2 != NULL) || (s1 != NULL && s2 == NULL)) return 0;
36 return (strcmp((const char*)s1, (const char*)s2) == 0);
37 }
38
__comps_xml_prop(char * key,char * val,xmlTextWriterPtr writer)39 inline int __comps_xml_prop(char *key, char *val,
40 xmlTextWriterPtr writer) {
41 int retc;
42 retc = xmlTextWriterStartElement(writer, BAD_CAST key) >= 0 ? 1 : 0;
43 retc &= xmlTextWriterWriteString(writer, BAD_CAST val) >= 0 ? 1 : 0;
44 retc &= xmlTextWriterEndElement(writer) >= 0 ? 1 : 0;
45 return retc;
46 }
47
__comps_num2boolstr(COMPS_Object * obj)48 char* __comps_num2boolstr(COMPS_Object* obj) {
49 char *ret;
50 char *_bool;
51 if (((COMPS_Num*)obj)->val) {
52 _bool = "true";
53 } else {
54 _bool = "false";
55 }
56 ret = malloc(sizeof(char) * (strlen(_bool)+1));
57 ret[0] = 0;
58 strcat(ret, _bool);
59 return ret;
60 }
61
digits_count(unsigned int x)62 unsigned int digits_count(unsigned int x) {
63 //unsigned int ret = 1;
64 if (x >= 100000000) return 9;
65 if (x >= 10000000) return 8;
66 if (x >= 1000000) return 7;
67 if (x >= 100000) return 6;
68 if (x >= 10000) return 5;
69 if (x >= 1000) return 4;
70 if (x >= 100) return 3;
71 if (x >= 10) return 2;
72 return 1;
73 }
74
75
__comps_objlist_intersected(COMPS_ObjList * list1,COMPS_ObjList * list2)76 bool __comps_objlist_intersected(COMPS_ObjList *list1, COMPS_ObjList *list2) {
77 for (COMPS_ObjListIt *it = list1->first; it != NULL; it = it->next) {
78 for (COMPS_ObjListIt *it2 = list2->first; it2 != NULL; it2 = it2->next){
79 if (comps_object_cmp(it->comps_obj, it2->comps_obj))
80 return true;
81 }
82 }
83 return false;
84 }
85
__comps_xml_arch_str(COMPS_Object * archlist)86 char* __comps_xml_arch_str(COMPS_Object *archlist) {
87 size_t x, total_len = 0;
88 COMPS_ObjListIt *it;
89 char *arches_str;
90
91 if (!archlist || !((COMPS_ObjList*)archlist)->len) {
92 arches_str = malloc(sizeof(char));
93 arches_str[0] = 0;
94 return arches_str;
95 }
96
97 char *arches[((COMPS_ObjList*)archlist)->len];
98 for (x=0, it = ((COMPS_ObjList*)archlist)->first; it != NULL; it = it->next, x++) {
99 arches[x] = comps_object_tostr(it->comps_obj);
100 total_len += strlen(arches[x])+1;
101 }
102 arches_str = malloc(sizeof(char) * (total_len));
103 arches_str[0]=0;
104
105 x = 0;
106 for (; x < (size_t)(((COMPS_ObjList*)archlist)->len-1); x++) {
107 strcat(arches_str, arches[x]);
108 free(arches[x]);
109 strcat(arches_str, " ");
110 }
111 strcat(arches_str, arches[x]);
112 free(arches[x]);
113 return arches_str;
114 }
115
__comps_xml_arch(COMPS_Object * archlist,xmlTextWriterPtr writer)116 int __comps_xml_arch(COMPS_Object *archlist, xmlTextWriterPtr writer) {
117 if (archlist && ((COMPS_ObjList*)archlist)->len != 0) {
118 char * str = __comps_xml_arch_str(archlist);
119 int ret = xmlTextWriterWriteAttribute(writer, BAD_CAST "arch",
120 BAD_CAST str);
121 free(str);
122 return ret;
123 } else return 0;
124 }
125
126
__comps_strcpy(char * str)127 char* __comps_strcpy(char *str) {
128 char *ret;
129 ret = malloc(sizeof(char)*(strlen(str)+1));
130 return memcpy(ret, str, sizeof(char)*(strlen(str)+1));
131 }
132
__comps_strcat(char * str1,char * str2)133 char* __comps_strcat(char *str1, char *str2) {
134 char *ret;
135 ret = malloc(sizeof(char)*(strlen(str1)+strlen(str2)+1));
136 memcpy(ret, str1, sizeof(char)*(strlen(str1)+1));
137 strcat(ret, str2);
138 return ret;
139 }
140
__comps_check_xml_get(int retcode,COMPS_Object * log)141 inline int __comps_check_xml_get(int retcode, COMPS_Object * log) {
142 if (retcode<0) {
143 comps_log_error((COMPS_Log*)log, COMPS_ERR_XMLGEN, 0);
144 return -1;
145 } return 0;
146 }
147