1
0
Fork 0
mirror of https://github.com/tailix/libkernaux.git synced 2024-10-30 11:54:01 -04:00

Remove libc (#158)

It has been moved to https://github.com/tailix/libclayer
This commit is contained in:
Alex Kotov 2022-12-27 14:52:08 +04:00 committed by GitHub
parent 3cef48e2f3
commit 5ac4de4203
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
28 changed files with 12 additions and 653 deletions

View file

@ -122,7 +122,7 @@ jobs:
- name: autogen
run: ./autogen.sh
- name: configure
run: ./configure --host='i386-elf' ${{matrix.assert}} --enable-freestanding --with-libc CC="$(which i686-linux-gnu-gcc)"
run: ./configure --host='i386-elf' ${{matrix.assert}} --enable-freestanding CC="$(which i686-linux-gnu-gcc)"
- name: make
run: make

4
.gitignore vendored
View file

@ -45,8 +45,6 @@
/examples/Makefile.in
/fixtures/Makefile.in
/include/Makefile.in
/libc/Makefile.in
/libc/include/Makefile.in
/tests/Makefile.in
###########################################
@ -78,8 +76,6 @@
/examples/Makefile
/fixtures/Makefile
/include/Makefile
/libc/Makefile
/libc/include/Makefile
/tests/Makefile
/libkernaux.pc

View file

@ -4,8 +4,8 @@ Common
* Add your name to [COPYING](/COPYING).
* Don't add your name to `AUTHORS` - it's for maintainers.
* Add copyright notice in the beginning of changed files except the headers.
* If you change the behavior (even just fix a bug) of **libkernaux** (stable) or
[libc](/libc), add a record to [ChangeLog](/ChangeLog).
* If you change the behavior (even just fix a bug), add a record
to [ChangeLog](/ChangeLog).
Prohibitions:

View file

@ -1,3 +1,7 @@
2022-12-27 Alex Kotov <kotovalexarian@gmail.com>
* configure.ac: Package "--with[out]-libc" has been removed
2022-12-23 Alex Kotov <kotovalexarian@gmail.com>
libkernaux 0.7.0 released

View file

@ -6,11 +6,6 @@ EXTRA_DIST = autogen.sh CONTRIBUTING.md sha256sums.txt src/assert.h
SUBDIRS = include
if WITH_LIBC
# FIXME: after "make clean" libc is not rebuiling
SUBDIRS += libc
endif
SUBDIRS += .
if ENABLE_FIXTURES
@ -21,9 +16,6 @@ if ENABLE_CHECKS
SUBDIRS += examples tests
endif
libc/libc.la:
$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/libc libc.la
AM_CFLAGS += -DKERNAUX_ACCESS_PRIVATE
lib_LTLIBRARIES = libkernaux.la
@ -45,14 +37,6 @@ libkernaux_la_SOURCES = \
src/generic/mutex.c \
src/runtime.c
########
# libc #
########
if WITH_LIBC
libkernaux_la_LIBADD += libc/libc.la
endif
#######
# ARCH #
#######

View file

@ -81,14 +81,6 @@ zero). Work-in-progress APIs can change at any time.
* [Example: vfprintf](/examples/printf_file_va.c)
* [Example: snprintf](/examples/printf_str.c)
* [Example: vsnprintf](/examples/printf_str_va.c)
* libc replacement (*work in progress*)
* [ctype.h](/libc/include/ctype.h)
* [errno.h](/libc/include/errno.h)
* [inttypes.h](/libc/include/inttypes.h)
* [setjmp.h](/libc/include/setjmp.h)
* [stdlib.h](/libc/include/stdlib.h)
* [string.h](/libc/include/string.h)
* [sys/types.h](/libc/include/sys/types.h)
* Architecture-specific code (*work in progress*)
* [Declarations](/include/kernaux/arch/)
* [Functions](/include/kernaux/asm/)
@ -143,11 +135,6 @@ stable options.
* `--enable-pkg-config[=PATH]` - install pkg-config files
[PATH='${libdir}/pkgconfig']
#### Packages
* `--with-libc` - provides the replacement for some standard C functions.
Useful in freestanding environment, where no libc is present.
### Default options
#### Features
@ -211,6 +198,9 @@ You can test with `make check`.
Create configuration script with `./autogen.sh` (if present).
The library requires some functions from the standard C library.
Use [libclayer](https://github.com/tailix/libclayer).
Let's assume that your target triplet is `i386-elf`. Configure with
[cross-compiler](https://wiki.osdev.org/GCC_Cross-Compiler) in `$PATH` to make
without it in `$PATH`:
@ -220,8 +210,8 @@ without it in `$PATH`:
--host='i386-elf' \
--disable-shared \
--enable-freestanding \
--with-libc \
CC="$(which i386-elf-gcc)"
CC="$(which i386-elf-gcc)" \
CFLAGS='-I<path/to/libc/headers>'
```
The variables include `AR`, `AS`, `CC`, `CCAS`, `LD`, `NM`, `OBJDUMP`, `RANLIB`,

View file

@ -30,8 +30,6 @@ AC_CONFIG_FILES([
fixtures/Makefile
fixtures/multiboot2_bin_examples_gen.c
include/Makefile
libc/Makefile
libc/include/Makefile
include/kernaux/version.h
tests/Makefile
tests/test_multiboot2_header_print.c
@ -62,7 +60,6 @@ AC_ARG_ENABLE([checks-all], AS_HELP_STRING([--enable-checks-all], [ena
AC_ARG_ENABLE([checks-cppcheck], AS_HELP_STRING([--enable-checks-cppcheck], [enable cppcheck]))
AC_ARG_ENABLE([checks-pthreads], AS_HELP_STRING([--enable-checks-pthreads], [enable tests that require pthreads]))
AC_ARG_ENABLE([checks-python], AS_HELP_STRING([--enable-checks-python], [enable tests that require Python 3 with YAML and Jinja2]))
AC_ARG_ENABLE([split-libc], AS_HELP_STRING([--enable-split-libc], [split off libc]))
dnl Features (with parameter)
AC_ARG_ENABLE([pkg-config], AS_HELP_STRING([--enable-pkg-config@<:@=PATH@:>@], [install pkg-config files @<:@PATH='${libdir}/pkgconfig'@:>@]))
@ -86,9 +83,6 @@ AC_ARG_WITH( [printf], AS_HELP_STRING([--without-printf], [wit
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], AS_HELP_STRING([--with-libc], [with libc replacement]))
################
@ -151,7 +145,6 @@ AS_IF([test "$enable_checks_all" = yes], [enable_checks_all=yes], [ena
AS_IF([test "$enable_checks_cppcheck" = yes], [enable_checks_cppcheck=yes], [enable_checks_cppcheck=no])
AS_IF([test "$enable_checks_pthreads" = yes], [enable_checks_pthreads=yes], [enable_checks_pthreads=no])
AS_IF([test "$enable_checks_python" = yes], [enable_checks_python=yes], [enable_checks_python=no])
AS_IF([test "$enable_split_libc" = yes], [enable_split_libc=yes], [enable_split_libc=no])
dnl Features (with parameter)
AS_IF([test "$enable_pkg_config" = yes], [enable_pkg_config='${libdir}/pkgconfig'])
@ -176,9 +169,6 @@ AS_IF([test "$with_printf" = no ], [with_printf=no], [wit
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" = yes], [with_libc=yes], [with_libc=no])
#############
@ -187,8 +177,6 @@ AS_IF([test "$with_libc" = yes], [with_libc=yes], [wit
AS_IF([test "$enable_checks" = yes -a "$enable_freestanding" = yes], AC_MSG_ERROR([can not build freestanding tests]))
AS_IF([test "$enable_fixtures" = yes -a "$enable_freestanding" = yes], AC_MSG_ERROR([can not build freestanding fixtures]))
AS_IF([test "$enable_checks" = yes -a "$with_libc" = yes], AC_MSG_ERROR([can not use package `libc' with tests]))
AS_IF([test "$enable_fixtures" = yes -a "$with_libc" = yes], AC_MSG_ERROR([can not use package `libc' with fixtures]))
AS_IF([test "$with_printf" = yes -a "$with_ntoa" = no], AC_MSG_ERROR([package `printf' requires package `ntoa']))
AS_IF([test "$with_printf" = yes -a "$with_printf_fmt" = no], AC_MSG_ERROR([package `printf' requires package `printf-fmt']))
@ -220,7 +208,6 @@ AM_CONDITIONAL([ENABLE_CHECKS], [test "$enable_checks" = yes])
AM_CONDITIONAL([ENABLE_CHECKS_CPPCHECK], [test "$enable_checks_cppcheck" = yes])
AM_CONDITIONAL([ENABLE_CHECKS_PTHREADS], [test "$enable_checks_pthreads" = yes])
AM_CONDITIONAL([ENABLE_CHECKS_PYTHON], [test "$enable_checks_python" = yes])
AM_CONDITIONAL([ENABLE_SPLIT_LIBC], [test "$enable_split_libc" = yes])
dnl Features (with parameter)
AM_CONDITIONAL([ENABLE_PKG_CONFIG], [test ! -z "$enable_pkg_config"])
@ -242,9 +229,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], [test "$with_libc" = yes])
dnl Packages (virtual)
AM_CONDITIONAL([WITH_ARCH_X86], [test "$with_arch_i386" = yes -o "$with_arch_x86_64" = yes])
@ -275,7 +259,6 @@ AS_IF([test "$enable_checks" = yes], [AC_DEFINE([ENABLE_CHECKS],
AS_IF([test "$enable_checks_cppcheck" = yes], [AC_DEFINE([ENABLE_CHECKS_CPPCHECK], [1], [enabled cppcheck])])
AS_IF([test "$enable_checks_pthreads" = yes], [AC_DEFINE([ENABLE_CHECKS_PTHREADS], [1], [enabled tests that require pthreads])])
AS_IF([test "$enable_checks_python" = yes], [AC_DEFINE([ENABLE_CHECKS_PYTHON], [1], [enabled tests that require Python 3 with YAML and Jinja2])])
AS_IF([test "$enable_split_libc" = yes], [AC_DEFINE([ENABLE_SPLIT_LIBC], [1], [split off libc])])
dnl Packages (enabled by default)
AS_IF([test "$with_arch_i386" = yes], [AC_DEFINE([WITH_ARCH_I386], [1], [with architecture i386])])
@ -294,9 +277,6 @@ AS_IF([test "$with_printf" = yes], [AC_DEFINE([WITH_PRINTF],
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" = yes], [AC_DEFINE([WITH_LIBC], [1], [with libc replacement])])
dnl Packages (virtual)
AS_IF([test "$with_arch_i386" = yes], [AC_DEFINE([WITH_ARCH_X86], [1], [with architecture x86])])
AS_IF([test "$with_arch_x86_64" = yes], [AC_DEFINE([WITH_ARCH_X86], [1], [with architecture x86])])

View file

@ -1,30 +0,0 @@
include $(top_srcdir)/make/shared.am
SUBDIRS = include
if ENABLE_SPLIT_LIBC
lib_LTLIBRARIES = libc.la
else
EXTRA_LTLIBRARIES = libc.la
endif
libc_la_SOURCES = \
src/ctype.c \
src/errno.c \
src/kernaux.c \
src/stdlib.c \
src/string.c
if ASM_I386
libc_la_SOURCES += \
src/asm/i386/longjmp.S \
src/asm/i386/setjmp.S
endif
if ASM_X86_64
libc_la_SOURCES += \
src/asm/x86_64/longjmp.S \
src/asm/x86_64/setjmp.S
endif
# TODO: implement setjmp/longjmp for riscv64

View file

@ -1,9 +0,0 @@
nobase_include_HEADERS = \
kernaux/libc.h \
ctype.h \
errno.h \
inttypes.h \
setjmp.h \
stdlib.h \
string.h \
sys/types.h

View file

@ -1,20 +0,0 @@
#ifndef _CTYPE_H
#define _CTYPE_H 1
#ifdef __cplusplus
extern "C" {
#endif
int isdigit(int c);
int islower(int c);
int isspace(int c);
int isupper(int c);
int tolower(int c);
int toupper(int c);
#ifdef __cplusplus
}
#endif
#endif

View file

@ -1,16 +0,0 @@
#ifndef _ERRNO_H
#define _ERRNO_H 1
#ifdef __cplusplus
extern "C" {
#endif
#define ERANGE 1
extern int errno;
#ifdef __cplusplus
}
#endif
#endif

View file

@ -1,12 +0,0 @@
#ifndef _INTTYPES_H
#define _INTTYPES_H 1
#ifdef __cplusplus
extern "C" {
#endif
#ifdef __cplusplus
}
#endif
#endif

View file

@ -1,26 +0,0 @@
#ifndef KERNAUX_INCLUDED_LIBC
#define KERNAUX_INCLUDED_LIBC
#ifdef __cplusplus
extern "C" {
#endif
#include <stddef.h>
struct KernAux_Libc {
void (*abort)() __attribute__((noreturn));
void (*exit)(int status) __attribute__((noreturn));
void *(*calloc)(size_t nmemb, size_t size);
void (*free)(void *ptr);
void *(*malloc)(size_t size);
void *(*realloc)(void *ptr, size_t size);
};
extern struct KernAux_Libc kernaux_libc;
#ifdef __cplusplus
}
#endif
#endif

View file

@ -1,27 +0,0 @@
#ifndef _SETJMP_H
#define _SETJMP_H 1
#ifdef __cplusplus
extern "C" {
#endif
// TODO: define in architecture-specific header
typedef unsigned long __jmp_buf[sizeof(long) == 8 ? 8 : 6];
typedef struct __jmp_buf_tag {
__jmp_buf __jb;
unsigned long __fl;
unsigned long __ss[128 / sizeof(long)];
} jmp_buf[1];
__attribute__((returns_twice))
int setjmp(jmp_buf env);
__attribute__((noreturn))
void longjmp(jmp_buf env, int val);
#ifdef __cplusplus
}
#endif
#endif

View file

@ -1,29 +0,0 @@
#ifndef _STDLIB_H
#define _STDLIB_H 1
#ifdef __cplusplus
extern "C" {
#endif
#include <stddef.h>
#define EXIT_SUCCESS 0
#define EXIT_FAILURE 1
int atoi(const char *str);
__attribute__((noreturn))
void abort();
__attribute__((noreturn))
void exit(int status);
void *calloc(size_t nmemb, size_t size);
void free(void *ptr);
void *malloc(size_t size);
void *realloc(void *ptr, size_t size);
#ifdef __cplusplus
}
#endif
#endif

View file

@ -1,37 +0,0 @@
#ifndef _STRING_H
#define _STRING_H 1
#ifdef __cplusplus
extern "C" {
#endif
#include <stddef.h>
// mem*
int memcmp(const void *s1, const void *s2, size_t n);
void *memcpy(void *dest, const void *src, size_t n);
void *memmove(void *dest, const void *src, size_t n);
void *memchr(const void *s, int c, size_t n);
void *memset(void *s, int c, size_t n);
// str*
char *strcat(char *dest, const char *src);
char *strchr(const char *s, int c);
int strcmp(const char *s1, const char *s2);
char *strcpy(char *dest, const char *src);
size_t strlen(const char *s);
// strn*
char *strncat(char *dest, const char *src, size_t n);
int strncmp(const char *s1, const char *s2, size_t n);
char *strncpy(char *dest, const char *src, size_t n);
size_t strnlen(const char *s, size_t maxlen);
// str*
char *strstr(const char *haystack, const char *needle);
#ifdef __cplusplus
}
#endif
#endif

View file

@ -1,12 +0,0 @@
#ifndef _SYS_TYPES_H
#define _SYS_TYPES_H 1
#ifdef __cplusplus
extern "C" {
#endif
#ifdef __cplusplus
}
#endif
#endif

View file

@ -1,25 +0,0 @@
/**
* The code was taken from musl libc.
*
* Copyright (c) 2011 Rich Felker
* Copyright (c) 2022 Alexander Monakov
* Copyright (c) 2022 Alex Kotov
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
.global longjmp
.type longjmp, @function
longjmp:
mov 4(%esp) , %edx
mov 8(%esp) , %eax
cmp $1 , %eax
adc $0 , %al
mov (%edx) , %ebx
mov 4(%edx) , %esi
mov 8(%edx) , %edi
mov 12(%edx) , %ebp
mov 16(%edx) , %esp
jmp *20(%edx)

View file

@ -1,25 +0,0 @@
/**
* The code was taken from musl libc.
*
* Copyright (c) 2011-2015 Rich Felker
* Copyright (c) 2022 Alex Kotov
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
.global setjmp
.type setjmp, @function
setjmp:
mov 4(%esp) , %eax
mov %ebx , (%eax)
mov %esi , 4(%eax)
mov %edi , 8(%eax)
mov %ebp , 12(%eax)
lea 4(%esp) , %ecx
mov %ecx , 16(%eax)
mov (%esp) , %ecx
mov %ecx , 20(%eax)
xor %eax , %eax
ret

View file

@ -1,27 +0,0 @@
/**
* The code was taken from musl libc.
*
* Copyright (c) 2011 Nicholas J. Kain
* Copyright (c) 2011-2012 Rich Felker
* Copyright (c) 2022 Alexander Monakov
* Copyright (c) 2022 Alex Kotov
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
.global longjmp
.type longjmp, @function
longjmp:
xor %eax , %eax
cmp $1 , %esi /* CF = val ? 0 : 1 */
adc %esi , %eax /* eax = val + !val */
mov (%rdi) , %rbx /* rdi is the jmp_buf, restore regs from it */
mov 8(%rdi) , %rbp
mov 16(%rdi) , %r12
mov 24(%rdi) , %r13
mov 32(%rdi) , %r14
mov 40(%rdi) , %r15
mov 48(%rdi) , %rsp
jmp *56(%rdi) /* goto saved address without altering rsp */

View file

@ -1,28 +0,0 @@
/**
* The code was taken from musl libc.
*
* Copyright (c) 2011 Nicholas J. Kain
* Copyright (c) 2011-2012 Rich Felker
* Copyright (c) 2022 Alexander Monakov
* Copyright (c) 2022 Alex Kotov
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
.global setjmp
.type setjmp, @function
setjmp:
mov %rbx , (%rdi) /* rdi is jmp_buf, move registers onto it */
mov %rbp , 8(%rdi)
mov %r12 , 16(%rdi)
mov %r13 , 24(%rdi)
mov %r14 , 32(%rdi)
mov %r15 , 40(%rdi)
lea 8(%rsp) , %rdx /* this is our rsp WITHOUT current ret addr */
mov %rdx , 48(%rdi)
mov (%rsp) , %rdx /* save return addr ptr for new rip */
mov %rdx , 56(%rdi)
xor %eax , %eax /* always return 0 */
ret

View file

@ -1,35 +0,0 @@
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <ctype.h>
int isdigit(const int c)
{
return (unsigned)c - '0' < 10;
}
int islower(const int c)
{
return (unsigned)c - 'a' < 26;
}
int isspace(const int c)
{
return c == ' ' || (unsigned)c - '\t' < 5;
}
int isupper(const int c)
{
return (unsigned)c - 'A' < 26;
}
int tolower(const int c)
{
return isupper(c) ? (c + ('a' - 'A')) : c;
}
int toupper(const int c)
{
return islower(c) ? (c - ('a' - 'A')) : c;
}

View file

@ -1,7 +0,0 @@
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <errno.h>
int errno = 0;

View file

@ -1,17 +0,0 @@
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <kernaux/libc.h>
#include <stddef.h>
struct KernAux_Libc kernaux_libc = {
.abort = NULL,
.exit = NULL,
.calloc = NULL,
.free = NULL,
.malloc = NULL,
.realloc = NULL,
};

View file

@ -1,70 +0,0 @@
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <kernaux/libc.h>
#include <ctype.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
void exit(const int status)
{
// Custom implementation
kernaux_libc.exit(status);
}
void abort()
{
// Custom implementation
if (kernaux_libc.abort) kernaux_libc.abort();
// Default implementation
exit(EXIT_FAILURE);
}
void *calloc(const size_t nmemb, const size_t size)
{
// Custom implementation
if (kernaux_libc.calloc) return kernaux_libc.calloc(nmemb, size);
// Default implementation
const size_t total_size = nmemb * size;
if (!total_size) return NULL;
if (total_size / nmemb != size) return NULL;
void *const ptr = malloc(total_size);
if (ptr) memset(ptr, 0, total_size);
return ptr;
}
void free(void *const ptr)
{
// Custom implementation
kernaux_libc.free(ptr);
}
void *malloc(const size_t size)
{
// Custom implementation
return kernaux_libc.malloc(size);
}
void *realloc(void *const ptr, const size_t size)
{
// Custom implementation
return kernaux_libc.realloc(ptr, size);
}
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;
}

View file

@ -1,135 +0,0 @@
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <stddef.h>
#include <string.h>
int memcmp(const void *s1, const void *s2, size_t n)
{
for (const unsigned char *p1 = s1, *p2 = s2; n--; ++p1, ++p2) {
if (*p1 != *p2) return *p1 - *p2;
}
return 0;
}
void *memcpy(void *dest, const void *src, size_t n)
{
char *dest_cell = dest;
char *src_cell = (char*)src;
while (n--) *dest_cell++ = *src_cell++;
return dest;
}
void *memmove(void *dest, const void *src, size_t n)
{
char *dest_cell = dest;
char *src_cell = (char*)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;
}
void *memchr(const void *s, int c, size_t n)
{
for (const unsigned char *p = s; n--; ++p) {
if ((unsigned char)c == *p) return (void*)p;
}
return NULL;
}
void *memset(void *s, int c, size_t n)
{
char *ss = s;
while (n--) *ss++ = c;
return s;
}
char *strcat(char *dest, const char *src)
{
char *const dest_start = dest;
while (*dest) ++dest;
while ((*dest++ = *src++));
return dest_start;
}
char *strchr(const char *s, int c)
{
for (; *s != (char)c; ++s) if (*s == '\0') return NULL;
return (char*)s;
}
int strcmp(const char *s1, const char *s2)
{
for (; *s1; ++s1, ++s2) if (*s1 != *s2) return *s1 < *s2 ? -1 : 1;
return 0;
}
char *strcpy(char *dest, const char *src)
{
char *tmp = dest;
while ((*dest++ = *src++) != '\0');
return tmp;
}
size_t strlen(const char *s)
{
const char *ss = s;
while (*ss != '\0') ++ss;
return ss - s;
}
char *strncat(char *dest, const char *src, size_t n)
{
char *const dest_start = dest;
if (n) {
while (*dest) ++dest;
while ((*dest++ = *src++)) {
if (--n == 0) {
*dest = '\0';
break;
}
}
}
return dest_start;
}
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;
}
char *strncpy(char *dest, const char *src, size_t n)
{
char *tmp = dest;
while (n-- && (*dest++ = *src++) != '\0');
return tmp;
}
size_t strnlen(const char *s, size_t maxlen)
{
const char *ss = s;
while (*ss != '\0' && maxlen--) ++ss;
return ss - s;
}
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;
}

View file

@ -31,8 +31,6 @@ CPPCHECK_PATHS = \
$(top_srcdir)/examples \
$(top_builddir)/include \
$(top_srcdir)/include \
$(top_builddir)/libc \
$(top_srcdir)/libc \
$(top_builddir)/src \
$(top_srcdir)/src \
$(top_builddir)/tests \

View file

@ -9,12 +9,6 @@ AM_CFLAGS = \
-I$(top_srcdir)/include \
-D_POSIX_C_SOURCE=200809L
if WITH_LIBC
AM_CFLAGS += \
-I$(top_builddir)/libc/include \
-I$(top_srcdir)/libc/include
endif
if ENABLE_WERROR
AM_CFLAGS += -Werror
endif