Thu, 30 Oct 2025 19:26:47 +0100
add tests for cxListDifference() - resolves #751
| 1143 
0559812df10c
assign proper names to the documentation topics
 Mike Becker <universe@uap-core.de> parents: 
1142diff
changeset | 1 | # Properties | 
| 1142 
9437530176bc
add symbols that need documentation as TODOs
 Mike Becker <universe@uap-core.de> parents: 
1141diff
changeset | 2 | |
| 1424 
563033aa998c
fixes tons of typos and grammar issues across the documentation - fixes #667
 Mike Becker <universe@uap-core.de> parents: 
1420diff
changeset | 3 | The UCX properties parser can be used to parse line-based key/value strings. | 
| 1229 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 4 | |
| 1230 
3ec9cce0de01
add information about supported properties syntax
 Mike Becker <universe@uap-core.de> parents: 
1229diff
changeset | 5 | ## Supported Syntax | 
| 
3ec9cce0de01
add information about supported properties syntax
 Mike Becker <universe@uap-core.de> parents: 
1229diff
changeset | 6 | |
| 1420 
c6f55a2b3495
fix various typos in the web documentation
 Mike Becker <universe@uap-core.de> parents: 
1298diff
changeset | 7 | Key/value pairs must be line-based and separated by a single character delimiter. | 
| 1230 
3ec9cce0de01
add information about supported properties syntax
 Mike Becker <universe@uap-core.de> parents: 
1229diff
changeset | 8 | The parser supports up to three different characters which introduce comments. | 
| 
3ec9cce0de01
add information about supported properties syntax
 Mike Becker <universe@uap-core.de> parents: 
1229diff
changeset | 9 | All characters starting with a comment character up to the end of the line are ignored. | 
| 
3ec9cce0de01
add information about supported properties syntax
 Mike Becker <universe@uap-core.de> parents: 
1229diff
changeset | 10 | Blank lines are also ignored. | 
| 
3ec9cce0de01
add information about supported properties syntax
 Mike Becker <universe@uap-core.de> parents: 
1229diff
changeset | 11 | |
| 
3ec9cce0de01
add information about supported properties syntax
 Mike Becker <universe@uap-core.de> parents: 
1229diff
changeset | 12 | An example properties file looks like this: | 
| 
3ec9cce0de01
add information about supported properties syntax
 Mike Becker <universe@uap-core.de> parents: 
1229diff
changeset | 13 | |
| 1277 
637d4775e79e
fixes some docs compiler complaints
 Mike Becker <universe@uap-core.de> parents: 
1268diff
changeset | 14 | ```Ini | 
| 1230 
3ec9cce0de01
add information about supported properties syntax
 Mike Becker <universe@uap-core.de> parents: 
1229diff
changeset | 15 | # Comment line at start of file | 
| 
3ec9cce0de01
add information about supported properties syntax
 Mike Becker <universe@uap-core.de> parents: 
1229diff
changeset | 16 | key1 = value1 | 
| 
3ec9cce0de01
add information about supported properties syntax
 Mike Becker <universe@uap-core.de> parents: 
1229diff
changeset | 17 | key2 = value2 | 
| 
3ec9cce0de01
add information about supported properties syntax
 Mike Becker <universe@uap-core.de> parents: 
1229diff
changeset | 18 | # next is a blank line and will be ignored | 
| 
3ec9cce0de01
add information about supported properties syntax
 Mike Becker <universe@uap-core.de> parents: 
1229diff
changeset | 19 | |
| 
3ec9cce0de01
add information about supported properties syntax
 Mike Becker <universe@uap-core.de> parents: 
1229diff
changeset | 20 | keys_are_trimmed = and_so_are_values # also a comment | 
| 
3ec9cce0de01
add information about supported properties syntax
 Mike Becker <universe@uap-core.de> parents: 
1229diff
changeset | 21 | ``` | 
| 
3ec9cce0de01
add information about supported properties syntax
 Mike Becker <universe@uap-core.de> parents: 
1229diff
changeset | 22 | |
| 
3ec9cce0de01
add information about supported properties syntax
 Mike Becker <universe@uap-core.de> parents: 
