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

69 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
1b2c798467 Fixed calloc() and getopt_long()
Added integer overflow test to calloc().

Tiny change in getopt_long() so that the value pointed to by the "longindex" parameter is always initialized to an invalid index position (that being -1), instead of 0. The value of 0 can break some shell commands, most notably GNU wget.
2017-05-01 18:06:23 +02:00
053a61fc4b Create LICENSE 2016-12-05 14:41:06 +01:00
4c54ee3f2d Version bump 2016-12-04 11:14:17 +01:00
f491e38b38 Added code to temporarily disable profiling 2016-12-04 11:14:00 +01:00
734ce4c1a9 Added code to temporarily disable profiling 2016-12-04 11:13:37 +01:00
ce345df9da Hide warnings for deprecated functions 2016-12-04 11:13:00 +01:00
5e0fa78d61 Only builds with GCC now 2016-12-04 11:12:42 +01:00
bc3e19abe5 Only uses MEMF_PRIVATE on OS4 now 2016-12-04 11:12:32 +01:00
29e02775fb Cleaned up the build rules, added missing files 2016-12-04 11:11:53 +01:00
5cb27db203 Slab allocator is exercised much more 2016-12-04 11:11:28 +01:00
4fc1b13945 Added a rogue malloc/free pair 2016-12-04 11:11:05 +01:00
8beaabac4f Removed unused local variable 2016-12-04 11:10:46 +01:00
271572ed56 Fixed so that it builds correctly with SAS/C again 2016-12-04 11:10:33 +01:00
e0feef8932 Moved __CXV54 into sas_cxv.asm
sas_cxv54.asm is no longer needed.
2016-12-04 11:10:13 +01:00
07259ed7eb This is needed when building with math=ieee option 2016-12-04 11:09:24 +01:00
3203fcf96a Removed unused result variable 2016-12-04 11:08:54 +01:00
bfba44bf83 Rewritten to use setjmp()/longjmp()
Also contains new code which prints the number of times a slab was reused.
2016-12-04 11:08:41 +01:00
35434bdedc Updated to build correctly with SAS/C again 2016-12-04 11:07:40 +01:00
17ba18c731 Added code which temporarily disables profiling 2016-12-04 11:06:50 +01:00
78a8c7655e Added __decay_unused_slabs() 2016-12-04 11:05:50 +01:00
184a127860 Added stdlib_decay_unused_slabs() 2016-12-04 11:05:30 +01:00
103 changed files with 2547 additions and 1356 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}

29
LICENSE Normal file
View File

@ -0,0 +1,29 @@
BSD 3-Clause License
Copyright (c) 2016, Olaf Barthel
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.
* Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
* Neither the name of the copyright holder nor the names of its
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 HOLDER 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.

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

@ -327,6 +327,7 @@ C_LIB = \
stdlib_exit.o \
stdlib_free.o \
stdlib_free_unused_slabs.o \
stdlib_decay_unused_slabs.o \
stdlib_getdefstacksize.o \
stdlib_getenv.o \
stdlib_getmemstats.o \
@ -448,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 \
@ -1142,6 +1144,8 @@ $(LIBC_OBJS)/stdlib_get_slab_stats.o : stdlib_get_slab_stats.c stdlib_memory.h i
$(LIBC_OBJS)/stdlib_free_unused_slabs.o : stdlib_free_unused_slabs.c stdlib_memory.h include/stdlib.h
$(LIBC_OBJS)/stdlib_decay_unused_slabs.o : stdlib_decay_unused_slabs.c stdlib_memory.h include/stdlib.h
$(LIBC_OBJS)/stdlib_get_slab_usage.o : stdlib_get_slab_usage.c stdlib_memory.h include/stdlib.h
$(LIBC_OBJS)/stdlib_get_slab_allocations.o : stdlib_get_slab_allocations.c stdlib_memory.h include/stdlib.h

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,12 +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
-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
@ -159,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)
@ -170,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)
@ -177,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)
@ -184,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)
@ -191,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)
@ -198,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)
@ -205,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)
@ -212,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)
@ -230,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 212
#define DATE "27.11.2016"
#define VERS "amiga.lib 1.212"
#define VSTRING "amiga.lib 1.212 (27.11.2016)\r\n"
#define VERSTAG "\0$VER: amiga.lib 1.212 (27.11.2016)"
#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 @@
212
215

View File

@ -79,6 +79,8 @@ DoTimer(struct timeval *tv,LONG unit,LONG command)
struct MsgPort * mp;
LONG error;
PROFILE_OFF();
assert( tv != NULL );
#if defined(__amigaos4__)
@ -129,14 +131,10 @@ DoTimer(struct timeval *tv,LONG unit,LONG command)
tr->tr_time.tv_secs = tv->tv_secs;
tr->tr_time.tv_micro = tv->tv_micro;
PROFILE_OFF();
SetSignal(0,(1UL << mp->mp_SigBit));
error = DoIO((struct IORequest *)tr);
PROFILE_ON();
tv->tv_secs = tr->tr_time.tv_secs;
tv->tv_micro = tr->tr_time.tv_micro;
@ -161,5 +159,7 @@ DoTimer(struct timeval *tv,LONG unit,LONG command)
}
#endif /* __amigaos4__ */
PROFILE_ON();
return(error);
}

View File

