mirror of
https://github.com/DarkFlippers/unleashed-firmware
synced 2024-11-23 04:53:08 +00:00
c9791a280a
* feat: strint_to_uint32 and tests * fix: permit explicit bases and prefixes * feat: strint_to_{int32,uint16,int16} * feat: strint_to_u?int64 * refactor: replace strtol, strtoul, sscanf with strint_to_* * fix: api symbols * docs: document parameter `end` of strint_to_uint_32 * style: apply changes requested by hedger * refactor: fix pvs-studio diagnostic * style: apply changes requested by CookiePLMonster * fix: unused var * fix: pointer type * refactor: convert atoi to strint_to_* * fix: strint_to_uint8 doesn't actually exist ._ . * fix: memory leak * style: address review comments * Toolbox: couple small comments in the code and doxygen comment update. SubGhz, Loader: fix strint usage. * Loader: fix incorrect cast Co-authored-by: あく <alleteam@gmail.com>
70 lines
2.5 KiB
C
70 lines
2.5 KiB
C
/**
|
|
* @file strint.h
|
|
* Performs conversions between strings and integers.
|
|
*/
|
|
#pragma once
|
|
|
|
#include <stdint.h>
|
|
#include <stddef.h>
|
|
#include <stdbool.h>
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/** String to integer conversion error */
|
|
typedef enum {
|
|
StrintParseNoError, //!< Conversion performed successfully
|
|
StrintParseSignError, //!< Multiple leading `+` or `-` characters, or leading `-` character if the type is unsigned
|
|
StrintParseAbsentError, //!< No valid digits after the leading whitespace, sign and prefix
|
|
StrintParseOverflowError, //!< Result does not fit in the requested type
|
|
} StrintParseError;
|
|
|
|
/** See `strint_to_uint32` */
|
|
StrintParseError strint_to_uint64(const char* str, char** end, uint64_t* out, uint8_t base);
|
|
|
|
/** See `strint_to_uint32` */
|
|
StrintParseError strint_to_int64(const char* str, char** end, int64_t* out, uint8_t base);
|
|
|
|
/** Converts a string to a `uint32_t`
|
|
*
|
|
* @param[in] str Input string
|
|
* @param[out] end Pointer to first character after the number in input string
|
|
* @param[out] out Parse result
|
|
* @param[in] base Integer base
|
|
*
|
|
* @return Parse error
|
|
*
|
|
* Parses the number in the input string. The number may be surrounded by
|
|
* whitespace characters to the left and any non-digit characters to the right.
|
|
* What's considered a digit is determined by the input base in the following
|
|
* order: `0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ`. The number may be prefixed
|
|
* with either a `+` or a `-` to indicate its sign. The pointer to the first
|
|
* character after the leading whitespace, allowed prefixes and digits is
|
|
* assigned to `end`.
|
|
*
|
|
* If the input base is 0, the base is inferred from the leading characters of
|
|
* the number:
|
|
* - If it starts with `0x`, it's read in base 16;
|
|
* - If it starts with a `0`, it's read in base 8;
|
|
* - If it starts with `0b`, it's read in base 2.
|
|
* - Otherwise, it's read in base 10.
|
|
*
|
|
* For a description of the return codes, see `StrintParseError`. If the return
|
|
* code is something other than `StrintParseNoError`, the values at `end` and
|
|
* `out` are unaltered.
|
|
*/
|
|
StrintParseError strint_to_uint32(const char* str, char** end, uint32_t* out, uint8_t base);
|
|
|
|
/** See `strint_to_uint32` */
|
|
StrintParseError strint_to_int32(const char* str, char** end, int32_t* out, uint8_t base);
|
|
|
|
/** See `strint_to_uint32` */
|
|
StrintParseError strint_to_uint16(const char* str, char** end, uint16_t* out, uint8_t base);
|
|
|
|
/** See `strint_to_uint32` */
|
|
StrintParseError strint_to_int16(const char* str, char** end, int16_t* out, uint8_t base);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|