mirror of
https://github.com/tailix/libkernaux.git
synced 2025-02-24 15:55:41 -05:00
Main: remove libc
This commit is contained in:
parent
f7e38306f2
commit
db65040e73
20 changed files with 28 additions and 264 deletions
|
@ -1,3 +1,7 @@
|
|||
2022-06-07 Alex Kotov <kotovalexarian@gmail.com>
|
||||
|
||||
* include/kernaux/libc.h: Removed
|
||||
|
||||
2022-06-06 Alex Kotov <kotovalexarian@gmail.com>
|
||||
|
||||
* include/kernaux/libc.h: Add more functions
|
||||
|
|
|
@ -37,10 +37,7 @@ noinst_PROGRAMS = $(TESTS)
|
|||
# libkernaux.a #
|
||||
################
|
||||
|
||||
libkernaux_a_SOURCES = \
|
||||
src/assert.c \
|
||||
src/libc.c
|
||||
|
||||
libkernaux_a_SOURCES = src/assert.c
|
||||
if ASM_I386
|
||||
libkernaux_a_SOURCES += src/asm/i386.S
|
||||
endif
|
||||
|
|
27
README.md
27
README.md
|
@ -22,7 +22,7 @@ Table of contents
|
|||
* [Tips](#tips)
|
||||
* [Installation](#installation)
|
||||
* [Development](#development)
|
||||
* [Cross](#cross)
|
||||
* [Freestanding](#freestanding)
|
||||
* [Architectures](#architectures)
|
||||
|
||||
|
||||
|
@ -65,7 +65,6 @@ zero). Work-in-progress APIs can change at any time.
|
|||
* Code from [https://github.com/mpaland/printf](https://github.com/mpaland/printf). Thank you!
|
||||
* [Example](/examples/printf_fmt.c)
|
||||
* Usual functions
|
||||
* [libc replacement](/include/kernaux/libc.h) (*stable since* **0.1.0**)
|
||||
* [itoa/ftoa replacement](/include/kernaux/ntoa.h) (*stable since* **0.1.0**, *non-breaking since* **?.?.?**)
|
||||
* [Example](/examples/ntoa.c)
|
||||
* [printf replacement](/include/kernaux/printf.h) (*stable since* **0.1.0**)
|
||||
|
@ -96,25 +95,6 @@ stable options.
|
|||
* `--enable-tests-python` - enable tests that require Python 3 with YAML and
|
||||
Jinja2
|
||||
|
||||
#### Packages
|
||||
|
||||
* `--with-libc-all` - provides the replacement for some standard C functions.
|
||||
Useful in freestanding environment, where no libc is present. You can also
|
||||
separately include or exclude components:
|
||||
* `--with[out]-libc-atoi`
|
||||
* `--with[out]-libc-isdigit`
|
||||
* `--with[out]-libc-isspace`
|
||||
* `--with[out]-libc-memcpy`
|
||||
* `--with[out]-libc-memmove`
|
||||
* `--with[out]-libc-memset`
|
||||
* `--with[out]-libc-strcmp`
|
||||
* `--with[out]-libc-strcpy`
|
||||
* `--with[out]-libc-strlen`
|
||||
* `--with[out]-libc-strncmp`
|
||||
* `--with[out]-libc-strncpy`
|
||||
* `--with[out]-libc-strnlen`
|
||||
* `--with[out]-libc-strstr`
|
||||
|
||||
### Default options
|
||||
|
||||
#### Features
|
||||
|
@ -158,7 +138,9 @@ make
|
|||
|
||||
You can test with `make check`.
|
||||
|
||||
### Cross
|
||||
### Freestanding
|
||||
|
||||
Some libc functions are needed. Use [libfsc](https://github.com/tailix/libfsc).
|
||||
|
||||
Create configuration script with `./autogen.sh` (if present).
|
||||
|
||||
|
@ -170,7 +152,6 @@ without it in `$PATH`:
|
|||
./configure \
|
||||
--host='i386-elf' \
|
||||
--enable-freestanding \
|
||||
--with-libc-all \
|
||||
AR="$(which i386-elf-ar)" \
|
||||
CC="$(which i386-elf-gcc)" \
|
||||
RANLIB="$(which i386-elf-ranlib)"
|
||||
|
|
|
@ -14,4 +14,4 @@ export AR="$CROSS-ar"
|
|||
export CC="$CROSS-gcc"
|
||||
export RANLIB="$CROSS-ranlib"
|
||||
|
||||
"$REPO/configure" --host="$HOST" --prefix="$PREFIX" --enable-freestanding --with-libc-all
|
||||
"$REPO/configure" --host="$HOST" --prefix="$PREFIX" --enable-freestanding
|
||||
|
|
|
@ -14,4 +14,4 @@ export AR="$CROSS-ar"
|
|||
export CC="$CROSS-gcc"
|
||||
export RANLIB="$CROSS-ranlib"
|
||||
|
||||
"$REPO/configure" --host="$HOST" --prefix="$PREFIX" --enable-freestanding --with-libc-all
|
||||
"$REPO/configure" --host="$HOST" --prefix="$PREFIX" --enable-freestanding
|
||||
|
|
|
@ -16,4 +16,4 @@ export RANLIB="$CROSS-ranlib"
|
|||
|
||||
export CFLAGS='-mabi=sysv -mcmodel=kernel -mno-80387 -mno-red-zone'
|
||||
|
||||
"$REPO/configure" --host="$HOST" --prefix="$PREFIX" --enable-freestanding --with-libc-all
|
||||
"$REPO/configure" --host="$HOST" --prefix="$PREFIX" --enable-freestanding
|
||||
|
|
|
@ -14,4 +14,4 @@ export AR="$TARGET-ar"
|
|||
export CC="$TARGET-gcc"
|
||||
export RANLIB="$TARGET-ranlib"
|
||||
|
||||
"$REPO/configure" --host="$HOST" --prefix="$PREFIX" --enable-freestanding --with-libc-all
|
||||
"$REPO/configure" --host="$HOST" --prefix="$PREFIX" --enable-freestanding
|
||||
|
|
|
@ -14,4 +14,4 @@ export AR="$TARGET-ar"
|
|||
export CC="$TARGET-gcc"
|
||||
export RANLIB="$TARGET-ranlib"
|
||||
|
||||
"$REPO/configure" --host="$HOST" --prefix="$PREFIX" --enable-freestanding --with-libc-all
|
||||
"$REPO/configure" --host="$HOST" --prefix="$PREFIX" --enable-freestanding
|
||||
|
|
|
@ -16,4 +16,4 @@ export RANLIB="$TARGET-ranlib"
|
|||
|
||||
export CFLAGS='-mabi=sysv -mcmodel=kernel -mno-80387 -mno-red-zone'
|
||||
|
||||
"$REPO/configure" --host="$HOST" --prefix="$PREFIX" --enable-freestanding --with-libc-all
|
||||
"$REPO/configure" --host="$HOST" --prefix="$PREFIX" --enable-freestanding
|
||||
|
|
80
configure.ac
80
configure.ac
|
@ -41,22 +41,6 @@ AC_ARG_WITH( [printf], AS_HELP_STRING([--without-printf], [without p
|
|||
AC_ARG_WITH( [printf-fmt], AS_HELP_STRING([--without-printf-fmt], [without printf format parser]))
|
||||
AC_ARG_WITH( [units], AS_HELP_STRING([--without-units], [without measurement units utils]))
|
||||
|
||||
dnl Packages (disabled by default)
|
||||
AC_ARG_WITH( [libc-all], AS_HELP_STRING([--with-libc-all], [with libc replacement]))
|
||||
AC_ARG_WITH( [libc-atoi], AS_HELP_STRING([--with-libc-atoi], [with atoi replacement]))
|
||||
AC_ARG_WITH( [libc-isdigit], AS_HELP_STRING([--with-libc-isdigit], [with isdigit replacement]))
|
||||
AC_ARG_WITH( [libc-isspace], AS_HELP_STRING([--with-libc-isspace], [with isspace replacement]))
|
||||
AC_ARG_WITH( [libc-memcpy], AS_HELP_STRING([--with-libc-memcpy], [with memcpy replacement]))
|
||||
AC_ARG_WITH( [libc-memmove], AS_HELP_STRING([--with-libc-memmove], [with memmove replacement]))
|
||||
AC_ARG_WITH( [libc-memset], AS_HELP_STRING([--with-libc-memset], [with memset replacement]))
|
||||
AC_ARG_WITH( [libc-strcmp], AS_HELP_STRING([--with-libc-strcmp], [with strcmp replacement]))
|
||||
AC_ARG_WITH( [libc-strcpy], AS_HELP_STRING([--with-libc-strcpy], [with strcpy replacement]))
|
||||
AC_ARG_WITH( [libc-strlen], AS_HELP_STRING([--with-libc-strlen], [with strlen replacement]))
|
||||
AC_ARG_WITH( [libc-strncmp], AS_HELP_STRING([--with-libc-strncmp], [with strncmp replacement]))
|
||||
AC_ARG_WITH( [libc-strncpy], AS_HELP_STRING([--with-libc-strncpy], [with strncpy replacement]))
|
||||
AC_ARG_WITH( [libc-strnlen], AS_HELP_STRING([--with-libc-strnlen], [with strnlen replacement]))
|
||||
AC_ARG_WITH( [libc-strstr], AS_HELP_STRING([--with-libc-strstr], [with strstr replacement]))
|
||||
|
||||
|
||||
|
||||
################
|
||||
|
@ -86,24 +70,6 @@ if test -z "$with_units"; then with_units=no; fi
|
|||
])
|
||||
AS_IF([test "$with_all" = no], do_without_all)
|
||||
|
||||
AC_DEFUN([do_with_libc_all],
|
||||
[
|
||||
if test -z "$with_libc_atoi"; then with_libc_atoi=yes; fi
|
||||
if test -z "$with_libc_isdigit"; then with_libc_isdigit=yes; fi
|
||||
if test -z "$with_libc_isspace"; then with_libc_isspace=yes; fi
|
||||
if test -z "$with_libc_memcpy"; then with_libc_memcpy=yes; fi
|
||||
if test -z "$with_libc_memmove"; then with_libc_memmove=yes; fi
|
||||
if test -z "$with_libc_memset"; then with_libc_memset=yes; fi
|
||||
if test -z "$with_libc_strcmp"; then with_libc_strcmp=yes; fi
|
||||
if test -z "$with_libc_strcpy"; then with_libc_strcpy=yes; fi
|
||||
if test -z "$with_libc_strlen"; then with_libc_strlen=yes; fi
|
||||
if test -z "$with_libc_strncmp"; then with_libc_strncmp=yes; fi
|
||||
if test -z "$with_libc_strncpy"; then with_libc_strncpy=yes; fi
|
||||
if test -z "$with_libc_strnlen"; then with_libc_strnlen=yes; fi
|
||||
if test -z "$with_libc_strstr"; then with_libc_strstr=yes; fi
|
||||
])
|
||||
AS_IF([test "$with_libc_all" = yes], do_with_libc_all)
|
||||
|
||||
|
||||
|
||||
##################
|
||||
|
@ -134,22 +100,6 @@ AS_IF([test "$with_printf" = no ], [with_printf=no], [with_prin
|
|||
AS_IF([test "$with_printf_fmt" = no ], [with_printf_fmt=no], [with_printf_fmt=yes])
|
||||
AS_IF([test "$with_units" = no ], [with_units=no], [with_units=yes])
|
||||
|
||||
dnl Packages (disabled by default)
|
||||
AS_IF([test "$with_libc_all" = yes], [with_libc_all=yes], [with_libc_all=no])
|
||||
AS_IF([test "$with_libc_atoi" = yes], [with_libc_atoi=yes], [with_libc_atoi=no])
|
||||
AS_IF([test "$with_libc_isdigit" = yes], [with_libc_isdigit=yes], [with_libc_isdigit=no])
|
||||
AS_IF([test "$with_libc_isspace" = yes], [with_libc_isspace=yes], [with_libc_isspace=no])
|
||||
AS_IF([test "$with_libc_memcpy" = yes], [with_libc_memcpy=yes], [with_libc_memcpy=no])
|
||||
AS_IF([test "$with_libc_memmove" = yes], [with_libc_memmove=yes], [with_libc_memmove=no])
|
||||
AS_IF([test "$with_libc_memset" = yes], [with_libc_memset=yes], [with_libc_memset=no])
|
||||
AS_IF([test "$with_libc_strcmp" = yes], [with_libc_strcmp=yes], [with_libc_strcmp=no])
|
||||
AS_IF([test "$with_libc_strcpy" = yes], [with_libc_strcpy=yes], [with_libc_strcpy=no])
|
||||
AS_IF([test "$with_libc_strlen" = yes], [with_libc_strlen=yes], [with_libc_strlen=no])
|
||||
AS_IF([test "$with_libc_strncmp" = yes], [with_libc_strncmp=yes], [with_libc_strncmp=no])
|
||||
AS_IF([test "$with_libc_strncpy" = yes], [with_libc_strncpy=yes], [with_libc_strncpy=no])
|
||||
AS_IF([test "$with_libc_strnlen" = yes], [with_libc_strnlen=yes], [with_libc_strnlen=no])
|
||||
AS_IF([test "$with_libc_strstr" = yes], [with_libc_strstr=yes], [with_libc_strstr=no])
|
||||
|
||||
|
||||
|
||||
#############
|
||||
|
@ -198,21 +148,6 @@ AM_CONDITIONAL([WITH_PRINTF], [test "$with_printf" = yes])
|
|||
AM_CONDITIONAL([WITH_PRINTF_FMT], [test "$with_printf_fmt" = yes])
|
||||
AM_CONDITIONAL([WITH_UNITS], [test "$with_units" = yes])
|
||||
|
||||
dnl Packages (disabled by default)
|
||||
AM_CONDITIONAL([WITH_LIBC_ATOI], [test "$with_libc_atoi" = yes])
|
||||
AM_CONDITIONAL([WITH_LIBC_ISDIGIT], [test "$with_libc_isdigit" = yes])
|
||||
AM_CONDITIONAL([WITH_LIBC_ISSPACE], [test "$with_libc_isspace" = yes])
|
||||
AM_CONDITIONAL([WITH_LIBC_MEMCPY], [test "$with_libc_memcpy" = yes])
|
||||
AM_CONDITIONAL([WITH_LIBC_MEMMOVE], [test "$with_libc_memmove" = yes])
|
||||
AM_CONDITIONAL([WITH_LIBC_MEMSET], [test "$with_libc_memset" = yes])
|
||||
AM_CONDITIONAL([WITH_LIBC_STRCMP], [test "$with_libc_strcmp" = yes])
|
||||
AM_CONDITIONAL([WITH_LIBC_STRCPY], [test "$with_libc_strcpy" = yes])
|
||||
AM_CONDITIONAL([WITH_LIBC_STRLEN], [test "$with_libc_strlen" = yes])
|
||||
AM_CONDITIONAL([WITH_LIBC_STRNCMP], [test "$with_libc_strncmp" = yes])
|
||||
AM_CONDITIONAL([WITH_LIBC_STRNCPY], [test "$with_libc_strncpy" = yes])
|
||||
AM_CONDITIONAL([WITH_LIBC_STRNLEN], [test "$with_libc_strnlen" = yes])
|
||||
AM_CONDITIONAL([WITH_LIBC_STRSTR], [test "$with_libc_strstr" = yes])
|
||||
|
||||
|
||||
|
||||
####################
|
||||
|
@ -246,21 +181,6 @@ AS_IF([test "$with_printf" = yes], [AC_DEFINE([WITH_PRINTF], [1]
|
|||
AS_IF([test "$with_printf_fmt" = yes], [AC_DEFINE([WITH_PRINTF_FMT], [1], [with printf format parser])])
|
||||
AS_IF([test "$with_units", = yes], [AC_DEFINE([WITH_UNITS], [1], [with measurement units utils])])
|
||||
|
||||
dnl Packages (disabled by default)
|
||||
AS_IF([test "$with_libc_atoi" = yes], [AC_DEFINE([WITH_LIBC_ATOI], [1], [with atoi replacement])])
|
||||
AS_IF([test "$with_libc_isdigit" = yes], [AC_DEFINE([WITH_LIBC_ISDIGIT], [1], [with isdigit replacement])])
|
||||
AS_IF([test "$with_libc_isspace" = yes], [AC_DEFINE([WITH_LIBC_ISSPACE], [1], [with isspace replacement])])
|
||||
AS_IF([test "$with_libc_memcpy" = yes], [AC_DEFINE([WITH_LIBC_MEMCPY], [1], [with memcpy replacement])])
|
||||
AS_IF([test "$with_libc_memmove" = yes], [AC_DEFINE([WITH_LIBC_MEMMOVE], [1], [with memmove replacement])])
|
||||
AS_IF([test "$with_libc_memset" = yes], [AC_DEFINE([WITH_LIBC_MEMSET], [1], [with memset replacement])])
|
||||
AS_IF([test "$with_libc_strcmp" = yes], [AC_DEFINE([WITH_LIBC_STRCMP], [1], [with strcmp replacement])])
|
||||
AS_IF([test "$with_libc_strcpy" = yes], [AC_DEFINE([WITH_LIBC_STRCPY], [1], [with strcpy replacement])])
|
||||
AS_IF([test "$with_libc_strlen" = yes], [AC_DEFINE([WITH_LIBC_STRLEN], [1], [with strlen replacement])])
|
||||
AS_IF([test "$with_libc_strncmp" = yes], [AC_DEFINE([WITH_LIBC_STRNCMP], [1], [with strncmp replacement])])
|
||||
AS_IF([test "$with_libc_strncpy" = yes], [AC_DEFINE([WITH_LIBC_STRNCPY], [1], [with strncpy replacement])])
|
||||
AS_IF([test "$with_libc_strnlen" = yes], [AC_DEFINE([WITH_LIBC_STRNLEN], [1], [with strnlen replacement])])
|
||||
AS_IF([test "$with_libc_strstr" = yes], [AC_DEFINE([WITH_LIBC_STRSTR], [1], [with strstr replacement])])
|
||||
|
||||
|
||||
|
||||
##########################
|
||||
|
|
|
@ -3,8 +3,7 @@ nobase_include_HEADERS = \
|
|||
kernaux/arch/i386.h \
|
||||
kernaux/arch/riscv64.h \
|
||||
kernaux/arch/x86_64.h \
|
||||
kernaux/assert.h \
|
||||
kernaux/libc.h
|
||||
kernaux/assert.h
|
||||
|
||||
if ASM_I386
|
||||
nobase_include_HEADERS += kernaux/asm/i386.h
|
||||
|
|
|
@ -1,9 +1,6 @@
|
|||
/*
|
||||
We don't include <kernaux/asm/*.h> because they
|
||||
contain architecture-specific assembly functions.
|
||||
|
||||
We don't include <kernaux/libc.h> because it may
|
||||
conflict with actual freestanding or hosted libc.
|
||||
*/
|
||||
|
||||
#include <kernaux/assert.h>
|
||||
|
|
|
@ -4,7 +4,8 @@
|
|||
|
||||
#include <kernaux/assert.h>
|
||||
#include <kernaux/cmdline.h>
|
||||
#include <kernaux/libc.h>
|
||||
|
||||
#include "libc.h"
|
||||
|
||||
enum State {
|
||||
INITIAL,
|
||||
|
|
|
@ -4,7 +4,8 @@
|
|||
|
||||
#include <kernaux/assert.h>
|
||||
#include <kernaux/console.h>
|
||||
#include <kernaux/libc.h>
|
||||
|
||||
#include "libc.h"
|
||||
|
||||
#ifdef ASM_I386
|
||||
#include <kernaux/asm/i386.h>
|
||||
|
|
140
src/libc.c
140
src/libc.c
|
@ -1,140 +0,0 @@
|
|||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
|
||||
#include <kernaux/libc.h>
|
||||
|
||||
#include <stdbool.h>
|
||||
|
||||
#ifdef WITH_LIBC_ATOI
|
||||
int atoi(const char *str)
|
||||
{
|
||||
while (isspace(*str)) ++str;
|
||||
bool is_negative = false;
|
||||
switch (*str) {
|
||||
case '-': is_negative = true; // fall through
|
||||
case '+': ++str;
|
||||
}
|
||||
int result = 0;
|
||||
while (isdigit(*str)) result = 10 * result - (*str++ - '0');
|
||||
return is_negative ? result : -result;
|
||||
}
|
||||
#endif // WITH_LIBC_ATOI
|
||||
|
||||
#ifdef WITH_LIBC_ISDIGIT
|
||||
int isdigit(const int c)
|
||||
{
|
||||
return (unsigned)c - '0' < 10;
|
||||
}
|
||||
#endif // WITH_LIBC_ISDIGIT
|
||||
|
||||
#ifdef WITH_LIBC_ISSPACE
|
||||
int isspace(const int c)
|
||||
{
|
||||
return c == ' ' || (unsigned)c - '\t' < 5;
|
||||
}
|
||||
#endif // WITH_LIBC_ISSPACE
|
||||
|
||||
#ifdef WITH_LIBC_MEMCPY
|
||||
void *memcpy(void *dest, const void *src, size_t n)
|
||||
{
|
||||
char *dest_cell = dest;
|
||||
char *src_cell = src;
|
||||
while (n--) *dest_cell++ = *src_cell++;
|
||||
return dest;
|
||||
}
|
||||
#endif // WITH_LIBC_MEMCPY
|
||||
|
||||
#ifdef WITH_LIBC_MEMMOVE
|
||||
void *memmove(void *dest, const void *src, size_t n)
|
||||
{
|
||||
char *dest_cell = dest;
|
||||
char *src_cell = src;
|
||||
if (dest_cell <= src_cell) {
|
||||
while (n--) *dest_cell++ = *src_cell++;
|
||||
} else {
|
||||
dest_cell += n;
|
||||
src_cell += n;
|
||||
while (n--) *--dest_cell = *--src_cell;
|
||||
}
|
||||
return dest;
|
||||
}
|
||||
#endif // WITH_LIBC_MEMMOVE
|
||||
|
||||
#ifdef WITH_LIBC_MEMSET
|
||||
void *memset(void *s, int c, size_t n)
|
||||
{
|
||||
char *ss = s;
|
||||
while (n--) *ss++ = c;
|
||||
return s;
|
||||
}
|
||||
#endif // WITH_LIBC_MEMSET
|
||||
|
||||
#ifdef WITH_LIBC_STRCMP
|
||||
int strcmp(const char *s1, const char *s2)
|
||||
{
|
||||
for (; *s1; ++s1, ++s2) if (*s1 != *s2) return *s1 < *s2 ? -1 : 1;
|
||||
return 0;
|
||||
}
|
||||
#endif // WITH_LIBC_STRCMP
|
||||
|
||||
#ifdef WITH_LIBC_STRCPY
|
||||
char *strcpy(char *dest, const char *src)
|
||||
{
|
||||
char *tmp = dest;
|
||||
while ((*dest++ = *src++) != '\0');
|
||||
return tmp;
|
||||
}
|
||||
#endif // WITH_LIBC_STRCPY
|
||||
|
||||
#ifdef WITH_LIBC_STRLEN
|
||||
size_t strlen(const char *s)
|
||||
{
|
||||
const char *ss = s;
|
||||
while (*ss != '\0') ++ss;
|
||||
return ss - s;
|
||||
}
|
||||
#endif // WITH_LIBC_STRLEN
|
||||
|
||||
#ifdef WITH_LIBC_STRNCMP
|
||||
int strncmp(const char *s1, const char *s2, size_t n)
|
||||
{
|
||||
for (; *s1 && n; ++s1, ++s2, --n) if (*s1 != *s2) return *s1 < *s2 ? -1 : 1;
|
||||
return 0;
|
||||
}
|
||||
#endif // WITH_LIBC_STRNCMP
|
||||
|
||||
#ifndef WITH_LIBC_STRNCPY
|
||||
char *strncpy(char *dest, const char *src, size_t n)
|
||||
{
|
||||
char *tmp = dest;
|
||||
while (n-- && (*dest++ = *src++) != '\0');
|
||||
return tmp;
|
||||
}
|
||||
#endif // WITH_LIBC_STRNCPY
|
||||
|
||||
#ifdef WITH_LIBC_STRNLEN
|
||||
size_t strnlen(const char *s, size_t maxlen)
|
||||
{
|
||||
const char *ss = s;
|
||||
while (*ss != '\0' && maxlen--) ++ss;
|
||||
return ss - s;
|
||||
}
|
||||
#endif // WITH_LIBC_STRNLEN
|
||||
|
||||
#ifdef WITH_LIBC_STRSTR
|
||||
char *strstr(const char *haystack, const char *needle)
|
||||
{
|
||||
const size_t needle_slen = strlen(needle);
|
||||
if (!needle_slen) return (char*)haystack;
|
||||
|
||||
size_t haystack_slen = strlen(haystack);
|
||||
while (haystack_slen >= needle_slen) {
|
||||
--haystack_slen;
|
||||
if (!memcmp(haystack, needle, needle_slen)) return (char*)haystack;
|
||||
++haystack;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
#endif // WITH_LIBC_STRSTR
|
|
@ -3,9 +3,10 @@
|
|||
#endif
|
||||
|
||||
#include <kernaux/assert.h>
|
||||
#include <kernaux/libc.h>
|
||||
#include <kernaux/pfa.h>
|
||||
|
||||
#include "libc.h"
|
||||
|
||||
#define PAGE_INDEX(page_addr) ((page_addr) / KERNAUX_PFA_PAGE_SIZE)
|
||||
|
||||
#define FLAG_INDEX_FROM_INDEX(page_index) ((page_index) / 8)
|
||||
|
|
|
@ -11,10 +11,11 @@
|
|||
#endif
|
||||
|
||||
#include <kernaux/assert.h>
|
||||
#include <kernaux/libc.h>
|
||||
#include <kernaux/printf.h>
|
||||
#include <kernaux/printf_fmt.h>
|
||||
|
||||
#include "libc.h"
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
|
||||
|
|
|
@ -7,9 +7,10 @@
|
|||
#endif
|
||||
|
||||
#include <kernaux/assert.h>
|
||||
#include <kernaux/libc.h>
|
||||
#include <kernaux/printf_fmt.h>
|
||||
|
||||
#include "libc.h"
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
|
|
|
@ -3,10 +3,11 @@
|
|||
#endif
|
||||
|
||||
#include <kernaux/assert.h>
|
||||
#include <kernaux/libc.h>
|
||||
#include <kernaux/ntoa.h>
|
||||
#include <kernaux/units.h>
|
||||
|
||||
#include "libc.h"
|
||||
|
||||
#define TMP_BUFFER_SIZE (64)
|
||||
|
||||
bool kernaux_units_human_raw(
|
||||
|
|
Loading…
Add table
Reference in a new issue