1229diff
changeset | 23 | > Delimiter and comment characters are configured with the `CxPropertiesConfig` structure. | 
| 
3ec9cce0de01
add information about supported properties syntax
 Mike Becker <universe@uap-core.de> parents: 
1229diff
changeset | 24 | > There is also a field reserved for `continuation` which will be used as a line continuation character | 
| 
3ec9cce0de01
add information about supported properties syntax
 Mike Becker <universe@uap-core.de> parents: 
1229diff
changeset | 25 | > in a future version of UCX. | 
| 
3ec9cce0de01
add information about supported properties syntax
 Mike Becker <universe@uap-core.de> parents: 
1229diff
changeset | 26 | > In UCX 3.1 this is not implemented. | 
| 1229 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 27 | |
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 28 | ## Basic Parsing | 
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 29 | |
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 30 | ```C | 
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 31 | #include <cx/properties.h> | 
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 32 | |
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 33 | typedef struct cx_properties_config_s { | 
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 34 | char delimiter; | 
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 35 | char comment1; | 
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 36 | char comment2; | 
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 37 | char comment3; | 
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 38 | // reserved for future use - not implemented in UCX 3.1 | 
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 39 | char continuation; | 
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 40 | } CxPropertiesConfig; | 
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 41 | |
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 42 | void cxPropertiesInit(CxProperties *prop, CxPropertiesConfig config); | 
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 43 | |
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 44 | void cxPropertiesInitDefault(CxProperties *prop); | 
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 45 | |
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 46 | void cxPropertiesDestroy(CxProperties *prop); | 
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 47 | |
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 48 | void cxPropertiesReset(CxProperties *prop); | 
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 49 | |
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 50 | int cxPropertiesFilln(CxProperties *prop, | 
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 51 | const char *buf, size_t len); | 
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 52 | |
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 53 | // where S is one of cxstring, cxmutstr, char*, const char* | 
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 54 | int cxPropertiesFill(CxProperties *prop, S string); | 
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 55 | |
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 56 | CxPropertiesStatus cxPropertiesNext(CxProperties *prop, | 
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 57 | cxstring *key, cxstring *value); | 
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 58 | |
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 59 | void cxPropertiesUseStack(CxProperties *prop, | 
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 60 | char *buf, size_t capacity); | 
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 61 | ``` | 
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 62 | |
| 1231 
a9f9c59e0b63
write basic parsing documentation
 Mike Becker <universe@uap-core.de> parents: 
1230diff
changeset | 63 | The first step is to initialize a `CxProperties` structure with a call to `cxPropertiesInit()` using the desired config. | 
| 1424 
563033aa998c
fixes tons of typos and grammar issues across the documentation - fixes #667
 Mike Becker <universe@uap-core.de> parents: 
1420diff
changeset | 64 | The shorthand `cxPropertiesInitDefault()` creates a default configuration with the equals sign `'='` as delimiter | 
| 1231 
a9f9c59e0b63
write basic parsing documentation
 Mike Becker <universe@uap-core.de> parents: 
1230diff
changeset | 65 | and the hash-symbol `'#'` as comment symbol (the other two comment symbols remain unused in the default config). | 
| 
a9f9c59e0b63
write basic parsing documentation
 Mike Becker <universe@uap-core.de> parents: 
1230diff
changeset | 66 | |
| 
a9f9c59e0b63
write basic parsing documentation
 Mike Becker <universe@uap-core.de> parents: 
1230diff
changeset | 67 | > In a future UCX version, the default `continuation` character will be a backslash `'\'`. | 
| 
a9f9c59e0b63
write basic parsing documentation
 Mike Becker <universe@uap-core.de> parents: 
1230diff
changeset | 68 | > In UCX 3.1 this feature is not implemented, yet. | 
| 
a9f9c59e0b63
write basic parsing documentation
 Mike Becker <universe@uap-core.de> parents: 
1230diff
changeset | 69 | |
| 
a9f9c59e0b63
write basic parsing documentation
 Mike Becker <universe@uap-core.de> parents: 
