blob: d659cdd4fd7aa93eb81096cac3f36e1813f3acae [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/*
* @file
* @brief Utility functions for parsing text.
*/
#ifndef H_UTIL_PARSE_
#define H_UTIL_PARSE_
#include <inttypes.h>
#include <stdbool.h>
struct mn_in6_addr;
#ifdef __cplusplus
extern "C" {
#endif
/**
* Parses a long long within an imposed range.
*
* @param sval The string to parse.
* @param min Values less than this are rejected.
* @param max Values greater than this are rejected.
* @param out_status Written on completion;
* 0: success;
* SYS_EINVAL: invalid string or number out of
* range.
*
* @return The parsed number on success;
* unspecified on error.
*/
long long
parse_ll_bounds(const char *sval, long long min, long long max,
int *out_status);
/**
* Parses an unsigned long long within an imposed range.
*
* @param sval The string to parse.
* @param min Values less than this are rejected.
* @param max Values greater than this are rejected.
* @param out_status Written on completion;
* 0: success;
* SYS_EINVAL: invalid string or number out of
* range.
*
* @return The parsed number on success;
* unspecified on error.
*/
unsigned long long
parse_ull_bounds(const char *sval,
unsigned long long min, unsigned long long max,
int *out_status);
/**
* Parses a long long.
*
* @param sval The string to parse.
* @param out_status Written on completion;
* 0: success;
* SYS_EINVAL: invalid string or number out of
* range.
*
* @return The parsed number on success;
* unspecified on error.
*/
long long
parse_ll(const char *sval, int *out_status);
/**
* Parses an unsigned long long.
*
* @param sval The string to parse.
* @param out_status Written on completion;
* 0: success;
* SYS_EINVAL: invalid string or number out of
* range.
*
* @return The parsed number on success;
* unspecified on error.
*/
unsigned long long
parse_ull(const char *sval, int *out_status);
/**
* @brief Parses a stream of bytes with the specified delimiter(s) and using
* the specified base.
*
* @param sval The string to parse.
* @param delims String containing delimiters; each character
* can act as a delimiter.
* @param base The base to use while parsing each byte string
* (valid values are: 10, 16, and 0).
* @param max_len The maximum number of bytes to write.
* @param dst The destination buffer to write bytes to.
* @param out_len Written on success; total number of bytes
* written to the destination buffer.
*
* @return 0 on success;
* SYS_EINVAL on invalid byte stream;
* SYS_ERANGE if result only partially written to
* buffer due to insufficient space.
*/
int
parse_byte_stream_delim_base(const char *sval, const char *delims, int base,
int max_len, uint8_t *dst, int *out_len);
/**
* @brief Parses a stream of bytes with the specified delimiter(s).
*
* Parses a stream of bytes with the specified delimiter(s). The base of each
* byte string is inferred from the text (base 16 if prefixed with "0x", base
* 10 otherwise).
*
* @param sval The string to parse.
* @param delims String containing delimiters; each character
* can act as a delimiter.
* @param max_len The maximum number of bytes to write.
* @param dst The destination buffer to write bytes to.
* @param out_len Written on success; total number of bytes
* written to the destination buffer.
*
* @return 0 on success;
* SYS_EINVAL on invalid byte stream;
* SYS_ERANGE if result only partially written to
* buffer due to insufficient space.
*/
int
parse_byte_stream_delim(const char *sval, const char *delims, int max_len,
uint8_t *dst, int *out_len);
/**
* @brief Parses a stream of bytes using the specified base.
*
* @param sval The string to parse.
* @param base The base to use while parsing each byte string
* (valid values are: 10, 16, and 0).
* @param max_len The maximum number of bytes to write.
* @param dst The destination buffer to write bytes to.
* @param out_len Written on success; total number of bytes
* written to the destination buffer.
*
* @return 0 on success;
* SYS_EINVAL on invalid byte stream;
* SYS_ERANGE if result only partially written to
* buffer due to insufficient space.
*/
int
parse_byte_stream_base(const char *sval, int base, int max_len,
uint8_t *dst, int *out_len);
/**
* @brief Parses a stream of bytes using ':' or '-' as delimiters.
*
* Parses a stream of bytes using ':' or '-' as delimiters.
* The base of each byte string is inferred from the text (base 16 if prefixed
* with "0x", base 10 otherwise).
*
* @param sval The string to parse.
* @param max_len The maximum number of bytes to write.
* @param dst The destination buffer to write bytes to.
* @param out_len Written on success; total number of bytes
* written to the destination buffer.
*
* @return 0 on success;
* SYS_EINVAL on invalid byte stream;
* SYS_ERANGE if result only partially written to
* buffer due to insufficient space.
*/
int
parse_byte_stream(const char *sval, int max_len, uint8_t *dst, int *out_len);
/**
* @brief Parses a stream of bytes using the specified base.
*
* Parses a stream of bytes using the specified base. If the length of the
* resulting byte array is not equal to the specified length, a SYS_EINVAL
* failure is reported.
*
* @param sval The string to parse.
* @param base The base to use while parsing each byte string
* (valid values are: 10, 16, and 0).
* @param dst The destination buffer to write bytes to.
* @param len The exact number of bytes the result is
* expected to contain.
*
* @return 0 on success;
* SYS_EINVAL on invalid byte stream or if source
* string specifies an unexpected number of
* bytes;
*/
int
parse_byte_stream_exact_length_base(const char *sval, int base,
uint8_t *dst, int len);
/**
* @brief Parses a stream of bytes using ':' or '-' as delimiters.
*
* Parses a stream of bytes using ':' or '-' as delimiters. If the length of
* the resulting byte array is not equal to the specified length, a SYS_EINVAL
* failure is reported. The base of each byte string is inferred from the text
* (base 16 if prefixed with "0x", base 10 otherwise).
*
* @param sval The string to parse.
* @param dst The destination buffer to write bytes to.
* @param len The exact number of bytes the result is
* expected to contain.
*
* @return 0 on success;
* SYS_EINVAL on invalid byte stream or if source
* string specifies an unexpected number of
* bytes;
*/
int
parse_byte_stream_exact_length(const char *sval, uint8_t *dst, int len);
/**
* @brief Parses a boolean string.
*
* Parses a boolean string. Valid boolean strings are: "true", "false", and
* numeric representations of 1 and 0.
*
* @param sval The string to parse.
* @param out_status Written on completion;
* 0: success;
* SYS_EINVAL: invalid boolean string.
*
* @return The parsed boolean on success;
* unspecified on error.
*/
bool
parse_bool(const char *sval, int *out_status);
/**
* @brief Parses an IPv6 network string. The string
*
* Parses an IPv6 network string. The string must have the following form:
* <ipv6-address>/<prefix-length>.
*
* @param sval The string to parse.
* @param out_addr The parsed IPv6 address is written here on
* success.
* @param out_prefix_len The parsed prefix length is written here on
* success.
*
* @return 0 on success;
* SYS_EINVAL if the IPv6 network string is
* invalid.
*/
int
parse_ip6_net(const char *sval,
struct mn_in6_addr *out_addr, uint8_t *out_prefix_len);
#ifdef __cplusplus
}
#endif
#endif