1111#include <stdlib.h>
1212#include <string.h>
1313
14+ #include "dds/dds.h"
1415#include "dds/ddsrt/heap.h"
1516#include "dds/ddsrt/string.h"
1617
1718#include "dds__content_filter.h"
1819
19- dds_return_t dds_expression_filter_init (const char * expression , dds_expression_content_filter_t * * filter )
20+ dds_return_t dds_expression_filter_create (const char * expression , dds_expression_content_filter_t * * filter )
2021{
2122 if (filter == NULL || expression == NULL )
2223 return DDS_RETCODE_BAD_PARAMETER ;
@@ -28,8 +29,10 @@ dds_return_t dds_expression_filter_init(const char *expression, dds_expression_c
2829 return DDS_RETCODE_OK ;
2930}
3031
31- void dds_expression_filter_fini (dds_expression_content_filter_t * filter )
32+ void dds_expression_filter_free (dds_expression_content_filter_t * filter )
3233{
34+ if (filter == NULL )
35+ return ;
3336 dds_expression_content_filter_t * ef = filter ;
3437 ddsrt_free (ef -> expression );
3538 ddsrt_free (ef -> param );
@@ -48,28 +51,25 @@ static void filter_param_clean(struct dds_expression_filter_param *param)
4851
4952static bool filter_param_copy (struct dds_expression_filter_param * from , struct dds_expression_filter_param * to )
5053{
51- if (from == NULL && to == NULL )
54+ if (from == NULL || to == NULL )
5255 return false;
5356 filter_param_clean (to );
5457 to -> t = from -> t ;
5558 to -> n = from -> n ;
5659 if ((to -> sz = from -> sz ) != 0 ) {
5760 if (to -> t == DDS_EXPR_FILTER_PARAM_STRING ) to -> s .s = ddsrt_strdup (from -> s .s );
5861 else if (to -> t == DDS_EXPR_FILTER_PARAM_BLOB ) to -> s .u = ddsrt_memdup (from -> s .u , to -> sz );
59- else abort () ;
62+ else return false ;
6063 }
6164 return true;
6265}
6366
6467static dds_return_t expression_filter_param_set (dds_expression_content_filter_t * filter , size_t id , struct dds_expression_filter_param p )
6568{
66- dds_return_t ret = DDS_RETCODE_OK ;
6769 dds_expression_content_filter_t * ef = filter ;
68- if (id > ef -> nparam || ef -> param == NULL ) return DDS_RETCODE_BAD_PARAMETER ;
69-
70- filter_param_copy (& p , & ef -> param [id - 1 ]);
71-
72- return ret ;
70+ if (id > ef -> nparam || ef -> param == NULL )
71+ return DDS_RETCODE_BAD_PARAMETER ;
72+ return filter_param_copy (& p , & ef -> param [id - 1 ]) ? DDS_RETCODE_OK : DDS_RETCODE_BAD_PARAMETER ;
7373}
7474
7575dds_return_t dds_expression_filter_bind_integer (dds_expression_content_filter_t * filter , size_t id , int64_t param )
@@ -96,7 +96,7 @@ dds_return_t dds_expression_filter_bind_blob (dds_expression_content_filter_t *f
9696 return expression_filter_param_set (filter , id , p );
9797}
9898
99- dds_return_t dds_function_filter_init (const dds_function_content_filter_mode_t mode , const dds_function_content_filter_fn_t fn , dds_function_content_filter_t * * filter )
99+ dds_return_t dds_function_filter_create (const dds_function_content_filter_mode_t mode , const dds_function_content_filter_fn_t fn , dds_function_content_filter_t * * filter )
100100{
101101 if (filter == NULL )
102102 return DDS_RETCODE_BAD_PARAMETER ;
@@ -108,8 +108,10 @@ dds_return_t dds_function_filter_init(const dds_function_content_filter_mode_t m
108108 return DDS_RETCODE_OK ;
109109}
110110
111- void dds_function_filter_fini (dds_function_content_filter_t * filter )
111+ void dds_function_filter_free (dds_function_content_filter_t * filter )
112112{
113+ if (filter == NULL )
114+ return ;
113115 dds_function_content_filter_t * ff = filter ;
114116 ddsrt_free (ff );
115117}
@@ -136,45 +138,6 @@ static bool expression_filter_copy(const dds_expression_content_filter_t *from,
136138 return true;
137139}
138140
139- static bool expression_filter_param_cmp (const struct dds_expression_filter_param * a , const struct dds_expression_filter_param * b )
140- {
141- if (a == NULL || b == NULL )
142- return false;
143- if (a -> t != b -> t )
144- return false;
145- else if (memcmp (& a -> n , & b -> n , sizeof (a -> n )))
146- return false;
147- else if (a -> sz != 0 || b -> sz != 0 )
148- {
149- if (a -> sz != b -> sz )
150- return false;
151- else if (a -> t == DDS_EXPR_FILTER_PARAM_STRING && (strcmp (a -> s .s , b -> s .s )))
152- return false;
153- else if (a -> t == DDS_EXPR_FILTER_PARAM_BLOB && (memcmp (a -> s .u , b -> s .u , (size_t )a -> n .i )))
154- return false;
155- }
156-
157- return true;
158- }
159-
160- static bool expression_filter_cmp (const dds_expression_content_filter_t * a , const dds_expression_content_filter_t * b )
161- {
162- if (a == NULL || b == NULL )
163- return false;
164- if (strcmp (a -> expression , b -> expression ))
165- return false;
166- else if (a -> nparam != b -> nparam )
167- return false;
168- else
169- {
170- size_t i = 0 ;
171- for (i = 0 ; i < a -> nparam && expression_filter_param_cmp (& a -> param [i ], & b -> param [i ]); i ++ ) {}
172- if (i != a -> nparam - 1 )
173- return false;
174- }
175- return true;
176- }
177-
178141static bool function_filter_copy (const dds_function_content_filter_t * from , dds_function_content_filter_t * to )
179142{
180143 if (from == NULL || to == NULL )
@@ -185,50 +148,61 @@ static bool function_filter_copy(const dds_function_content_filter_t *from, dds_
185148 return true;
186149}
187150
188- static bool function_filter_cmp (const dds_function_content_filter_t * a , const dds_function_content_filter_t * b )
151+ bool dds_content_filter_valid (const struct dds_content_filter * filter )
189152{
190- if (a == NULL || b == NULL )
191- return false;
192- if (a -> mode != b -> mode )
193- return false;
194- else if (!memcmp (& a -> f , & b -> f , sizeof (a -> f )))
195- return false;
196- return true;
153+ if (filter == NULL )
154+ return true;
155+
156+ return filter -> kind == DDS_CONTENT_FILTER_EXPRESSION ? filter -> filter .expr != NULL : filter -> filter .func != NULL ;
197157}
198158
199- bool dds_content_filter_copy ( const struct dds_content_filter * from , struct dds_content_filter * to )
159+ void dds_content_filter_free ( struct dds_content_filter * filter )
200160{
201- bool result = false;
202- if (from == NULL || to == NULL )
203- return result ;
161+ if (filter == NULL )
162+ return ;
204163
205- to -> kind = from -> kind ;
206- switch (from -> kind )
164+ switch (filter -> kind )
207165 {
208166 case DDS_CONTENT_FILTER_EXPRESSION :
209- to -> filter .expr = (dds_expression_content_filter_t * ) ddsrt_malloc (sizeof (* to -> filter .expr ));
210- result = expression_filter_copy (from -> filter .expr , to -> filter .expr );
167+ dds_expression_filter_free (filter -> filter .expr );
211168 break ;
212169 case DDS_CONTENT_FILTER_FUNCTION :
213- to -> filter .func = (dds_function_content_filter_t * ) ddsrt_malloc (sizeof (* to -> filter .func ));
214- result = function_filter_copy (from -> filter .func , to -> filter .func );
170+ dds_function_filter_free (filter -> filter .func );
215171 break ;
216- default :
217- abort ();
218172 }
219173
220- return result ;
174+ ddsrt_free ( filter ) ;
221175}
222176
223- bool dds_content_filter_compare ( const struct dds_content_filter * a , const struct dds_content_filter * b )
177+ struct dds_content_filter * dds_content_filter_dup ( const struct dds_content_filter * filter )
224178{
225- if (a == NULL || b == NULL )
226- return false;
227- else if (a -> kind != b -> kind )
228- return false;
229- else if (a -> kind == DDS_CONTENT_FILTER_EXPRESSION && !expression_filter_cmp (a -> filter .expr , b -> filter .expr ))
230- return false;
231- else if (a -> kind == DDS_CONTENT_FILTER_FUNCTION && !function_filter_cmp (a -> filter .func , b -> filter .func ))
232- return false;
233- return true;
179+ if (filter == NULL )
180+ return NULL ;
181+ struct dds_content_filter * res = (struct dds_content_filter * ) ddsrt_malloc (sizeof (* res ));
182+ switch (filter -> kind )
183+ {
184+ case DDS_CONTENT_FILTER_EXPRESSION :
185+ dds_expression_content_filter_t * expr = (dds_expression_content_filter_t * ) ddsrt_malloc (sizeof (* expr ));
186+ if (!expression_filter_copy (filter -> filter .expr , expr )) {
187+ ddsrt_free (expr );
188+ goto err_copy ;
189+ }
190+ res -> filter .expr = expr ;
191+ break ;
192+ case DDS_CONTENT_FILTER_FUNCTION :
193+ dds_function_content_filter_t * func = (dds_function_content_filter_t * ) ddsrt_malloc (sizeof (* func ));
194+ if (!function_filter_copy (filter -> filter .func , func )) {
195+ ddsrt_free (func );
196+ goto err_copy ;
197+ }
198+ res -> filter .func = func ;
199+ break ;
200+ }
201+
202+ res -> kind = filter -> kind ;
203+ return res ;
204+
205+ err_copy :
206+ ddsrt_free (res );
207+ return NULL ;
234208}
0 commit comments