1230diff
changeset | 70 | The actual parsing is an interleaving invocation of the `cxPropertiesFill()` (or `cxPropertiesFilln()`) and `cxPropertiesNext()` functions. | 
| 
a9f9c59e0b63
write basic parsing documentation
 Mike Becker <universe@uap-core.de> parents: 
1230diff
changeset | 71 | The `cxPropertiesFill()` function is a convenience function, that accepts UCX strings and normal zero-terminated C strings and behaves otherwise like `cxPropertiesFilln()`. | 
| 
a9f9c59e0b63
write basic parsing documentation
 Mike Becker <universe@uap-core.de> parents: 
1230diff
changeset | 72 | |
| 
a9f9c59e0b63
write basic parsing documentation
 Mike Becker <universe@uap-core.de> parents: 
1230diff
changeset | 73 | Filling the input buffer is cost-free if there is no data already in the input buffer. | 
| 
a9f9c59e0b63
write basic parsing documentation
 Mike Becker <universe@uap-core.de> parents: 
1230diff
changeset | 74 | In that case, the input buffer only stores the pointer to the original data without creating a copy. | 
| 
a9f9c59e0b63
write basic parsing documentation
 Mike Becker <universe@uap-core.de> parents: 
1230diff
changeset | 75 | Calling `cxPropertiesNext()` will return with `CX_PROPERTIES_NO_ERROR` (= zero) for each key/value-pair that is successfully parsed, | 
| 
a9f9c59e0b63
write basic parsing documentation
 Mike Becker <universe@uap-core.de> parents: 
1230diff
changeset | 76 | and stores the pointers and lengths for both the key and the value into the structures pointed to by the `key` and `value` arguments. | 
| 
a9f9c59e0b63
write basic parsing documentation
 Mike Becker <universe@uap-core.de> parents: 
1230diff
changeset | 77 | |
| 1232 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 78 | When all the data from the input buffer was successfully consumed, `cxPropertiesNext()` returns `CX_PROPERTIES_NO_DATA`. | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 79 | |
| 1231 
a9f9c59e0b63
write basic parsing documentation
 Mike Becker <universe@uap-core.de> parents: 
1230diff
changeset | 80 | > This is all still free of any copies and allocations. | 
| 
a9f9c59e0b63
write basic parsing documentation
 Mike Becker <universe@uap-core.de> parents: 
1230diff
changeset | 81 | > That means, the pointers in `key` and `value` after `cxPropertiesNext()` returns will point into the input buffer. | 
| 
a9f9c59e0b63
write basic parsing documentation
 Mike Becker <universe@uap-core.de> parents: 
1230diff
changeset | 82 | > If you intend to store the key and/or the value somewhere else, it is strongly recommended to create a copy with `cx_strdup()`, | 
| 
a9f9c59e0b63
write basic parsing documentation
 Mike Becker <universe@uap-core.de> parents: 
1230diff
changeset | 83 | > because you will otherwise soon end up with a dangling pointer. | 
| 
a9f9c59e0b63
write basic parsing documentation
 Mike Becker <universe@uap-core.de> parents: 
1230diff
changeset | 84 | > {style="note"} | 
| 
a9f9c59e0b63
write basic parsing documentation
 Mike Becker <universe@uap-core.de> parents: 
1230diff
changeset | 85 | |
| 
a9f9c59e0b63
write basic parsing documentation
 Mike Becker <universe@uap-core.de> parents: 
1230diff
changeset | 86 | If `cxPropertiesNext()` returns `CX_PROPERTIES_INCOMPLETE_DATA` it means that the input buffer is exhausted, | 
| 
a9f9c59e0b63
write basic parsing documentation
 Mike Becker <universe@uap-core.de> parents: 
1230diff
changeset | 87 | but the last line did not contain a full key/value pair. | 
| 
a9f9c59e0b63
write basic parsing documentation
 Mike Becker <universe@uap-core.de> parents: 
1230diff
changeset | 88 | In that case, you can call `cxPropertiesFill()` again to add more data and continue with `cxPropertiesNext()`. | 
| 
a9f9c59e0b63
write basic parsing documentation
 Mike Becker <universe@uap-core.de> parents: 