@ -262,9 +262,8 @@ STATIC VOID
_SetValue(struct Environment * env,struct NexxStr * value,struct Node * symbol_table_node)
{
STATIC CONST UWORD code[] = { 0x4EAE,0xFFAC,0x4E75 }; /* jsr -84(a6) ; rts */
struct Node * result;
result = (struct Node *)EmulateTags(code,
EmulateTags(code,
ET_RegisterA0,env,
ET_RegisterA1,value,
ET_RegisterD0,symbol_table_node,

View File

@ -1,6 +1,6 @@
#define VERSION 1
#define REVISION 212
#define DATE "27.11.2016"
#define VERS "c.lib 1.212"
#define VSTRING "c.lib 1.212 (27.11.2016)\r\n"
#define VERSTAG "\0$VER: c.lib 1.212 (27.11.2016)"
#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 @@
212
215

View File

@ -1,3 +1,64 @@
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().
- Tiny change in getopt_long() so that the value pointed to by longindex
is always initialized to an invalid index position (that being -1),
instead of 0. The value of 0 can break some shell commands, most notably
GNU wget.
c.lib 1.213 (4.12.2016)
- Added the __decay_unused_slabs() function which brings all currently
empty slabs which are still protected from reuse closer to getting
reused or released.
- The slab-test program now exercises the memory allocation functions
to a greater degree. Memory is allocated in random chunk sizes,
the allocations are resized (to other random chunk sizes),
33% of all allocations are randomly freed, empty slabs readied for
reuse then discarded. The output in JSON format now shows a bit
more information as to what is being done.
- Rewrote __get_slab_stats() to use setjmp() and longjmp() in the
print() callback invocation.
- __get_slab_stats() now reports how many times a slab was reused
after having stuck around in the "empty slab" list.
- Changing the slab size through an environment variable is now
a feature of the debug build.
- Small changes to allow the library to be built with SAS/C again.
This includes adding code to disable/re-enable profiling,
fixing "stdlib_profile.h" and updating the smakefiles.
- Still not sure what it does, but _CXV45 now sits along with _CX25
and _CX35 in "sas_cxv.asm". "sas_cxv54.asm" is not needed any
more.
- Found the last use of MEMF_PRIVATE which should have been compiled
only for the OS4 version.
c.lib 1.212 (27.11.2016)
- Unused slabs which get recycled are no longer reinitialized from

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 212
#define DATE "27.11.2016"
#define VERS "debug.lib 1.212"
#define VSTRING "debug.lib 1.212 (27.11.2016)\r\n"
#define VERSTAG "\0$VER: debug.lib 1.212 (27.11.2016)"
#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 @@
212
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

@ -296,7 +296,7 @@ static int getopt_long_internal(int argc, const char **argv, const char *optstri
optp = strchr(optstring, c);
/* We never find a long option in a compound option */
*longindex = 0;
*longindex = -1;
/* Check if it's legal */
if (c == ':' || (optp == NULL))

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
@ -201,6 +205,21 @@ extern void __free_unused_slabs(void);
/****************************************************************************/
/*
* You can accelerate the reuse of currently unused slabs by calling
* the __decay_unused_slabs() function. Each call decrements the decay
* counter until it reaches 0, at which point an unused slab can be
* reused instead of allocating a new slab. Also, at 0 unused slabs
* will be freed by the allocator.
*
* Please note that this function works within the context of the memory
* allocation system and is not safe to call from interrupt code. It may
* break a Forbid() or Disable() condition.
*/
extern void __decay_unused_slabs(void);
/****************************************************************************/
/*
* You can obtain runtime statistics about the slab allocator by
* invoking the __get_slab_usage() function which in turn invokes
@ -432,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

@ -212,6 +212,7 @@ C_LIB := \
stdlib_dosbase.o \
stdlib_exit.o \
stdlib_free.o \
stdlib_decay_unused_slabs.o \
stdlib_free_unused_slabs.o \
stdlib_getdefstacksize.o \
stdlib_getenv.o \
@ -233,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 \
@ -309,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 \
@ -335,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 \
@ -371,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 212
#define DATE "27.11.2016"
#define VERS "m.lib 1.212"
#define VSTRING "m.lib 1.212 (27.11.2016)\r\n"
#define VERSTAG "\0$VER: m.lib 1.212 (27.11.2016)"
#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 @@
212
215

View File

@ -1,6 +1,6 @@
#define VERSION 1
#define REVISION 212
#define DATE "27.11.2016"
#define VERS "m881.lib 1.212"
#define VSTRING "m881.lib 1.212 (27.11.2016)\r\n"
#define VERSTAG "\0$VER: m881.lib 1.212 (27.11.2016)"
#define REVISION 214
#define DATE "27.4.2017"
#define VERS "m881.lib 1.214"
#define VSTRING "m881.lib 1.214 (27.4.2017)\r\n"
#define VERSTAG "\0$VER: m881.lib 1.214 (27.4.2017)"

View File

@ -1 +1 @@
212
214

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 212
#define DATE "27.11.2016"
#define VERS "net.lib 1.212"
#define VSTRING "net.lib 1.212 (27.11.2016)\r\n"
#define VERSTAG "\0$VER: net.lib 1.212 (27.11.2016)"
#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 @@
212
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

@ -37,6 +37,7 @@
xdef __CXV25
xdef __CXV35
xdef __CXV45
xdef __CXNRM5
xdef __CXTAB5
@ -74,6 +75,43 @@ L44: MOVE.W D0,D1
MOVEM.L (SP)+,D2-D5/A1
RTS
__CXV45:
MOVE.L D0,D1
SWAP D1
AND.W #$7FFF,D1
CMP.W #$80,D1
BLT .1
CMP.W #$7F80,D1
BGE .3
ASR.L #3,D0
AND.L #$8FFFFFFF,D0
ADD.L #$38000000,D0
SWAP D1
AND.L #7,D1
ROR.L #3,D1
.2 RTS
.1 TST.L D1
BEQ.S .2
MOVEM.L D2-D5,-(SP)
SWAP D0
MOVE.W D0,D4
AND.W #$8000,D4
MOVE.W #$39D0,D5
MOVEQ #0,D0
SWAP D1
JSR __CXNRM5(PC)
MOVEM.L (SP)+,D2-D5
RTS
.3 ASR.L #3,D0
OR.L #$7FF00000,D0
SWAP D1
AND.L #7,D1
ROR.L #3,D1
RTS
__CXNRM5:
CMP.L #$20,D0

106
library/sas_cxv52.asm Normal file
View File

@ -0,0 +1,106 @@
*
* :ts=8
*
* Adapted from reassembled SAS/C runtime library code.
*
* 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.
*
xdef __CXV52
xdef __CXV53
xref __CXFERR
section text,code
__CXV52:
MOVEM.L D2/D3,-(SP)
MOVEQ #-1,D3
MOVE.L D0,D2
BPL.W lab04A
CMPI.L #$BFF00000,D0
BCS.W lab07A
MOVEM.L D0/D1/A0/A1,-(SP)
PEA (2).L
JSR __CXFERR
ADDQ.W #4,SP
MOVEM.L (SP)+,D0/D1/A0/A1
BRA.W lab07A
__CXV53:
MOVEM.L D2/D3,-(SP)
MOVE.L #$7FFFFFFF,D3
MOVE.L D0,D2
BPL.W lab04A
ADDQ.L #1,D3
EOR.L D3,D0
lab04A: SWAP D0
MOVE.W D0,D2
ANDI.W #$7FF0,D2
EOR.W D2,D0
SUBI.W #$3FF0,D2
BLT.W lab07A
EORI.W #$10,D0
SWAP D0
ASR.W #4,D2
SUBI.W #$14,D2
BGT.W lab09A
NEG.W D2
LSR.L D2,D0
TST.L D2
BMI.W lab0B2
BRA.W lab0B4
lab07A: MOVEQ #0,D0
BRA.W lab0B4
lab080: MOVEM.L D0/D1/A0/A1,-(SP)
PEA (2).L
JSR __CXFERR
ADDQ.W #4,SP
MOVEM.L (SP)+,D0/D1/A0/A1
MOVE.L D3,D0
BRA.W lab0B4
lab09A: CMPI.W #11,D2
BGT.B lab080
EOR.L D1,D0
ROL.L D2,D0
LSL.L D2,D1
EOR.L D1,D0
CMP.L D3,D0
BHI.B lab080
TST.L D2
BPL.W lab0B4
lab0B2: NEG.L D0
lab0B4: MOVEM.L (SP)+,D2/D3
RTS
end

View File

@ -1,6 +1,4 @@
*
* $Id: sas_cxv54.asm,v 1.1.1.1 2004-07-26 16:31:04 obarthel Exp $
*
* :ts=8
*
* Adapted from reassembled SAS/C runtime library code.
@ -38,7 +36,8 @@
xdef __CXV54
xref __CXFERR
__CXV54
__CXV54:
MOVEM.L A0/A1,-(SP)
MOVE.L D4,A0
SWAP D0
@ -47,11 +46,11 @@ __CXV54
EOR.W D4,D0
SUB.W #$3800,D0
CMP.W #$10,D0
BLT lbC000098
BLT lab098
CMP.W #$FEF,D0
BLT lbC000102
BLT lab102
CMP.W #$47F0,D0
BLT lbC000058
BLT lab058
SWAP D0
LSL.L #3,D0
ROL.L #3,D1
@ -59,17 +58,16 @@ __CXV54
EOR.L D1,D0
SWAP D0
OR.W #$7F80,D0
BRA lbC000112
BRA lab112
lbC000058
CMP.W #$FF0,D0
BGE lbC000074
lab058: CMP.W #$FF0,D0
BGE lab074
CMP.L #$FFFF0FEF,D0
BNE lbC000102
BNE lab102
CMP.L #$F0000000,D1
BCS lbC000102
lbC000074
MOVEM.L D0/D1/A0/A1,-(SP)
BCS lab102
lab074: MOVEM.L D0/D1/A0/A1,-(SP)
PEA 2.L
JSR __CXFERR
ADDQ.W #4,SP
@ -78,63 +76,56 @@ lbC000074
EOR.W D4,D0
SWAP D0
MOVEQ #0,D1
BRA lbC000116
BRA lab116
lbC000098
CMP.W #$FE90,D0
BGE lbC0000C4
lab098: CMP.W #$FE90,D0
BGE lab0C4
ADD.W #$3800,D0
OR.L D1,D0
BEQ lbC000112
BEQ lab112
MOVEM.L D0/D1/A0/A1,-(SP)
PEA 1.L
JSR __CXFERR
ADDQ.W #4,SP
MOVEM.L (SP)+,D0/D1/A0/A1
MOVEQ #0,D0
BRA lbC000112
BRA lab112
lbC0000C4
MOVE.L D5,A1
lab0C4: MOVE.L D5,A1
MOVE.W D0,D5
AND.W #15,D0
EOR.W #$10,D0
SWAP D0
ASR.W #4,D5
ADDQ.W #2,D5
BGE lbC0000E6
BGE lab0E6
NEG.W D5
LSR.L D5,D0
MOVEQ #0,D5
ADDX.L D5,D0
BRA lbC0000F6
BRA lab0F6
lbC0000E6
CLR.W D1
lab0E6: CLR.W D1
LSL.L D5,D0
ADDQ.W #1,D5
ROXL.L D5,D1
AND.L #15,D1
ADDX.L D1,D0
lbC0000F6
MOVE.L A1,D5
lab0F6: MOVE.L A1,D5
SWAP D0
EOR.W D4,D0
SWAP D0
BRA lbC000116
BRA lab116
lbC000102
SWAP D0
lab102: SWAP D0
LSL.L #3,D0
ROXL.L #4,D1
AND.L #7,D1
ADDX.L D1,D0
SWAP D0
lbC000112
EOR.W D4,D0
lab112: EOR.W D4,D0
SWAP D0
lbC000116
MOVE.L A0,D4
lab116: MOVE.L A0,D4
MOVEM.L (SP)+,A0/A1
RTS

File diff suppressed because it is too large Load Diff

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

@ -0,0 +1,75 @@
/*
* :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_HEADERS_H
#include "stdlib_headers.h"
#endif /* _STDLIB_HEADERS_H */
/****************************************************************************/
#ifndef _STDLIB_MEMORY_H
#include "stdlib_memory.h"
#endif /* _STDLIB_MEMORY_H */
/****************************************************************************/
/* Look at all currently unused slabs, decrementing the decay
* counter which prevents them from being reused.
*/
void
__decay_unused_slabs(void)
{
if(__slab_data.sd_InUse)
{
struct MinNode * free_node;
struct MinNode * free_node_next;
struct SlabNode * sn;
__memory_lock();
for(free_node = (struct MinNode *)__slab_data.sd_EmptySlabs.mlh_Head ;
free_node->mln_Succ != NULL ;
free_node = free_node_next)
{
free_node_next = (struct MinNode *)free_node->mln_Succ;
/* free_node points to SlabNode.sn_EmptyLink, which
* directly follows the SlabNode.sn_MinNode.
*/
sn = (struct SlabNode *)&free_node[-1];
if(sn->sn_EmptyDecay > 0)
sn->sn_EmptyDecay--;
}
__memory_unlock();
}
}

View File

@ -374,44 +374,57 @@ remove_and_free_memory_node(struct MemoryNode * mn)
#if defined(__USE_SLAB_ALLOCATOR)
{
/* Are we using the slab allocator? */
if (__slab_data.sd_InUse)
if(__slab_data.sd_InUse)
{
__slab_free(mn,allocation_size);
}
else if (__memory_pool != NULL)
{
FreePooled(__memory_pool,mn,allocation_size);
}
else
{
#if defined(__MEM_DEBUG)
if(__memory_pool != NULL)
{
FreeMem(mn,allocation_size);
PROFILE_OFF();
FreePooled(__memory_pool,mn,allocation_size);
PROFILE_ON();
}
#else
else
{
struct MinNode * mln = (struct MinNode *)mn;
#if defined(__MEM_DEBUG)
{
PROFILE_OFF();
FreeMem(mn,allocation_size);
PROFILE_ON();
}
#else
{
struct MinNode * mln = (struct MinNode *)mn;
mln--;
mln--;
Remove((struct Node *)mln);
Remove((struct Node *)mln);
FreeMem(mln,sizeof(*mln) + allocation_size);
PROFILE_OFF();
FreeMem(mln,sizeof(*mln) + allocation_size);
PROFILE_ON();
}
#endif /* __MEM_DEBUG */
}
#endif /* __MEM_DEBUG */
}
}
#else
{
if (__memory_pool != NULL)
if(__memory_pool != NULL)
{
PROFILE_OFF();
FreePooled(__memory_pool,mn,allocation_size);
PROFILE_ON();
}
else
{
#if defined(__MEM_DEBUG)
{
PROFILE_OFF();
FreeMem(mn,allocation_size);
PROFILE_ON();
}
#else
{
@ -421,7 +434,9 @@ remove_and_free_memory_node(struct MemoryNode * mn)
Remove((struct Node *)mln);
PROFILE_OFF();
FreeMem(mln,sizeof(*mln) + allocation_size);
PROFILE_ON();
}
#endif /* __MEM_DEBUG */
}

View File

@ -72,7 +72,9 @@ __free_unused_slabs(void)
/* Unlink from list of slabs of the same size. */
Remove((struct Node *)sn);
PROFILE_OFF();
FreeVec(sn);
PROFILE_ON();
}
__memory_unlock();

View File

@ -41,9 +41,13 @@
/****************************************************************************/
#include <setjmp.h>
/****************************************************************************/
struct context
{
int status;
jmp_buf abort_buf;
void * user_data;
__slab_status_callback callback;
char * buffer;
@ -54,23 +58,21 @@ struct context
static void print(struct context * ct, const char * format, ...)
{
if(ct->status == 0)
{
va_list args;
int len;
va_list args;
int len;
va_start(args,format);
len = vsnprintf(ct->buffer, ct->buffer_size, format, args);
va_end(args);
va_start(args,format);
len = vsnprintf(ct->buffer, ct->buffer_size, format, args);
va_end(args);
/* This shouldn't happen: the buffer ought to be large enough
* to hold every single line.
*/
if(len >= (int)ct->buffer_size)
len = strlen(ct->buffer);
/* This shouldn't happen: the buffer ought to be large enough
* to hold every single line.
*/
if(len >= (int)ct->buffer_size)
len = strlen(ct->buffer);
ct->status = (*ct->callback)(ct->user_data, ct->buffer, len);
}
if((*ct->callback)(ct->user_data, ct->buffer, len) != 0)
longjmp(ct->abort_buf,-1);
}
/****************************************************************************/
@ -83,11 +85,11 @@ __get_slab_stats(void * user_data, __slab_status_callback callback)
static int times_checked = 1;
const struct SlabNode * sn;
size_t num_empty_slabs = 0;
size_t num_full_slabs = 0;
size_t num_slabs = 0;
size_t slab_allocation_size = 0;
size_t total_slab_allocation_size = 0;
volatile size_t num_empty_slabs = 0;
volatile size_t num_full_slabs = 0;
volatile size_t num_slabs = 0;
volatile size_t slab_allocation_size = 0;
volatile size_t total_slab_allocation_size = 0;
struct context ct;
char line[1024];
char time_buffer[40];
@ -104,96 +106,100 @@ __get_slab_stats(void * user_data, __slab_status_callback callback)
__memory_lock();
now = time(NULL);
localtime_r(&now, &when);
strftime(time_buffer, sizeof(time_buffer), "%Y-%m-%dT%H:%M:%S", &when);
print(&ct,"{\n");
print(&ct,"\t\"when\": \"%s\",\n", time_buffer);
print(&ct,"\t\"times_checked\": %d,\n", times_checked++);
print(&ct,"\t\"slab_size\": %zu,\n", __slab_data.sd_StandardSlabSize);
print(&ct,"\t\"num_single_allocations\": %zu,\n", __slab_data.sd_NumSingleAllocations);
print(&ct,"\t\"total_single_allocation_size\": %zu,\n", __slab_data.sd_TotalSingleAllocationSize);
if(__slab_data.sd_SingleAllocations.mlh_Head->mln_Succ != NULL)
if(setjmp(ct.abort_buf) == 0)
{
const struct SlabSingleAllocation * ssa;
now = time(NULL);
localtime_r(&now, &when);
print(&ct,"\t\"single_allocations\": [\n");
strftime(time_buffer, sizeof(time_buffer), "%Y-%m-%dT%H:%M:%S", &when);
for(ssa = (struct SlabSingleAllocation *)__slab_data.sd_SingleAllocations.mlh_Head ;
ssa->ssa_MinNode.mln_Succ != NULL && ct.status == 0 ;
ssa = (struct SlabSingleAllocation *)ssa->ssa_MinNode.mln_Succ)
print(&ct,"{\n");
print(&ct,"\t\"when\": \"%s\",\n", time_buffer);
print(&ct,"\t\"times_checked\": %d,\n", times_checked++);
print(&ct,"\t\"slab_size\": %zu,\n", __slab_data.sd_StandardSlabSize);
print(&ct,"\t\"num_single_allocations\": %zu,\n", __slab_data.sd_NumSingleAllocations);
print(&ct,"\t\"total_single_allocation_size\": %zu,\n", __slab_data.sd_TotalSingleAllocationSize);
if(__slab_data.sd_SingleAllocations.mlh_Head->mln_Succ != NULL)
{
print(&ct,"\t\t{ \"size\": %lu, \"total_size\": %lu }%s\n",
ssa->ssa_Size - sizeof(*ssa), ssa->ssa_Size,
ssa->ssa_MinNode.mln_Succ->mln_Succ != NULL ? "," : "");
const struct SlabSingleAllocation * ssa;
print(&ct,"\t\"single_allocations\": [\n");
for(ssa = (struct SlabSingleAllocation *)__slab_data.sd_SingleAllocations.mlh_Head ;
ssa->ssa_MinNode.mln_Succ != NULL ;
ssa = (struct SlabSingleAllocation *)ssa->ssa_MinNode.mln_Succ)
{
print(&ct,"\t\t{ \"size\": %lu, \"total_size\": %lu }%s\n",
ssa->ssa_Size - sizeof(*ssa), ssa->ssa_Size,
ssa->ssa_MinNode.mln_Succ->mln_Succ != NULL ? "," : "");
}
print(&ct,"\t],\n");
}
else
{
print(&ct,"\t\"single_allocations\": [],\n");
}
print(&ct,"\t],\n");
}
else
{
print(&ct,"\t\"single_allocations\": [],\n");
}
for(i = 0 ; i < (int)NUM_ENTRIES(__slab_data.sd_Slabs) ; i++)
{
for(sn = (struct SlabNode *)__slab_data.sd_Slabs[i].mlh_Head ;
sn->sn_MinNode.mln_Succ != NULL ;
sn = (struct SlabNode *)sn->sn_MinNode.mln_Succ)
{
if (sn->sn_UseCount == 0)
num_empty_slabs++;
else if (sn->sn_UseCount == sn->sn_Count)
num_full_slabs++;
num_slabs++;
slab_allocation_size += sn->sn_ChunkSize * sn->sn_UseCount;
total_slab_allocation_size += sizeof(*sn) + __slab_data.sd_StandardSlabSize;
}
}
print(&ct,"\t\"num_slabs\": %zu,\n", num_slabs);
print(&ct,"\t\"num_empty_slabs\": %zu,\n", num_empty_slabs);
print(&ct,"\t\"num_full_slabs\": %zu,\n", num_full_slabs);
print(&ct,"\t\"slab_allocation_size\": %zu,\n", slab_allocation_size);
print(&ct,"\t\"total_slab_allocation_size\": %zu,\n", total_slab_allocation_size);
if(num_slabs > 0)
{
const char * eol = "";
print(&ct,"\t\"slabs\": [\n");
for(i = 0 ; i < (int)NUM_ENTRIES(__slab_data.sd_Slabs) && ct.status == 0 ; i++)
for(i = 0 ; i < (int)NUM_ENTRIES(__slab_data.sd_Slabs) ; i++)
{
for(sn = (struct SlabNode *)__slab_data.sd_Slabs[i].mlh_Head ;
sn->sn_MinNode.mln_Succ != NULL && ct.status == 0 ;
sn->sn_MinNode.mln_Succ != NULL ;
sn = (struct SlabNode *)sn->sn_MinNode.mln_Succ)
{
print(&ct,"%s\t\t{ \"size\": %lu, \"chunks\": %lu, \"chunks_in_use\": %lu, \"times_reused\": %lu }",
eol,
sn->sn_ChunkSize,
sn->sn_Count,
sn->sn_UseCount,
sn->sn_NumReused);
if (sn->sn_UseCount == 0)
num_empty_slabs++;
else if (sn->sn_UseCount == sn->sn_Count)
num_full_slabs++;
eol = ",\n";
num_slabs++;
slab_allocation_size += sn->sn_ChunkSize * sn->sn_UseCount;
total_slab_allocation_size += sizeof(*sn) + __slab_data.sd_StandardSlabSize;
}
}
print(&ct,"\n\t]\n");
}
else
{
print(&ct,"\t\"slabs\": []\n");
}
print(&ct,"\t\"num_slabs\": %zu,\n", num_slabs);
print(&ct,"\t\"num_empty_slabs\": %zu,\n", num_empty_slabs);
print(&ct,"\t\"num_full_slabs\": %zu,\n", num_full_slabs);
print(&ct,"\t\"slab_allocation_size\": %zu,\n", slab_allocation_size);
print(&ct,"\t\"total_slab_allocation_size\": %zu,\n", total_slab_allocation_size);
print(&ct,"}\n");
if(num_slabs > 0)
{
const char * eol = "";
print(&ct,"\t\"slabs\": [\n");
for(i = 0 ; i < (int)NUM_ENTRIES(__slab_data.sd_Slabs) ; i++)
{
for(sn = (struct SlabNode *)__slab_data.sd_Slabs[i].mlh_Head ;
sn->sn_MinNode.mln_Succ != NULL ;
sn = (struct SlabNode *)sn->sn_MinNode.mln_Succ)
{
print(&ct,"%s\t\t{ \"size\": %lu, \"chunks\": %lu, \"chunks_in_use\": %lu, \"times_reused\": %lu, \"empty_decay\": %lu }",
eol,
sn->sn_ChunkSize,
sn->sn_Count,
sn->sn_UseCount,
sn->sn_NumReused,
sn->sn_EmptyDecay);
eol = ",\n";
}
}
print(&ct,"\n\t]\n");
}
else
{
print(&ct,"\t\"slabs\": []\n");
}
print(&ct,"}\n");
}
__memory_unlock();
}

View File

@ -37,6 +37,10 @@
/****************************************************************************/
#if defined(__GNUC__) || (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L))
/****************************************************************************/
lldiv_t
lldiv(long long n,long long d)
{
@ -49,3 +53,7 @@ lldiv(long long n,long long d)
return(result);
}
/****************************************************************************/
#endif

View File

@ -117,9 +117,20 @@ call_main(void)
struct Process * this_process = (struct Process *)FindTask(NULL);
UBYTE * arg_str = GetArgStr();
size_t arg_str_len = strlen(arg_str);
UBYTE * arg_str_copy = AllocVec(arg_str_len+1,MEMF_PRIVATE);
UBYTE * arg_str_copy;
UBYTE current_dir_name[256];
#if defined(__amigaos4__)
{
arg_str_copy = AllocVec(arg_str_len+1,MEMF_PRIVATE);
}
#else
{
arg_str_copy = AllocVec(arg_str_len+1,MEMF_ANY);
}
#endif /* __amigaos4__ */
if(arg_str_copy != NULL && NameFromLock(this_process->pr_CurrentDir,current_dir_name,sizeof(current_dir_name)))
{
strcpy(arg_str_copy,arg_str);

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;
@ -147,56 +148,73 @@ __allocate_memory(size_t size,BOOL never_free,const char * UNUSED debug_file_nam
#if defined(__USE_SLAB_ALLOCATOR)
{
/* Are we using the slab allocator? */
if (__slab_data.sd_InUse)
if(__slab_data.sd_InUse)
{
mn = __slab_allocate(allocation_size);
}
else if (__memory_pool != NULL)
{
mn = AllocPooled(__memory_pool,allocation_size);
}
else
{
#ifdef __MEM_DEBUG
if (__memory_pool != NULL)
{
mn = AllocMem(allocation_size,MEMF_ANY);
PROFILE_OFF();
mn = AllocPooled(__memory_pool,allocation_size);
PROFILE_ON();
}
#else
else
{
struct MinNode * mln;
mln = AllocMem(sizeof(*mln) + allocation_size,MEMF_ANY);
if(mln != NULL)
#ifdef __MEM_DEBUG
{
AddTail((struct List *)&__memory_list,(struct Node *)mln);
mn = (struct MemoryNode *)&mln[1];
PROFILE_OFF();
mn = AllocMem(allocation_size,MEMF_ANY);
PROFILE_ON();
}
else
#else
{
mn = NULL;
struct MinNode * mln;
PROFILE_OFF();
mln = AllocMem(sizeof(*mln) + allocation_size,MEMF_ANY);
PROFILE_ON();
if(mln != NULL)
{
AddTail((struct List *)&__memory_list,(struct Node *)mln);
mn = (struct MemoryNode *)&mln[1];
}
else
{
mn = NULL;
}
}
#endif /* __MEM_DEBUG */
}
#endif /* __MEM_DEBUG */
}
}
#else
{
if(__memory_pool != NULL)
{
PROFILE_OFF();
mn = AllocPooled(__memory_pool,allocation_size);
PROFILE_ON();
}
else
{
#ifdef __MEM_DEBUG
{
PROFILE_OFF();
mn = AllocMem(allocation_size,MEMF_ANY);
PROFILE_ON();
}
#else
{
struct MinNode * mln;
PROFILE_OFF();
mln = AllocMem(sizeof(*mln) + allocation_size,MEMF_ANY);
PROFILE_ON();
if(mln != NULL)
{
AddTail((struct List *)&__memory_list,(struct Node *)mln);
@ -355,8 +373,12 @@ static struct SignalSemaphore * memory_semaphore;
void
__memory_lock(void)
{
PROFILE_OFF();
if(memory_semaphore != NULL)
ObtainSemaphore(memory_semaphore);
PROFILE_ON();
}
/****************************************************************************/
@ -364,8 +386,12 @@ __memory_lock(void)
void
__memory_unlock(void)
{
PROFILE_OFF();
if(memory_semaphore != NULL)
ReleaseSemaphore(memory_semaphore);
PROFILE_ON();
}
/****************************************************************************/
@ -392,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;
@ -428,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 */
@ -453,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 */
@ -503,7 +529,7 @@ STDLIB_CONSTRUCTOR(stdlib_memory_init)
#if defined(__USE_SLAB_ALLOCATOR)
{
/* ZZZ this is just for the purpose of testing */
#if 1
#if DEBUG
{
TEXT slab_size_var[20];

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

@ -45,8 +45,8 @@
/****************************************************************************/
extern void ASM _PROLOG(REG(a0,char *));
extern void ASM _EPILOG(REG(a0,char *));
extern void __asm _PROLOG(register __a0 char *);
extern void __asm _EPILOG(register __a0 char *);
#if _PROFILE
#define PROFILE_OFF() _PROLOG(0L)

View File

@ -85,6 +85,8 @@ __slab_allocate(size_t allocation_size)
/* No integer overflow? */
if(allocation_size < total_single_allocation_size)
{
PROFILE_OFF();
#if defined(__amigaos4__)
{
ssa = AllocMem(total_single_allocation_size,MEMF_PRIVATE);
@ -94,6 +96,8 @@ __slab_allocate(size_t allocation_size)
ssa = AllocMem(total_single_allocation_size,MEMF_ANY);
}
#endif /* __amigaos4__ */
PROFILE_ON();
}
/* Integer overflow has occured. */
else
@ -203,6 +207,9 @@ __slab_allocate(size_t allocation_size)
/* Pull it out of the list of slabs available for reuse. */
Remove((struct Node *)&sn->sn_EmptyLink);
sn->sn_EmptyDecay = 0;
sn->sn_NumReused++;
}
sn->sn_UseCount++;
@ -272,6 +279,8 @@ __slab_allocate(size_t allocation_size)
D(("reusing a slab"));
sn->sn_NumReused++;
new_sn = sn;
break;
}
@ -284,6 +293,8 @@ __slab_allocate(size_t allocation_size)
{
D(("no slab is available for reuse; allocating a new slab (%lu bytes)",sizeof(*new_sn) + __slab_data.sd_StandardSlabSize));
PROFILE_OFF();
#if defined(__amigaos4__)
{
new_sn = (struct SlabNode *)AllocVec(sizeof(*new_sn) + __slab_data.sd_StandardSlabSize,MEMF_PRIVATE);
@ -294,6 +305,8 @@ __slab_allocate(size_t allocation_size)
}
#endif /* __amigaos4__ */
PROFILE_ON();
if(new_sn == NULL)
D(("slab allocation failed"));
@ -354,8 +367,6 @@ __slab_allocate(size_t allocation_size)
/* This slab was reused and need not be reinitialized from scratch. */
else
{
new_sn->sn_NumReused++;
assert( new_sn->sn_FreeList.mlh_Head != NULL );
assert( new_sn->sn_ChunkSize == chunk_size );
assert( new_sn->sn_Count == 0 );
@ -409,7 +420,9 @@ __slab_allocate(size_t allocation_size)
/* Unlink from list of slabs of the same size. */
Remove((struct Node *)sn);
PROFILE_OFF();
FreeVec(sn);
PROFILE_ON();
total_purged += sizeof(*sn) + __slab_data.sd_StandardSlabSize;
@ -509,7 +522,10 @@ __slab_free(void * address,size_t allocation_size)
assert( size <= __slab_data.sd_TotalSingleAllocationSize );
Remove((struct Node *)ssa);
PROFILE_OFF();
FreeMem(ssa, size);
PROFILE_ON();
__slab_data.sd_NumSingleAllocations--;
__slab_data.sd_TotalSingleAllocationSize -= size;
@ -804,7 +820,9 @@ __slab_exit(void)
total_slab_size += sizeof(*sn) + __slab_data.sd_StandardSlabSize;
slab_count++;
PROFILE_OFF();
FreeVec(sn);
PROFILE_ON();
}
}
@ -830,7 +848,9 @@ __slab_exit(void)
total_single_allocation_size += ssa->ssa_Size;
single_allocation_count++;
PROFILE_OFF();
FreeMem(ssa, ssa->ssa_Size);
PROFILE_ON();
}
if(single_allocation_count > 0)

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

@ -184,7 +184,6 @@ __getcwd(char * buffer,size_t buffer_size,const char *file,int line)
if(__unix_path_semantics)
{
const char * path_name = buffer;
size_t len;
if(__translate_amiga_to_unix_path_name(&path_name,&buffer_nti) != 0)
goto out;

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 212
#define DATE "27.11.2016"
#define VERS "unix.lib 1.212"
#define VSTRING "unix.lib 1.212 (27.11.2016)\r\n"
#define VERSTAG "\0$VER: unix.lib 1.212 (27.11.2016)"
#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 @@
212
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);
}

View File

@ -21,104 +21,120 @@ WARNINGS = \
-Wall -W -Wshadow -Wpointer-arith -Wsign-compare -Wmissing-prototypes \
-Wundef -Wbad-function-cast -Wmissing-declarations -Wconversion
V = /V
INCLUDE = -I$(V)/include -I../library/include
LIB = -L../library/lib
#OPTIONS = -DNDEBUG -fno-builtin -DNO_INLINE_STDARG -DIEEE_FLOATING_POINT_SUPPORT
#OPTIONS = -D__MEM_DEBUG -fno-builtin
OPTIONS = -DDEBUG -DNO_INLINE_STDARG -fno-builtin
#OPTIMIZE = -O
#OPTIMIZE = -O2 -fomit-frame-pointer
DEBUG = -ggdb
#OPTIONS = -D__MEM_DEBUG
#OPTIONS = -DDEBUG
OPTIONS = -DNDEBUG
#OPTIMIZE = -O3
#DEBUG = -ggdb
CFLAGS = $(WARNINGS) $(OPTIMIZE) $(DEBUG) $(OPTIONS) $(CODE_TYPE) $(INCLUDE) $(LIB)
# Note: Because the matching startup code needs to be used for
# correctly linking the test programs, you need to make sure
# that the current development version of clib2 is visible
# where the linker expects it (soft link). Some more tuning would be
# required here because you really should not need to tinker
# with the location of library and the options "-L. -L../library/lib"
# should be sufficient.
CFLAGS = -mcrt=clib2 -fno-builtin $(WARNINGS) $(OPTIMIZE) $(DEBUG) $(OPTIONS) $(INCLUDE)
LFLAGS = -Wl,-d
##############################################################################
LIBS = -lm -lc -ldebug -lgcc
LIBS = -ldebug -lm -lc
##############################################################################
all: test fgets_test iotest sscanf_test printf_test sprintf_test \
stack_size_test translate_test strtok_test uname simple \
fstat_stdout_test simple_sprintf date_test sscanf_64 \
factorial setlocale
factorial setlocale rand malloc-test slab-test
clean:
$(DELETE) *.o *.map test fgets_test iotest sscanf_test printf_test \
sprintf_test stack_size_test translate_test strtok_test \
uname simple fstat_stdout_test simple_sprintf date_test \
sscanf_64 factorial setlocale rand
sscanf_64 factorial setlocale rand malloc-test slab-test
##############################################################################
setlocale : setlocale.o
@echo "Linking $@"
$(CC) $(CFLAGS) -o $@ setlocale.o $(LIBS) -Wl,--cref,-M,-Map=$@.map
$(CC) $(CFLAGS) -o $@ setlocale.o $(LIBS) $(LFLAGS) -Wl,--cref,-M,-Map=$@.map
test : test.o
@echo "Linking $@"
$(CC) $(CFLAGS) -o $@ test.o $(LIBS) -Wl,--cref,-M,-Map=$@.map
$(CC) $(CFLAGS) -o $@ test.o $(LIBS) $(LFLAGS) -Wl,--cref,-M,-Map=$@.map
date_test : date_test.o
@echo "Linking $@"
$(CC) $(CFLAGS) -o $@ test.o $(LIBS) -Wl,--cref,-M,-Map=$@.map
$(CC) $(CFLAGS) -o $@ test.o $(LIBS) $(LFLAGS) -Wl,--cref,-M,-Map=$@.map
fgets_test : fgets_test.o
@echo "Linking $@"
$(CC) $(CFLAGS) -o $@ fgets_test.o $(LIBS) -Wl,--cref,-M,-Map=$@.map
$(CC) $(CFLAGS) -o $@ fgets_test.o $(LIBS) $(LFLAGS) -Wl,--cref,-M,-Map=$@.map
strtok_test : strtok_test.o
@echo "Linking $@"
$(CC) $(CFLAGS) -o $@ strtok_test.o $(LIBS) -Wl,--cref,-M,-Map=$@.map
$(CC) $(CFLAGS) -o $@ strtok_test.o $(LIBS) $(LFLAGS) -Wl,--cref,-M,-Map=$@.map
iotest : iotest.o
@echo "Linking $@"
$(CC) $(CFLAGS) -o $@ iotest.o $(LIBS) -Wl,--cref,-M,-Map=$@.map
$(CC) $(CFLAGS) -o $@ iotest.o $(LIBS) $(LFLAGS) -Wl,--cref,-M,-Map=$@.map
sscanf_test : sscanf_test.o
@echo "Linking $@"
$(CC) $(CFLAGS) -o $@ sscanf_test.o $(LIBS) -Wl,--cref,-M,-Map=$@.map
$(CC) $(CFLAGS) -o $@ sscanf_test.o $(LIBS) $(LFLAGS) -Wl,--cref,-M,-Map=$@.map
printf_test : printf_test.o
@echo "Linking $@"
$(CC) $(CFLAGS) -o $@ printf_test.o $(LIBS) -Wl,--cref,-M,-Map=$@.map
$(CC) $(CFLAGS) -o $@ printf_test.o $(LIBS) $(LFLAGS) -Wl,--cref,-M,-Map=$@.map
sprintf_test : sprintf_test.o
@echo "Linking $@"
$(CC) $(CFLAGS) -o $@ sprintf_test.o $(LIBS) -Wl,--cref,-M,-Map=$@.map
$(CC) $(CFLAGS) -o $@ sprintf_test.o $(LIBS) $(LFLAGS) -Wl,--cref,-M,-Map=$@.map
stack_size_test : stack_size_test.o
@echo "Linking $@"
$(CC) $(CFLAGS) -o $@ stack_size_test.o $(LIBS) -Wl,--cref,-M,-Map=$@.map
$(CC) $(CFLAGS) -o $@ stack_size_test.o $(LIBS) $(LFLAGS) -Wl,--cref,-M,-Map=$@.map
translate_test : translate_test.o
@echo "Linking $@"
$(CC) $(CFLAGS) -o $@ translate_test.o -lunix $(LIBS) -Wl,--cref,-M,-Map=$@.map
$(CC) $(CFLAGS) -o $@ translate_test.o -lunix $(LIBS) $(LFLAGS) -Wl,--cref,-M,-Map=$@.map
uname : uname.o
@echo "Linking $@"
$(CC) $(CFLAGS) -o $@ uname.o -lunix $(LIBS) -Wl,--cref,-M,-Map=$@.map
$(CC) $(CFLAGS) -o $@ uname.o -lunix $(LIBS) $(LFLAGS) -Wl,--cref,-M,-Map=$@.map
simple : simple.o
@echo "Linking $@"
$(CC) $(CFLAGS) -o $@ simple.o $(LIBS) -Wl,--cref,-M,-Map=$@.map
$(CC) $(CFLAGS) -o $@ simple.o $(LIBS) $(LFLAGS) -Wl,--cref,-M,-Map=$@.map
fstat_stdout_test : fstat_stdout_test.o
@echo "Linking $@"
$(CC) $(CFLAGS) -o $@ fstat_stdout_test.o $(LIBS) -Wl,--cref,-M,-Map=$@.map
$(CC) $(CFLAGS) -o $@ fstat_stdout_test.o $(LIBS) $(LFLAGS) -Wl,--cref,-M,-Map=$@.map
simple_sprintf : simple_sprintf.o
@echo "Linking $@"
$(CC) -nostdlib $(CFLAGS) -o $@ simple_sprintf.o -lc -lgcc -Wl,--cref,-M,-Map=$@.map
$(CC) $(CFLAGS) -nostdlib -o $@ simple_sprintf.o -lc -lgcc $(LFLAGS) -Wl,--cref,-M,-Map=$@.map
sscanf_64 : sscanf_64.o
@echo "Linking $@"
$(CC) -nostdlib $(CFLAGS) -o $@ sscanf_64.o -lc -lgcc -Wl,--cref,-M,-Map=$@.map
$(CC) $(CFLAGS) -o $@ sscanf_64.o $(LIBS) $(LFLAGS) -Wl,--cref,-M,-Map=$@.map
factorial : factorial.o
@echo "Linking $@"
$(CC) -nostdlib $(CFLAGS) -o $@ factorial.o -lc -lgcc -Wl,--cref,-M,-Map=$@.map
$(CC) $(CFLAGS) -o $@ factorial.o $(LIBS) $(LFLAGS) -Wl,--cref,-M,-Map=$@.map
rand : rand.o
@echo "Linking $@"
$(CC) -nostdlib $(CFLAGS) -o $@ rand.o -lc -lgcc -Wl,--cref,-M,-Map=$@.map
$(CC) $(CFLAGS) -o $@ rand.o $(LIBS) $(LFLAGS) -Wl,--cref,-M,-Map=$@.map
malloc-test : malloc-test.o
@echo "Linking $@"
$(CC) $(CFLAGS) -o $@ malloc-test.o $(LIBS) $(LFLAGS) -Wl,--cref,-M,-Map=$@.map
slab-test : slab-test.o
@echo "Linking $@"
$(CC) $(CFLAGS) -o $@ slab-test.o $(LIBS) $(LFLAGS) -Wl,--cref,-M,-Map=$@.map

Some files were not shown because too many files have changed in this diff Show More