src/cx/properties.h

changeset 1426
3a89b31f0724
parent 1424
563033aa998c
equal deleted inserted replaced
1425:83284b289430 1426:3a89b31f0724
92 typedef struct cx_properties_config_s CxPropertiesConfig; 92 typedef struct cx_properties_config_s CxPropertiesConfig;
93 93
94 /** 94 /**
95 * Default properties configuration. 95 * Default properties configuration.
96 */ 96 */
97 cx_attr_export 97 CX_EXPORT extern const CxPropertiesConfig cx_properties_config_default;
98 extern const CxPropertiesConfig cx_properties_config_default;
99 98
100 /** 99 /**
101 * Status codes for the properties interface. 100 * Status codes for the properties interface.
102 */ 101 */
103 enum cx_properties_status { 102 enum cx_properties_status {
208 * @param key the key 207 * @param key the key
209 * @param value the value 208 * @param value the value
210 * @retval zero success 209 * @retval zero success
211 * @retval non-zero sinking the k/v-pair failed 210 * @retval non-zero sinking the k/v-pair failed
212 */ 211 */
213 cx_attr_nonnull
214 typedef int(*cx_properties_sink_func)( 212 typedef int(*cx_properties_sink_func)(
215 CxProperties *prop, 213 CxProperties *prop,
216 CxPropertiesSink *sink, 214 CxPropertiesSink *sink,
217 cxstring key, 215 cxstring key,
218 cxstring value 216 cxstring value
255 * @param src the source 253 * @param src the source
256 * @param target a string buffer where the read data shall be stored 254 * @param target a string buffer where the read data shall be stored
257 * @retval zero success 255 * @retval zero success
258 * @retval non-zero reading the data failed 256 * @retval non-zero reading the data failed
259 */ 257 */
260 cx_attr_nonnull
261 typedef int(*cx_properties_read_func)( 258 typedef int(*cx_properties_read_func)(
262 CxProperties *prop, 259 CxProperties *prop,
263 CxPropertiesSource *src, 260 CxPropertiesSource *src,
264 cxstring *target 261 cxstring *target
265 ); 262 );
270 * @param prop the properties interface that wants to read from the source 267 * @param prop the properties interface that wants to read from the source
271 * @param src the source 268 * @param src the source
272 * @retval zero initialization was successful 269 * @retval zero initialization was successful
273 * @retval non-zero otherwise 270 * @retval non-zero otherwise
274 */ 271 */
275 cx_attr_nonnull
276 typedef int(*cx_properties_read_init_func)( 272 typedef int(*cx_properties_read_init_func)(
277 CxProperties *prop, 273 CxProperties *prop,
278 CxPropertiesSource *src 274 CxPropertiesSource *src
279 ); 275 );
280 276
282 * A function that cleans memory initialized by the read_init_func. 278 * A function that cleans memory initialized by the read_init_func.
283 * 279 *
284 * @param prop the properties interface that wants to read from the source 280 * @param prop the properties interface that wants to read from the source
285 * @param src the source 281 * @param src the source
286 */ 282 */
287 cx_attr_nonnull
288 typedef void(*cx_properties_read_clean_func)( 283 typedef void(*cx_properties_read_clean_func)(
289 CxProperties *prop, 284 CxProperties *prop,
290 CxPropertiesSource *src 285 CxPropertiesSource *src
291 ); 286 );
292 287
329 * @param prop the properties interface 324 * @param prop the properties interface
330 * @param config the properties configuration 325 * @param config the properties configuration
331 * @see cxPropertiesInitDefault() 326 * @see cxPropertiesInitDefault()
332 */ 327 */
333 cx_attr_nonnull 328 cx_attr_nonnull
334 cx_attr_export 329 CX_EXPORT void cxPropertiesInit(CxProperties *prop, CxPropertiesConfig config);
335 void cxPropertiesInit(CxProperties *prop, CxPropertiesConfig config);
336 330
337 /** 331 /**
338 * Destroys the properties interface. 332 * Destroys the properties interface.
339 * 333 *
340 * @note Even when you are certain that you did not use the interface in a 334 * @note Even when you are certain that you did not use the interface in a
344 * add a call to this function. 338 * add a call to this function.
345 * 339 *
346 * @param prop the properties interface 340 * @param prop the properties interface
347 */ 341 */
348 cx_attr_nonnull 342 cx_attr_nonnull
349 cx_attr_export 343 CX_EXPORT void cxPropertiesDestroy(CxProperties *prop);
350 void cxPropertiesDestroy(CxProperties *prop);
351 344
352 /** 345 /**
353 * Destroys and re-initializes the properties interface. 346 * Destroys and re-initializes the properties interface.
354 * 347 *
355 * You might want to use this to reset the parser after 348 * You might want to use this to reset the parser after
356 * encountering a syntax error. 349 * encountering a syntax error.
357 * 350 *
358 * @param prop the properties interface 351 * @param prop the properties interface
359 */ 352 */
360 cx_attr_nonnull 353 cx_attr_nonnull
361 static inline void cxPropertiesReset(CxProperties *prop) { 354 CX_EXPORT void cxPropertiesReset(CxProperties *prop);
362 CxPropertiesConfig config = prop->config;
363 cxPropertiesDestroy(prop);
364 cxPropertiesInit(prop, config);
365 }
366 355
367 /** 356 /**
368 * Initialize a properties parser with the default configuration. 357 * Initialize a properties parser with the default configuration.
369 * 358 *
370 * @param prop (@c CxProperties*) the properties interface 359 * @param prop (@c CxProperties*) the properties interface
371 * @see cxPropertiesInit() 360 * @see cxPropertiesInit()
372 */ 361 */
373 #define cxPropertiesInitDefault(prop) \ 362 #define cxPropertiesInitDefault(prop) \
374 cxPropertiesInit(prop, cx_properties_config_default) 363 cxPropertiesInit(prop, cx_properties_config_default)
375 364
376 /** 365 /**
377 * Fills the input buffer with data. 366 * Fills the input buffer with data.
378 * 367 *
379 * After calling this function, you can parse the data by calling 368 * After calling this function, you can parse the data by calling
392 * @param len the length of the data 381 * @param len the length of the data
393 * @retval zero success 382 * @retval zero success
394 * @retval non-zero a memory allocation was necessary but failed 383 * @retval non-zero a memory allocation was necessary but failed
395 * @see cxPropertiesFill() 384 * @see cxPropertiesFill()
396 */ 385 */
397 cx_attr_nonnull 386 cx_attr_nonnull cx_attr_access_r(2, 3)
398 cx_attr_access_r(2, 3) 387 CX_EXPORT int cxPropertiesFilln(CxProperties *prop, const char *buf, size_t len);
399 cx_attr_export
400 int cxPropertiesFilln(
401 CxProperties *prop,
402 const char *buf,
403 size_t len
404 );
405 388
406 /** 389 /**
407 * Internal function, do not use. 390 * Internal function, do not use.
408 * 391 *
409 * @param prop the properties interface 392 * @param prop the properties interface
410 * @param str the text to fill in 393 * @param str the text to fill in
411 * @retval zero success 394 * @retval zero success
412 * @retval non-zero a memory allocation was necessary but failed 395 * @retval non-zero a memory allocation was necessary but failed
413 */ 396 */
414 cx_attr_nonnull 397 cx_attr_nonnull
415 static inline int cx_properties_fill( 398 CX_INLINE int cx_properties_fill(CxProperties *prop, cxstring str) {
416 CxProperties *prop,
417 cxstring str
418 ) {
419 return cxPropertiesFilln(prop, str.ptr, str.length); 399 return cxPropertiesFilln(prop, str.ptr, str.length);
420 } 400 }
421 401
422 /** 402 /**
423 * Fills the input buffer with data. 403 * Fills the input buffer with data.
447 * @param prop the properties interface 427 * @param prop the properties interface
448 * @param buf a pointer to stack memory 428 * @param buf a pointer to stack memory
449 * @param capacity the capacity of the stack memory 429 * @param capacity the capacity of the stack memory
450 */ 430 */
451 cx_attr_nonnull 431 cx_attr_nonnull
452 cx_attr_export 432 CX_EXPORT void cxPropertiesUseStack(CxProperties *prop, char *buf, size_t capacity);
453 void cxPropertiesUseStack(
454 CxProperties *prop,
455 char *buf,
456 size_t capacity
457 );
458 433
459 /** 434 /**
460 * Retrieves the next key/value-pair. 435 * Retrieves the next key/value-pair.
461 * 436 *
462 * This function returns zero as long as there are key/value-pairs found. 437 * This function returns zero as long as there are key/value-pairs found.
484 * @retval CX_PROPERTIES_NULL_INPUT the input buffer was never filled 459 * @retval CX_PROPERTIES_NULL_INPUT the input buffer was never filled
485 * @retval CX_PROPERTIES_INVALID_EMPTY_KEY the properties data contains an illegal empty key 460 * @retval CX_PROPERTIES_INVALID_EMPTY_KEY the properties data contains an illegal empty key
486 * @retval CX_PROPERTIES_INVALID_MISSING_DELIMITER the properties data contains a line without delimiter 461 * @retval CX_PROPERTIES_INVALID_MISSING_DELIMITER the properties data contains a line without delimiter
487 * @retval CX_PROPERTIES_BUFFER_ALLOC_FAILED an internal allocation was necessary but failed 462 * @retval CX_PROPERTIES_BUFFER_ALLOC_FAILED an internal allocation was necessary but failed
488 */ 463 */
489 cx_attr_nonnull 464 cx_attr_nonnull cx_attr_nodiscard
490 cx_attr_nodiscard 465 CX_EXPORT CxPropertiesStatus cxPropertiesNext(CxProperties *prop, cxstring *key, cxstring *value);
491 cx_attr_export
492 CxPropertiesStatus cxPropertiesNext(
493 CxProperties *prop,
494 cxstring *key,
495 cxstring *value
496 );
497 466
498 /** 467 /**
499 * Creates a properties sink for an UCX map. 468 * Creates a properties sink for an UCX map.
500 * 469 *
501 * The values stored in the map will be pointers to freshly allocated, 470 * The values stored in the map will be pointers to freshly allocated,
507 * 476 *
508 * @param map the map that shall consume the k/v-pairs. 477 * @param map the map that shall consume the k/v-pairs.
509 * @return the sink 478 * @return the sink
510 * @see cxPropertiesLoad() 479 * @see cxPropertiesLoad()
511 */ 480 */
512 cx_attr_nonnull 481 cx_attr_nonnull cx_attr_nodiscard
513 cx_attr_nodiscard 482 CX_EXPORT CxPropertiesSink cxPropertiesMapSink(CxMap *map);
514 cx_attr_export
515 CxPropertiesSink cxPropertiesMapSink(CxMap *map);
516 483
517 /** 484 /**
518 * Creates a properties source based on an UCX string. 485 * Creates a properties source based on an UCX string.
519 * 486 *
520 * @param str the string 487 * @param str the string
521 * @return the properties source 488 * @return the properties source
522 * @see cxPropertiesLoad() 489 * @see cxPropertiesLoad()
523 */ 490 */
524 cx_attr_nodiscard 491 cx_attr_nodiscard
525 cx_attr_export 492 CX_EXPORT CxPropertiesSource cxPropertiesStringSource(cxstring str);
526 CxPropertiesSource cxPropertiesStringSource(cxstring str);
527 493
528 /** 494 /**
529 * Creates a properties source based on C string with the specified length. 495 * Creates a properties source based on C string with the specified length.
530 * 496 *
531 * @param str the string 497 * @param str the string
532 * @param len the length 498 * @param len the length
533 * @return the properties source 499 * @return the properties source
534 * @see cxPropertiesLoad() 500 * @see cxPropertiesLoad()
535 */ 501 */
536 cx_attr_nonnull 502 cx_attr_nonnull cx_attr_nodiscard cx_attr_access_r(1, 2)
537 cx_attr_nodiscard 503 CX_EXPORT CxPropertiesSource cxPropertiesCstrnSource(const char *str, size_t len);
538 cx_attr_access_r(1, 2)
539 cx_attr_export
540 CxPropertiesSource cxPropertiesCstrnSource(const char *str, size_t len);
541 504
542 /** 505 /**
543 * Creates a properties source based on a C string. 506 * Creates a properties source based on a C string.
544 * 507 *
545 * The length will be determined with strlen(), so the string MUST be 508 * The length will be determined with strlen(), so the string MUST be
547 * 510 *
548 * @param str the string 511 * @param str the string
549 * @return the properties source 512 * @return the properties source
550 * @see cxPropertiesLoad() 513 * @see cxPropertiesLoad()
551 */ 514 */
552 cx_attr_nonnull 515 cx_attr_nonnull cx_attr_nodiscard cx_attr_cstr_arg(1)
553 cx_attr_nodiscard 516 CX_EXPORT CxPropertiesSource cxPropertiesCstrSource(const char *str);
554 cx_attr_cstr_arg(1)
555 cx_attr_export
556 CxPropertiesSource cxPropertiesCstrSource(const char *str);
557 517
558 /** 518 /**
559 * Creates a properties source based on an FILE. 519 * Creates a properties source based on an FILE.
560 * 520 *
561 * @param file the file 521 * @param file the file
562 * @param chunk_size how many bytes may be read in one operation 522 * @param chunk_size how many bytes may be read in one operation
563 * 523 *
564 * @return the properties source 524 * @return the properties source
565 * @see cxPropertiesLoad() 525 * @see cxPropertiesLoad()
566 */ 526 */
567 cx_attr_nonnull 527 cx_attr_nonnull cx_attr_nodiscard cx_attr_access_r(1)
568 cx_attr_nodiscard 528 CX_EXPORT CxPropertiesSource cxPropertiesFileSource(FILE *file, size_t chunk_size);
569 cx_attr_access_r(1)
570 cx_attr_export
571 CxPropertiesSource cxPropertiesFileSource(FILE *file, size_t chunk_size);
572 529
573 530
574 /** 531 /**
575 * Loads properties data from a source and transfers it to a sink. 532 * Loads properties data from a source and transfers it to a sink.
576 * 533 *
598 * @retval CX_PROPERTIES_INVALID_EMPTY_KEY the properties data contains an illegal empty key 555 * @retval CX_PROPERTIES_INVALID_EMPTY_KEY the properties data contains an illegal empty key
599 * @retval CX_PROPERTIES_INVALID_MISSING_DELIMITER the properties data contains a line without delimiter 556 * @retval CX_PROPERTIES_INVALID_MISSING_DELIMITER the properties data contains a line without delimiter
600 * @retval CX_PROPERTIES_BUFFER_ALLOC_FAILED an internal allocation was necessary but failed 557 * @retval CX_PROPERTIES_BUFFER_ALLOC_FAILED an internal allocation was necessary but failed
601 */ 558 */
602 cx_attr_nonnull 559 cx_attr_nonnull
603 cx_attr_export 560 CX_EXPORT CxPropertiesStatus cxPropertiesLoad(CxProperties *prop,
604 CxPropertiesStatus cxPropertiesLoad( 561 CxPropertiesSink sink, CxPropertiesSource source);
605 CxProperties *prop,
606 CxPropertiesSink sink,
607 CxPropertiesSource source
608 );
609 562
610 #ifdef __cplusplus 563 #ifdef __cplusplus
611 } // extern "C" 564 } // extern "C"
612 #endif 565 #endif
613 566

mercurial