1230diff
changeset | 89 | |
| 1424 
563033aa998c
fixes tons of typos and grammar issues across the documentation - fixes #667
 Mike Becker <universe@uap-core.de> parents: 
1420diff
changeset | 90 | Note that adding more data to a non-empty input buffer will lead to an allocation, | 
| 1231 
a9f9c59e0b63
write basic parsing documentation
 Mike Becker <universe@uap-core.de> parents: 
1230diff
changeset | 91 | unless you specified some stack memory with `cxPropertiesUseStack()`. | 
| 
a9f9c59e0b63
write basic parsing documentation
 Mike Becker <universe@uap-core.de> parents: 
1230diff
changeset | 92 | The stack capacity must be large enough to contain the longest line in your data. | 
| 
a9f9c59e0b63
write basic parsing documentation
 Mike Becker <universe@uap-core.de> parents: 
1230diff
changeset | 93 | If the internal buffer is not large enough to contain a single line, it is extended. | 
| 
a9f9c59e0b63
write basic parsing documentation
 Mike Becker <universe@uap-core.de> parents: 
1230diff
changeset | 94 | If that is not possible for some reason, `cxPropertiesNext()` fails and returns `CX_PROPERTIES_BUFFER_ALLOC_FAILED`. | 
| 
a9f9c59e0b63
write basic parsing documentation
 Mike Becker <universe@uap-core.de> parents: 
1230diff
changeset | 95 | |
| 
a9f9c59e0b63
write basic parsing documentation
 Mike Becker <universe@uap-core.de> parents: 
1230diff
changeset | 96 | If you want to reuse a `CxProperties` structure with the same config, you can call `cxPropertiesReset()`, even if the last operation was a failure. | 
| 
a9f9c59e0b63
write basic parsing documentation
 Mike Becker <universe@uap-core.de> parents: 
1230diff
changeset | 97 | Otherwise, you should always call `cxPropertiesDestroy()` when you are done with the parser. | 
| 
a9f9c59e0b63
write basic parsing documentation
 Mike Becker <universe@uap-core.de> parents: 
1230diff
changeset | 98 | |
| 1268 
a84403b0a503
complete JSON documentation
 Mike Becker <universe@uap-core.de> parents: 
1233diff
changeset | 99 | > It is strongly recommended to always call `cxPropertiesDestroy()` when you are done with the parser, | 
| 1231 
a9f9c59e0b63
write basic parsing documentation
 Mike Becker <universe@uap-core.de> parents: 
1230diff
changeset | 100 | > even if you did not expect any allocations because you used `cxPropertiesUseStack()`. | 
| 
a9f9c59e0b63
write basic parsing documentation
 Mike Becker <universe@uap-core.de> parents: 
1230diff
changeset | 101 | |
| 1229 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 102 | ### List of Status Codes | 
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 103 | |
| 1232 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 104 | Below is a full list of status codes for `cxPropertiesNext()`. | 
| 1231 
a9f9c59e0b63
write basic parsing documentation
 Mike Becker <universe@uap-core.de> parents: 
1230diff
changeset | 105 | |
| 
a9f9c59e0b63
write basic parsing documentation
 Mike Becker <universe@uap-core.de> parents: 
1230diff
changeset | 106 | | Status Code | Meaning | | 
| 
a9f9c59e0b63
write basic parsing documentation
 Mike Becker <universe@uap-core.de> parents: 
1230diff
changeset | 107 | |-----------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | 
| 
a9f9c59e0b63
write basic parsing documentation
 Mike Becker <universe@uap-core.de> parents: 
1230diff
changeset | 108 | | CX_PROPERTIES_NO_ERROR | A key/value pair was found and returned. | | 
| 
a9f9c59e0b63
write basic parsing documentation
 Mike Becker <universe@uap-core.de> parents: 
1230diff
changeset | 109 | | CX_PROPERTIES_NO_DATA | The input buffer does not contain more data. | | 
| 
a9f9c59e0b63
write basic parsing documentation
 Mike Becker <universe@uap-core.de> parents: 
