Skip to content
Snippets Groups Projects
Commit 706f0d94 authored by Jonathan Schöbel's avatar Jonathan Schöbel
Browse files

Validator: deregister attr

A attribute can be deregistered by calling SH_Validator_deregister_attr.
Note that deregistering an attr, that was never registered is considered
an error, but this may change, as technically it is not registered
afterwards and sometimes (i.e. for a blacklist) it might be preferable
to ensure, that a specific attr is not registered, but it is not clear
whether there should be an error or not.
Also the deallocating of the data used for an attr was moved to an extra
method, as this is needed in several locations and it might be subject
to change.
parent f2d22c04
Branches
Tags
No related merge requests found
......@@ -64,8 +64,8 @@ FILE_NAME_31=1111;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fp
FILE_NAME_32=5802;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fsrc%2Flib%2Fsefht%2Fvalidator_tag.c;0;8
FILE_NAME_33=1148;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fsrc%2Flib%2Fsefht%2Fvalidator_tag.h;0;8
FILE_NAME_34=1124;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fsrc%2Flib%2Fsefht%2Fvalidator_tag_data.h;0;8
FILE_NAME_35=9830;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fsrc%2Flib%2Fsefht%2Fvalidator_attr.c;0;8
FILE_NAME_36=1627;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fsrc%2Flib%2Fsefht%2Fvalidator_attr.h;0;8
FILE_NAME_35=1818;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fsrc%2Flib%2Fsefht%2Fvalidator_attr.c;0;8
FILE_NAME_36=1874;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fsrc%2Flib%2Fsefht%2Fvalidator_attr.h;0;8
FILE_NAME_37=1099;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fsrc%2Flib%2Fsefht%2Fvalidator_attr_data.h;0;8
FILE_NAME_38=924;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fsrc%2Flib%2Fsefht%2Fstatus.h;0;8
FILE_NAME_39=18;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fsrc%2Flib%2Fsefht%2Flog.h;0;4
......@@ -83,7 +83,7 @@ FILE_NAME_50=4221;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fp
FILE_NAME_51=994;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Ftests%2Ftest_text_mark.c;0;8
FILE_NAME_52=2447;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Ftests%2Ftest_validator.c;0;8
FILE_NAME_53=3880;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Ftests%2Ftest_validator_tag.c;0;8
FILE_NAME_54=7652;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Ftests%2Ftest_validator_attr.c;0;8
FILE_NAME_54=13518;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Ftests%2Ftest_validator_attr.c;0;8
FILE_NAME_55=536;None;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Ftodo.txt;0;8
FILE_NAME_56=201;YAML;0;EUTF-8;0;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2F.gitlab-ci.yml;0;4
FILE_NAME_57=71;Sh;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fgitlab-ci%2Fupload.sh.in;0;8
......
......@@ -59,6 +59,12 @@ copy_attrs (/*@special@*/ struct SH_Validator * copy,
/*@modifies fileSystem@*/
/*@modifies status@*/;
static inline
void
free_attr (struct attr_info attr)
/*@modifies attr.name@*/
/*@releases attr.name@*/;
static inline
void
free_attrs (/*@special@*/ struct SH_Validator * validator)
......@@ -113,6 +119,18 @@ get_attr_id_by_name (struct SH_Validator * validator,
/*@out@*/ size_t * index)
/*@modifies index@*/;
static inline
bool
remove_attr (struct SH_Validator * validator,
const char * attr,
/*@null@*/ /*@out@*/ struct SH_Status * status)
/*@modifies validator->attrs@*/
/*@modifies validator->attr_n@*/
/*@modifies validator->last_attr@*/
/*@globals fileSystem@*/
/*@modifies fileSystem@*/
/*@modifies status@*/;
static inline
......@@ -209,6 +227,16 @@ copy_attrs (/*@special@*/ struct SH_Validator * copy,
return TRUE;
}
static inline
void
free_attr (struct attr_info attr)
/*@modifies attr.name@*/
/*@releases attr.name@*/
{
free (attr.name);
return;
}
static inline
void
free_attrs (/*@special@*/ struct SH_Validator * validator)
......@@ -219,7 +247,7 @@ free_attrs (/*@special@*/ struct SH_Validator * validator)
for (index = 0; index < validator->attr_n; index++)
{
free (validator->attrs[index].name);
free_attr (validator->attrs[index]);
}
free (validator->attrs);
......@@ -319,7 +347,7 @@ add_attr (struct SH_Validator * validator,
#ifdef S_SPLINT_S
validator->attrs = (void *) 0x12345;
#endif
free (attr_data.name);
free_attr (attr_data);
return ATTR_ERR;
}
......@@ -414,6 +442,66 @@ get_attr_id_by_name (struct SH_Validator * validator,
return validator->attrs[*index].id;
}
static inline
bool
remove_attr (struct SH_Validator * validator,
const char * attr,
/*@null@*/ /*@out@*/ struct SH_Status * status)
/*@modifies validator->attrs@*/
/*@modifies validator->attr_n@*/
/*@modifies validator->last_attr@*/
/*@globals fileSystem@*/
/*@modifies fileSystem@*/
/*@modifies status@*/
{
struct attr_info attr_data;
struct attr_info * new_attrs;
size_t index;
size_t index2;
if (!find_attr (validator, attr, &index))
{
/* TODO: define whether this is an error */
set_status (status, E_VALUE, 3, "no such attr");
return FALSE;
}
/* preserve data as realloc may fail */
attr_data = validator->attrs[index];
for (index2 = index; index2 < validator->attr_n-1; index2++)
{
validator->attrs[index2] = validator->attrs[index2+1];
}
new_attrs = realloc (validator->attrs,
sizeof (struct attr_info)
* (validator->attr_n - 1));
if (NULL == new_attrs)
{
set_status (status, E_ALLOC, 3, "realloc failed");
for (index2 = index; index2 < validator->attr_n-1;
index2++)
{
validator->attrs[index2+1] =
validator->attrs[index2];
}
validator->attrs[index] = attr_data;
return FALSE;
}
free_attr (attr_data);
validator->attrs = new_attrs;
validator->attr_n--;
set_success (status);
return TRUE;
}
bool
SH_Validator_check_attr (struct SH_Validator * validator,
const char * attr)
......@@ -447,3 +535,18 @@ SH_Validator_register_attr (struct SH_Validator * validator,
return add_attr (validator, attr, index, status);
}
bool
SH_Validator_deregister_attr (struct SH_Validator * validator,
const char * attr,
/*@null@*/ /*@out@*/
struct SH_Status * status)
/*@modifies validator->attr_n@*/
/*@modifies validator->attrs@*/
/*@modifies validator->last_attr@*/
/*@globals fileSystem@*/
/*@modifies fileSystem@*/
/*@modifies status@*/
{
return remove_attr (validator, attr, status);
}
......@@ -51,6 +51,16 @@ SH_Validator_register_attr (SH_Validator * validator,
/*@modifies fileSystem@*/
/*@modifies status@*/;
bool
SH_Validator_deregister_attr (SH_Validator * validator,
const char * attr,
/*@null@*/ /*@out@*/
struct SH_Status * status)
/*@modifies validator@*/
/*@globals fileSystem@*/
/*@modifies fileSystem@*/
/*@modifies status@*/;
bool
SH_Validator_check_attr (struct SH_Validator * validator,
const char * attr)
......
......@@ -367,6 +367,87 @@ START_TEST(test_validator_register_with_status)
SH_Validator_free (validator);
}
START_TEST(test_validator_deregister_no_status)
{
struct SH_Validator * validator;
Attr attr;
bool result;
/* setup */
validator = SH_Validator_new (NULL);
ck_assert_ptr_ne (NULL, validator);
attr = SH_Validator_register_attr (validator, "attr", NULL);
ck_assert_int_ne (ATTR_ERR, attr);
attr = SH_Validator_register_attr (validator, "id", NULL);
ck_assert_int_ne (ATTR_ERR, attr);
/* test - consistency */
ck_assert_int_eq (2, validator->attr_n);
ck_assert_str_eq ("attr", validator->attrs[0].name);
ck_assert_str_eq ("id", validator->attrs[1].name);
/* test - existent attr */
result = SH_Validator_deregister_attr (validator, "attr", NULL);
ck_assert_int_eq (TRUE, result);
/* test - non existent attr */
result = SH_Validator_deregister_attr (validator, "attr", NULL);
ck_assert_int_eq (FALSE, result);
/* test - consistency */
ck_assert_int_eq (1, validator->attr_n);
ck_assert_str_eq ("id", validator->attrs[0].name);
/* cleanup */
SH_Validator_free (validator);
}
END_TEST
START_TEST(test_validator_deregister_with_status)
{
struct SH_Status status;
struct SH_Validator * validator;
Attr attr;
bool result;
/* setup */
validator = SH_Validator_new (NULL);
ck_assert_ptr_ne (NULL, validator);
attr = SH_Validator_register_attr (validator, "attr", NULL);
ck_assert_int_ne (ATTR_ERR, attr);
attr = SH_Validator_register_attr (validator, "id", NULL);
ck_assert_int_ne (ATTR_ERR, attr);
/* test - consistency */
ck_assert_int_eq (2, validator->attr_n);
ck_assert_str_eq ("attr", validator->attrs[0].name);
ck_assert_str_eq ("id", validator->attrs[1].name);
/* test - existent attr */
_status_preinit (status);
result = SH_Validator_deregister_attr (validator, "attr",
&status);
ck_assert_int_eq (TRUE, result);
ck_assert_int_eq (SUCCESS, status.status);
/* test - non existent attr */
_status_preinit (status);
result = SH_Validator_deregister_attr (validator, "attr",
&status);
ck_assert_int_eq (FALSE, result);
ck_assert_int_eq (E_VALUE, status.status);
/* test - consistency */
ck_assert_int_eq (1, validator->attr_n);
ck_assert_str_eq ("id", validator->attrs[0].name);
/* cleanup */
SH_Validator_free (validator);
}
END_TEST
START_TEST(test_validator_check)
{
struct SH_Validator * validator;
......@@ -414,6 +495,8 @@ Suite * test_suite (void)
tcase_add_test (tc_core, test_validator_copy_with_status);
tcase_add_test (tc_core, test_validator_register_no_status);
tcase_add_test (tc_core, test_validator_register_with_status);
tcase_add_test (tc_core, test_validator_deregister_no_status);
tcase_add_test (tc_core, test_validator_deregister_with_status);
tcase_add_test (tc_core, test_validator_check);
suite_add_tcase (s, tc_core);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment