1
0
mirror of https://github.com/adtools/clib2.git synced 2025-12-08 14:59:05 +00:00

48 Commits

Author SHA1 Message Date
c02665938f Merge pull request #13 from sodero/topic/additional_error_codes
Add ENOTSUP error code
2021-05-14 00:38:42 +02:00
1e2863c5b8 fixed README.md 2021-05-14 00:32:09 +02:00
e1da3dadfb moved from travis-ci to github actions and retired codeclimate. 2021-05-14 00:31:17 +02:00
b51c79577e Add ENOTSUP error code. 2021-01-20 15:34:37 +01:00
975f949aa1 Rewritten to handle date ranges better which lie outside the expected time of day, day of month and month.
The 'struct tm' is now properly updated to reflect the time and date information which comes out of the number of seconds calculated.

A bug reported by Andreas Falkenhahn is resolved which had the effect of distorting the number of seconds calculated.
2020-07-06 12:09:51 +02:00
5f14118d73 Fix for translation bug, which would make "a/../b" into "a./b". Contributed by Thomas Frieden - thank you very much! 2018-12-05 13:31:43 +01:00
b874ff71de Add wcscoll() dummy. 2018-04-22 11:21:24 +02:00
397013922c Use IsMinListEmpty() for MinList rather than IsListEmpty().
This removes the warnings about breaking the strict-aliasing rules.
2018-04-10 23:20:20 +02:00
85c36839d5 Create the proper directoy for MAKELIB. 2018-04-10 23:19:13 +02:00
196d37b28a Compile with -nostdlib, rather than -mcrt=clib2.
We are actually building the clib2 here.
2018-04-10 23:18:30 +02:00
e8086be768 Disable -Wunused-label.
There are a lot of unused lables, depending on the actual
compiling mode.
2018-04-10 23:17:08 +02:00
82dd474e3b Disable -Wbad-function-cast. It produces a lot of useless warnings. 2018-04-09 23:24:56 +02:00
58f36203b1 Fix cast to function pointer. 2018-04-09 23:24:07 +02:00
425f899302 Merge pull request #7 from sba1/wchar-fixes
Wchar fixes
2018-03-31 09:37:50 +02:00
febe89c61b Update changelog. 2018-03-30 22:17:41 +02:00
3e50be491b Include stdint.h for WCHAR_MAX to avoid redundant definitions. 2018-03-30 21:42:12 +02:00
dfc7f310d6 Don't define wchar_t in C++ as it is a bultin-type there. 2018-03-30 21:35:06 +02:00
a6a9352a00 Compile wchar_wscoll.c. 2018-03-30 21:21:31 +02:00
eb1d784c0d Provide stub for mbrtowc(). 2018-03-30 21:21:11 +02:00
d1092099d0 Provide some more wide char functions. 2018-03-29 20:59:02 +02:00
bc621bed9c Disable the LOG_COMMAND.
Piping will have the consequence that the exit status of the first command
will not be considered. As this is the compiling command in our case, make
will not exit with an error code even if the compiling failed.

While there are shell-specific solutions, disabling LOG_COMMAND seems to
be the most general solution.
2018-03-29 20:57:32 +02:00
60eebbe732 Implement wcscat(). 2018-03-28 21:23:13 +02:00
345995000a Implement some more of the iswXXX() functions. 2018-03-28 21:16:14 +02:00
ef18bf5f3e Fix vswprintf() prototype. 2018-03-28 18:47:24 +02:00
6f3b3b6d28 Implement few wide char functions. 2018-03-28 17:09:18 +02:00
846eebc66c Fix mbtowc() to and compile it. 2018-03-28 17:08:42 +02:00
75d47ccdad Build all existing wchar and wctype functions. 2018-03-27 20:03:45 +02:00
456123fe7f Add dummy wctob(). 2018-03-27 20:02:54 +02:00
5733c99ba1 Fix wcspbrk() definition to match the prototype. 2018-03-27 20:00:28 +02:00
391e7e39ad Add wcscoll() prototype. 2018-03-27 19:59:54 +02:00
f5f0e17e78 Define ISO 99 multibyte functions also in C++ context. 2018-03-27 19:59:23 +02:00
f6f0082a0e Include sys/clib2_stdc.h for restrict. 2018-03-27 19:56:45 +02:00
c84b1fc1ff Tiny fixes 2018-02-18 13:58:25 +01:00
e35307a7e3 Ignore linker map files, too. 2018-02-17 13:45:21 +01:00
911114c286 add an unimplemented tzset().
ctime_r() and localtime_r() are already using the localtime, so no need to do anything.
http://pubs.opengroup.org/onlinepubs/9699919799/functions/tzset.html

Signed-off-by: Henning Nielsen Lund <hnl_dk@amigaos.dk>
2017-08-27 13:30:12 +02:00
9e998ca108 should have been sys/clib2_stdc.h 2017-08-15 21:53:49 +02:00
99695dec0b we use restrict
Signed-off-by: Henning Nielsen Lund <hnl_dk@amigaos.dk>
2017-08-15 21:45:33 +02:00
0ec7094877 Code depending on statfs or fstatfs do both depend on sys/mount.h and sys/param.h where we only had sys/mount.h
Signed-off-by: Henning Nielsen Lund <hnl_dk@amigaos.dk>
2017-08-15 21:26:45 +02:00
a471e73adf add timespec declaration 2017-08-05 17:28:39 +02:00
c76bf8e20b add strnlen() 2017-08-01 21:28:07 +02:00
309bbd8c8c Add a few extra wide-character prototypes and the missing typedef locale_t 2017-08-01 21:26:59 +02:00
d6e5769bc5 using restrict, so restrict to c99 2017-08-01 14:52:45 +02:00
976b6ae7e1 Change the mbrlen declaration to equal ISO C.
http://pubs.opengroup.org/onlinepubs/9699919799/functions/mbrlen.html

Signed-off-by: Henning Nielsen Lund <hnl_dk@amigaos.dk>
2017-08-01 13:55:11 +02:00
8af96cb6cb Merge branch 'master' of https://github.com/adtools/clib2 2017-07-08 18:10:45 +02:00
febe690623 This got lost last year
The missing calloc() overflow test never made it to the CVS or git repositories :-(
2017-07-08 18:10:28 +02:00
e36ebff16e Merge pull request #3 from adtools/gcc5-fixes
Fixes for compiling with GCC 5.4.0 on AmigaOS 4.1
2017-06-28 08:55:21 +02:00
6a1fd36b3a Revision bump. 2017-06-28 06:35:31 +02:00
feebeb6751 GCC 5 changes 2017-06-28 06:34:57 +02:00
80 changed files with 972 additions and 292 deletions

View File

@ -1,14 +0,0 @@
---
engines:
duplication:
enabled: false
fixme:
enabled: true
markdownlint:
enabled: true
ratings:
paths:
- "**.c"
- "**.h"
- "**.l"
- "**.md"

54
.github/workflows/ci.yml vendored Normal file
View File

@ -0,0 +1,54 @@
name: CI
on:
push:
pull_request:
workflow_dispatch:
jobs:
build:
runs-on: ubuntu-20.04
timeout-minutes: 480
strategy:
fail-fast: false
matrix:
platform: [os4, os3]
steps:
- uses: actions/checkout@v2
- name: setup dependencies
run: |
sudo dpkg --add-architecture i386
sudo apt-get update -y -qq || true
sudo apt-get -qq install libc6:i386
sudo ln -s /usr/lib/x86_64-linux-gnu/libmpfr.so.6 /usr/lib/x86_64-linux-gnu/libmpfr.so.4
- name: setup env
run : |
echo "GITHUB_SHA7=$(echo ${GITHUB_SHA::7})" >>$GITHUB_ENV
- name: install adtools build env
run: |
DOWNLOAD_PATH=https://github.com/adtools/adtools/releases/download/20170213
curl -L ${DOWNLOAD_PATH}/adtools-utils.tar.bz2 | sudo tar xj -C /
if [[ ${{ matrix.platform }} =~ os3 ]]; then curl -L ${DOWNLOAD_PATH}/adtools-m68k-amigaos.tar.bz2 | sudo tar xj -C / ; fi
if [[ ${{ matrix.platform }} =~ os4 ]]; then curl -L ${DOWNLOAD_PATH}/adtools-ppc-amigaos.tar.bz2 | sudo tar xj -C / ; fi
if [[ ${{ matrix.platform }} =~ mos ]]; then curl -L ${DOWNLOAD_PATH}/adtools-ppc-morphos.tar.bz2 | sudo tar xj -C / ; fi
if [[ ${{ matrix.platform }} =~ aros-ppc ]]; then curl -L ${DOWNLOAD_PATH}/adtools-ppc-aros.tar.bz2 | sudo tar xj -C / ; fi
if [[ ${{ matrix.platform }} =~ aros-i386 ]]; then curl -L ${DOWNLOAD_PATH}/adtools-i386-aros.tar.bz2 | sudo tar xj -C / ; fi
if [[ ${{ matrix.platform }} =~ aros-x86_64 ]]; then curl -L ${DOWNLOAD_PATH}/adtools-x86_64-aros.tar.bz2 | sudo tar xj -C / ; fi
- name: cleanup old action artifacts
run: .github/workflows/purge_artifacts.sh ${{ secrets.GITHUB_TOKEN }}
#- name: remote debug tmate session
# uses: mxschmitt/action-tmate@v1
# if: matrix.platform == 'os4'
- name: build [${{ matrix.platform }}]
timeout-minutes: 480
run: |
export PATH=/usr/local/amiga/bin:/opt/m68k-amigaos/bin:/opt/ppc-amigaos/bin:/opt/ppc-morphos/bin:${PATH}
if [[ ${{ matrix.platform }} =~ os4 ]]; then make -C library -j1 -f GNUmakefile.os4 OS=os4 ; fi
if [[ ${{ matrix.platform }} =~ os3 ]]; then make -C library -j1 -f GNUmakefile.68k OS=os3 ; fi

55
.github/workflows/purge_artifacts.sh vendored Executable file
View File

@ -0,0 +1,55 @@
#!/usr/bin/env bash
# Customize those three lines with your repository and credentials:
REPO=https://api.github.com/repos/${GITHUB_REPOSITORY}
GITHUB_USER=${GITHUB_REPOSITORY%%/*}
GITHUB_TOKEN=${1}
# Number of most recent versions to keep for each artifact:
KEEP=4
# A shortcut to call GitHub API.
ghapi() { curl --silent --location --user $GITHUB_USER:$GITHUB_TOKEN "$@"; }
# A temporary file which receives HTTP response headers.
TMPFILE=/tmp/tmp.$$
# An associative array, key: artifact name, value: number of artifacts of that name.
declare -A ARTCOUNT
# Process all artifacts on this repository, loop on returned "pages".
URL=$REPO/actions/artifacts
while [[ -n "$URL" ]]; do
# Get current page, get response headers in a temporary file.
JSON=$(ghapi --dump-header $TMPFILE "$URL")
# Get URL of next page. Will be empty if we are at the last page.
URL=$(grep '^Link:' "$TMPFILE" | tr ',' '\n' | grep 'rel="next"' | head -1 | sed -e 's/.*<//' -e 's/>.*//')
rm -f ${TMPFILE}
# Number of artifacts on this page:
COUNT=$(( $(jq <<<$JSON -r '.artifacts | length') ))
# Loop on all artifacts on this page.
for ((i=0; $i < $COUNT; i++)); do
# Get name of artifact and count instances of this name.
STR=$(jq <<<$JSON -r ".artifacts[$i].name?")
name=${STR%%-*}-${STR##*-}
ARTCOUNT[$name]=$(( $(( ${ARTCOUNT[$name]} )) + 1))
printf "Found '%s' #%d, " $STR ${ARTCOUNT[$name]}
# Check if we must delete this one.
if [[ ${ARTCOUNT[$name]} -gt $KEEP ]]; then
id=$(jq <<<$JSON -r ".artifacts[$i].id?")
size=$(( $(jq <<<$JSON -r ".artifacts[$i].size_in_bytes?") ))
printf "deleting %d bytes\n" $size
ghapi -X DELETE $REPO/actions/artifacts/$id
else
printf "OK\n"
fi
done
done
exit 0

1
.gitignore vendored
View File

@ -2,3 +2,4 @@
*.a
/library/compiler.log
/library/netinclude
*.map

View File

@ -1,36 +0,0 @@
sudo: required
dist: trusty
language: c
# download and install our required cross compilers
install:
# Make sure we can install i386 packages as some adtools binaries
# requires i386 libraries being installed to work in the 64bit env
# of Travis
- sudo dpkg --add-architecture i386
- sudo apt-get -qq update || true
- sudo apt-get -qq install libc6:i386
# Install all adtools related stuff we need
- curl -L https://dl.bintray.com/jens-maus/adtools/adtools-utils.tar.bz2 | sudo tar xj -C /
- if [[ ${BUILD} =~ os3|release ]]; then curl -L https://dl.bintray.com/jens-maus/adtools/adtools-m68k-amigaos.tar.bz2 | sudo tar xj -C / ; fi
- if [[ ${BUILD} =~ os4|release ]]; then curl -L https://dl.bintray.com/jens-maus/adtools/adtools-ppc-amigaos.tar.bz2 | sudo tar xj -C / ; fi
- if [[ ${BUILD} =~ mos|release ]]; then curl -L https://dl.bintray.com/jens-maus/adtools/adtools-ppc-morphos.tar.bz2 | sudo tar xj -C / ; fi
- if [[ ${BUILD} =~ aros-ppc|release ]]; then curl -L https://dl.bintray.com/jens-maus/adtools/adtools-ppc-aros.tar.bz2 | sudo tar xj -C / ; fi
- if [[ ${BUILD} =~ aros-i386|release ]]; then curl -L https://dl.bintray.com/jens-maus/adtools/adtools-i386-aros.tar.bz2 | sudo tar xj -C / ; fi
- if [[ ${BUILD} =~ aros-x86_64|release ]]; then curl -L https://dl.bintray.com/jens-maus/adtools/adtools-x86_64-aros.tar.bz2 | sudo tar xj -C / ; fi
- if [[ ${BUILD} =~ mingw32|release ]]; then sudo apt-get -qq install binutils-mingw-w64-i686 gcc-mingw-w64-i686 ; fi
# set the PATH variable to the directories the cross compilers are installed.
before_script:
- export PATH=/usr/local/amiga/bin:/opt/m68k-amigaos/bin:/opt/ppc-amigaos/bin:/opt/ppc-morphos/bin:${PATH}
# specify a list of variables to test (here we test the build for our supported
# list of operating systems).
env:
- BUILD="-f GNUmakefile.68k OS=os3"
- BUILD="-f GNUmakefile.os4 OS=os4"
# the build command to execute for each test
script:
- make -C library -j1 ${BUILD}

View File

@ -1,9 +1,7 @@
# clib2 An ISO 'C' (1994) compliant runtime library for AmigaOS
[![Build Status](https://travis-ci.org/adtools/clib2.svg?branch=master)](https://travis-ci.org/adtools/clib2)
[![Code Climate](https://codeclimate.com/github/adtools/clib2/badges/gpa.svg)](https://codeclimate.com/github/adtools/clib2)
[![Build](https://github.com/adtools/clib2/workflows/CI/badge.svg)](https://github.com/adtools/clib2/actions)
[![License](https://img.shields.io/badge/License-BSD%203--Clause-blue.svg)](https://opensource.org/licenses/BSD-3-Clause)
[![Github Issues](http://githubbadges.herokuapp.com/adtools/clib2/issues.svg)](https://github.com/adtools/clib2/issues)
## What is this?

View File

@ -449,6 +449,7 @@ C_LIB = \
time_numbertostring.o \
time_strftime.o \
time_time.o \
time_tzset.o \
time_weekday.o \
uio_readv.o \
uio_writev.o \

View File

@ -29,7 +29,11 @@ RANLIB := ppc-amigaos-ranlib
COPY := cp -p
DELETE := rm -rf
MAKEDIR := mkdir -p
LOG_COMMAND := 2>&1 | tee -a compiler.log
# Enabling the LOG_COMMAND has the consequence that a rule will not
# fail on an error because only the exit status from the tee command
# will be considered
#LOG_COMMAND := 2>&1 | tee -a compiler.log
LOG_COMMAND :=
# You may need to request a specific compiler version in order to
# build the baserel versions of the library. At this time of
# writing (2008-11-06) GCC 4.0.4 and below support the -mbaserel
@ -54,13 +58,13 @@ LOG_COMMAND := 2>&1 | tee -a compiler.log
WARNINGS := \
-Wall -W -Wpointer-arith -Wsign-compare -Wmissing-prototypes \
-Wundef -Wbad-function-cast -Wmissing-declarations -Wunused -Wwrite-strings \
-Wno-deprecated-declarations \
-Wundef -Wmissing-declarations -Wunused -Wwrite-strings \
-Wno-deprecated-declarations -Wno-unused-label \
# -Wconversion -Wshadow
# -Wconversion -Wshadow -Wbad-function-cast
INCLUDES := -Iinclude -I. -I$(SDK_INCLUDE)
OPTIONS := -DUSE_64_BIT_INTS -D__USE_INLINE__ -Wa,-mregnames -fno-common -std=gnu99 -mcrt=clib2
OPTIONS := -DUSE_64_BIT_INTS -D__USE_INLINE__ -Wa,-mregnames -fno-builtin -fno-common -std=c99 -nostdlib
OPTIMIZE := -DNDEBUG -O3
#DEBUG := -ggdb
@ -160,6 +164,10 @@ cvs-tag:
# General build rules for all object files and the individual libraries
lib/crtbegin.o : CFLAGS += -fno-aggressive-loop-optimizations
lib/crtbegin.o : crtbegin.c
@$(COMPILE)
lib/%.o : AFLAGS += $(LARGEDATA)
lib/%.o : %.S
@$(ASSEMBLE)
@ -171,6 +179,11 @@ lib/small-data/%.o : AFLAGS += $(SMALLDATA)
lib/small-data/%.o : %.S
@$(ASSEMBLE)
lib/small-data/crtbegin.o : CFLAGS += $(SMALLDATA) -fno-aggressive-loop-optimizations
lib/small-data/crtbegin.o : crtbegin.c
@$(COMPILE)
lib/small-data/%.o : CFLAGS += $(SMALLDATA)
lib/small-data/%.o : %.c
@$(COMPILE)
@ -178,6 +191,11 @@ lib/soft-float/%.o : AFLAGS += $(SOFTFLOAT)
lib/soft-float/%.o : %.S
@$(ASSEMBLE)
lib/soft-float/crtbegin.o : CFLAGS += $(SOFTFLOAT) -fno-aggressive-loop-optimizations
lib/soft-float/crtbegin.o : crtbegin.c
@$(COMPILE)
lib/soft-float/%.o : CFLAGS += $(SOFTFLOAT)
lib/soft-float/%.o : %.c
@$(COMPILE)
@ -185,6 +203,11 @@ lib/baserel/%.o : AFLAGS += $(BASEREL)
lib/baserel/%.o : %.S
@$(ASSEMBLE)
lib/baserel/crtbegin.o : CFLAGS += $(BASEREL) -fno-aggressive-loop-optimizations
lib/baserel/crtbegin.o : crtbegin.c
@$(COMPILE)
lib/baserel/%.o : CFLAGS += $(BASEREL)
lib/baserel/%.o : %.c
@$(COMPILE)
@ -192,6 +215,11 @@ lib.threadsafe/%.o : AFLAGS += $(LARGEDATA) $(THREADSAFE)
lib.threadsafe/%.o : %.S
@$(ASSEMBLE)
lib.threadsafe/crtbegin.o : CFLAGS += $(THREADSAFE) $(LARGEDATA) -fno-aggressive-loop-optimizations
lib.threadsafe/crtbegin.o : crtbegin.c
@$(COMPILE)
lib.threadsafe/%.o : CFLAGS += $(THREADSAFE) $(LARGEDATA)
lib.threadsafe/%.o : %.c
@$(COMPILE)
@ -199,6 +227,11 @@ lib.threadsafe/small-data/%.o : AFLAGS += $(SMALLDATA) $(THREADSAFE)
lib.threadsafe/small-data/%.o : %.S
@$(ASSEMBLE)
lib.threadsafe/small-data/crtbegin.o : CFLAGS += $(THREADSAFE) $(SMALLDATA) -fno-aggressive-loop-optimizations
lib.threadsafe/small-data/crtbegin.o : crtbegin.c
@$(COMPILE)
lib.threadsafe/small-data/%.o : CFLAGS += $(THREADSAFE) $(SMALLDATA)
lib.threadsafe/small-data/%.o : %.c
@$(COMPILE)
@ -206,6 +239,11 @@ lib.threadsafe/soft-float/%.o : AFLAGS += $(SOFTFLOAT) $(THREADSAFE)
lib.threadsafe/soft-float/%.o : %.S
@$(ASSEMBLE)
lib.threadsafe/soft-float/crtbegin.o : CFLAGS += $(THREADSAFE) $(SOFTFLOAT) -fno-aggressive-loop-optimizations
lib.threadsafe/soft-float/crtbegin.o : crtbegin.c
@$(COMPILE)
lib.threadsafe/soft-float/%.o : CFLAGS += $(THREADSAFE) $(SOFTFLOAT)
lib.threadsafe/soft-float/%.o : %.c
@$(COMPILE)
@ -213,6 +251,11 @@ lib.threadsafe/baserel/%.o : AFLAGS += $(BASEREL) $(THREADSAFE)
lib.threadsafe/baserel/%.o : %.S
@$(ASSEMBLE)
lib.threadsafe/baserel/crtbegin.o : CFLAGS += $(THREADSAFE) $(BASEREL) -fno-aggressive-loop-optimizations
lib.threadsafe/baserel/crtbegin.o : crtbegin.c
@$(COMPILE)
lib.threadsafe/baserel/%.o : CFLAGS += $(THREADSAFE) $(BASEREL)
lib.threadsafe/baserel/%.o : %.c
@$(COMPILE)
@ -231,7 +274,7 @@ $(CC) $(AFLAGS) -o $@ -c $< $(LOG_COMMAND)
endef
define MAKELIB
-$(MAKEDIR) $@
-$(MAKEDIR) $(@D)
$(DELETE) $@
echo "Making $@"
$(AR) $@ $^ $(LOG_COMMAND)

View File

@ -1,6 +1,6 @@
#define VERSION 1
#define REVISION 214
#define DATE "27.4.2017"
#define VERS "amiga.lib 1.214"
#define VSTRING "amiga.lib 1.214 (27.4.2017)\r\n"
#define VERSTAG "\0$VER: amiga.lib 1.214 (27.4.2017)"
#define REVISION 215
#define DATE "26.6.2017"
#define VERS "amiga.lib 1.215"
#define VSTRING "amiga.lib 1.215 (26.6.2017)\r\n"
#define VERSTAG "\0$VER: amiga.lib 1.215 (26.6.2017)"

View File

@ -1 +1 @@
214
215

View File

@ -1,6 +1,6 @@
#define VERSION 1
#define REVISION 214
#define DATE "27.4.2017"
#define VERS "c.lib 1.214"
#define VSTRING "c.lib 1.214 (27.4.2017)\r\n"
#define VERSTAG "\0$VER: c.lib 1.214 (27.4.2017)"
#define REVISION 215
#define DATE "26.6.2017"
#define VERS "c.lib 1.215"
#define VSTRING "c.lib 1.215 (26.6.2017)\r\n"
#define VERSTAG "\0$VER: c.lib 1.215 (26.6.2017)"

View File

@ -1 +1 @@
214
215

View File

@ -1,3 +1,20 @@
c.lib 1.216 (xxx)
- Add some wchar and multbyte-string related functions to allow gcc
building a libstdc++ library with wide char support. For now, the
functions are mostly stub ones only. They can be implemented on
demand.
c.lib 1.215 (26.6.2017)
- Added -fno-aggressive-loop-optimizations option when building crtbegin.c
to work around constructor/destructor hack with GCC 5.4.0 on AmigaOS 4.
- Added -fno-builtin option to fix conflicts with builtin memset()
with GCC 5.4.0 on AmigaOS 4.
c.lib 1.214 (27.4.2017)
- Added integer overflow test to calloc().

View File

@ -1,5 +1,5 @@
/*
* $Id: crtbegin.c,v 1.13 2010-08-21 11:37:03 obarthel Exp $
* crtbegin.c
*
* :ts=4
*
@ -48,7 +48,12 @@
* Dummy constructor and destructor array. The linker script will put these at the
* very beginning of section ".ctors" and ".dtors". crtend.o contains a similar entry
* with a NULL pointer entry and is put at the end of the sections. This way, the init
* code can find the global constructor/destructor pointers
* code can find the global constructor/destructor pointers.
*
* WARNING:
* This hack does not work correctly with GCC 5 and higher. The optimizer
* will see a one element array and act appropriately. The current workaround
* is to use -fno-aggressive-loop-optimizations when compiling this file.
*/
static void (*__CTOR_LIST__[1]) (void) __attribute__(( used, section(".ctors"), aligned(sizeof(void (*)(void))) ));
static void (*__DTOR_LIST__[1]) (void) __attribute__(( used, section(".dtors"), aligned(sizeof(void (*)(void))) ));

View File

@ -1,6 +1,6 @@
#define VERSION 1
#define REVISION 214
#define DATE "27.4.2017"
#define VERS "debug.lib 1.214"
#define VSTRING "debug.lib 1.214 (27.4.2017)\r\n"
#define VERSTAG "\0$VER: debug.lib 1.214 (27.4.2017)"
#define REVISION 215
#define DATE "26.6.2017"
#define VERS "debug.lib 1.215"
#define VSTRING "debug.lib 1.215 (26.6.2017)\r\n"
#define VERSTAG "\0$VER: debug.lib 1.215 (26.6.2017)"

View File

@ -1 +1 @@
214
215

View File

@ -125,7 +125,7 @@ CLIB_DESTRUCTOR(dirent_exit)
if(__directory_list.mlh_Head != NULL)
{
while(NOT IsListEmpty((struct List *)&__directory_list))
while(NOT IsMinListEmpty(&__directory_list))
closedir((DIR *)__directory_list.mlh_Head);
}

View File

@ -196,7 +196,7 @@ opendir(const char * path_name)
UnLockDosList(LDF_VOLUMES|LDF_READ);
/* Bail out if we cannot present anything. */
if(IsListEmpty((struct List *)&dh->dh_VolumeList))
if(IsMinListEmpty(&dh->dh_VolumeList))
{
__set_errno(ENOMEM);
goto out;

View File

@ -93,7 +93,7 @@ readdir(DIR * directory_pointer)
assert( (((ULONG)name) & 3) == 0 );
if(dh->dh_VolumeNode == NULL && NOT IsListEmpty((struct List *)&dh->dh_VolumeList))
if(dh->dh_VolumeNode == NULL && NOT IsMinListEmpty(&dh->dh_VolumeList))
dh->dh_VolumeNode = (struct Node *)dh->dh_VolumeList.mlh_Head;
strcpy(name,"\1:"); /* BSTR for ":" */

View File

@ -359,7 +359,7 @@ extern unsigned int (* __get_default_stack_size)(void);
/*
* This library falls back onto locale.library to perform string collation
* in strcoll(), character conversion in toupper() and various other
* functions. This may not your intention. To restrict the library to use
* functions. This may not be your intention. To restrict the library to use
* only the "C" language locale, declare the following variable in your
* code and set it to FALSE, so that it overrides the default settings.
* The variable value is checked during program startup and, if set to

View File

@ -166,6 +166,8 @@ extern int errno;
#define EILSEQ 85 /* Encoding error detected */
#define ENOTSUP 86 /* Not supported */
/****************************************************************************/
#ifdef __cplusplus

View File

@ -59,6 +59,10 @@ extern "C" {
/****************************************************************************/
typedef void *locale_t;
/****************************************************************************/
struct lconv
{
char * decimal_point; /* Decimal point character (non-monetary). */

View File

@ -61,7 +61,11 @@ extern "C" {
typedef int ptrdiff_t;
typedef unsigned int size_t;
/* wchar_t is a built-in type in C++ */
#ifndef __cplusplus
typedef unsigned short wchar_t;
#endif
/****************************************************************************/

View File

@ -47,6 +47,10 @@
#include <stddef.h>
#endif /* _STDDEF_H */
#ifndef _SYS_CLIB2_STDC_H
#include <sys/clib2_stdc.h>
#endif /* _SYS_CLIB2_STDC_H */
/****************************************************************************/
#ifdef __cplusplus
@ -447,6 +451,11 @@ extern lldiv_t lldiv(long long n,long long d);
/****************************************************************************/
extern int mbtowc(wchar_t *restrict pwc, const char *restrict s, size_t n);
extern int wctomb(char *s, wchar_t wchar);
/****************************************************************************/
#endif /* __GNUC__ || (__STDC_VERSION__ && __STDC_VERSION__ >= 199901L) */
/****************************************************************************/

View File

@ -62,6 +62,7 @@ extern int strcmp(const char *s1, const char * s2);
extern int strncmp(const char *s1, const char *s2, size_t n);
extern char *strcpy(char *dest, const char *src);
extern char *strncpy(char *dest, const char *src, size_t n);
extern size_t strnlen(const char *s, size_t maxlen);
extern size_t strlen(const char *s);
extern char *strchr(const char *s, int c);
extern char *strrchr(const char *s, int c);

View File

@ -0,0 +1,73 @@
/*
* $Id: $
*
* :ts=4
*
* Portable ISO 'C' (1994) runtime library for the Amiga computer
* Copyright (c) 2002-2017 by Olaf Barthel <obarthel (at) gmx.net>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Neither the name of Olaf Barthel nor the names of contributors
* may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*****************************************************************************
*
* Documentation and source code for this library, and the most recent library
* build are available from <https://github.com/adtools/clib2>.
*
*****************************************************************************
*/
#ifndef _SYS_PARAM_H
#define _SYS_PARAM_H
/****************************************************************************/
/* The following is not part of the ISO 'C' (1994) standard. */
/****************************************************************************/
#ifndef _UNISTD_H
#include <unistd.h>
#endif /* _UNISTD_H */
/****************************************************************************/
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
/****************************************************************************/
#define MIN(a,b) (((a)<(b))?(a):(b))
#define MAX(a,b) (((a)>(b))?(a):(b))
/****************************************************************************/
#ifdef __cplusplus
}
#endif /* __cplusplus */
/****************************************************************************/
#endif /* _SYS_MOUNT_H */

View File

@ -106,10 +106,24 @@ extern size_t strftime(char *s, size_t maxsize, const char *format,
/****************************************************************************/
/* Timespec declaration */
struct timespec
{
time_t tv_secs;
long tv_nsec;
};
#ifndef tv_sec
#define tv_sec tv_secs
#endif /* tv_sec */
/****************************************************************************/
extern char * asctime_r(const struct tm *tm,char * buffer);
extern char * ctime_r(const time_t *tptr,char * buffer);
extern struct tm * gmtime_r(const time_t *t,struct tm * tm_ptr);
extern struct tm * localtime_r(const time_t *t,struct tm * tm_ptr);
extern void tzset(void);
/****************************************************************************/

View File

@ -43,6 +43,10 @@
/****************************************************************************/
#ifndef _SYS_CLIB2_STDC_H
#include <sys/clib2_stdc.h>
#endif /* _SYS_CLIB2_STDC_H */
#ifndef _STDDEF_H
#include <stddef.h>
#endif /* _STDDEF_H */
@ -59,6 +63,14 @@
#include <time.h>
#endif /* _TIME_H */
#ifndef _LOCALE_H
#include <locale.h>
#endif /* _LOCALE_H */
#ifndef _STDINT_H
#include <stdint.h>
#endif
/****************************************************************************/
#ifdef __cplusplus
@ -68,8 +80,6 @@ extern "C" {
/****************************************************************************/
#define WEOF (-1)
#define WCHAR_MAX 65535
#define WCHAR_MIN 0
/****************************************************************************/
@ -81,7 +91,6 @@ typedef long mbstate_t;
extern wint_t btowc(int c);
extern int wctob(wint_t c);
extern int mbsinit(const mbstate_t *ps);
extern size_t mbrlen(wchar_t *pwc, const char * s, size_t n, mbstate_t *ps);
extern size_t wcrtomb(char *s, wchar_t wc, mbstate_t *ps);
extern size_t mbsrtowcs(wchar_t *pwcs, const char **src, size_t n, mbstate_t *ps);
extern size_t wcsrtombs(char *s, const wchar_t **src, size_t n, mbstate_t *ps);
@ -161,7 +170,7 @@ extern int swprintf(wchar_t *s, const wchar_t *format, ...);
extern int vfwprintf(FILE *stream,const wchar_t *format,va_list arg);
extern int vwprintf(const wchar_t *format,va_list arg);
extern int vswprintf(char *s, const wchar_t *format,va_list arg);
extern int vswprintf(wchar_t *s, size_t maxlen, const wchar_t *format, va_list arg);
/****************************************************************************/
@ -174,16 +183,24 @@ extern size_t wcsftime(wchar_t *s, size_t maxsize, const wchar_t *format, const
/****************************************************************************/
#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)
#if (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) || defined(__cplusplus)
extern size_t mbrlen(const char *restrict s, size_t n, mbstate_t *restrict ps);
extern size_t mbrtowc(wchar_t *restrict pwc, const char *restrict s, size_t n, mbstate_t *restrict ps);
extern int mbsinit(const mbstate_t *ps);
extern size_t mbsnrtowcs(wchar_t *restrict dst, const char **restrict src, size_t nmc, size_t len, mbstate_t *restrict ps);
extern size_t mbsrtowcs(wchar_t *restrict dst, const char **restrict src, size_t len, mbstate_t *restrict ps);
extern size_t wcrtomb(char *restrict s, wchar_t wc, mbstate_t *restrict ps);
extern int wcscoll(const wchar_t *ws1, const wchar_t *ws2);
extern int wcscoll_l(const wchar_t *ws1, const wchar_t *ws2, locale_t loc);
extern size_t wcscspn(const wchar_t *s, const wchar_t *c);
extern size_t wcsnrtombs(char *restrict dst, const wchar_t **restrict src, size_t nwc, size_t len, mbstate_t *restrict ps);
extern wchar_t * wcsrchr(const wchar_t *ws, wchar_t wc);
extern size_t wcsrtombs(char *restrict dst, const wchar_t **restrict src, size_t len, mbstate_t *restrict ps);
extern long long wcstoll(const wchar_t *str, wchar_t **ptr, int base);
extern unsigned long long wcstoull(const wchar_t *str, wchar_t **ptr, int base);
extern size_t mbrtowc_l(wchar_t *restrict pwc, const char *restrict s, size_t n, mbstate_t *restrict ps, locale_t loc);
extern int wcscoll_l(const wchar_t *ws1, const wchar_t *ws2, locale_t loc);
extern size_t wcscspn(const wchar_t *ws1, const wchar_t *ws2);
extern wchar_t * wcsrchr(const wchar_t *ws, wchar_t wc);
#endif /* __STDC_VERSION__ && __STDC_VERSION__ >= 199901L */
/****************************************************************************/

View File

@ -234,6 +234,7 @@ C_LIB := \
stdlib_main_stub.o \
stdlib_malloc.o \
stdlib_math.o \
stdlib_mbtowc.o \
stdlib_mkdtemp.o \
stdlib_mkstemp.o \
stdlib_mktemp.o \
@ -310,6 +311,7 @@ C_LIB := \
string_strncat.o \
string_strncmp.o \
string_strncpy.o \
string_strnlen.o \
string_strpbrk.o \
string_strrchr.o \
string_strspn.o \
@ -336,6 +338,7 @@ C_LIB := \
time_numbertostring.o \
time_strftime.o \
time_time.o \
time_tzset.o \
time_weekday.o \
uio_readv.o \
uio_writev.o \
@ -372,7 +375,79 @@ C_LIB := \
unistd_unlink.o \
unistd_usleep.o \
utime_utime.o \
utsname_uname.o
utsname_uname.o \
wchar_btowc.o \
wchar_fgetwc.o \
wchar_fgetws.o \
wchar_fputwc.o \
wchar_fputws.o \
wchar_fwide.o \
wchar_fwprintf.o \
wchar_fwscanf.o \
wchar_getwc.o \
wchar_getwchar.o \
wchar_mbrlen.o \
wchar_mbrtowc.o \
wchar_mbsinit.o \
wchar_mbsrtowcs.o \
wchar_putwc.o \
wchar_putwchar.o \
wchar_swprintf.o \
wchar_swscanf.o \
wchar_ungetwc.o \
wchar_vfwprintf.o \
wchar_vswprintf.o \
wchar_vwprintf.o \
wchar_wcrtomb.o \
wchar_wcscat.o \
wchar_wcschr.o \
wchar_wcscmp.o \
wchar_wcscoll.o \
wchar_wcscpy.o \
wchar_wcscspn.o \
wchar_wcsftime.o \
wchar_wcslen.o \
wchar_wcsncat.o \
wchar_wcsncmp.o \
wchar_wcsncpy.o \
wchar_wscoll.o \
wchar_wcspbrk.o \
wchar_wcsrtombs.o \
wchar_wcsspn.o \
wchar_wcstod.o \
wchar_wcstok.o \
wchar_wcstol.o \
wchar_wcstoll.o \
wchar_wcstoul.o \
wchar_wcstoull.o \
wchar_wcsxfrm.o \
wchar_wctob.o \
wchar_wmemchr.o \
wchar_wmemcmp.o \
wchar_wmemcpy.o \
wchar_wmemmove.o \
wchar_wmemset.o \
wchar_wprintf.o \
wchar_wscanf.o \
wchar_wscoll.o \
wctype_iswalnum.o \
wctype_iswalpha.o \
wctype_iswblank.o \
wctype_iswcntrl.o \
wctype_iswctype.o \
wctype_iswdigit.o \
wctype_iswgraph.o \
wctype_iswlower.o \
wctype_iswprint.o \
wctype_iswpunc.o \
wctype_iswspace.o \
wctype_iswupper.o \
wctype_iswxdigit.o \
wctype_towctrans.o \
wctype_towlower.o \
wctype_towupper.o \
wctype_wctrans.o \
wctype_wctype.o
##############################################################################

View File

@ -1,6 +1,6 @@
#define VERSION 1
#define REVISION 214
#define DATE "27.4.2017"
#define VERS "m.lib 1.214"
#define VSTRING "m.lib 1.214 (27.4.2017)\r\n"
#define VERSTAG "\0$VER: m.lib 1.214 (27.4.2017)"
#define REVISION 215
#define DATE "26.6.2017"
#define VERS "m.lib 1.215"
#define VSTRING "m.lib 1.215 (26.6.2017)\r\n"
#define VERSTAG "\0$VER: m.lib 1.215 (26.6.2017)"

View File

@ -1 +1 @@
214
215

View File

@ -93,6 +93,13 @@
/****************************************************************************/
#ifndef IsMinListEmpty
#define IsMinListEmpty(ml) \
((struct MinList *)((ml)->mlh_TailPred) == (struct MinList *)(ml))
#endif
/****************************************************************************/
#ifndef AMIGA_COMPILER_H
#ifdef __SASC

View File

@ -1,6 +1,6 @@
#define VERSION 1
#define REVISION 214
#define DATE "27.4.2017"
#define VERS "net.lib 1.214"
#define VSTRING "net.lib 1.214 (27.4.2017)\r\n"
#define VERSTAG "\0$VER: net.lib 1.214 (27.4.2017)"
#define REVISION 215
#define DATE "26.6.2017"
#define VERS "net.lib 1.215"
#define VSTRING "net.lib 1.215 (26.6.2017)\r\n"
#define VERSTAG "\0$VER: net.lib 1.215 (26.6.2017)"

View File

@ -1 +1 @@
214
215

View File

@ -136,7 +136,7 @@ profil(unsigned short *buffer, size_t bufSize, size_t offset, unsigned int scale
ProfileData.CounterStart = GetCounterStart();
/* Set interrupt vector */
CounterInt.is_Code = (void (*)())CounterIntFn;
CounterInt.is_Code = (void (*)(void))CounterIntFn;
CounterInt.is_Data = &ProfileData;
IPM->SetInterruptVector(1, &CounterInt);

View File

@ -327,7 +327,7 @@ remove_locked_region_node(struct FileLockSemaphore * fls,struct fd * fd,LONG sta
/* Check if there are any locked regions left.
* If not, mark the entire file as unlocked.
*/
if(IsListEmpty((struct List *)&which_lock->fln_LockedRegionList))
if(IsMinListEmpty(&which_lock->fln_LockedRegionList))
{
SHOWMSG("no more regions are locked; removing the file lock node");
@ -705,7 +705,7 @@ cleanup_locked_records(struct fd * fd)
}
}
if(IsListEmpty((struct List *)&which_lock->fln_LockedRegionList))
if(IsMinListEmpty(&which_lock->fln_LockedRegionList))
{
SHOWMSG("no more regions are locked; removing the file lock node");

View File

@ -94,7 +94,7 @@ alloca_cleanup(const char * file,int line)
NewList((struct List *)&alloca_memory_list);
/* Is this worth cleaning up? */
if(NOT IsListEmpty((struct List *)&alloca_memory_list))
if(NOT IsMinListEmpty(&alloca_memory_list))
{
struct MemoryContextNode * mcn_prev;
struct MemoryContextNode * mcn;
@ -120,7 +120,7 @@ alloca_cleanup(const char * file,int line)
/* Drop the cleanup callback if there's nothing to be cleaned
up any more. */
if(IsListEmpty((struct List *)&alloca_memory_list))
if(IsMinListEmpty(&alloca_memory_list))
__alloca_cleanup = NULL;
}

View File

@ -59,13 +59,25 @@ __calloc(size_t num_elements,size_t element_size,const char * file,int line)
}
#endif /* __MEM_DEBUG */
/* This might overflow. */
total_size = num_elements * element_size;
result = __malloc(total_size,file,line);
if(result != NULL)
memset(result,0,total_size);
/* No arithmetic overflow? */
if(total_size >= num_elements)
{
result = __malloc(total_size,file,line);
if(result != NULL)
memset(result,0,total_size);
else
SHOWMSG("memory allocation failure");
}
/* Multiplying the number and size of elements overflows
* the size_t range.
*/
else
SHOWMSG("memory allocation failure");
{
D(("calloc(num_elements=%ld, element_size=%ld) overflow"));
}
return(result);
}

View File

@ -75,14 +75,15 @@ struct MinList NOCOMMON __memory_list;
/****************************************************************************/
void *
__allocate_memory(size_t size,BOOL never_free,const char * UNUSED debug_file_name,int UNUSED debug_line_number)
__allocate_memory(size_t size,BOOL never_free,const char *debug_file_name UNUSED,int debug_line_number UNUSED)
{
struct MemoryNode * mn;
size_t allocation_size;
void * result = NULL;
size_t original_size;
#if defined(UNIX_PATH_SEMANTICS)
size_t original_size;
{
original_size = size;
@ -417,7 +418,7 @@ STDLIB_DESTRUCTOR(stdlib_memory_exit)
if(__memory_list.mlh_Head != NULL)
{
while(NOT IsListEmpty((struct List *)&__memory_list))
while(NOT IsMinListEmpty(&__memory_list))
{
((struct MemoryNode *)__memory_list.mlh_Head)->mn_AlreadyFree = FALSE;
@ -453,12 +454,12 @@ STDLIB_DESTRUCTOR(stdlib_memory_exit)
{
#ifdef __MEM_DEBUG
{
while(NOT IsListEmpty((struct List *)&__memory_list))
while(NOT IsMinListEmpty(&__memory_list))
__free_memory_node((struct MemoryNode *)__memory_list.mlh_Head,__FILE__,__LINE__);
}
#else
{
while(NOT IsListEmpty((struct List *)&__memory_list))
while(NOT IsMinListEmpty(&__memory_list))
__free_memory_node((struct MemoryNode *)__memory_list.mlh_Head,NULL,0);
}
#endif /* __MEM_DEBUG */
@ -478,12 +479,12 @@ STDLIB_DESTRUCTOR(stdlib_memory_exit)
{
#ifdef __MEM_DEBUG
{
while(NOT IsListEmpty((struct List *)&__memory_list))
while(NOT IsMinListEmpty(&__memory_list))
__free_memory_node((struct MemoryNode *)__memory_list.mlh_Head,__FILE__,__LINE__);
}
#else
{
while(NOT IsListEmpty((struct List *)&__memory_list))
while(NOT IsMinListEmpty(&__memory_list))
__free_memory_node((struct MemoryNode *)__memory_list.mlh_Head,NULL,0);
}
#endif /* __MEM_DEBUG */

View File

@ -37,9 +37,13 @@
/****************************************************************************/
#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)
int
mbtowc(wchar_t *pwc, const char *s, size_t n)
mbtowc(wchar_t *restrict pwc, const char *restrict s, size_t n)
{
/* ZZZ unimplemented */
return(-1);
errno = EILSEQ;
return -1;
}
#endif

View File

@ -41,7 +41,7 @@
/****************************************************************************/
static const char * error_table[EILSEQ - EPERM + 1] =
static const char * error_table[ENOTSUP - EPERM + 1] =
{
"Operation not permitted",
"No such file or directory",
@ -127,7 +127,8 @@ static const char * error_table[EILSEQ - EPERM + 1] =
"Identifier removed",
"No message of the desired type.",
"Value too large to be stored in data type.",
"Encoding error detected"
"Encoding error detected",
"Not supported"
};
/****************************************************************************/
@ -139,7 +140,7 @@ strerror_r(int number,char * buffer,size_t buffer_size)
const char * str;
size_t len;
if(number < EPERM || number > EILSEQ)
if(number < EPERM || number > ENOTSUP)
{
__set_errno(EINVAL);
goto out;

75
library/string_strnlen.c Normal file
View File

@ -0,0 +1,75 @@
/*
* $Id: string_strlen.c,v 1.4 2006-01-08 12:04:27 obarthel Exp $
*
* :ts=4
*
* Portable ISO 'C' (1994) runtime library for the Amiga computer
* Copyright (c) 2002-2015 by Olaf Barthel <obarthel (at) gmx.net>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Neither the name of Olaf Barthel nor the names of contributors
* may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef _STDLIB_NULL_POINTER_CHECK_H
#include "stdlib_null_pointer_check.h"
#endif /* _STDLIB_NULL_POINTER_CHECK_H */
/****************************************************************************/
#ifndef _STRING_HEADERS_H
#include "string_headers.h"
#endif /* _STRING_HEADERS_H */
/****************************************************************************/
size_t
strnlen(const char *s, size_t maxlen)
{
const char * start = s;
size_t result = 0;
assert( s != NULL );
#if defined(CHECK_FOR_NULL_POINTERS)
{
if(s == NULL)
{
__set_errno(EFAULT);
goto out;
}
}
#endif /* CHECK_FOR_NULL_POINTERS */
while((maxlen != 0) && ((*s) != '\0'))
{
s++;
maxlen--;
}
result = (size_t)(s - start);
out:
return(result);
}

View File

@ -1,5 +1,5 @@
/*
* $Id: time_mktime.c,v 1.10 2006-01-08 12:04:27 obarthel Exp $
* $Id: time_mktime.c,v 1.11 2015-06-26 11:22:00 obarthel Exp $
*
* :ts=4
*
@ -52,9 +52,10 @@ mktime(struct tm *tm)
{
DECLARE_UTILITYBASE();
struct ClockData clock_data;
ULONG seconds, delta;
ULONG seconds;
time_t result = (time_t)-1;
int max_month_days;
LONG combined_seconds;
int month, year;
ENTER();
@ -73,116 +74,63 @@ mktime(struct tm *tm)
}
#endif /* CHECK_FOR_NULL_POINTERS */
/* The month must be valid. */
if(tm->tm_mon < 0 || tm->tm_mon > 11)
/* Normalize the year and month. */
year = tm->tm_year + 1900;
month = tm->tm_mon + 1;
if(month < 0 || month > 12)
{
SHOWVALUE(tm->tm_mon);
SHOWMSG("invalid month");
goto out;
int y;
y = month / 12;
month -= y * 12;
year += y;
}
/* The day of the month must be valid. */
if(tm->tm_mday < 1 || tm->tm_mday > 31)
if(month < 1)
{
SHOWVALUE(tm->tm_mday);
SHOWMSG("invalid day of month");
goto out;
month += 12;
year -= 1;
}
/* The year must be valid. */
if(tm->tm_year < 78)
/* The year must be valid. Amiga time begins with January 1st, 1978. */
if(year < 1978)
{
SHOWVALUE(tm->tm_year);
SHOWVALUE(year);
SHOWMSG("invalid year");
goto out;
}
/* Is this the month of February? */
if(tm->tm_mon == 1)
{
int year;
/* We need to have the full year number for the
leap year calculation below. */
year = tm->tm_year + 1900;
/* Now for the famous leap year calculation rules... In
the given year, how many days are there in the month
of February? */
if((year % 4) != 0)
max_month_days = 28;
else if ((year % 400) == 0)
max_month_days = 29;
else if ((year % 100) == 0)
max_month_days = 28;
else
max_month_days = 29;
}
else
{
static const char days_per_month[12] =
{
31, 0,31,
30,31,30,
31,31,30,
31,30,31
};
max_month_days = days_per_month[tm->tm_mon];
}
/* The day of the month must be valid. */
if(tm->tm_mday < 0 || tm->tm_mday > max_month_days)
{
SHOWVALUE(tm->tm_mday);
SHOWMSG("invalid day of month");
goto out;
}
/* The hour must be valid. */
if(tm->tm_hour < 0 || tm->tm_hour > 23)
{
SHOWVALUE(tm->tm_hour);
SHOWMSG("invalid hour");
goto out;
}
/* The minute must be valid. */
if(tm->tm_min < 0 || tm->tm_min > 59)
{
SHOWVALUE(tm->tm_min);
SHOWMSG("invalid minute");
goto out;
}
/* Note: the number of seconds can be larger than 59
in order to account for leap seconds. */
if(tm->tm_sec < 0 || tm->tm_sec > 60)
{
SHOWVALUE(tm->tm_sec);
SHOWMSG("invalid seconds");
goto out;
}
clock_data.sec = (tm->tm_sec > 59) ? 59 : tm->tm_sec;
clock_data.min = tm->tm_min;
clock_data.hour = tm->tm_hour;
clock_data.mday = tm->tm_mday;
clock_data.month = tm->tm_mon + 1;
clock_data.year = tm->tm_year + 1900;
seconds = Date2Amiga(&clock_data) + (tm->tm_sec - 59);
/* The AmigaOS "epoch" starts with January 1st, 1978, which was
a Sunday. */
tm->tm_wday = (seconds / (24 * 60 * 60)) % 7;
/* Convert the first day of the month in the given year
into the corresponding number of seconds. */
memset(&clock_data, 0, sizeof(clock_data));
clock_data.mday = 1;
clock_data.month = 1;
clock_data.month = month;
clock_data.year = year;
delta = Date2Amiga(&clock_data);
seconds = Date2Amiga(&clock_data);
tm->tm_yday = (seconds - delta) / (24 * 60 * 60);
/* Put the combined number of seconds involved together,
covering the seconds/minutes/hours of the day as well
as the number of days of the month. This will be added
to the number of seconds for the date. */
combined_seconds = tm->tm_sec + 60 * (tm->tm_min + 60 * (tm->tm_hour + 24 * (tm->tm_mday-1)));
/* If the combined number of seconds is negative, adding it
* to the number of seconds for the date should not produce
* a negative value.
*/
if(combined_seconds < 0 && seconds < (ULONG)(-combined_seconds))
{
SHOWVALUE(seconds);
SHOWVALUE(combined_seconds);
SHOWMSG("invalid combined number of seconds");
goto out;
}
seconds += combined_seconds;
__locale_lock();
@ -193,10 +141,13 @@ mktime(struct tm *tm)
__locale_unlock();
/* Finally, adjust for the difference between the Unix and the
/* Adjust for the difference between the Unix and the
AmigaOS epochs, which differ by 8 years. */
result = seconds + UNIX_TIME_OFFSET;
/* Finally, normalize the provided time and date information. */
localtime_r(&result, tm);
out:
RETURN(result);

48
library/time_tzset.c Normal file
View File

@ -0,0 +1,48 @@
/*
* $Id: $
*
* :ts=4
*
* Portable ISO 'C' (1994) runtime library for the Amiga computer
* Copyright (c) 2002-2017 by Olaf Barthel <obarthel (at) gmx.net>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Neither the name of Olaf Barthel nor the names of contributors
* may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef _TIME_HEADERS_H
#include "time_headers.h"
#endif /* _TIME_HEADERS_H */
#ifndef _LOCALE_HEADERS_H
#include "locale_headers.h"
#endif /* _LOCALE_HEADERS_H */
/****************************************************************************/
void
tzset(void)
{
/* For now, do nothing. */
}

View File

@ -69,7 +69,7 @@ CLIB_DESTRUCTOR(unistd_exit)
PROFILE_OFF();
if(__unlink_list.mlh_Head != NULL && NOT IsListEmpty((struct List *)&__unlink_list))
if(__unlink_list.mlh_Head != NULL && NOT IsMinListEmpty(&__unlink_list))
{
struct UnlinkNode * uln;
BPTR old_dir;

View File

@ -1,5 +1,5 @@
/*
* $Id: unistd_translateu2a.c,v 1.12 2010-08-20 15:33:36 obarthel Exp $
* $Id: unistd_translateu2a.c,v 1.13 2015-06-26 11:22:00 obarthel Exp $
*
* :ts=4
*
@ -477,7 +477,10 @@ __translate_unix_to_amiga_path_name(char const ** name_ptr,struct name_translati
for(i = j = 0 ; i < len ; i++)
{
if(i < len - 3 && name[i] == '/' && name[i + 1] == '.' && name[i + 2] == '.' && name[i + 3] == '/')
i += 2;
{
replace[j++] = '/';
i += 3;
}
replace[j++] = name[i];
}

View File

@ -1,6 +1,6 @@
#define VERSION 1
#define REVISION 214
#define DATE "27.4.2017"
#define VERS "unix.lib 1.214"
#define VSTRING "unix.lib 1.214 (27.4.2017)\r\n"
#define VERSTAG "\0$VER: unix.lib 1.214 (27.4.2017)"
#define REVISION 215
#define DATE "26.6.2017"
#define VERS "unix.lib 1.215"
#define VSTRING "unix.lib 1.215 (26.6.2017)\r\n"
#define VERSTAG "\0$VER: unix.lib 1.215 (26.6.2017)"

View File

@ -1 +1 @@
214
215

View File

@ -37,9 +37,12 @@
/****************************************************************************/
#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)
size_t
mbrlen(wchar_t *pwc, const char * s, size_t n, mbstate_t *ps)
mbrlen(const char *restrict s, size_t n, mbstate_t *restrict ps)
{
/* ZZZ unimplemented */
return(0);
}
#endif /* __STDC_VERSION__ && __STDC_VERSION__ >= 199901L */

64
library/wchar_mbrtowc.c Normal file
View File

@ -0,0 +1,64 @@
/*
* $Id: wchar_mbrlen.c,v 1.3 2006-01-08 12:04:27 obarthel Exp $
*
* :ts=4
*
* Portable ISO 'C' (1994) runtime library for the Amiga computer
* Copyright (c) 2002-2015 by Olaf Barthel <obarthel (at) gmx.net>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Neither the name of Olaf Barthel nor the names of contributors
* may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef _WCHAR_HEADERS_H
#include "wchar_headers.h"
#endif /* _WCHAR_HEADERS_H */
/****************************************************************************/
/* Mostly non-working stub based on bionic */
#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)
size_t
mbrtowc(wchar_t *restrict pwc, const char *restrict s, size_t n, mbstate_t *restrict ps)
{
if (s == NULL)
{
s = "";
pwc = NULL;
}
if (n == 0)
{
if (pwc)
*pwc = 0;
return 0;
}
if (pwc)
*pwc = *s;
return (*s != 0);
}
#endif /* __STDC_VERSION__ && __STDC_VERSION__ >= 199901L */

View File

@ -40,6 +40,5 @@
int
mbsinit(const mbstate_t *ps)
{
/* ZZZ unimplemented */
return(0);
return !ps || !*(unsigned *)ps;
}

View File

@ -38,7 +38,7 @@
/****************************************************************************/
int
vswprintf(char *s, const wchar_t *format,va_list arg)
vswprintf(wchar_t *s, size_t maxlen, const wchar_t *format, va_list arg)
{
/* ZZZ unimplemented */
return(0);

View File

@ -35,11 +35,13 @@
#include "wchar_headers.h"
#endif /* _WCHAR_HEADERS_H */
/* Implementation based on musl */
/****************************************************************************/
wchar_t *
wcscat(wchar_t *dest, const wchar_t *src)
{
/* ZZZ unimplemented */
return(NULL);
wcscpy(dest + wcslen(dest), src);
return dest;
}

View File

@ -37,9 +37,12 @@
/****************************************************************************/
/* Implementation based on musl */
wchar_t *
wcschr(const wchar_t *s, wchar_t c)
{
/* ZZZ unimplemented */
return(NULL);
if (!c) return (wchar_t *)s + wcslen(s);
for (; *s && *s != c; s++);
return *s ? (wchar_t *)s : 0;
}

View File

@ -40,6 +40,6 @@
int
wcscmp(const wchar_t *s1, const wchar_t * s2)
{
/* ZZZ unimplemented */
return(0);
for (; *s1==*s2 && *s1 && *s2; s1++, s2++);
return *s1 - *s2;
}

45
library/wchar_wcscoll.c Normal file
View File

@ -0,0 +1,45 @@
/*
* $Id: wchar_wscoll.c,v 1.3 2006-01-08 12:04:27 obarthel Exp $
*
* :ts=4
*
* Portable ISO 'C' (1994) runtime library for the Amiga computer
* Copyright (c) 2002-2015 by Olaf Barthel <obarthel (at) gmx.net>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Neither the name of Olaf Barthel nor the names of contributors
* may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef _WCHAR_HEADERS_H
#include "wchar_headers.h"
#endif /* _WCHAR_HEADERS_H */
/****************************************************************************/
int
wcscoll(const wchar_t *ws1, const wchar_t *ws2)
{
/* ZZZ unimplemented */
return(0);
}

View File

@ -40,6 +40,7 @@
wchar_t *
wcscpy(wchar_t *dest, const wchar_t *src)
{
/* ZZZ unimplemented */
return(NULL);
wchar_t *a = dest;
while ((*dest++ = *src++));
return a;
}

50
library/wchar_wcscspn.c Normal file
View File

@ -0,0 +1,50 @@
/*
* $Id: wchar_wcsspn.c,v 1.3 2006-01-08 12:04:27 obarthel Exp $
*
* :ts=4
*
* Portable ISO 'C' (1994) runtime library for the Amiga computer
* Copyright (c) 2002-2015 by Olaf Barthel <obarthel (at) gmx.net>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Neither the name of Olaf Barthel nor the names of contributors
* may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef _WCHAR_HEADERS_H
#include "wchar_headers.h"
#endif /* _WCHAR_HEADERS_H */
/****************************************************************************/
/* Implementation based on musl */
size_t
wcscspn(const wchar_t *s, const wchar_t *c)
{
const wchar_t *a;
if (!c[0]) return wcslen(s);
if (!c[1]) return (s=wcschr(a=s, *c)) ? (size_t)(s-a) : wcslen(a);
for (a=s; *s && !wcschr(c, *s); s++);
return s-a;
}

View File

@ -37,9 +37,12 @@
/****************************************************************************/
/* Implementation based on musl */
size_t
wcslen(const wchar_t *s)
{
/* ZZZ unimplemented */
return(0);
const wchar_t *a;
for (a=s; *s; s++);
return s-a;
}

View File

@ -37,9 +37,14 @@
/****************************************************************************/
/* Implementation based on musl */
wchar_t *
wcsncat(wchar_t *dest, const wchar_t *src, size_t n)
{
/* ZZZ unimplemented */
return(NULL);
wchar_t *a = dest;
dest += wcslen(dest);
while (n && *src) n--, *dest++ = *src++;
*dest++ = 0;
return a;
}

View File

@ -37,9 +37,11 @@
/****************************************************************************/
/* Implementation based on musl */
int
wcsncmp(const wchar_t *s1, const wchar_t *s2, size_t n)
{
/* ZZZ unimplemented */
return(0);
for (; n && *s1==*s2 && *s1 && *s2; n--, s1++, s2++);
return n ? *s1 - *s2 : 0;
}

View File

@ -37,9 +37,13 @@
/****************************************************************************/
/* Implementation based on musl */
wchar_t *
wcsncpy(wchar_t *dest, const wchar_t *src, size_t n)
{
/* ZZZ unimplemented */
return(NULL);
wchar_t *a = dest;
while (n && *src) n--, *dest++ = *src++;
wmemset(dest, 0, n);
return a;
}

View File

@ -37,7 +37,7 @@
/****************************************************************************/
wchar_t
wchar_t *
wcspbrk(const wchar_t *s, const wchar_t *set)
{
/* ZZZ unimplemented */

45
library/wchar_wctob.c Normal file
View File

@ -0,0 +1,45 @@
/*
* $Id: wchar_wmemchr.c,v 1.3 2006-01-08 12:04:27 obarthel Exp $
*
* :ts=4
*
* Portable ISO 'C' (1994) runtime library for the Amiga computer
* Copyright (c) 2002-2015 by Olaf Barthel <obarthel (at) gmx.net>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Neither the name of Olaf Barthel nor the names of contributors
* may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef _WCHAR_HEADERS_H
#include "wchar_headers.h"
#endif /* _WCHAR_HEADERS_H */
/****************************************************************************/
int
wctob(wint_t c)
{
if (c < 128U) return c;
return EOF;
}

View File

@ -37,9 +37,11 @@
/****************************************************************************/
/* Implementation based on musl */
wchar_t *
wmemchr(const wchar_t *ptr, wchar_t val, size_t len)
{
/* ZZZ unimplemented */
return(NULL);
for (; len && *ptr != val; len--, ptr++);
return len ? (wchar_t *)ptr : 0;
}

View File

@ -37,9 +37,11 @@
/****************************************************************************/
/* Implementation based on musl */
int
wmemcmp(const wchar_t *ptr1, const wchar_t *ptr2, size_t len)
{
/* ZZZ unimplemented */
return(0);
for (; len && *ptr1==*ptr2; len--, ptr1++, ptr2++);
return len ? *ptr1-*ptr2 : 0;
}

View File

@ -37,9 +37,12 @@
/****************************************************************************/
/* Implementation based on musl */
wchar_t *
wmemcpy(wchar_t *dest, const wchar_t *src, size_t len)
{
/* ZZZ unimplemented */
return(NULL);
wchar_t *a = dest;
while (len--) *dest++ = *src++;
return a;
}

View File

@ -37,9 +37,15 @@
/****************************************************************************/
/* Implementation based on musl */
wchar_t *
wmemmove(wchar_t *dest, const wchar_t * src, size_t len)
{
/* ZZZ unimplemented */
return(NULL);
wchar_t *d0 = dest;
if ((size_t)(dest-src) < len)
while (len--) dest[len] = src[len];
else
while (len--) *dest++ = *src++;
return d0;
}

View File

@ -37,9 +37,12 @@
/****************************************************************************/
/* Implementation based on musl */
wchar_t *
wmemset(wchar_t *ptr, int val, size_t len)
{
/* ZZZ unimplemented */
return(NULL);
wchar_t *ret = ptr;
while (len--) *ptr++ = val;
return ret;
}

View File

@ -37,9 +37,10 @@
/****************************************************************************/
/* Implementation based on musl */
int
iswalnum(wint_t c)
{
/* ZZZ unimplemented */
return(0);
return iswdigit(c) || iswalpha(c);
}

View File

@ -35,11 +35,12 @@
#include <wctype.h>
#endif /* _WCTYPE_HEADERS_H */
#include <ctype.h>
/****************************************************************************/
int
iswalpha(wint_t c)
{
/* ZZZ unimplemented */
return(0);
return isalpha(c);
}

View File

@ -35,11 +35,14 @@
#include <wctype.h>
#endif /* _WCTYPE_HEADERS_H */
#include <ctype.h>
/****************************************************************************/
/* Implementation based on musl */
int
iswblank(wint_t c)
{
/* ZZZ unimplemented */
return(0);
return isblank(c);
}

View File

@ -35,11 +35,12 @@
#include <wctype.h>
#endif /* _WCTYPE_HEADERS_H */
#include <ctype.h>
/****************************************************************************/
int
iswcntrl(wint_t c)
{
/* ZZZ unimplemented */
return(0);
return iscntrl(c);
}

View File

@ -35,11 +35,12 @@
#include <wctype.h>
#endif /* _WCTYPE_HEADERS_H */
#include <ctype.h>
/****************************************************************************/
int
iswdigit(wint_t c)
{
/* ZZZ unimplemented */
return(0);
return isdigit(c);
}

View File

@ -35,11 +35,12 @@
#include <wctype.h>
#endif /* _WCTYPE_HEADERS_H */
#include <ctype.h>
/****************************************************************************/
int
iswgraph(wint_t c)
{
/* ZZZ unimplemented */
return(0);
return isgraph(c);
}

View File

@ -35,11 +35,12 @@
#include <wctype.h>
#endif /* _WCTYPE_HEADERS_H */
#include <ctype.h>
/****************************************************************************/
int
iswlower(wint_t c)
{
/* ZZZ unimplemented */
return(0);
return islower(c);
}

View File

@ -35,11 +35,12 @@
#include <wctype.h>
#endif /* _WCTYPE_HEADERS_H */
#include <ctype.h>
/****************************************************************************/
int
iswpunc(wint_t c)
iswpunct(wint_t c)
{
/* ZZZ unimplemented */
return(0);
return ispunct(c);
}

View File

@ -35,11 +35,12 @@
#include <wctype.h>
#endif /* _WCTYPE_HEADERS_H */
#include <ctype.h>
/****************************************************************************/
int
iswspace(wint_t c)
{
/* ZZZ unimplemented */
return(0);
return isspace(c);
}

View File

@ -35,11 +35,12 @@
#include <wctype.h>
#endif /* _WCTYPE_HEADERS_H */
#include <ctype.h>
/****************************************************************************/
int
iswupper(wint_t c)
{
/* ZZZ unimplemented */
return(0);
return isupper(c);
}

View File

@ -35,11 +35,12 @@
#include <wctype.h>
#endif /* _WCTYPE_HEADERS_H */
#include <ctype.h>
/****************************************************************************/
int
iswxdigit(wint_t c)
{
/* ZZZ unimplemented */
return(0);
return isxdigit(c);
}