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