| 100 * This either happens when the last line does not terminate with a line |
103 * This either happens when the last line does not terminate with a line |
| 101 * break, or when the input ends with a parsed key but no value. |
104 * break, or when the input ends with a parsed key but no value. |
| 102 */ |
105 */ |
| 103 CX_PROPERTIES_INCOMPLETE_DATA, |
106 CX_PROPERTIES_INCOMPLETE_DATA, |
| 104 /** |
107 /** |
| |
108 * Not used as a status and never returned by any function. |
| |
109 * |
| |
110 * You can use this enumerator to check for all "good" status results |
| |
111 * by checking if the status is less than \c CX_PROPERTIES_OK. |
| |
112 * |
| |
113 * A "good" status means, that you can refill data and continue parsing. |
| |
114 */ |
| |
115 CX_PROPERTIES_OK, |
| |
116 /** |
| 105 * Input buffer is \c NULL. |
117 * Input buffer is \c NULL. |
| 106 */ |
118 */ |
| 107 CX_PROPERTIES_NULL_INPUT, |
119 CX_PROPERTIES_NULL_INPUT, |
| 108 /** |
120 /** |
| 109 * The line contains a delimiter, but no key. |
121 * The line contains a delimiter, but no key. |
| 115 CX_PROPERTIES_INVALID_MISSING_DELIMITER, |
127 CX_PROPERTIES_INVALID_MISSING_DELIMITER, |
| 116 /** |
128 /** |
| 117 * More internal buffer was needed, but could not be allocated. |
129 * More internal buffer was needed, but could not be allocated. |
| 118 */ |
130 */ |
| 119 CX_PROPERTIES_BUFFER_ALLOC_FAILED, |
131 CX_PROPERTIES_BUFFER_ALLOC_FAILED, |
| |
132 /** |
| |
133 * Initializing the properties source failed. |
| |
134 * |
| |
135 * @see cx_properties_read_init_func |
| |
136 */ |
| |
137 CX_PROPERTIES_READ_INIT_FAILED, |
| |
138 /** |
| |
139 * Reading from a properties source failed. |
| |
140 * |
| |
141 * @see cx_properties_read_func |
| |
142 */ |
| |
143 CX_PROPERTIES_READ_FAILED, |
| |
144 /** |
| |
145 * Sinking a k/v-pair failed. |
| |
146 * |
| |
147 * @see cx_properties_sink_func |
| |
148 */ |
| |
149 CX_PROPERTIES_SINK_FAILED, |
| 120 }; |
150 }; |
| |
151 |
| |
152 /** |
| |
153 * Typedef for the properties status enum. |
| |
154 */ |
| |
155 typedef enum cx_properties_status CxPropertiesStatus; |
| 121 |
156 |
| 122 /** |
157 /** |
| 123 * Interface for working with properties data. |
158 * Interface for working with properties data. |
| 124 */ |
159 */ |
| 125 struct cx_properties_s { |
160 struct cx_properties_s { |
| 167 /** |
202 /** |
| 168 * Typedef for the properties interface. |
203 * Typedef for the properties interface. |
| 169 */ |
204 */ |
| 170 typedef struct cx_properties_s CxProperties; |
205 typedef struct cx_properties_s CxProperties; |
| 171 |
206 |
| |
207 |
| |
208 /** |
| |
209 * Typedef for a properties sink. |
| |
210 */ |
| |
211 typedef struct cx_properties_sink_s CxPropertiesSink; |
| |
212 |
| |
213 /** |
| |
214 * A function that consumes a k/v-pair in a sink. |
| |
215 * |
| |
216 * The sink could be e.g. a map and the sink function would be calling |
| |
217 * a map function to store the k/v-pair. |
| |
218 * |
| |
219 * @param prop the properties interface that wants to sink a k/v-pair |
| |
220 * @param sink the sink |
| |
221 * @param key the key |
| |
222 * @param value the value |
| |
223 * @return zero on success, non-zero when sinking the k/v-pair failed |
| |
224 */ |
| |
225 __attribute__((__nonnull__)) |
| |
226 typedef int(*cx_properties_sink_func)( |
| |
227 CxProperties *prop, |
| |
228 CxPropertiesSink *sink, |
| |
229 cxstring key, |
| |
230 cxstring value |
| |
231 ); |
| |
232 |
| |
233 /** |
| |
234 * Defines a sink for k/v-pairs. |
| |
235 */ |
| |
236 struct cx_properties_sink_s { |
| |
237 /** |
| |
238 * The sink object. |
| |
239 */ |
| |
240 void *sink; |
| |
241 /** |
| |
242 * Optional custom data. |
| |
243 */ |
| |
244 void *data; |
| |
245 /** |
| |
246 * A function for consuming k/v-pairs into the sink. |
| |
247 */ |
| |
248 cx_properties_sink_func sink_func; |
| |
249 }; |
| |
250 |
| |
251 |
| |
252 /** |
| |
253 * Typedef for a properties source. |
| |
254 */ |
| |
255 typedef struct cx_properties_source_s CxPropertiesSource; |
| |
256 |
| |
257 /** |
| |
258 * A function that reads data from a source. |
| |
259 * |
| |
260 * When the source is depleted, implementations SHALL provide an empty |
| |
261 * string in the \p target and return zero. |
| |
262 * A non-zero return value is only permitted in case of an error. |
| |
263 * |
| |
264 * The meaning of the optional parameters is implementation-dependent. |
| |
265 * |
| |
266 * @param prop the properties interface that wants to read from the source |
| |
267 * @param src the source |
| |
268 * @param target a string buffer where the read data shall be stored |
| |
269 * @return zero on success, non-zero when reading data failed |
| |
270 */ |
| |
271 __attribute__((__nonnull__)) |
| |
272 typedef int(*cx_properties_read_func)( |
| |
273 CxProperties *prop, |
| |
274 CxPropertiesSource *src, |
| |
275 cxstring *target |
| |
276 ); |
| |
277 |
| |
278 /** |
| |
279 * A function that may initialize additional memory for the source. |
| |
280 * |
| |
281 * @param prop the properties interface that wants to read from the source |
| |
282 * @param src the source |
| |
283 * @return zero when initialization was successful, non-zero otherwise |
| |
284 */ |
| |
285 __attribute__((__nonnull__)) |
| |
286 typedef int(*cx_properties_read_init_func)( |
| |
287 CxProperties *prop, |
| |
288 CxPropertiesSource *src |
| |
289 ); |
| |
290 |
| |
291 /** |
| |
292 * A function that cleans memory initialized by the read_init_func. |
| |
293 * |
| |
294 * @param prop the properties interface that wants to read from the source |
| |
295 * @param src the source |
| |
296 */ |
| |
297 __attribute__((__nonnull__)) |
| |
298 typedef void(*cx_properties_read_clean_func)( |
| |
299 CxProperties *prop, |
| |
300 CxPropertiesSource *src |
| |
301 ); |
| |
302 |
| |
303 /** |
| |
304 * Defines a properties source. |
| |
305 */ |
| |
306 struct cx_properties_source_s { |
| |
307 /** |
| |
308 * The source object. |
| |
309 * |
| |
310 * For example a file stream or a string. |
| |
311 */ |
| |
312 void *src; |
| |
313 /** |
| |
314 * Optional additional data pointer. |
| |
315 */ |
| |
316 void *data_ptr; |
| |
317 /** |
| |
318 * Optional size information. |
| |
319 */ |
| |
320 size_t data_size; |
| |
321 /** |
| |
322 * A function that reads data from the source. |
| |
323 */ |
| |
324 cx_properties_read_func read_func; |
| |
325 /** |
| |
326 * Optional function that may prepare the source for reading data. |
| |
327 */ |
| |
328 cx_properties_read_init_func read_init_func; |
| |
329 /** |
| |
330 * Optional function that cleans additional memory allocated by the |
| |
331 * read_init_func. |
| |
332 */ |
| |
333 cx_properties_read_clean_func read_clean_func; |
| |
334 }; |
| 172 |
335 |
| 173 /** |
336 /** |
| 174 * Initialize a properties interface. |
337 * Initialize a properties interface. |
| 175 * |
338 * |
| 176 * @param prop the properties interface |
339 * @param prop the properties interface |
| 275 * @param key a pointer to the cxstring that shall contain the property name |
439 * @param key a pointer to the cxstring that shall contain the property name |
| 276 * @param value a pointer to the cxstring that shall contain the property value |
440 * @param value a pointer to the cxstring that shall contain the property value |
| 277 * @return the status code as defined above |
441 * @return the status code as defined above |
| 278 * @see cxPropertiesFill() |
442 * @see cxPropertiesFill() |
| 279 */ |
443 */ |
| 280 enum cx_properties_status cxPropertiesNext( |
444 __attribute__((__nonnull__, __warn_unused_result__)) |
| |
445 CxPropertiesStatus cxPropertiesNext( |
| 281 CxProperties *prop, |
446 CxProperties *prop, |
| 282 cxstring *key, |
447 cxstring *key, |
| 283 cxstring *value |
448 cxstring *value |
| 284 ); |
449 ); |
| 285 |
450 |
| |
451 /** |
| |
452 * Creates a properties sink for an UCX map. |
| |
453 * |
| |
454 * The values stored in the map will be pointers to strings allocated |
| |
455 * by #cx_strdup_a(). |
| |
456 * The default stdlib allocator will be used, unless you specify a custom |
| |
457 * allocator in the optional \c data of the sink. |
| |
458 * |
| |
459 * @param map the map that shall consume the k/v-pairs. |
| |
460 * @return the sink |
| |
461 * @see cxPropertiesLoad() |
| |
462 */ |
| |
463 __attribute__((__nonnull__, __warn_unused_result__)) |
| |
464 CxPropertiesSink cxPropertiesMapSink(CxMap *map); |
| |
465 |
| |
466 /** |
| |
467 * Creates a properties source based on an UCX string. |
| |
468 * |
| |
469 * @param str the string |
| |
470 * @return the properties source |
| |
471 * @see cxPropertiesLoad() |
| |
472 */ |
| |
473 __attribute__((__warn_unused_result__)) |
| |
474 CxPropertiesSource cxPropertiesStringSource(cxstring str); |
| |
475 |
| |
476 /** |
| |
477 * Creates a properties source based on C string with the specified length. |
| |
478 * |
| |
479 * @param str the string |
| |
480 * @param len the length |
| |
481 * @return the properties source |
| |
482 * @see cxPropertiesLoad() |
| |
483 */ |
| |
484 __attribute__((__nonnull__, __warn_unused_result__)) |
| |
485 CxPropertiesSource cxPropertiesCstrnSource(const char *str, size_t len); |
| |
486 |
| |
487 /** |
| |
488 * Creates a properties source based on a C string. |
| |
489 * |
| |
490 * The length will be determined with strlen(), so the string MUST be |
| |
491 * zero-terminated. |
| |
492 * |
| |
493 * @param str the string |
| |
494 * @return the properties source |
| |
495 * @see cxPropertiesLoad() |
| |
496 */ |
| |
497 __attribute__((__nonnull__, __warn_unused_result__)) |
| |
498 CxPropertiesSource cxPropertiesCstrSource(const char *str); |
| |
499 |
| |
500 /** |
| |
501 * Creates a properties source based on an FILE. |
| |
502 * |
| |
503 * @param file the file |
| |
504 * @param chunk_size how many bytes may be read in one operation |
| |
505 * |
| |
506 * @return the properties source |
| |
507 * @see cxPropertiesLoad() |
| |
508 */ |
| |
509 __attribute__((__nonnull__, __warn_unused_result__)) |
| |
510 CxPropertiesSource cxPropertiesFileSource(FILE *file, size_t chunk_size); |
| |
511 |
| |
512 |
| |
513 /** |
| |
514 * Loads properties data from a source and transfers it to a sink. |
| |
515 * |
| |
516 * This function tries to read as much data from the source as possible. |
| |
517 * When the source was completely consumed and at least on k/v-pair was found, |
| |
518 * the return value will be #CX_PROPERTIES_NO_ERROR. |
| |
519 * When the source was consumed but no k/v-pairs were found, the return value |
| |
520 * will be #CX_PROPERTIES_NO_DATA. |
| |
521 * The other result codes apply, according to their description. |
| |
522 * |
| |
523 * @param prop the properties interface |
| |
524 * @param sink the sink |
| |
525 * @param source the source |
| |
526 * @return the status of the last operation |
| |
527 */ |
| |
528 __attribute__((__nonnull__)) |
| |
529 CxPropertiesStatus cxPropertiesLoad( |
| |
530 CxProperties *prop, |
| |
531 CxPropertiesSink sink, |
| |
532 CxPropertiesSource source |
| |
533 ); |
| |
534 |
| 286 #endif // UCX_PROPERTIES |
535 #endif // UCX_PROPERTIES |