#ifndef FHP_H_ #define FHP_H #include // for uint8_t #include // for size_t #include // for size_t typedef enum { FHP_TOKEN_METHOD_START, FHP_TOKEN_METHOD_FRAGMENT, FHP_TOKEN_METHOD_END, FHP_TOKEN_URL_START, FHP_TOKEN_URL_FRAGMENT, FHP_TOKEN_URL_END, FHP_TOKEN_VERSION_START, FHP_TOKEN_VERSION_FRAGMENT, FHP_TOKEN_VERSION_END, FHP_TOKEN_HEADER_NAME_START, FHP_TOKEN_HEADER_NAME_FRAGMENT, FHP_TOKEN_HEADER_NAME_END, FHP_TOKEN_HEADER_VALUE_START, FHP_TOKEN_HEADER_VALUE_FRAGMENT, FHP_TOKEN_HEADER_VALUE_END, FHP_TOKEN_LAST } fhp_token_t; typedef struct fhp_t_ fhp_t; typedef bool (*fhp_cb_t)( fhp_t * const, fhp_token_t, uint8_t * const, size_t ); typedef enum { FHP_STATE_INIT, FHP_STATE_ERROR, FHP_STATE_METHOD, FHP_STATE_METHOD_END, FHP_STATE_URL, FHP_STATE_URL_END, FHP_STATE_VERSION, FHP_STATE_VERSION_END, FHP_STATE_VERSION_END_CR, FHP_STATE_STATUS_END, FHP_STATE_STATUS_END_CR, FHP_STATE_HEADER_NAME, FHP_STATE_HEADER_NAME_END, FHP_STATE_HEADER_NAME_END_CR, FHP_STATE_HEADER_VALUE, FHP_STATE_HEADER_VALUE_END_CR, FHP_STATE_HEADER_VALUE_END, FHP_STATE_HEADERS_END, FHP_STATE_HEADERS_END_CR, FHP_STATE_LAST } fhp_state_t; typedef enum { FHP_OK, FHP_ERR_CB, FHP_ERR_BAD_STATE, FHP_ERR_INVALID_CHAR, FHP_ERR_INVALID_ERROR, FHP_ERR_BUFFER_TOO_SMALL, FHP_ERR_LAST } fhp_err_t; fhp_err_t fhp_strerror(fhp_err_t, char * const, size_t); #define FHP_BUF_SIZE 1024 struct fhp_t_ { fhp_state_t state; fhp_cb_t cb; uint64_t ofs; fhp_err_t err; void *user_data; uint8_t buf[FHP_BUF_SIZE]; size_t buf_len; }; fhp_err_t fhp_init(fhp_t * const, fhp_cb_t, void * const); fhp_err_t fhp_push(fhp_t * const, uint8_t * const, size_t); #endif /* FHP_H */