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