CE interactive shell
All checks were successful
Build documentation / build-and-deploy (push) Successful in 2m36s
All checks were successful
Build documentation / build-and-deploy (push) Successful in 2m36s
This commit is contained in:
4
libaux/.gitignore
vendored
Normal file
4
libaux/.gitignore
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
*.o
|
||||
*.json
|
||||
docs/
|
||||
.cache/
|
||||
6
libaux/Makefile
Normal file
6
libaux/Makefile
Normal file
@@ -0,0 +1,6 @@
|
||||
include ../make/ufuncs.mk
|
||||
|
||||
libname := libaux
|
||||
cflags += -DPRINTF_INCLUDE_CONFIG_H=1
|
||||
|
||||
include ../make/lib.mk
|
||||
170
libaux/list.h
Normal file
170
libaux/list.h
Normal file
@@ -0,0 +1,170 @@
|
||||
#ifndef _KERNEL_LIBK_LIST_H
|
||||
#define _KERNEL_LIBK_LIST_H
|
||||
|
||||
struct list_node_link {
|
||||
struct list_node_link* next;
|
||||
struct list_node_link* prev;
|
||||
};
|
||||
|
||||
#define list_entry(ptr, type, member) ((type*)((char*)(ptr) - offsetof (type, member)))
|
||||
|
||||
#define list_append(head, new) \
|
||||
do { \
|
||||
if ((new) != NULL) { \
|
||||
(new)->next = NULL; \
|
||||
if ((head) != NULL) { \
|
||||
struct list_node_link* __tmp = (head); \
|
||||
while (__tmp->next != NULL) { \
|
||||
__tmp = __tmp->next; \
|
||||
} \
|
||||
__tmp->next = (new); \
|
||||
(new)->prev = __tmp; \
|
||||
} else { \
|
||||
(new)->prev = NULL; \
|
||||
(head) = (new); \
|
||||
} \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define list_prepend(head, new) \
|
||||
do { \
|
||||
if ((new) != NULL) { \
|
||||
(new)->prev = NULL; \
|
||||
(new)->next = (head); \
|
||||
if ((head) != NULL) { \
|
||||
(head)->prev = (new); \
|
||||
} \
|
||||
(head) = (new); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define list_remove(head, ele) \
|
||||
do { \
|
||||
if ((ele) != NULL) { \
|
||||
if ((ele)->prev != NULL) { \
|
||||
(ele)->prev->next = (ele)->next; \
|
||||
} else { \
|
||||
(head) = (ele)->next; \
|
||||
} \
|
||||
if ((ele)->next != NULL) { \
|
||||
(ele)->next->prev = (ele)->prev; \
|
||||
} \
|
||||
(ele)->next = NULL; \
|
||||
(ele)->prev = NULL; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define list_find(head, out, propname, propvalue) \
|
||||
do { \
|
||||
(out) = NULL; \
|
||||
struct list_node_link* __tmp = (head); \
|
||||
while (__tmp) { \
|
||||
if (__tmp->propname == (propvalue)) { \
|
||||
(out) = __tmp; \
|
||||
break; \
|
||||
} \
|
||||
__tmp = __tmp->next; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define list_foreach(head, var, tmp) \
|
||||
for (var = (head), tmp = (var ? var->next : NULL); var != NULL; \
|
||||
var = tmp, tmp = (var ? var->next : NULL))
|
||||
|
||||
#define list_foreach_index(head, var, tmp, idx) \
|
||||
for ((idx) = 0, var = (head), tmp = (var ? var->next : NULL); var != NULL; \
|
||||
var = tmp, tmp = (var ? var->next : NULL), (idx)++)
|
||||
|
||||
#define list_foreach_index_limit(head, var, tmp, idx, max) \
|
||||
for ((idx) = 0, var = (head), tmp = (var ? var->next : NULL); var != NULL && (idx) < (max); \
|
||||
var = tmp, tmp = (var ? var->next : NULL), (idx)++)
|
||||
|
||||
#define list_back(head, out) \
|
||||
do { \
|
||||
(out) = NULL; \
|
||||
if ((head) != NULL) { \
|
||||
struct list_node_link* __tmp = (head); \
|
||||
while (__tmp->next != NULL) { \
|
||||
__tmp = __tmp->next; \
|
||||
} \
|
||||
(out) = __tmp; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define list_front(head, out) \
|
||||
do { \
|
||||
(out) = NULL; \
|
||||
if ((head) != NULL) { \
|
||||
struct list_node_link* __tmp = (head); \
|
||||
while (__tmp->prev != NULL) { \
|
||||
__tmp = __tmp->prev; \
|
||||
} \
|
||||
(out) = __tmp; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define list_insert_after(head, pos, new) \
|
||||
do { \
|
||||
if ((pos) != NULL && (new) != NULL) { \
|
||||
(new)->prev = (pos); \
|
||||
(new)->next = (pos)->next; \
|
||||
if ((pos)->next != NULL) { \
|
||||
(pos)->next->prev = (new); \
|
||||
} \
|
||||
(pos)->next = (new); \
|
||||
} else if ((pos) == NULL && (head) == NULL) { \
|
||||
(new)->prev = NULL; \
|
||||
(new)->next = NULL; \
|
||||
(head) = (new); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define list_insert_before(head, pos, new) \
|
||||
do { \
|
||||
if ((pos) != NULL && (new) != NULL) { \
|
||||
(new)->next = (pos); \
|
||||
(new)->prev = (pos)->prev; \
|
||||
if ((pos)->prev != NULL) { \
|
||||
(pos)->prev->next = (new); \
|
||||
} else { \
|
||||
(head) = (new); \
|
||||
} \
|
||||
(pos)->prev = (new); \
|
||||
} else if ((pos) == NULL && (head) == NULL) { \
|
||||
(new)->prev = NULL; \
|
||||
(new)->next = NULL; \
|
||||
(head) = (new); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define list_index_of(head, ele, out_idx) \
|
||||
do { \
|
||||
(out_idx) = -1; \
|
||||
int __idx = 0; \
|
||||
struct list_node_link* __tmp = (head); \
|
||||
while (__tmp != NULL) { \
|
||||
if (__tmp == (ele)) { \
|
||||
(out_idx) = __idx; \
|
||||
break; \
|
||||
} \
|
||||
__tmp = __tmp->next; \
|
||||
__idx++; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define list_index_of_prop(head, propname, propvalue, out_idx) \
|
||||
do { \
|
||||
(out_idx) = -1; \
|
||||
int __idx = 0; \
|
||||
struct list_node_link* __tmp = (head); \
|
||||
while (__tmp != NULL) { \
|
||||
if (__tmp->propname == (propvalue)) { \
|
||||
(out_idx) = __idx; \
|
||||
break; \
|
||||
} \
|
||||
__tmp = __tmp->next; \
|
||||
__idx++; \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#endif // _KERNEL_LIBK_LIST_H
|
||||
7
libaux/minmax.h
Normal file
7
libaux/minmax.h
Normal file
@@ -0,0 +1,7 @@
|
||||
#ifndef _KERNEL_LIBK_MINMAX_H
|
||||
#define _KERNEL_LIBK_MINMAX_H
|
||||
|
||||
#define max(a, b) ((a) > (b) ? (a) : (b))
|
||||
#define min(a, b) ((a) < (b) ? (a) : (b))
|
||||
|
||||
#endif // _KERNEL_LIBK_MINMAX_H
|
||||
1693
libaux/printf.c
Normal file
1693
libaux/printf.c
Normal file
File diff suppressed because it is too large
Load Diff
240
libaux/printf.h
Normal file
240
libaux/printf.h
Normal file
@@ -0,0 +1,240 @@
|
||||
/**
|
||||
* @author (c) Eyal Rozenberg <eyalroz1@gmx.com>
|
||||
* 2021-2024, Haifa, Palestine/Israel
|
||||
* @author (c) Marco Paland (info@paland.com)
|
||||
* 2014-2019, PALANDesign Hannover, Germany
|
||||
*
|
||||
* @note Others have made smaller contributions to this file: see the
|
||||
* contributors page at https://github.com/eyalroz/printf/graphs/contributors
|
||||
* or ask one of the authors.
|
||||
*
|
||||
* @brief Small stand-alone implementation of the printf family of functions
|
||||
* (`(v)printf`, `(v)s(n)printf` etc., geared towards use on embedded systems
|
||||
* with a very limited resources.
|
||||
*
|
||||
* @note the implementations are thread-safe; re-entrant; use no functions from
|
||||
* the standard library; and do not dynamically allocate any memory.
|
||||
*
|
||||
* @license The MIT License (MIT)
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef PRINTF_H_
|
||||
#define PRINTF_H_
|
||||
|
||||
#ifdef PRINTF_INCLUDE_CONFIG_H
|
||||
#include "printf_config.h"
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
#include <cstdarg>
|
||||
#include <cstddef>
|
||||
extern "C" {
|
||||
#else
|
||||
#include <stdarg.h>
|
||||
#include <stddef.h>
|
||||
#endif
|
||||
|
||||
#ifdef __GNUC__
|
||||
#if ((__GNUC__ == 4 && __GNUC_MINOR__ >= 4) || __GNUC__ > 4)
|
||||
#define ATTR_PRINTF(one_based_format_index, first_arg) \
|
||||
__attribute__ ((format (gnu_printf, (one_based_format_index), (first_arg))))
|
||||
#else
|
||||
#define ATTR_PRINTF(one_based_format_index, first_arg) \
|
||||
__attribute__ ((format (printf, (one_based_format_index), (first_arg))))
|
||||
#endif
|
||||
#define ATTR_VPRINTF(one_based_format_index) ATTR_PRINTF ((one_based_format_index), 0)
|
||||
#else
|
||||
#define ATTR_PRINTF(one_based_format_index, first_arg)
|
||||
#define ATTR_VPRINTF(one_based_format_index)
|
||||
#endif
|
||||
|
||||
#ifndef PRINTF_ALIAS_STANDARD_FUNCTION_NAMES_SOFT
|
||||
#define PRINTF_ALIAS_STANDARD_FUNCTION_NAMES_SOFT 0
|
||||
#endif
|
||||
|
||||
#ifndef PRINTF_ALIAS_STANDARD_FUNCTION_NAMES_HARD
|
||||
#define PRINTF_ALIAS_STANDARD_FUNCTION_NAMES_HARD 0
|
||||
#endif
|
||||
|
||||
#if PRINTF_ALIAS_STANDARD_FUNCTION_NAMES_HARD
|
||||
#define printf_ printf
|
||||
#define sprintf_ sprintf
|
||||
#define vsprintf_ vsprintf
|
||||
#define snprintf_ snprintf
|
||||
#define vsnprintf_ vsnprintf
|
||||
#define vprintf_ vprintf
|
||||
#endif
|
||||
|
||||
/*
|
||||
* If you want to include this implementation file directly rather than
|
||||
* link against it, this will let you control the functions' visibility,
|
||||
* e.g. make them static so as not to clash with other objects also
|
||||
* using them.
|
||||
*/
|
||||
#ifndef PRINTF_VISIBILITY
|
||||
#define PRINTF_VISIBILITY
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Prints/send a single character to some opaque output entity
|
||||
*
|
||||
* @note This function is not implemented by the library, only declared; you
|
||||
* must provide an implementation if you wish to use the @ref printf / @ref
|
||||
* vprintf function (and possibly for linking against the library, if your
|
||||
* toolchain does not support discarding unused functions)
|
||||
*
|
||||
* @note The output could be as simple as a wrapper for the `write()` system
|
||||
* call on a Unix-like * system, or even libc's @ref putchar , for replicating
|
||||
* actual functionality of libc's @ref printf * function; but on an embedded
|
||||
* system it may involve interaction with a special output device, like a UART,
|
||||
* etc.
|
||||
*
|
||||
* @note in libc's @ref putchar, the parameter type is an int; this was intended
|
||||
* to support the representation of either a proper character or EOF in a
|
||||
* variable - but this is really not meaningful to pass into @ref putchar and is
|
||||
* discouraged today. See further discussion in:
|
||||
* @link https://stackoverflow.com/q/17452847/1593077
|
||||
*
|
||||
* @param c the single character to print
|
||||
*/
|
||||
PRINTF_VISIBILITY
|
||||
void putchar_ (char c);
|
||||
|
||||
/**
|
||||
* An implementation of the C standard's printf/vprintf
|
||||
*
|
||||
* @note you must implement a @ref putchar_ function for using this function -
|
||||
* it invokes @ref putchar_ * rather than directly performing any I/O (which
|
||||
* insulates it from any dependence on the operating system * and external
|
||||
* libraries).
|
||||
*
|
||||
* @param format A string specifying the format of the output, with %-marked
|
||||
* specifiers of how to interpret additional arguments.
|
||||
* @param arg Additional arguments to the function, one for each %-specifier in
|
||||
* @p format
|
||||
* @return The number of characters written into @p s, not counting the
|
||||
* terminating null character
|
||||
*/
|
||||
/* @{ */
|
||||
PRINTF_VISIBILITY
|
||||
int printf_ (const char* format, ...) ATTR_PRINTF (1, 2);
|
||||
PRINTF_VISIBILITY
|
||||
int vprintf_ (const char* format, va_list arg) ATTR_VPRINTF (1);
|
||||
/* @} */
|
||||
|
||||
/**
|
||||
* An implementation of the C standard's sprintf/vsprintf
|
||||
*
|
||||
* @note For security considerations (the potential for exceeding the buffer
|
||||
* bounds), please consider using the size-constrained variant, @ref snprintf /
|
||||
* @ref vsnprintf, instead.
|
||||
*
|
||||
* @param s An array in which to store the formatted string. It must be large
|
||||
* enough to fit the formatted output!
|
||||
* @param format A string specifying the format of the output, with %-marked
|
||||
* specifiers of how to interpret additional arguments
|
||||
* @param arg Additional arguments to the function, one for each specifier in
|
||||
* @p format
|
||||
* @return The number of characters written into @p s, not counting the
|
||||
* terminating null character
|
||||
*/
|
||||
/* @{ */
|
||||
PRINTF_VISIBILITY
|
||||
int sprintf_ (char* s, const char* format, ...) ATTR_PRINTF (2, 3);
|
||||
PRINTF_VISIBILITY
|
||||
int vsprintf_ (char* s, const char* format, va_list arg) ATTR_VPRINTF (2);
|
||||
/* @} */
|
||||
|
||||
/**
|
||||
* An implementation of the C standard's snprintf/vsnprintf
|
||||
*
|
||||
* @param s An array in which to store the formatted string. It must be large
|
||||
* enough to fit either the entire formatted output, or at least @p n
|
||||
* characters. Alternatively, it can be NULL, in which case nothing will
|
||||
* be printed, and only the number of characters which _could_ have been
|
||||
* printed is tallied and returned.
|
||||
* @param n The maximum number of characters to write to the array, including
|
||||
* a terminating null character
|
||||
* @param format A string specifying the format of the output, with %-marked
|
||||
* specifiers of how to interpret additional arguments.
|
||||
* @param arg Additional arguments to the function, one for each specifier in
|
||||
* @p format
|
||||
* @return The number of characters that COULD have been written into @p s, not
|
||||
* counting the terminating null character. A value equal or larger than
|
||||
* @p n indicates truncation. Only when the returned value is non-negative
|
||||
* and less than @p n, the null-terminated string has been fully and
|
||||
* successfully printed.
|
||||
*/
|
||||
/* @{ */
|
||||
PRINTF_VISIBILITY
|
||||
int snprintf_ (char* s, size_t count, const char* format, ...) ATTR_PRINTF (3, 4);
|
||||
PRINTF_VISIBILITY
|
||||
int vsnprintf_ (char* s, size_t count, const char* format, va_list arg) ATTR_VPRINTF (3);
|
||||
/* @} */
|
||||
|
||||
/**
|
||||
* printf/vprintf with user-specified output function
|
||||
*
|
||||
* An alternative to @ref printf_, in which the output function is specified
|
||||
* dynamically (rather than @ref putchar_ being used)
|
||||
*
|
||||
* @param out An output function which takes one character and a type-erased
|
||||
* additional parameters
|
||||
* @param extra_arg The type-erased argument to pass to the output function @p
|
||||
* out with each call
|
||||
* @param format A string specifying the format of the output, with %-marked
|
||||
* specifiers of how to interpret additional arguments.
|
||||
* @param arg Additional arguments to the function, one for each specifier in
|
||||
* @p format
|
||||
* @return The number of characters for which the output f unction was invoked,
|
||||
* not counting the terminating null character
|
||||
*
|
||||
*/
|
||||
PRINTF_VISIBILITY
|
||||
int fctprintf (void (*out) (char c, void* extra_arg), void* extra_arg, const char* format, ...)
|
||||
ATTR_PRINTF (3, 4);
|
||||
PRINTF_VISIBILITY
|
||||
int vfctprintf (void (*out) (char c, void* extra_arg), void* extra_arg, const char* format,
|
||||
va_list arg) ATTR_VPRINTF (3);
|
||||
|
||||
#ifdef __cplusplus
|
||||
} /* extern "C" */
|
||||
#endif
|
||||
|
||||
#if PRINTF_ALIAS_STANDARD_FUNCTION_NAMES_HARD
|
||||
#undef printf_
|
||||
#undef sprintf_
|
||||
#undef vsprintf_
|
||||
#undef snprintf_
|
||||
#undef vsnprintf_
|
||||
#undef vprintf_
|
||||
#else
|
||||
#if PRINTF_ALIAS_STANDARD_FUNCTION_NAMES_SOFT
|
||||
#define printf printf_
|
||||
#define sprintf sprintf_
|
||||
#define vsprintf vsprintf_
|
||||
#define snprintf snprintf_
|
||||
#define vsnprintf vsnprintf_
|
||||
#define vprintf vprintf_
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#endif /* PRINTF_H_ */
|
||||
8
libaux/printf_config.h
Normal file
8
libaux/printf_config.h
Normal file
@@ -0,0 +1,8 @@
|
||||
#ifndef _KERNEL_LIBK_PRINTF_CONFIG_H
|
||||
#define _KERNEL_LIBK_PRINTF_CONFIG_H
|
||||
|
||||
#define PRINTF_ALIAS_STANDARD_FUNCTION_NAMES_HARD 1
|
||||
#define PRINTF_SUPPORT_DECIMAL_SPECIFIERS 0
|
||||
#define PRINTF_SUPPORT_EXPONENTIAL_SPECIFIERS 0
|
||||
|
||||
#endif // _KERNEL_LIBK_PRINTF_CONFIG_H
|
||||
3
libaux/src.mk
Normal file
3
libaux/src.mk
Normal file
@@ -0,0 +1,3 @@
|
||||
c += printf.c
|
||||
|
||||
o += printf.o
|
||||
Reference in New Issue
Block a user