1 #include "comps_obj.h"
2 
3 #include <math.h>
4 #include <stdio.h>
5 #include <fnmatch.h>
6 
comps_object_create(COMPS_ObjectInfo * obj_info,COMPS_Object ** args)7 COMPS_Object * comps_object_create(COMPS_ObjectInfo *obj_info, COMPS_Object **args){
8     COMPS_Object *obj;
9     obj = malloc(obj_info->obj_size);
10     obj->obj_info = obj_info;
11     obj->refc = comps_refc_create((void*)obj,
12                                  (void (*)(void*)) obj_info->destructor);
13     if (obj_info->constructor)
14         obj_info->constructor(obj, args);
15     return obj;
16 }
17 
comps_object_destroy(COMPS_Object * comps_obj)18 void comps_object_destroy(COMPS_Object *comps_obj) {
19     if (!comps_obj || !comps_obj->refc) return;
20     if (comps_obj->refc->ref_count)
21         comps_refc_destroy(comps_obj->refc);
22     else {
23         comps_refc_destroy(comps_obj->refc);
24         free(comps_obj);
25     }
26 }
27 
comps_object_destroy_v(void * comps_obj)28 void comps_object_destroy_v(void *comps_obj) {
29     comps_object_destroy((COMPS_Object*) comps_obj);
30 }
31 
comps_object_copy(COMPS_Object * comps_obj)32 COMPS_Object* comps_object_copy(COMPS_Object *comps_obj) {
33     if (!comps_obj) return NULL;
34     COMPS_Object *obj;
35     obj = malloc(comps_obj->obj_info->obj_size);
36     obj->refc = comps_refc_create((void*)obj,
37                              (void (*)(void*)) comps_obj->obj_info->destructor);
38     obj->obj_info = comps_obj->obj_info;
39     comps_obj->obj_info->copy(obj, comps_obj);
40     return obj;
41 }
42 
43 /*COMPS_Object* comps_object_copy_deep(COMPS_Object *comps_obj) {
44    (void) comps_obj;
45     return NULL;
46 }*/
47 
comps_object_cmp(COMPS_Object * obj1,COMPS_Object * obj2)48 signed char comps_object_cmp(COMPS_Object *obj1, COMPS_Object *obj2) {
49     if (!obj1 && !obj2)
50         return 1;
51     else if (!obj1 || !obj2)
52         return 0;
53     if (obj1->obj_info->obj_cmp) {
54         return obj1->obj_info->obj_cmp(obj1, obj2);
55     } else {
56         return 0;
57     }
58 }
comps_object_cmp_v(void * obj1,void * obj2)59 char comps_object_cmp_v(void *obj1, void *obj2) {
60     return (char)comps_object_cmp((COMPS_Object*)obj1, (COMPS_Object*)obj2);
61 }
62 
comps_object_tostr(COMPS_Object * obj1)63 char* comps_object_tostr(COMPS_Object *obj1) {
64     char *ret;
65     if (obj1 && obj1->obj_info->to_str != NULL) {
66        return obj1->obj_info->to_str(obj1);
67     } else {
68         ret = malloc(sizeof(char));
69         ret[0]=0;
70         return ret;;
71     }
72 }
73 
comps_object_incref(COMPS_Object * obj)74 inline COMPS_Object* comps_object_incref(COMPS_Object *obj) {
75     if (obj && obj->refc)
76         comps_refc_incref(obj->refc);
77     return obj;
78 }
79 
80 
comps_num_create_u(COMPS_Object * num,COMPS_Object ** args)81 void comps_num_create_u(COMPS_Object* num, COMPS_Object **args){
82     if (args && args[0]->obj_info == &COMPS_Num_ObjInfo) {
83         ((COMPS_Num*)num)->val = ((COMPS_Num*)args[0])->val;
84     } else
85         ((COMPS_Num*)num)->val = 0;
86 }
87 
comps_num_copy_u(COMPS_Object * num_dst,COMPS_Object * num_src)88 void comps_num_copy_u(COMPS_Object *num_dst, COMPS_Object *num_src) {
89     ((COMPS_Num*)num_dst)->val = ((COMPS_Num*)num_src)->val;
90 }
91 
comps_num_destroy_u(COMPS_Object * num)92 void comps_num_destroy_u(COMPS_Object *num){
93     (void)num;
94 }
95 
comps_num_tostr(COMPS_Object * num)96 char* comps_num_tostr(COMPS_Object *num) {
97     char *ret;
98     int x;
99 
100     if (((COMPS_Num*)num)->val == 0)
101         x = 1;
102     else
103         x = (int)(log10(((COMPS_Num*)num)->val)) + 1;
104     ret = malloc(sizeof(char)*(x+1));
105     sprintf(ret, "%d", ((COMPS_Num*)num)->val);
106     return ret;
107 }
108 
comps_num_cmp_u(COMPS_Object * num1,COMPS_Object * num2)109 signed char comps_num_cmp_u(COMPS_Object *num1, COMPS_Object *num2) {
110     return ((COMPS_Num*)num1)->val == ((COMPS_Num*)num2)->val;
111 }
112 
comps_str_create_u(COMPS_Object * str,COMPS_Object ** args)113 void comps_str_create_u(COMPS_Object* str, COMPS_Object **args){
114     if (args && args[0]->obj_info == &COMPS_Str_ObjInfo) {
115         ((COMPS_Str*)str)->val = malloc(sizeof(char) *
116                                         (strlen(((COMPS_Str*)args[0])->val)+1));
117         strcpy(((COMPS_Str*)str)->val, ((COMPS_Str*)args[0])->val);
118     }
119 }
120 
comps_str_copy_u(COMPS_Object * str_dst,COMPS_Object * str_src)121 void comps_str_copy_u(COMPS_Object *str_dst, COMPS_Object *str_src) {
122     if (((COMPS_Str*)str_src)->val) {
123         ((COMPS_Str*)str_dst)->val =
124                       malloc(sizeof(char) *
125                              (strlen(((COMPS_Str*)str_src)->val) + 1));
126         strcpy(((COMPS_Str*)str_dst)->val, ((COMPS_Str*)str_src)->val);
127     } else
128         ((COMPS_Str*)str_dst)->val = NULL;
129 }
130 
comps_str_destroy_u(COMPS_Object * str)131 void comps_str_destroy_u(COMPS_Object *str){
132     free(((COMPS_Str*)str)->val);
133 }
134 
comps_str_tostr(COMPS_Object * str)135 char* comps_str_tostr(COMPS_Object *str) {
136     char *ret;
137     if (((COMPS_Str*)str)->val) {
138         ret = malloc(sizeof(char)*(strlen(((COMPS_Str*)str)->val)+1));
139         strcpy(ret, ((COMPS_Str*)str)->val);
140     } else {
141         ret = malloc(sizeof(char));
142         ret[0] = 0;
143     }
144     return ret;
145 }
146 
comps_str_cmp_u(COMPS_Object * str1,COMPS_Object * str2)147 signed char comps_str_cmp_u(COMPS_Object *str1, COMPS_Object *str2) {
148     if (!((COMPS_Str*)str1)->val && !((COMPS_Str*)str2)->val) {
149         return 1;
150     } else if (!((COMPS_Str*)str1)->val || !((COMPS_Str*)str2)->val) {
151         return 0;
152     } else return strcmp(((COMPS_Str*)str1)->val,
153                          ((COMPS_Str*)str2)->val) == 0;
154 }
155 
156 
comps_num(int n)157 COMPS_Num* comps_num(int n) {
158     COMPS_Num *ret = COMPS_OBJECT_CREATE(COMPS_Num, NULL);
159     ret->val = n;
160     return ret;
161 }
162 
comps_str(const char * s)163 COMPS_Str* comps_str(const char *s) {
164     COMPS_Str *ret = COMPS_OBJECT_CREATE(COMPS_Str, NULL);
165     if (s) {
166         ret->val = malloc(sizeof(char) * ((strlen(s)+1)));
167         strcpy(ret->val, s);
168     } else
169         ret->val = NULL;
170     return ret;
171 }
comps_str_x(char * s)172 COMPS_Str* comps_str_x(char *s) {
173     COMPS_Str *ret = COMPS_OBJECT_CREATE(COMPS_Str, NULL);
174     ret->val = s;
175     return ret;
176 }
comps_str_set(COMPS_Str * str,char * s)177 void comps_str_set(COMPS_Str *str, char *s) {
178     free(str->val);
179     str->val = malloc(sizeof(char) * ((strlen(s)+1)));
180     strcpy(str->val, s);
181 }
comps_str_fnmatch(COMPS_Str * str,char * pattern,int flags)182 signed char comps_str_fnmatch(COMPS_Str *str, char *pattern, int flags) {
183     return fnmatch(pattern, str->val, flags) == 0;
184 }
comps_str_fnmatch_o(COMPS_Str * str,COMPS_Str * pattern,int flags)185 signed char comps_str_fnmatch_o(COMPS_Str *str, COMPS_Str *pattern, int flags) {
186     return fnmatch(pattern->val, str->val, flags) == 0;
187 }
188 
189 COMPS_ObjectInfo COMPS_Num_ObjInfo = {
190     .obj_size = sizeof(COMPS_Num),
191     .constructor = &comps_num_create_u,
192     .destructor = &comps_num_destroy_u,
193     .copy = &comps_num_copy_u,
194     .to_str = &comps_num_tostr,
195     .obj_cmp = &comps_num_cmp_u
196 };
197 
198 COMPS_ObjectInfo COMPS_Str_ObjInfo = {
199     .obj_size = sizeof(COMPS_Str),
200     .constructor = &comps_str_create_u,
201     .destructor = &comps_str_destroy_u,
202     .copy = &comps_str_copy_u,
203     .to_str = &comps_str_tostr,
204     .obj_cmp = &comps_str_cmp_u
205 };
206 
207