| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143 |
- /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
- file LICENSE.rst or https://cmake.org/licensing for details. */
- #ifndef INCLUDE_LLPKGC_API_H_
- #define INCLUDE_LLPKGC_API_H_
- #ifdef __cplusplus
- extern "C" {
- #endif
- #include <stddef.h>
- #include "llpkgc__internal.h"
- #if defined(_MSC_VER)
- #define LLPKGC_EXPORT __declspec(dllexport)
- #else
- #define LLPKGC_EXPORT __attribute__((visibility("default")))
- #endif
- typedef llpkgc__internal_t llpkgc_t;
- typedef struct llpkgc_settings_s llpkgc_settings_t;
- typedef int (*llpkgc_data_cb)(llpkgc_t*, const char* at, size_t length);
- typedef int (*llpkgc_cb)(llpkgc_t*);
- struct llpkgc_settings_s {
- /* Possible return values 0, -1, PCE_USER */
- llpkgc_data_cb on_key;
- llpkgc_data_cb on_value_literal;
- llpkgc_data_cb on_value_variable;
- /* Possible return values 0, -1, `PCE_PAUSED` */
- llpkgc_cb on_line_begin;
- llpkgc_cb on_keyword_complete;
- llpkgc_cb on_variable_complete;
- llpkgc_cb on_value_literal_complete;
- llpkgc_cb on_value_variable_complete;
- llpkgc_cb on_value_complete;
- llpkgc_cb on_pkgc_complete;
- };
- enum llpkgc_errno {
- PCE_OK = 0,
- PCE_INTERNAL = 1,
- PCE_PAUSED = 2,
- PCE_USER = 3,
- PCE_UNFINISHED = 4,
- };
- typedef enum llpkgc_errno llpkgc_errno_t;
- /* Initialize the parser with user settings.
- *
- * NOTE: lifetime of `settings` has to be at least the same as the lifetime of
- * the `parser` here. In practice, `settings` has to be either a static
- * variable or be allocated with `malloc`, `new`, etc.
- */
- LLPKGC_EXPORT
- void llpkgc_init(llpkgc_t* parser, const llpkgc_settings_t* settings);
- /* Reset an already initialized parser back to the start state, preserving the
- * existing callback settings and user data.
- */
- LLPKGC_EXPORT
- void llpkgc_reset(llpkgc_t* parser);
- /* Initialize the settings object */
- LLPKGC_EXPORT
- void llpkgc_settings_init(llpkgc_settings_t* settings);
- /* Parse full or partial pc data, invoking user callbacks along the way.
- *
- * If any of `llpkgc_data_cb` returns errno not equal to `PCE_OK` - the parsing
- * interrupts, and such errno is returned from `llpkgc_execute()`. If
- * `PCE_PAUSED` was used as an errno, the execution can be resumed with
- * `llpkgc_resume()` call.
- *
- * NOTE: if this function ever returns a non-pause type error, it will continue
- * to return the same error upon each successive call up until `llpkgc_init()`
- * or `llpkgc_reset()` are called.
- */
- LLPKGC_EXPORT
- llpkgc_errno_t llpkgc_execute(llpkgc_t* parser, const char* data, size_t len);
- /* This method should be called when the input has reached EOF
- *
- * This method will invoke `on_pkgc_complete()` callback if the file was
- * terminated safely. Otherwise an error code will be returned.
- */
- LLPKGC_EXPORT
- llpkgc_errno_t llpkgc_finish(llpkgc_t* parser);
- /* Make further calls of `llpkgc_execute()` return `PCE_PAUSED` and set
- * appropriate error reason.
- *
- * Important: do not call this from user callbacks! User callbacks must return
- * `PCE_PAUSED` if pausing is required.
- */
- LLPKGC_EXPORT
- void llpkgc_pause(llpkgc_t* parser);
- /* Might be called to resume the execution after the pause in user's callback.
- * See `llpkgc_execute()` above for details.
- *
- * Call this only if `llpkgc_execute()` returns `PCE_PAUSED`.
- */
- LLPKGC_EXPORT
- void llpkgc_resume(llpkgc_t* parser);
- /* Returns the latest return error */
- LLPKGC_EXPORT
- llpkgc_errno_t llpkgc_get_errno(const llpkgc_t* parser);
- /* Returns the verbal explanation of the latest returned error.
- *
- * Note: User callback should set error reason when returning the error. See
- * `llpkgc_set_error_reason()` for details.
- */
- LLPKGC_EXPORT
- const char* llpkgc_get_error_reason(const llpkgc_t* parser);
- /* Assign verbal description to the returned error. Must be called in user
- * callbacks right before returning the errno.
- *
- * Note: `PCE_USER` error code might be useful in user callbacks.
- */
- LLPKGC_EXPORT
- void llpkgc_set_error_reason(llpkgc_t* parser, const char* reason);
- /* Returns the pointer to the last parsed byte before the returned error. The
- * pointer is relative to the `data` argument of `llpkgc_execute()`.
- *
- * Note: this method might be useful for counting the number of parsed bytes.
- */
- LLPKGC_EXPORT
- const char* llpkgc_get_error_pos(const llpkgc_t* parser);
- /* Returns textual name of error code */
- LLPKGC_EXPORT
- const char* llpkgc_errno_name(llpkgc_errno_t err);
- #ifdef __cplusplus
- } /* extern "C" */
- #endif
- #endif /* INCLUDE_LLPKGC_API_H_ */
|