1230diff
changeset | 110 | | CX_PROPERTIES_INCOMPLETE_DATA | The input ends unexpectedly. This can happen when the last line does not terminate with a line break, or when the input ends with a parsed key but no value. Use `cxPropertiesFill()` to add more data before retrying. | | 
| 
a9f9c59e0b63
write basic parsing documentation
 Mike Becker <universe@uap-core.de> parents: 
1230diff
changeset | 111 | | CX_PROPERTIES_NULL_INPUT | The input buffer was never initialized. Probably you forgot to call `cxPropertiesFill()` at least once. | | 
| 
a9f9c59e0b63
write basic parsing documentation
 Mike Becker <universe@uap-core.de> parents: 
1230diff
changeset | 112 | | CX_PROPERTIES_INVALID_EMPTY_KEY | Only white-spaces were found on the left hand-side of the delimiter. Keys must not be empty. | | 
| 
a9f9c59e0b63
write basic parsing documentation
 Mike Becker <universe@uap-core.de> parents: 
1230diff
changeset | 113 | | CX_PROPERTIES_INVALID_MISSING_DELIMITER | A line contains data, but no delimiter. | | 
| 
a9f9c59e0b63
write basic parsing documentation
 Mike Becker <universe@uap-core.de> parents: 
1230diff
changeset | 114 | | CX_PROPERTIES_BUFFER_ALLOC_FAILED | More internal buffer was needed, but could not be allocated. | | 
| 
a9f9c59e0b63
write basic parsing documentation
 Mike Becker <universe@uap-core.de> parents: 
1230diff
changeset | 115 | |
| 
a9f9c59e0b63
write basic parsing documentation
 Mike Becker <universe@uap-core.de> parents: 
