- Jun 04, 2023
-
-
Jonathan Schöbel authored
Two alternatives are provided: remove_attr and pop_attr. While the former free's the Attr's data, the latter allocates a new Attr, to store and return the data. Both functionality is provided by a single (internal) static method.
-
- Jun 03, 2023
-
-
Jonathan Schöbel authored
This method needs to be used in places where freeing the src-pointer is not possible, as it may be not allocated. If freeing is needed, it is now in the responsibility of the caller. As it turns out this approach is not even more useful, it is also less work, as it can be determined from the fact, that adjusting the tests to the new behavior means actually removing lines, that were previously working around the quirks, that the old approach introduced.
-
Jonathan Schöbel authored
The prepend_child and append_child methods were previously not tested. They are now added to testing.
-
Jonathan Schöbel authored
Hand in still missing tests.
-
- Jun 02, 2023
-
-
Jonathan Schöbel authored
added tests for getter
-
- Mar 20, 2023
-
-
Jonathan Schöbel authored
-
Jonathan Schöbel authored
Added the allocation part of the implementation of attributes. Also some tests were improved. The functions to add and remove attributes are not implemented, as well as the generation of the html for the attributes. Thats why also test can't really test the attributes as it is not possible to add attributes.
-
Jonathan Schöbel authored
-
- Mar 17, 2023
-
-
Jonathan Schöbel authored
The function get_alloc_size was renamed to get_child_alloc_size as the attributes will need another function.
-
- Mar 16, 2023
-
-
Jonathan Schöbel authored
Various remove methods were added, which are all implemented by an static method, analog to the last commit.
-
Jonathan Schöbel authored
The single method (formerly SH_NodeFragment_append_child) to add a child at the end of the child list was replaced, by a bunch of methods to insert a child at the beginning (SH_NodeFragment_prepend_child), at the end (SH_NodeFragment_append_child), at a specific position (SH_NodeFragment_insert_child) and directly before (SH_NodeFragment_insert_child_before) or after another child (SH_NodeFragment_insert_child_after). All these methods are implemented by a single internal one (insert_child), as there isn't really much difference in inserting one or the other way. But this internal method doesn't check whether this insertion request is actually doable, to save overhead as not every insertion method requires this check. This is done by the respective method. However if the check is not done correctly the internal method will attempt to write at not allocated space, which will hopefully result in a segfault. The child list is implemented as an array. To reduce the overhead to realloc calls, the array is allocated in chunks of childs. The calculation how many has to be allocated is done by another static method and determined by the macro CHILD_CHUNK. This is set to 5, which is just a guess. It should be somewhere around the average number of childs per html element, to reduce unused overhead. Also some predicates (SH_NodeFragment_is_parent, SH_NodeFragment_is_ancestor) were added to check whether a relationship exists between to nodes, thus whether they are linked through one or multiple levels. These functions could replace the old ones (SH_NodeFragment_is_child, SH_NodeFragment_is_descendant) semantically. Furthermore they are more efficient as this is now possible to check over the parent pointer. The internal insert method also uses these methods to check whether the child node is actually a parent of the parent node, which would result in errors later one. The old test is now obsolete but remained, as it is not bad to test more.
-
- Mar 13, 2023
-
-
Jonathan Schöbel authored
Removed some unnecessary type casts. Added some forgotten calls to free.
-
Jonathan Schöbel authored
Every fragment has a parent now, this is useful for both traversing the tree and checking for cycles when a node is added, which would cause problems, like freeing things twice or similar nice bugs. Both wouldn't be possible otherwise. These features are not implemented yet.
-
Jonathan Schöbel authored
The library provides a way to directly access the tag in a read-only way, which saves an call to strdup. This is useful if only reading is necessary , but needs special care by developers, as it is neither allowed to modify it nor to free it. Disregarding this will lead to a segfault in the best, and to silent data corruption and security bugs in the worst case.
-
- Jan 06, 2023
-
-
Jonathan Schöbel authored
-
- Jan 05, 2023
-
-
Jonathan Schöbel authored
-
- Jan 04, 2023
-
-
Jonathan Schöbel authored
Internal struct definitions shouldn't be exported by header files.
-
Jonathan Schöbel authored
The validator was used to check that every created tag is validate. However I now think that validation should take place at a later time, so it is not mandatory. Thus developing the validator is now discontinued.
-
- Nov 15, 2022
-
-
Jonathan Schöbel authored
Instead of the trivial structure SH_Error, SH_Status is used. The name was chosen, because error/status is set independently whether an error has occurred. Beside the error type, it also contains the associated errno and an error message. The error message is also printed, when it is set. Generating error messages with variadic arguments is now also supported. There are also macros to check for a set status. The exception handling was removed for the *_free methods, because they can't fail predictably during runtime. Unfortunately the compiler reports, that inside the macro set_status printf may be called with NULL [printf (NULL)], although, this is explicitly debarred.
-
- Sep 20, 2022
-
-
Jonathan Schöbel authored
-
- Sep 18, 2022
-
-
Jonathan Schöbel authored
This renaming is neccessary, as the future Fragmment will be the base class to all Fragment types.
-
- Sep 08, 2022
-
-
Jonathan Schöbel authored
When the wrap mode is used, after each tag a newline is started. Also the html is indented, which can be configured by the parameters indent_base, indent_base, indent_char. The parameter indent_base specifies the width the first tag should be indented with, while indent_step specifies the increment of the indent when switching to a child tag. The character, that is used for indenting is taken from indent_char. (It could also be a string longer than a single character). This aguments can't be set by the user, but are hardcoded (by now).
-
Jonathan Schöbel authored
Fragment can be copied, either recursive (copying also all childs) or nonrecursive (ignoring the childs, thus the copy has always no childs). Adding the same element twice in the tree (graph) isn't possible, as this leads to problems e.g. double free or similars.
-
- Sep 05, 2022
-
-
Jonathan Schöbel authored
The methods - SH_Fragment_get_child (by index) - SH_Fragment_is_child (non recursive) and - SH_Fragment_is_descendant (recursive) were added.
-
- Sep 04, 2022
-
-
Jonathan Schöbel authored
A Fragment can contain childs. When building the html, the childs html is generated where appropiate.
-
- Sep 01, 2022
-
-
Jonathan Schöbel authored
A Fragment can output it's html. If there is an error the method aborts and returns NULL.
-
- Jun 22, 2022
-
-
Jonathan Schöbel authored
Check in tests whether error really was written, by setting it to undefined before each call.
-
- Aug 31, 2022
-
-
Jonathan Schöbel authored
-
- Jun 20, 2022
-
-
Jonathan Schöbel authored
-
Jonathan Schöbel authored
Tests are done using check, allowing to integrate the tests into the Autotools. Methods that are part of another unit, but are called in this unit aren't tested as this would interfere with the idea of unittests. This also applies for purely wrapper functions, where a call is passed to another unit.
-
- Jun 21, 2022
-
-
Jonathan Schöbel authored
Error handling is done by passing an Error structure as inout parameter to functions that can fail on runtime predictable. This parameter is always the last one. Methods, where this is not the case, doesn't have an error parameter. When an Error is detected, also an ERROR is passed to the log. Because this isn't implemented yet, it is replaced by a nop. The macro EXIT becomes now useless. It was used earlier in case of an error, to terminate the program in the first place. This behaviour is not userfriendly, but it can't be decided on the library's side, whether there is an option to inform the user, something must be cleaned up or even that recovering is possible at all. Often these recognized errors are a non-working malloc or an over-/underflow. Error handling can be ignored by the caller by passing NULL to the Error parameter. Whether an error had occured, is also always possible to be determined, by examining the return value. If the error occours in a function returning a pointer, NULL will be returned. If it returns an value, a special error value of that type is returned, i.e. PAGE_ERR in SH_Data_register_page. If the return type would be void, a boolean is returned, which tells, whether the method has succeeded. (False means, that an error has occured.) The error may have occured in an intern method and is passed upwards (the stack). Internally errors are handled by an enum, but this must be considered an implementation detail and can be changed in later versions. It is in the responsibility of the caller to recover gracefully. It has to be assumed that the requested operation have neither worked, nor actually took place. Those the operation can be retried (hopefully).
-
- Jun 20, 2022
-
-
Jonathan Schöbel authored
Pages are hold by Data, CMS passes trough the call(s).
-
Jonathan Schöbel authored
data handels all intern data and serves as a cache between the CMS and the (R)DBMS.
-
Jonathan Schöbel authored
cms will be the base "object", that performs all neccessary actions.
-
Jonathan Schöbel authored
-