1230diff
changeset | 116 | |
| 1229 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 117 | ## Sources and Sinks | 
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 118 | |
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 119 | ```C | 
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 120 | #include <cx/properties.h> | 
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 121 | |
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 122 | CxPropertiesSource | 
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 123 | cxPropertiesStringSource(cxstring str); | 
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 124 | |
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 125 | CxPropertiesSource | 
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 126 | cxPropertiesCstrSource(const char *str); | 
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 127 | |
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 128 | CxPropertiesSource | 
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 129 | cxPropertiesCstrnSource(const char *str, size_t len); | 
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 130 | |
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 131 | CxPropertiesSource | 
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 132 | cxPropertiesFileSource(FILE *file, size_t chunk_size); | 
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 133 | |
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 134 | CxPropertiesSink | 
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 135 | cxPropertiesMapSink(CxMap *map); | 
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 136 | |
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 137 | CxPropertiesStatus | 
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 138 | cxPropertiesLoad(CxProperties *prop, | 
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 139 | CxPropertiesSink sink, CxPropertiesSource source); | 
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 140 | ``` | 
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 141 | |
| 1232 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 142 | The basic idea of `cxPropertiesLoad()` is that key/value-pairs are extracted from a _source_ and ingested by a _sink_. | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 143 | For the most common scenarios where properties data is read from a string or a file and put into a map, several functions are available. | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 144 | But you can specify your [own sources and sinks](#creating-own-sources-and-sinks), as well. | 
| 1231 
a9f9c59e0b63
write basic parsing documentation
 Mike Becker <universe@uap-core.de> parents: 
1230diff
changeset | 145 | |
| 1232 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 146 | The following example shows a simple function which loads all properties data from a file. | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 147 | The `chunk_size` argument when creating the file source specifies | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 148 | how many bytes are read from the file and filled into the properties parser in one read/sink cycle. | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 149 | |
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 150 | ```C | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 151 | #include <stdio.h> | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 152 | #include <cx/properties.h> | 
| 1231 
a9f9c59e0b63
write basic parsing documentation
 Mike Becker <universe@uap-core.de> parents: 
1230diff
changeset | 153 | |
| 1232 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 154 | int load_props_from_file(const char *filename, CxMap *map) { | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 155 | FILE *f = fopen(filename, "r"); | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 156 | if (!f) return -1; | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 157 | CxProperties prop; | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 158 | cxPropertiesInitDefault(&prop); | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 159 | CxPropertiesSink sink = cxPropertiesMapSink(map); | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 160 | CxPropertiesSource src = cxPropertiesFileSource(f, 512); | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 161 | CxPropertiesStatus status = cxPropertiesLoad(&prop, sink, src); | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 162 | fclose(f); | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 163 | return status; | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 164 | } | 
| 1231 
a9f9c59e0b63
write basic parsing documentation
 Mike Becker <universe@uap-core.de> parents: 
1230diff
changeset | 165 | |
| 1232 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 166 | // usage: | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 167 | CxMap *map = cxHashMapCreateSimple(CX_STORE_POINTERS); | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 168 | if (load_props_from_file("my-props.properties", map)) { | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 169 | // error handling | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 170 | } else { | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 171 | // assuming my-props.properties contains the following line: | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 172 | // my-key = some value | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 173 | char *value = cxMapGet(map, "my-key"); | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 174 | } | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 175 | ``` | 
| 1231 
a9f9c59e0b63
write basic parsing documentation
 Mike Becker <universe@uap-core.de> parents: 
1230diff
changeset | 176 | |
| 1232 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 177 | > The function `cxPropertiesLoad()` should usually not return `CX_PROPERTIES_INCOMPLETE_DATA` because the parser is automatically refilled from the source. | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 178 | > If it does, it could mean that the source was unable to provide all the data, or the properties data ended unexpectedly. | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 179 | > The most expected status code is `CX_PROPERTIES_NO_ERROR` which means that at least one key/value-pair was found. | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 180 | > If `cxPropertiesLoad()` returns `CX_PROPERTIES_NO_DATA` it means that the source did not provide any key/value-pair. | 
| 1424 
563033aa998c
fixes tons of typos and grammar issues across the documentation - fixes #667
 Mike Becker <universe@uap-core.de> parents: 
1420diff
changeset | 181 | > There are several special status codes that are documented [below](#additional-status-codes). | 
| 1231 
a9f9c59e0b63
write basic parsing documentation
 Mike Becker <universe@uap-core.de> parents: 
1230diff
changeset | 182 | |
| 1229 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 183 | ### Creating own Sources and Sinks | 
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 184 | |
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 185 | ```C | 
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 186 | #include <cx/properties.h> | 
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 187 | |
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 188 | typedef int(*cx_properties_read_init_func)(CxProperties *prop, | 
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 189 | CxPropertiesSource *src); | 
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 190 | |
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 191 | typedef int(*cx_properties_read_func)(CxProperties *prop, | 
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 192 | CxPropertiesSource *src, cxstring *target); | 
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 193 | |
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 194 | typedef void(*cx_properties_read_clean_func)(CxProperties *prop, | 
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 195 | CxPropertiesSource *src); | 
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 196 | |
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 197 | typedef int(*cx_properties_sink_func)(CxProperties *prop, | 
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 198 | CxPropertiesSink *sink, cxstring key, cxstring value); | 
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 199 | |
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 200 | typedef struct cx_properties_source_s { | 
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 201 | void *src; | 
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 202 | void *data_ptr; | 
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 203 | size_t data_size; | 
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 204 | cx_properties_read_func read_func; | 
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 205 | cx_properties_read_init_func read_init_func; | 
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 206 | cx_properties_read_clean_func read_clean_func; | 
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 207 | } CxPropertiesSource; | 
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 208 | |
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 209 | typedef struct cx_properties_sink_s { | 
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 210 | void *sink; | 
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 211 | void *data; | 
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 212 | cx_properties_sink_func sink_func; | 
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 213 | } CxPropertiesSink; | 
| 
9899043d7e39
basic structure for properties docu
 Mike Becker <universe@uap-core.de> parents: 
1190diff
changeset | 214 | ``` | 
| 1190 
a7b913d5d589
bring incomplete docs into a shape that can be released
 Mike Becker <universe@uap-core.de> parents: 
1143diff
changeset | 215 | |
| 1232 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 216 | You can create your own sources and sinks by initializing the respective structures. | 
| 1233 
29e1c48d1a6c
add one more sentence to the example for properties source and sink
 Mike Becker <universe@uap-core.de> parents: 
1232diff
changeset | 217 | |
| 1232 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 218 | For a source, only the `read_func` is mandatory, the other two functions are optional and used for initialization and cleanup, if required. | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 219 | The file source created by `cxPropertiesFileSource()`, for example, | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 220 | uses the `read_init_func` to allocate, and the `read_clean_func` to free the read buffer, respectively. | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 221 | |
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 222 | Since the default map sink created by `cxPropertiesMapSink()` stores `char*` pointers into a map, | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 223 | the following example uses a different sink, which stores them as `cxmutstr` values, automatically freeing them | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 224 | when the map gets destroyed. | 
| 1233 
29e1c48d1a6c
add one more sentence to the example for properties source and sink
 Mike Becker <universe@uap-core.de> parents: 
1232diff
changeset | 225 | And instead of reading the data from a file with `fread()`, it uses `mmap()` to map the file into memory for reading. | 
| 1232 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 226 | |
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 227 | ```C | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 228 | #include <stdio.h> | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 229 | #include <unistd.h> | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 230 | #include <fcntl.h> | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 231 | #include <sys/stat.h> | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 232 | #include <sys/mman.h> | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 233 | #include <cx/properties.h> | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 234 | #include <cx/hash_map.h> | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 235 | |
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 236 | static int prop_mmap(CxProperties *prop, CxPropertiesSource *src) { | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 237 | struct stat s; | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 238 | int fd = open(src->src, O_RDONLY); | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 239 | if (fd < 0) return -1; | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 240 | // re-use the data field to store the fd | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 241 | // there are cleaner ways, but this is just for illustration | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 242 | src->src = (void*) fd; | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 243 | fstat(fd, &s); | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 244 | // memory map the entire file | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 245 | // and store the address and length in the properties source | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 246 | src->data_ptr = mmap(0, s.st_size, PROT_READ, MAP_PRIVATE, fd, 0); | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 247 | src->data_size = s.st_size; | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 248 | return src->data_ptr == NULL; | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 249 | } | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 250 | |
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 251 | static int prop_read(CxProperties *prop, CxPropertiesSource *src, | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 252 | cxstring *target) { | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 253 | // copy the address and length of the mapped data to the target | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 254 | target->ptr = src->data_ptr; | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 255 | target->length = src->data_size; | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 256 | // set the new size to zero to indicate that there is no more data | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 257 | src->data_size = 0; | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 258 | return 0; | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 259 | } | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 260 | |
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 261 | static void prop_unmap(CxProperties *prop, CxPropertiesSource *src) { | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 262 | // unmap the memory and close the file | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 263 | munmap(src->data_ptr, src->data_size); | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 264 | close((int)src->src); | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 265 | } | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 266 | |
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 267 | static int prop_sink(CxProperties *prop, CxPropertiesSink *sink, | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 268 | cxstring key, cxstring value) { | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 269 | CxMap *map = sink->sink; | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 270 | // copy the string and store it into the map | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 271 | cxmutstr v = cx_strdup(value); | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 272 | int r = cxMapPut(map, key, &v); | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 273 | if (r != 0) cx_strfree(&v); | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 274 | return r; | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 275 | } | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 276 | |
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 277 | int load_props_from_file(const char *filename, CxMap *map) { | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 278 | CxProperties prop; | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 279 | cxPropertiesInitDefault(&prop); | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 280 | CxPropertiesSource src; | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 281 | src.src = (void*) filename; | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 282 | src.read_init_func = prop_mmap; | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 283 | src.read_func = prop_read; | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 284 | src.read_clean_func = prop_unmap; | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 285 | CxPropertiesSink sink; | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 286 | sink.sink = map; | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 287 | sink.sink_func = prop_sink; | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 288 | return cxPropertiesLoad(&prop, sink, src); | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 289 | } | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 290 | |
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 291 | int main() { | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 292 | // in contrast to the default map sink, | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 293 | // this one here stores the UCX strings by value | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 294 | CxMap *map = cxHashMapCreateSimple(sizeof(cxmutstr)); | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 295 | |
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 296 | // automatically free the UCX string when removed from the map | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 297 | cxDefineDestructor(map, cx_strfree); | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 298 | |
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 299 | // use our custom load function to load the data from the file | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 300 | if (load_props_from_file("my-props.properties", map)) { | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 301 | fputs("Error reading properties.\n", stderr); | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 302 | return 1; | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 303 | } | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 304 | |
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 305 | // output the read key/value pairs for illustration | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 306 | CxMapIterator iter = cxMapIterator(map); | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 307 | cx_foreach(CxMapEntry *, entry, iter) { | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 308 | cxstring k = cx_strn(entry->key->data, entry->key->len); | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 309 | cxmutstr *v = entry->value; | 
| 1298 
0597f1f20ea9
use new string formatting macros in documentation
 Mike Becker <universe@uap-core.de> parents: 
1277diff
changeset | 310 | printf("%" CX_PRIstr " = %" CX_PRIstr "\n", | 
| 
0597f1f20ea9
use new string formatting macros in documentation
 Mike Becker <universe@uap-core.de> parents: 
1277diff
changeset | 311 | CX_SFMT(k), CX_SFMT(*v)); | 
| 1232 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 312 | } | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 313 | |
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 314 | // freeing the map also frees the strings | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 315 | // because we have registered cx_strfree() as destructor function | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 316 | cxMapFree(map); | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 317 | |
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 318 | return 0; | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 319 | } | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 320 | ``` | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 321 | |
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 322 | > A cleaner implementation that does not produce a warning for bluntly casting an `int` to a `void*` | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 323 | > can be achieved by declaring a struct that contains the information, allocate memory for | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 324 | > that struct, and store the pointer in `data_ptr`. | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 325 | > For illustrating how properties sources and sinks can be implemented, this was not necessary. | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 326 | |
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 327 | ### Additional Status Codes | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 328 | |
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 329 | For sources and sinks there are three additional special status codes, | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 330 | which only appear as return values for `cxPropertiesLoad()`. | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 331 | |
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 332 | | Status Code | Meaning | | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 333 | |-----------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 334 | | CX_PROPERTIES_READ_INIT_FAILED | Initializing the properties source failed and the `cx_properties_read_init_func` returned non-zero. | | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 335 | | CX_PROPERTIES_READ_FAILED | Reading from a properties source failed and the `cx_properties_read_func` returned non-zero. | | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 336 | | CX_PROPERTIES_SINK_FAILED | Sinking a key/value-pair failed and the `cx_properties_sink_func` returned non-zero. | | 
| 
781bd188f1c0
complete the properties documentation
 Mike Becker <universe@uap-core.de> parents: 
1231diff
changeset | 337 | |
| 1231 
a9f9c59e0b63
write basic parsing documentation
 Mike Becker <universe@uap-core.de> parents: 
1230diff
changeset | 338 | |
| 1190 
a7b913d5d589
bring incomplete docs into a shape that can be released
 Mike Becker <universe@uap-core.de> parents: 
1143diff
changeset | 339 | <seealso> | 
| 
a7b913d5d589
bring incomplete docs into a shape that can be released
 Mike Becker <universe@uap-core.de> parents: 
1143diff
changeset | 340 | <category ref="apidoc"> | 
| 
a7b913d5d589
bring incomplete docs into a shape that can be released
 Mike Becker <universe@uap-core.de> parents: 
1143diff
changeset | 341 | <a href="https://ucx.sourceforge.io/api/properties_8h.html">properties.h</a> | 
| 
a7b913d5d589
bring incomplete docs into a shape that can be released
 Mike Becker <universe@uap-core.de> parents: 
1143diff
changeset | 342 | </category> | 
| 
a7b913d5d589
bring incomplete docs into a shape that can be released
 Mike Becker <universe@uap-core.de> parents: 
1143diff
changeset | 343 | </seealso> |