mescc: Support gcc-2.6.3.
authorJan Nieuwenhuizen <janneke@gnu.org>
Sat, 2 Jun 2018 09:41:06 +0000 (11:41 +0200)
committerJan Nieuwenhuizen <janneke@gnu.org>
Sat, 2 Jun 2018 09:41:06 +0000 (11:41 +0200)
* TODO

70 files changed:
.gitignore
GNUmakefile
build-aux/build-mes-gcc.sh
build-aux/cc.sh
build-aux/check-mescc.sh
build-aux/test.sh
include/alloca.h
include/assert.h
include/ctype.h
include/dlfcn.h
include/endian.h
include/errno.h
include/fcntl.h
include/features.h
include/float.h
include/getopt.h
include/inttypes.h
include/libgen.h
include/libmes.h
include/limits.h
include/locale.h
include/math.h
include/memory.h
include/pwd.h
include/setjmp.h
include/signal.h
include/stdarg.h
include/stdbool.h
include/stddef.h
include/stdint.h
include/stdio.h
include/stdlib.h
include/stdnoreturn.h
include/string.h
include/strings.h
include/sys/cdefs.h
include/sys/dir.h
include/sys/file.h
include/sys/ioctl.h
include/sys/mman.h
include/sys/param.h
include/sys/select.h
include/sys/stat.h
include/sys/time.h
include/sys/timeb.h
include/sys/times.h [new file with mode: 0644]
include/sys/types.h
include/sys/ucontext.h
include/sys/user.h
include/sys/wait.h
include/time.h
include/unistd.h
lib/binutils.c
lib/crt0.c [new file with mode: 0644]
lib/gcc.c [new file with mode: 0644]
lib/libc+gnu.c
lib/libc+tcc.c
lib/libc.c
lib/libg.c [new file with mode: 0644]
lib/libmes.c
lib/linux+gnu-gcc.c [new file with mode: 0644]
lib/linux+tcc-gcc.c
lib/linux+tcc-mes.c
lib/linux-gcc.c
lib/m4.c
lib/x86-mes/x86.M1
scaffold/tests/51-strcmp.c
scaffold/tests/70-printf.c
scaffold/tests/87-sscanf.c
src/posix.c

index 734586495576fec20f529a8cb5ac2efd6b69fa13..d20997acbab4cbbdac416887cc6b1ac0a30ae987 100644 (file)
@@ -9,6 +9,7 @@
 *.gcc
 *.gcc-o
 *.gcc-out
+*.gcc-stdout
 *.go
 *.guile
 *.log
index 506f93b3ce1a4022c94c453a093a970b1eb9f1b7..132e8d96d0f389d8fbc252f8d7e92d52edefcb76 100644 (file)
@@ -3,6 +3,9 @@ GUILE_FLAGS:=--no-auto-compile -L . -L guile -C . -C guile
 
 include .config.make
 
+.config.make:
+       ./configure
+
 PHONY_TARGETS:= all all-go check clean clean-go default help install
 .PHONY: $(PHONY_TARGETS)
 
index 7ce4a4b2f8dda3fd5ba180f7158e1d86e16f4e6e..2dca41f1f5e6e18c79da2e460940e27ab387c1fc 100755 (executable)
@@ -62,12 +62,14 @@ C32FLAGS=${C32FLAGS-"
 -nostdlib
 "}
 
+ARCHDIR=1 NOLINK=1 sh build-aux/cc-mes-gcc.sh lib/crt0
 ARCHDIR=1 NOLINK=1 sh build-aux/cc-mes-gcc.sh lib/crt1
 ARCHDIR=1 NOLINK=1 sh build-aux/cc-mes-gcc.sh lib/libc-mini
 ARCHDIR=1 NOLINK=1 sh build-aux/cc-mes-gcc.sh lib/libc
 ARCHDIR=1 NOLINK=1 sh build-aux/cc-mes-gcc.sh lib/libgetopt
 ARCHDIR=1 NOLINK=1 sh build-aux/cc-mes-gcc.sh lib/libc+tcc
 ARCHDIR=1 NOLINK=1 sh build-aux/cc-mes-gcc.sh lib/libc+gnu
+ARCHDIR=1 NOLINK=1 sh build-aux/cc-mes-gcc.sh lib/libg
 
 sh build-aux/cc-mes-gcc.sh scaffold/main
 sh build-aux/cc-mes-gcc.sh scaffold/hello
index 0b4610d6cff7acc1db888e27a886ff4dcceaf1b7..19381623af81affa4976cb8b0e14fd997ced5bf4 100755 (executable)
@@ -55,6 +55,7 @@ $CC\
     -c\
     $CPPFLAGS\
     $CFLAGS\
+    -D WITH_GLIBC=1\
     -D POSIX=1\
     -o "$o".${p}o\
     "$c".c
index 64a0261f120b2f5233bbc36681c8fb4b19a50e7e..3ce4a04e35ce9fcbbd4740b35abb0f33d6f257e3 100755 (executable)
@@ -145,6 +145,8 @@ broken="$broken
 91-fseek
 "
 
+# gcc not supported
+CC=
 set +e
 expect=$(echo $broken | wc -w)
 pass=0
index 9739cce0a0897beeb3d90903258d7542f7dbd2fe..25e83ff851190c356151a21d3a4993fbaf5d6fce 100755 (executable)
@@ -34,6 +34,24 @@ shift
 
 set -e
 
+rm -f "$t".gcc-out
+if [ -n "$CC" ]; then
+    sh build-aux/cc.sh "$t"
+
+    r=0
+    [ -f "$t".exit ] && r=$(cat "$t".exit)
+    set +e
+    "$t".gcc-out $ARGS > "$t".gcc-stdout
+    m=$?
+    cat "$t".gcc-stdout
+    set -e
+
+    [ $m = $r ]
+    if [ -f "$t".expect ]; then
+        $DIFF -ub "$t".expect "$t".gcc-stdout;
+    fi
+fi
+
 rm -f "$t".mes-gcc-out
 if [ -n "$CC32" ]; then
     sh build-aux/cc-mes-gcc.sh "$t"
index 07f88f3f04d20915bf1bcc1ea3964977e2b1c0a7..b06ffbaffe8d6ea3c301240bd95f8723f5d87f5a 100644 (file)
 #ifndef __MES_ALLOCA_H
 #define __MES_ALLOCA_H 1
 
-#if __GNUC__ && POSIX
+#if WITH_GLIBC
 #ifndef _GNU_SOURCE
 #define _GNU_SOURCE
 #endif
 #undef __MES_ALLOCA_H 1
 #include_next <alloca.h>
 
-#else // ! (__GNUC__ && POSIX)
+#else // ! WITH_GLIBC
 void* alloca (size_t);
-#endif // ! (__GNUC__ && POSIX)
+#endif // ! WITH_GLIBC
 
 #endif // __MES_ALLOCA_H
index eb1f3bac4b694cee9a944332c95a8c0a1f19db15..317c99f44305932a5bb96dadf84f104ae0613d2a 100644 (file)
 #ifndef __MES_ASSERT_H
 #define __MES_ASSERT_H 1
 
-#if __GNUC__ && POSIX
+#if WITH_GLIBC
 #ifndef _GNU_SOURCE
 #define _GNU_SOURCE
 #endif
 #undef __MES_ASSERT_H
 #include_next <assert.h>
-#else // ! (__GNUC__ && POSIX)
+#else // ! WITH_GLIBC
 #define assert(x) ((x) ? (void)0 : assert_fail (#x))
 void assert_fail (char* s);
-#endif // ! (__GNUC__ && POSIX)
+#endif // ! WITH_GLIBC
 
 #endif // __MES_ASSERT_H
index b0c7889fc9c1d02aa01dba149880c68092941e01..c533f244d85bcab315d84ff97bbc307395c98594 100644 (file)
 #ifndef __MES_CTYPE_H
 #define __MES_CTYPE_H 1
 
-#if __GNUC__ && POSIX
+#if WITH_GLIBC
 #ifndef _GNU_SOURCE
 #define _GNU_SOURCE
 #endif
 #undef __MES_CTYPE_H
 #include_next <ctype.h>
 
-#else // ! (__GNUC__ && POSIX)
+#else // ! WITH_GLIBC
 #include <endian.h>
 int isdigit (int);
 int isxdigit (int);
 int isspace (int);
-#endif // ! (__GNUC__ && POSIX)
+#endif // ! WITH_GLIBC
 
 #endif // __MES_CTYPE_H
index 54e85534c4989a9c86dd552f05b01e213591a048..1774380fdfe1ae3d4f5266425f0dfcf8e282d260 100644 (file)
 #ifndef __MES_DLFCN_H
 #define __MES_DLFCN_H 1
 
-#if __GNUC__ && POSIX
+#if WITH_GLIBC
 #undef __MES_DLFCN_H
 #include_next <dlfcn.h>
 
-#else // !(__GNUC__ && POSIX)
+#else // ! WITH_GLIBC
 
 #define RTLD_LAZY      0x00001
 #define RTLD_NOW       0x00002
@@ -38,7 +38,7 @@
 void *dlopen (char const *filename, int flags);
 int dlclose (void *handle);
 
-#endif // !(__GNUC__ && POSIX)
+#endif // ! WITH_GLIBC
 
 #endif // __MES_DLFCN_H
 
index 45e57c60ea25fe4dc48059e67961abf3caea9ffc..192bc83abab498a18195f24a0dbac8bd7e36c379 100644 (file)
 #ifndef __MES_ENDIAN_H
 #define __MES_ENDIAN_H 1
 
-#if __GNUC__ && POSIX
+#if WITH_GLIBC
 #ifndef _GNU_SOURCE
 #define _GNU_SOURCE
 #endif
 #undef __MES_ENDIAN_H
 #include_next <endian.h>
 
-#else // ! (__GNUC__ && POSIX)
+#else // ! WITH_GLIBC
 #define        __LITTLE_ENDIAN 1234
 #define        __BIG_ENDIAN 4321
 #define __BYTE_ORDER __LITTLE_ENDIAN
-#endif // ! (__GNUC__ && POSIX)
+#endif // ! WITH_GLIBC
 
 #endif // __MES_ENDIAN_H
index 72c89a43388bc47ec2f4066a96a22d047b9703cb..83655d38b098d3ba541adb4101aeb0e5d546d103 100644 (file)
 #ifndef __MES_ERRNO_H
 #define __MES_ERRNO_H 1
 
-#if __GNUC__ && POSIX
+#if WITH_GLIBC
 #ifndef _GNU_SOURCE
 #define _GNU_SOURCE
 #endif
 #undef __MES_ERRNO_H
 #include_next <errno.h>
-#else // ! (__GNUC__ && POSIX)
+#else // ! WITH_GLIBC
 int errno;
-#define        ENOENT           2      /* No such file or directory */
-#define        EIO              5      /* I/O error */
-#define        EBADF            9      /* Bad file number */
-#define        ENOMEM          12      /* Out of memory */
-#define        EEXIST          17      /* File exists */
-#define        ENOTDIR         20      /* Not a directory */
-#define        EISDIR          21      /* Is a directory */
-#define        EINVAL          22      /* Invalid argument */
-#define        EMFILE          24      /* Too many open files */
-#define        EPIPE           32      /* Broken pipe */
-#define        ERANGE          34      /* Math result not representable */
+#define ENOENT   2
+#define EIO      5
+#define EBADF    9
+#define EAGAIN  11
+#define ENOMEM  12
+#define EEXIST  17
+#define ENOTDIR 20
+#define EISDIR  21
+#define EINVAL  22
+#define EMFILE  24
+#define EPIPE   32
+#define ERANGE  34
 
-#define        ENAMETOOLONG    36      /* File name too long */
-#define        ENOSYS          38      /* Invalid system call number */
-#define        ELOOP           40      /* Too many symbolic links encountered */
+#define ENAMETOOLONG 36
+#define ENOSYS 38
+#define ELOOP  40
 
-#endif // ! (__GNUC__ && POSIX)
+#endif // ! WITH_GLIBC
 
 #endif // __MES_ERRNO_H
index 879181bce7a0a5c2e806f4154ffe91dcb8a1e745..deefe3e77d621e9353e24f7f3acb2a4e43af0331 100644 (file)
 #ifndef __MES_FCNTL_H
 #define __MES_FCNTL_H 1
 
-#if __GNUC__ && POSIX
+#if WITH_GLIBC
 #ifndef _GNU_SOURCE
 #define _GNU_SOURCE
 #endif
 #undef __MES_FCNTL_H
 #include_next <fcntl.h>
 
-#else // ! (__GNUC__ && POSIX)
+#else // ! WITH_GLIBC
 #define O_RDONLY 0
 #define O_WRONLY 1
 #define O_RDWR 2
@@ -42,6 +42,6 @@
 #define F_SETFL 4
 
 int open (char const *s, int flags, ...);
-#endif // ! (__GNUC__ && POSIX)
+#endif // ! WITH_GLIBC
 
 #endif // __MES_FCNTL_H
index e887ee8fa3fc98a821f98578e5c5b2fa5f1097cc..eeecfc9509009dbcce6fdd595db260bfcd3fd430 100644 (file)
 #ifndef __MES_FEATURES_H
 #define __MES_FEATURES_H 1
 
-#if __GNUC__ && POSIX
+#if WITH_GLIBC
 #undef __MES_FEATURES_H
 #include_next <features.h>
-#endif // (__GNUC__ && POSIX)
+#endif // (WITH_GLIBC)
 
 #endif // __MES_FEATURES_H
 
index 35d9b896384be589b90712651de9e23e6993a3b8..d250aea84a924b2075574edaa46ea40d61223f38 100644 (file)
 #ifndef __MES_FLOAT_H
 #define __MES_FLOAT_H 1
 
-#if __GNUC__ && POSIX
+#if WITH_GLIBC
 #undef __MES_FLOAT_H
 #include_next <float.h>
-#else // ! (__GNUC__ && POSIX)
+#else // ! WITH_GLIBC
 
 #define MIN_EXP -1021
 #define DBL_MIN_EXP -1021
 #define LDBL_MIN_EXP -1021
 
-#endif // ! (__GNUC__ && POSIX)
+#endif // ! WITH_GLIBC
 
 #endif // __MES_FLOAT_H
index 1200ff46fedaca066bf29f8a18b2bd6efbabe63a..1c50e936db2a7448734608b626d306c17a144f0b 100644 (file)
 #ifndef __MES_GETOPT_H
 #define __MES_GETOPT_H 1
 
-#if __GNUC__ && POSIX
+#if WITH_GLIBC
 #ifndef _GNU_SOURCE
 #define _GNU_SOURCE
 #endif
 #undef __MES_GETOPT_H
 #include_next <getopt.h>
 
-#else // ! (__GNUC__ && POSIX)
+#else // ! WITH_GLIBC
 #include <endian.h>
 int isdigit (int);
 int isxdigit (int);
@@ -57,6 +57,6 @@ int getopt_long (int argc, char *const *argv, char const *options,
 int getopt_long_only (int argc, char *const *argv, char const *options,
                       struct option const *long_options, int *opt_index);
 
-#endif // ! (__GNUC__ && POSIX)
+#endif // ! WITH_GLIBC
 
 #endif // __MES_GETOPT_H
index c963f34fcce4c91c2a7f72c705ffd40e23e6d9eb..eae673aaa71befe4ea6f3d255620ae65b6ec231d 100644 (file)
 #ifndef __MES_INTTYPES_H
 #define __MES_INTTYPES_H 1
 
-#if __GNUC__ && POSIX
+#if WITH_GLIBC
 #ifndef _GNU_SOURCE
 #define _GNU_SOURCE
 #endif
 #undef __MES_INTTYPES_H
 #include_next <inttypes.h>
-#else // ! (__GNUC__ && POSIX)
+#else // ! WITH_GLIBC
 
 #include <stdint.h>
-#endif // ! (__GNUC__ && POSIX)
+#endif // ! WITH_GLIBC
 
 #endif // __MES_INTTYPES_H
index 76eb8cd9caf6bdfa29c9fdda448d7a82b8923549..001069a8b21d86bcc2b4f78bc0061f8f3146a294 100644 (file)
 #ifndef __MES_LIBGEN_H
 #define __MES_LIBGEN_H 1
 
-#if __GNUC__ && POSIX
+#if WITH_GLIBC
 #ifndef _GNU_SOURCE
 #define _GNU_SOURCE
 #endif
 #undef __MES_LIBGEN_H
 #include_next <libgen.h>
 
-#else // ! (__GNUC__ && POSIX)
+#else // ! WITH_GLIBC
 char* dirname (char*);
-#endif // ! (__GNUC__ && POSIX)
+#endif // ! WITH_GLIBC
 
 #endif // __MES_LIBGEN_H
index ac4f1879d221f7e02b71e840bb425771bae8bd6d..4d2c3d5ebe07baf593ba391fc7959f82a0c65900 100644 (file)
@@ -21,7 +21,9 @@
 #ifndef __MES_LIBMES_H
 #define __MES_LIBMES_H
 
-char const* itoa (int);
+char const* number_to_ascii (int number, int base, int signed_p);
+char const* itoa (int number);
+char const* utoa (unsigned number);
 char const* itoab (int x, int base);
 int _atoi (char const**, int base);
 int atoi (char const *s);
index 9d4c3308a50fc0df0c322747f0b9f8a125b241cc..c1e0f4d3935dab5a5ad5429b89fc114d7fcb9e68 100644 (file)
 #ifndef __MES_LIMITS_H
 #define __MES_LIMITS_H 1
 
-#if __GNUC__ && POSIX
+#if WITH_GLIBC
 #ifndef _GNU_SOURCE
 #define _GNU_SOURCE
 #endif
 #undef __MES_LIMITS_H
 #include_next <limits.h>
 
-#else // ! (__GNUC__ && POSIX)
+#else // ! WITH_GLIBC
 #define CHAR_BIT 8
 #define UCHAR_MAX 255
 #define INT_MIN -2147483648
@@ -36,6 +36,6 @@
 #define LONG_MIN -2147483648
 #define LONG_MAX 2147483647
 
-#endif // ! (__GNUC__ && POSIX)
+#endif // ! WITH_GLIBC
 
 #endif // __MES_LIMITS_H
index 91d6ac65a4cb7abc0fdd2f36ffc5ebf1476be0a3..d429a76774534fd659e3c783559f6b31e1ffabf7 100644 (file)
 #ifndef __MES_LOCALE_H
 #define __MES_LOCALE_H 1
 
-#if __GNUC__ && POSIX
+#if WITH_GLIBC
 #ifndef _GNU_SOURCE
 #define _GNU_SOURCE
 #endif
 #undef __MES_LOCALE_H
 #include_next <locale.h>
 
-#else // ! (__GNUC__ && POSIX)
+#else // ! WITH_GLIBC
 char* dirname (char*);
-#endif // ! (__GNUC__ && POSIX)
+#endif // ! WITH_GLIBC
 
 #endif // __MES_LOCALE_H
index df0006c453318f0511d7092927bdcd0b7867e1b1..a8d5636e63b6384343efb9550790be04895e0c10 100644 (file)
 #ifndef __MES_MATH_H
 #define __MES_MATH_H 1
 
-#if __GNUC__ && POSIX
+#if WITH_GLIBC
 #undef __MES_MATH_H
 #include_next <math.h>
-#else  // !(__GNUC__ && POSIX)
+#else  // ! WITH_GLIBC
 double ldexp (double x, int exp);
-#endif  // !(__GNUC__ && POSIX)
+#endif  // ! WITH_GLIBC
 
 #endif // __MES_MATH_H
 
index 82c9088bcf917c56e9a2e1e6d79ac071c7abe29f..4412c56e7d78047b65830f3f60a42fbf34e46b49 100644 (file)
 #ifndef __MES_MEMORY_H
 #define __MES_MEMORY_H 1
 
-#if __GNUC__ && POSIX
+#if WITH_GLIBC
 #ifndef _GNU_SOURCE
 #define _GNU_SOURCE
 #endif
 #undef __MES_MEMORY_H
 #include_next <memory.h>
 
-#else // ! (__GNUC__ && POSIX)
+#else // ! WITH_GLIBC
 
 #include <string.h>
 
-#endif // ! (__GNUC__ && POSIX)
+#endif // ! WITH_GLIBC
 
 #endif // __MES_MEMORY_H
index 09f4245a2de9a73f091d41b35c4be7479ee2ff91..a9b9b6d8d6c1a981503adfb024d4f0e3192c3be9 100644 (file)
 #ifndef __MES_PWD_H
 #define __MES_PWD_H 1
 
-#if __GNUC__ && POSIX
+#if WITH_GLIBC
 #undef __MES_PWD_H
 #include_next <pwd.h>
-#else  // !(__GNUC__ && POSIX)
+#else  // ! WITH_GLIBC
 
 struct passwd
 {
@@ -36,6 +36,6 @@ struct passwd
   char *pw_shell;
 };
 
-#endif  // !(__GNUC__ && POSIX)
+#endif  // ! WITH_GLIBC
 
 #endif // __MES_PWD_H
index fdfee319347c4938107751b0d34d498fc4308874..e5f1e404b1735410343fbc0f4f09c1c5b2b730cd 100644 (file)
 #ifndef __MES_SETJMP_H
 #define __MES_SETJMP_H 1
 
-#if __GNUC__ && POSIX
+#if WITH_GLIBC
 #undef __MES_SETJMP_H
 #include_next <setjmp.h>
-#else // ! (__GNUC__ && POSIX)
+#else // ! WITH_GLIBC
 
 typedef struct
 {
@@ -42,7 +42,7 @@ jmp_buf buf;
 void longjmp (jmp_buf env, int val);
 int setjmp (jmp_buf env);
 
-#endif // ! (__GNUC__ && POSIX)
+#endif // ! WITH_GLIBC
 
 #endif // __MES_SETJMP_H
 
index 122fbb9537b3af4f43a7a6f69ebb5dceb4cbafc2..57b284b63f85054e838582e680beb956764fb143 100644 (file)
 #ifndef __MES_SIGNAL_H
 #define __MES_SIGNAL_H 1
 
-#if __GNUC__ && POSIX
+#if WITH_GLIBC
 #undef __MES_SIGNAL_H
 #include_next <signal.h>
-#else //! (__GNUC__ && POSIX)
+#else //! WITH_GLIBC
 typedef int sigset_t;
 
 typedef int stack_t;
@@ -218,6 +218,6 @@ typedef struct ucontext
 int sigaction (int signum, struct sigaction const *act, struct sigaction *oldact);
 int sigemptyset (sigset_t *set);
 
-#endif //! (__GNUC__ && POSIX)
+#endif //! WITH_GLIBC
 
 #endif // __MES_SIGNAL_H
index 6675bced32d2458d4bdbbbfe9429db668b547c08..03487a56d4fc78b9cd130567c0f143050cf5990e 100644 (file)
 #ifndef __MES_STDARG_H
 #define __MES_STDARG_H 1
 
-#if __GNUC__ && POSIX
+#if WITH_GLIBC
 #undef __MES_STDARG_H
 #include_next <stdarg.h>
-#else // ! (__GNUC__ && POSIX)
+#else // ! WITH_GLIBC
 
 #ifndef __MES_SIZE_T
 #define __MES_SIZE_T
@@ -48,6 +48,6 @@ int vsprintf (char *str, char const *format, va_list ap);
 int vsnprintf (char *str, size_t size, char const *format, va_list ap);
 int vsscanf (char const *s, char const *template, va_list ap);
 
-#endif // ! (__GNUC__ && POSIX)
+#endif // ! WITH_GLIBC
 
 #endif // __MES_STDARG_H
index 72136eced22664bec396be1b7ceb4cd7fab23c7a..1fc8a873e03def6c1b90804b099edb29a25699a1 100644 (file)
 #ifndef __MES_STDBOOL_H
 #define __MES_STDBOOL_H 1
 
-#if __GNUC__ && POSIX
+#if WITH_GLIBC
 #ifndef _GNU_SOURCE
 #define _GNU_SOURCE
 #endif
 #undef __MES_STDBOOL_H
 #include_next <stdbool.h>
 
-#else // ! (__GNUC__ && POSIX)
+#else // ! WITH_GLIBC
 typedef int bool;
 #define false 0
 #define true 1
-#endif // ! (__GNUC__ && POSIX)
+#endif // ! WITH_GLIBC
 
 #endif // __MES_STDBOOL_H
index 20174580a1d80226edc3f7ddcbd05f2f3bebf376..1283066fdfb91b9b9edbed2d6c21cbcbd092dcaf 100644 (file)
 #ifndef __MES_STDDEF_H
 #define __MES_STDDEF_H 1
 
-#if __GNUC__ && POSIX
+#if WITH_GLIBC
 #undef __MES_STDDEF_H
 #include_next <stddef.h>
-#else // ! (__GNUC__ && POSIX)
+#else // ! WITH_GLIBC
+
 #include <stdint.h>
 #include <unistd.h>
 
@@ -35,6 +36,6 @@
 #endif // !__MESC__
 #endif // offsetof
 
-#endif // ! (__GNUC__ && POSIX)
+#endif // ! WITH_GLIBC
 
 #endif // __MES_STDDEF_H
index fb58223c9b6e69feccbb79002f3d6a09b3326b52..eb774d6c763bfda2b982a5b41b5e2007f0c1ce2d 100644 (file)
 #ifndef __MES_STDINT_H
 #define __MES_STDINT_H 1
 
-#if __GNUC__ && POSIX
+#if WITH_GLIBC
 #ifndef _GNU_SOURCE
 #define _GNU_SOURCE
 #endif
 #undef __MES_STDINT_H
 #include_next <stdint.h>
 
-#else // ! (__GNUC__ && POSIX)
+#else // ! WITH_GLIBC
 
 #undef unsigned
 #undef uint8_t
@@ -71,6 +71,6 @@ typedef unsigned* uintptr_t;
 
 typedef unsigned ptrdiff_t;
 
-#endif // ! (__GNUC__ && POSIX)
+#endif // ! WITH_GLIBC
 
 #endif // __MES_STDINT_H
index 414b4ce2f80d8f4afeac5c83564d668b7dbbf35c..9cd6ddec1c3982a016f61fa451ad8e9fa4d1315c 100644 (file)
@@ -36,14 +36,14 @@ int g_stdout;
 #define STDERR 2
 #endif
 
-#if __GNUC__ && POSIX
+#if WITH_GLIBC
 #ifndef _GNU_SOURCE
 #define _GNU_SOURCE
 #endif
 #undef __MES_STDIO_H
 #include_next <stdio.h>
 
-#else // ! (__GNUC__ && POSIX)
+#else // ! WITH_GLIBC
 
 #ifndef __MESCCLIB__
 #define __MESCCLIB__ 15
@@ -113,6 +113,6 @@ size_t fread (void *ptr, size_t size, size_t count, FILE *stream);
 size_t freadahead (FILE *fp);
 size_t fwrite (void const *ptr, size_t size, size_t count, FILE *stream);
 
-#endif // ! (__GNUC__ && POSIX)
+#endif // ! WITH_GLIBC
 
 #endif // __MES_STDIO_H
index 83686cc14f2d3465273fd6943fcd5f8901820988..c683902c45243ac317bd1d270c783b2b637c2889 100644 (file)
 #ifndef __MES_STDLIB_H
 #define __MES_STDLIB_H 1
 
-#if __GNUC__ && POSIX
+#if WITH_GLIBC
 #ifndef _GNU_SOURCE
 #define _GNU_SOURCE
 #endif
 #undef __MES_STDLIB_H
 #include_next <stdlib.h>
-#else  // !(__GNUC__ && POSIX)
+#else  // ! WITH_GLIBC
 
 #ifndef __MES_SIZE_T
 #define __MES_SIZE_T
@@ -56,7 +56,7 @@ unsigned long long strtoull (char const *nptr, char **endptr, int base);
 
 #include <endian.h>
 
-#endif // !(__GNUC__ && POSIX)
+#endif // ! WITH_GLIBC
 
 #endif // __MES_STDLIB_H
 
index 434882f2fdfaea1961b899e734ede55fbb96f065..0e615ac71f8fe9bbef03710bd50cce9a4cb8b1c3 100644 (file)
 #ifndef __MES_STDNORETURN_H
 #define __MES_STDNORETURN_H 1
 
-#if __GNUC__ && POSIX
+#if WITH_GLIBC
 #ifndef _GNU_SOURCE
 #define _GNU_SOURCE
 #endif
 #undef __MES_STDNORETURN_H
 #include_next <stdnoreturn.h>
 
-#else // ! (__GNUC__ && POSIX)
+#else // ! WITH_GLIBC
 // whut?
-#endif // ! (__GNUC__ && POSIX)
+#endif // ! WITH_GLIBC
 
 #endif // __MES_STDNORETURN_H
index 556eeffec7828406300ad4407f35c3363cf05f01..8d503d9b9f2d98e5022d01f468294c7054487fa0 100644 (file)
 #ifndef __MES_STRING_H
 #define __MES_STRING_H 1
 
-#if __GNUC__ && POSIX
+#if WITH_GLIBC
 #ifndef _GNU_SOURCE
 #define _GNU_SOURCE
 #endif
 #undef __MES_STRING_H
 #include_next <string.h>
 
-#else // ! (__GNUC__ && POSIX)
+#else // ! WITH_GLIBC
 
 #ifndef NULL
 #define NULL 0
@@ -55,10 +55,11 @@ char *strchr (char const *s, int c);
 int strcmp (char const*, char const*);
 char *strcpy (char *dest, char const *src);
 size_t strlen (char const*);
+char *strncpy (char *to, char const *from, size_t size);
 int strncmp (char const*, char const*, size_t);
 char *strrchr (char const *s, int c);
 char *strstr (char const *haystack, char const *needle);
 
-#endif // ! (__GNUC__ && POSIX)
+#endif // ! WITH_GLIBC
 
 #endif // __MES_STRING_H
index e65c6a1458a111cb7daf9b5a002611b635555561..72c986e11fdd3e39eadb307ab08bfd7efd8f6dd5 100644 (file)
 #ifndef __MES_STRINGS_H
 #define __MES_STRINGS_H 1
 
-#if __GNUC__ && POSIX
+#if WITH_GLIBC
 #undef __MES_STRINGS_H
 #include_next <strings.h>
-#endif // (__GNUC__ && POSIX)
+#endif // (WITH_GLIBC)
 
 #endif // __MES_STRINGS_H
 
index 9f6814881384c821582703e9c4092efe22ee54e6..f04c7d80177ea4bb667690177204733bae3a35fa 100644 (file)
 #ifndef __MES_SYS_CDEFS_H
 #define __MES_SYS_CDEFS_H 1
 
-#if __GNUC__ && POSIX
+#if WITH_GLIBC
 #undef __MES_SYS_CDEFS_H
 #include_next <sys/cdefs.h>
-#endif // (__GNUC__ && POSIX)
+#endif // (WITH_GLIBC)
 
 #endif // __MES_SYS_CDEFS_H
 
index 424a093aad0746b6c090d61f92bb4350d7d0674e..d7607b6dbc993f247282af1308e61db120c38495 100644 (file)
 #ifndef __MES_SYS_DIR_H
 #define __MES_SYS_DIR_H 1
 
-#if __GNUC__ && POSIX
+#if WITH_GLIBC
 #undef __MES_SYS_DIR_H
 #include_next <sys/dir.h>
 
-#else // !(__GNUC__ && POSIX)
+#else // ! WITH_GLIBC
 
 
-#endif // !(__GNUC__ && POSIX)
+#endif // ! WITH_GLIBC
 
 #endif // __MES_SYS_DIR_H
index 171469a0fe3ad93fa198fcfebb8d7eb895f80a40..e9fcd317a47be68bb71368ba01438b4c7e2b5dbc 100644 (file)
 #ifndef __MES_SYS_FILE_H
 #define __MES_SYS_FILE_H 1
 
-#if __GNUC__ && POSIX
+#if WITH_GLIBC
 #undef __MES_SYS_FILE_H
 #include_next <sys/file.h>
 
-#else // !(__GNUC__ && POSIX)
+#else // ! WITH_GLIBC
 
 
-#endif // !(__GNUC__ && POSIX)
+#endif // ! WITH_GLIBC
 
 #endif // __MES_SYS_FILE_H
index d24fd82b1f4f89fb3b26935bec84735ed9008302..dbe4becaac04682f3988149eb6848cbb7cae62fa 100644 (file)
 #ifndef __MES_SYS_IOCTL_H
 #define __MES_SYS_IOCTL_H 1
 
-#if __GNUC__ && POSIX
+#if WITH_GLIBC
 #undef __MES_SYS_IOCTL_H
 #include_next <sys/ioctl.h>
 
-#else // !(__GNUC__ && POSIX)
+#else // ! WITH_GLIBC
 
 #define TCGETS 0x5401
 #define TCGETA 0x5405
 int ioctl (int fd, unsigned long request, ...);
 
-#endif // !(__GNUC__ && POSIX)
+#endif // ! WITH_GLIBC
 
 #endif // __MES_SYS_IOCTL_H
 
index 06e99779073f7aff8945e20b8437c9b5a21f7bc3..9d59f84f77840856571e23925f7af93fa7be3671 100644 (file)
 #ifndef __MES_SYS_MMAN_H
 #define __MES_SYS_MMAN_H 1
 
-#if __GNUC__ && POSIX
+#if WITH_GLIBC
 #undef __MES_SYS_MMAN_H
 #include_next <sys/mman.h>
-#else // !(__GNUC__ && POSIX)
+#else // ! WITH_GLIBC
 
 #ifndef __MES_SIZE_T
 #define __MES_SIZE_T
@@ -37,7 +37,7 @@ typedef unsigned long size_t;
 
 int mprotect (void *addr, size_t len, int prot);
 
-#endif // !(__GNUC__ && POSIX)
+#endif // ! WITH_GLIBC
 
 #endif // __MES_SYS_MMAN_H
 
index e7998a3fc14722d00a5d8fe662fb9148d91a5254..32e6d6a7a7773b5d8d7760bd1d2a7334a91fa108 100644 (file)
 #ifndef __MES_SYS_PARAM_H
 #define __MES_SYS_PARAM_H 1
 
-#if __GNUC__ && POSIX
+#if WITH_GLIBC
 #undef __MES_SYS_PARAM_H
 #include_next <sys/param.h>
 
-#else // !(__GNUC__ && POSIX)
+#else // ! WITH_GLIBC
 
-#endif // !(__GNUC__ && POSIX)
+#endif // ! WITH_GLIBC
 
 #endif // __MES_SYS_PARAM_H
index e68998218bd06950b0b64b8fa2163e4ba7fb256b..ff98912458170add4e155c689d3c76cb19fe7582 100644 (file)
 #ifndef __MES_SYS_SELECT_H
 #define __MES_SYS_SELECT_H 1
 
-#if __GNUC__ && POSIX
+#if WITH_GLIBC
 #undef __MES_SYS_SELECT_H
 #include_next <sys/select.h>
-#else  //! (__GNUC__ && POSIX)
+#else  //! WITH_GLIBC
 typedef int fd_set;
-#endif //! (__GNUC__ && POSIX)
+#endif //! WITH_GLIBC
 
 #endif // __MES_SYS_SELECT_H
 
index 3698331f27b7acdea3aa056e07a1126afa227d38..74998f1529e7dc5b463ec28c8b021147ccf3263b 100644 (file)
 #ifndef __MES_SYS_STAT_H
 #define __MES_SYS_STAT_H 1lei
 
-#if __GNUC__ && POSIX
+#if WITH_GLIBC
 #undef __MES_SYS_STAT_H
 #include_next <sys/stat.h>
 
-#else // !(__GNUC__ && POSIX)
+#else // ! WITH_GLIBC
 
 #include <sys/types.h>
 
@@ -75,6 +75,6 @@ int rmdir (char const *file_name);
 #define S_IWUSR 00200
 #define S_IRUSR 00400
 
-#endif // !(__GNUC__ && POSIX)
+#endif // ! WITH_GLIBC
 
 #endif // __MES_SYS_STAT_H
index b48b52301d7b1013cc05e39819aaa42ca43f386d..e8769fed4d304556ac6fd8af1bb284deba16d913 100644 (file)
 #ifndef __MES_SYS_TIME_H
 #define __MES_SYS_TIME_H 1
 
-#if __GNUC__ && POSIX
+#if WITH_GLIBC
 #undef __MES_SYS_TIME_H
 #include_next <sys/time.h>
 
-#else // !(__GNUC__ && POSIX)
+#else // ! WITH_GLIBC
 
 struct timeval
 {
@@ -51,6 +51,6 @@ struct itimerval
 int gettimeofday (struct timeval *tv, struct timezone *tz);
 int setitimer (int which, struct itimerval const *new, struct itimerval *old);
 
-#endif // !(__GNUC__ && POSIX)
+#endif // ! WITH_GLIBC
 
 #endif // __MES_SYS_TIME_H
index d89f4f968bf02fb00d46e0fc80d87d78fe58c427..5d1abf6cfde79f7ef7c9af7141739f3e5fd82771 100644 (file)
 #ifndef __MES_SYS_TIMEB_H
 #define __MES_SYS_TIMEB_H 1
 
-#if __GNUC__ && POSIX
+#if WITH_GLIBC
 #undef __MES_SYS_TIMEB_H
 #include_next <sys/timeb.h>
-#endif // (__GNUC__ && POSIX)
+#endif // (WITH_GLIBC)
 
 #endif // __MES_SYS_TIMEB_H
 
diff --git a/include/sys/times.h b/include/sys/times.h
new file mode 100644 (file)
index 0000000..60da88b
--- /dev/null
@@ -0,0 +1,49 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * Mes --- Maxwell Equations of Software
+ * Copyright © 2017 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of Mes.
+ *
+ * Mes is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * Mes is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+#ifndef __MES_SYS_TIMES_H
+#define __MES_SYS_TIMES_H 1
+
+#if WITH_GLIBC
+#undef __MES_SYS_TIMES_H
+#include_next <sys/times.h>
+
+#else // ! WITH_GLIBC
+
+#ifndef __MES_CLOCK_T
+#define __MES_CLOCK_T
+#undef clock_t
+typedef long clock_t;
+#endif
+
+#ifndef HZ
+#define HZ 100
+#endif
+
+struct tms
+{
+  clock_t tms_utime;
+  clock_t tms_stime;
+  clock_t tms_cutime;
+  clock_t tms_cstime;
+};
+
+#endif // ! WITH_GLIBC
+
+#endif // __MES_SYS_TIMES_H
index 87cbd30dcba81c605c2fc8ec4c446156fc3060ed..1e7c310b0ad1c646480b909587c459e5c964a39f 100644 (file)
 #ifndef __MES_SYS_TYPES_H
 #define __MES_SYS_TYPES_H 1
 
-#if __GNUC__ && POSIX
+#if WITH_GLIBC
 #undef __MES_SYS_TYPES_H
 #include_next <sys/types.h>
-#else // ! (__GNUC__ && POSIX)
+#else // ! WITH_GLIBC
 #include <endian.h>
 
-#ifndef __MES_SIZE_T
-#define __MES_SIZE_T
-#undef size_t
-typedef unsigned long size_t;
+#ifndef __MES_DEV_T
+#define __MES_DEV_T
+#undef dev_t
+typedef int dev_t;
+#endif
+
+#ifndef __MES_GID_T
+#define __MES_GID_T
+#undef gid_t
+typedef int gid_t;
+#endif
+
+#ifndef __MES_INO_T
+#define __MES_INO_T
+#undef ino_t
+typedef unsigned ino_t;
 #endif
 
 #ifndef __MES_PID_T
@@ -38,10 +50,10 @@ typedef unsigned long size_t;
 typedef int pid_t;
 #endif
 
-#ifndef __MES_GID_T
-#define __MES_GID_T
-#undef gid_t
-typedef int gid_t;
+#ifndef __MES_SIZE_T
+#define __MES_SIZE_T
+#undef size_t
+typedef unsigned long size_t;
 #endif
 
 #ifndef __MES_UID_T
@@ -50,6 +62,6 @@ typedef int gid_t;
 typedef int uid_t;
 #endif
 
-#endif // ! (__GNUC__ && POSIX)
+#endif // ! WITH_GLIBC
 
 #endif // __MES_SYS_TYPES_H
index 0d159402115ff2f754512773b7e57b6ebb76ac53..2de764935de7281c23d33f250b6925487a229e5b 100644 (file)
 #ifndef __MES_SYS_UCONTEXT_H
 #define __MES_SYS_UCONTEXT_H 1
 
-#if __GNUC__ && POSIX
+#if WITH_GLIBC
 #undef __MES_SYS_UCONTEXT_H
 #include_next <sys/ucontext.h>
-#endif // (__GNUC__ && POSIX)
+#endif // (WITH_GLIBC)
 
 #endif // __MES_SYS_UCONTEXT_H
 
index 03777b71fc99b135a9e94551d7ca23b740555eb2..a3ea1a152b8d89eba30e9209abba48d4c9693553 100644 (file)
 #ifndef __MES_SYS_USER_H
 #define __MES_SYS_USER_H 1
 
-#if __GNUC__ && POSIX
+#if WITH_GLIBC
 #undef __MES_SYS_USER_H
 #include_next <sys/user.h>
 
-#else // !(__GNUC__ && POSIX)
+#else // ! WITH_GLIBC
 
 /* These are the 32-bit x86 structures.  */
 struct user_fpregs_struct
@@ -104,6 +104,6 @@ struct user
 #define HOST_TEXT_START_ADDR   (u.start_code)
 #define HOST_STACK_END_ADDR    (u.start_stack + u.u_ssize * NBPG)
 
-#endif // !(__GNUC__ && POSIX)
+#endif // ! WITH_GLIBC
 
 #endif // __MES_SYS_USER_H
index 37bb299cd2e819bf158e46511909bc5f6c441482..aa4473fbe7d89c824573f0c574ff7c8b1ab16085 100644 (file)
 #ifndef __MES_SYS_WAIT_H
 #define __MES_SYS_WAIT_H 1
 
-#if __GNUC__ && POSIX
+#if WITH_GLIBC
 #undef __MES_SYS_WAIT_H
 #include_next <sys/wait.h>
-#else // !(__GNUC__ && POSIX)
+#else // ! WITH_GLIBC
 
 #ifndef __MES_PID_T
 #define __MES_PID_T
@@ -33,6 +33,6 @@ typedef int pid_t;
 pid_t waitpid (pid_t pid, int *status_ptr, int options);
 pid_t wait (int *status_ptr);
 
-#endif // !(__GNUC__ && POSIX)
+#endif // ! WITH_GLIBC
 
 #endif // __MES_SYS_WAIT_H
index e5219f6bb78c6b97cdd74da64a1381014bcccd6d..c8bd415f3e7efcb48cb178433418208e481f3cad 100644 (file)
 #ifndef __MES_TIME_H
 #define __MES_TIME_H 1
 
-#if __GNUC__ && POSIX
+#if WITH_GLIBC
 #undef __MES_TIME_H
 #include_next <time.h>
-#else // ! (__GNUC__ && POSIX)
+#else // ! WITH_GLIBC
 typedef int time_t;
 
 struct tm {
@@ -44,21 +44,22 @@ time_t time (time_t *tloc);
 #ifndef __MES_STRUCT_TIMESPEC
 #define __MES_STRUCT_TIMESPEC
 
-#ifndef __kernel_long_t
-typedef long           __kernel_long_t;
-typedef unsigned long  __kernel_ulong_t;
-#endif
+// #ifndef __kernel_long_t
+// typedef long                __kernel_long_t;
+// typedef unsigned long       __kernel_ulong_t;
+// #endif
 
-typedef __kernel_long_t        __kernel_time_t;
+// typedef __kernel_long_t     __kernel_time_t;
 
 struct timespec
 {
-  __kernel_time_t tv_sec;
+  //__kernel_time_t tv_sec;
+  long tv_sec;
   long tv_nsec;
 };
 
 #endif // __MES_STRUCT_TIMESPEC
 
-#endif // ! (__GNUC__ && POSIX)
+#endif // ! WITH_GLIBC
 
 #endif // __MES_TIME_H
index 9cf809b7014ee699b9ae8fa211d5e3c5b91faf42..bd21b4ddff69a879250ab8b6be0d4a33dd8be525 100644 (file)
 #ifndef __MES_UNISTD_H
 #define __MES_UNISTD_H 1
 
-#if __GNUC__ && POSIX
+#if WITH_GLIBC
 #ifndef _GNU_SOURCE
 #define _GNU_SOURCE
 #endif
 #undef __MES_UNISTD_H
 #include_next <unistd.h>
 
-#else // ! (__GNUC__ && POSIX)
+#else // ! WITH_GLIBC
 
 #ifndef NULL
 #define NULL 0
@@ -51,8 +51,20 @@ typedef unsigned long size_t;
 typedef long ssize_t;
 #endif
 
+#ifndef R_OK
+#define F_OK 0
+#define X_OK 1
+#define W_OK 2
+#define R_OK 4
+#endif
+
 int access (char const *s, int mode);
+unsigned int alarm (unsigned int seconds);
+#define alarm(x) {eputs ("alarm x="); eputs (itoa (x)); eputs ("\n"); kill (getpid (), 14);}
+#define atexit(x) eputs ("atexit\n")
+
 int close (int fd);
+int execv (char const *file_name, char *const argv[]);
 int execve (char const *file, char *const argv[], char *const env[]);
 int execvp (char const *file, char *const argv[]);
 int fork ();
@@ -62,6 +74,6 @@ off_t lseek (int fd, off_t offset, int whence);
 int read (int fd, void* buf, size_t n);
 int unlink (char const *file_name);
 int write (int fd, char const* s, int n);
-#endif // ! (__GNUC__ && POSIX)
+#endif // ! WITH_GLIBC
 
 #endif // __MES_UNISTD_H
index 00175ba3760d3d4265220e6b648e4be18a5797e4..1510b8d4f318aef6e3afff829637d16a8d532405 100644 (file)
@@ -157,8 +157,10 @@ strcspn (char const *string, char const *stopset)
 char *
 strncat (char *to, char const *from, size_t size)
 {
+  if (size == 0)
+    return to;
   char *p = strchr (to , '\0');
-  while (*from && size--)
+  while (*from && size-- > 1)
     *p++ = *from++;
   *p = 0;
   return to;
diff --git a/lib/crt0.c b/lib/crt0.c
new file mode 100644 (file)
index 0000000..08cbbc8
--- /dev/null
@@ -0,0 +1,61 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * Mes --- Maxwell Equations of Software
+ * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of Mes.
+ *
+ * Mes is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * Mes is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+// no clue what crt0.o is and why gcc-2.6.3 needs it
+
+// instead of calling main, it seems to call either _main or ___main,
+// let's try _main first
+
+char **environ = 0;
+int _main (int argc, char *argv[]);
+
+void
+_start ()
+{
+  asm (
+       "mov     %%ebp,%%eax\n\t"
+       "addl    $4,%%eax\n\t"
+       "movzbl  (%%eax),%%eax\n\t"
+       "addl    $3,%%eax\n\t"
+       "shl     $2,%%eax\n\t"
+       "add     %%ebp,%%eax\n\t"
+       "movl    %%eax,%0\n\t"
+       : "=environ" (environ)
+       : //no inputs ""
+       );
+  asm (
+       "mov     %%ebp,%%eax\n\t"
+       "addl    $8,%%eax\n\t"
+       "push    %%eax\n\t"
+
+       "mov     %%ebp,%%eax\n\t"
+       "addl    $4,%%eax\n\t"
+       "movzbl  (%%eax),%%eax\n\t"
+       "push    %%eax\n\t"
+
+       "call    _main\n\t"
+
+       "mov     %%eax,%%ebx\n\t"
+       "mov     $1,%%eax\n\t"
+       "int     $0x80\n\t"
+       "hlt      \n\t"
+       :
+       );
+}
diff --git a/lib/gcc.c b/lib/gcc.c
new file mode 100644 (file)
index 0000000..27ae03e
--- /dev/null
+++ b/lib/gcc.c
@@ -0,0 +1,48 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * Mes --- Maxwell Equations of Software
+ * Copyright © 2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of Mes.
+ *
+ * Mes is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * Mes is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <libmes.h>
+#include <stdint.h>
+#include <time.h>
+#include <sys/time.h>
+
+FILE *
+freopen (char const *file_name, char const *opentype, FILE *stream)
+{
+  fclose (stream);
+  return fopen (file_name, opentype);
+}
+
+clock_t
+times (struct tms *buffer)
+{
+  eputs ("times stub\n");
+  return 0;
+}
+
+unsigned int
+sleep (unsigned int seconds)
+{
+  struct timespec requested_time;
+  struct timespec remaining;
+  requested_time.tv_sec = seconds;
+  requested_time.tv_nsec = 0;
+  return nanosleep (&requested_time, &remaining);
+}
index 543291103dc3a59f4b5a04daab68addf36778495..31229180b8210fc4060c968ccc385c61acd02353 100644 (file)
@@ -18,6 +18,9 @@
  * along with Mes.  If not, see <http://www.gnu.org/licenses/>.
  */
 
+#include <sys/time.h>
 #include <libc+tcc.c>
+#include <linux+gnu-gcc.c>
 #include <m4.c>
 #include <binutils.c>
+#include <gcc.c>
index d3ee7372d405123dc4ec2d696bf8b1985b73fbc4..26ed30116c77a574459ca14f1dfadffd588ea3d4 100644 (file)
@@ -1,6 +1,7 @@
 /* -*-comment-start: "//";comment-end:""-*-
  * Mes --- Maxwell Equations of Software
  * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ * Copyright © 2018 Jeremiah Orians <jeremiah@pdp10.guru>
  * Copyright (C) 2018 Han-Wen Nienhuys <hanwen@xs4all.nl>
  *
  * This file is part of Mes.
@@ -19,6 +20,8 @@
  * along with Mes.  If not, see <http://www.gnu.org/licenses/>.
  */
 
+#include <errno.h>
+#include <fcntl.h>
 #include <setjmp.h>
 #include <stdarg.h>
 #include <stdio.h>
@@ -57,13 +60,65 @@ dlopen (char const *filename, int flags)
   return 0;
 }
 
-int
-execvp (char const *file, char *const argv[])
+char *
+search_path (char const *file_name)
 {
-  eputs ("execvp stub\n");
+  static char buf[256];
+  char *path = getenv ("PATH");
+  if (getenv ("MESC_DEBUG"))
+    {
+      eputs ("\n search-path: "); eputs (file_name); eputs ("\n");
+    }
+  while (*path)
+    {
+      char *end = strchr (path, ':');
+      if (!end)
+        end = strchr (path, '\0');
+      strncpy (buf, path, end - path);
+      buf[end - path] = 0;
+      if (getenv ("MESC_DEBUG"))
+        {
+          eputs (" dir: "); eputs (buf); eputs ("\n");
+        }
+      if (buf[end - path] != '/')
+        strcat (buf, "/");
+      strcat (buf, file_name);
+      if (!access (buf, X_OK))
+        {
+          if (getenv ("MESC_DEBUG"))
+            {
+              eputs (" found: "); eputs (buf); eputs ("\n");
+            }
+          return buf;
+        }
+      path = end + 1;
+    }
   return 0;
 }
 
+int
+execvp (char const *file_name, char *const argv[])
+{
+  if (file_name[0] != '/')
+    file_name = search_path (file_name);
+  if (!file_name)
+    {
+      errno = ENOENT;
+      return -1;
+    }
+  if (getenv ("MESC_DEBUG"))
+    {
+      eputs (" EXEC: "); eputs (file_name); eputs ("\n");
+      int i = 0;
+      while (argv[i])
+        {
+          eputs (" arg["); eputs (itoa (i)); eputs ("]: "); eputs (argv[i]); eputs ("\n");
+          i++;
+        }
+    }
+  return execve (file_name, argv, environ);
+}
+
 int
 fclose (FILE *stream)
 {
@@ -110,7 +165,18 @@ fread (void *data, size_t size, size_t count, FILE *stream)
   if (bytes > 0)
     return bytes/size;
 
-  return bytes;
+  return 0;
+}
+
+size_t
+fwrite (void const *data, size_t size, size_t count, FILE *stream)
+{
+  if (! size || !count)
+    return 0;
+  int bytes = write ((int)stream, data, size * count);
+  if (bytes > 0)
+    return bytes/size;
+  return 0;
 }
 
 long
@@ -119,6 +185,31 @@ ftell (FILE *stream)
   return lseek ((int)stream, 0, SEEK_CUR);
 }
 
+FILE*
+fopen (char const *file_name, char const *opentype)
+{
+  int fd;
+  if (opentype[0] == 'a')
+    {
+      fd = open (file_name, O_RDONLY);
+      if (fd > 0)
+        {
+          close (fd);
+          fd = open (file_name, O_RDWR);
+          lseek (fd, 0, SEEK_END);
+          return fd;
+        }
+    }
+  if (opentype[0] == 'w' || opentype[0] == 'a')
+    /* 577 is O_WRONLY|O_CREAT|O_TRUNC, 384 is 600 in octal */
+    fd = open (file_name, 577 , 384);
+  else
+    /* Everything else is a read */
+    fd = open (file_name, 0, 0);
+
+  return (FILE*)fd;
+}
+
 int
 fseek (FILE *stream, long offset, int whence)
 {
@@ -262,7 +353,6 @@ sscanf (char const *str, const char *template, ...)
   int r = vsscanf (str, template, ap);
   va_end (ap);
   return r;
-  return 0;
 }
 
 char *
@@ -289,16 +379,18 @@ strchr (char const *s, int c)
 }
 
 char *
-strncpy (char *dest, char const *src, size_t length)
-{
-  char *p = dest;
-  while (*src && length--)
-    *p++ = *src++;
-  if (*src)
-    length++;
-  while (length--)
+strncpy (char *to, char const *from, size_t size)
+{
+  if (size == 0)
+    return to;
+  char *p = to;
+  while (*from && size--)
+    *p++ = *from++;
+  if (*from)
+    size++;
+  while (size--)
     *p++ = 0;
-  return dest;
+  return to;
 }
 
 char *
@@ -431,6 +523,58 @@ calloc (size_t nmemb, size_t size)
   return p;
 }
 
+
+int
+islower (int c)
+{
+  return c >= 'a' && c <= 'z';
+}
+int
+isupper (int c)
+{
+  return c >= 'A' && c <= 'Z';
+}
+
+int
+tolower (int c)
+{
+  if (isupper (c))
+    return c + ('a' - 'A');
+  return c;
+}
+
+int
+toupper (int c)
+{
+  if (islower (c))
+    return c - ('a' - 'A');
+  return c;
+}
+
+char *
+strlwr (char *string)
+{
+  char *p = string;
+  while (*p)
+    {
+      *p = tolower (*p);
+      p++;
+    }
+  return string;
+}
+
+char *
+strupr (char *string)
+{
+  char *p = string;
+  while (*p)
+    {
+      *p = toupper (*p);
+      p++;
+    }
+  return string;
+}
+
 int
 vfprintf (FILE* f, char const* format, va_list ap)
 {
@@ -443,12 +587,90 @@ vfprintf (FILE* f, char const* format, va_list ap)
       {
         p++;
         char c = *p;
+        int left_p = 0;
+        int precision_p = 0;
+        int width = -1;
+        if (c == 'l')
+          c = *++p;
+        if (c == '-')
+          {
+            left_p = 1;
+            c = *++p;
+          }
+        if (c == '.')
+          {
+            precision_p = 1;
+            c = *++p;
+          }
+        char pad = ' ';
+        if (c == '0')
+          {
+            pad = c;
+            c = *p++;
+          }
+        if (c >= '0' && c <= '9')
+          {
+            width = abtoi (&p, 10);
+            c = *p;
+          }
+        else if (c == '*')
+          {
+            width = va_arg (ap, int);
+            c = *++p;
+          }
+        if (c == 'l')
+          c = *++p;
         switch (c)
           {
           case '%': {fputc (*p, fd); break;}
-          case 'c': {char c; c = va_arg (ap, char); fputc (c, fd); break;}
-          case 'd': {int d; d = va_arg (ap, int); fputs (itoa (d), fd); break;}
-          case 's': {char *s; s = va_arg (ap, char *); fputs (s, fd); break;}
+          case 'c': {char c; c = va_arg (ap, int); fputc (c, fd); break;}
+          case 'd':
+          case 'i':
+          case 'o':
+          case 'u':
+          case 'x':
+          case 'X':
+            {
+              int d = va_arg (ap, int);
+              int base = c == 'o' ? 8
+                : c == 'x' || c == 'X' ? 16
+                : 10;
+              char const *s = number_to_ascii (d, base, c != 'u' && c != 'x' && c != 'X');
+              if (c == 'X')
+                strupr (s);
+              if (!precision_p && width >= 0)
+                width = width - strlen (s);
+              if (!left_p && !precision_p)
+                while (!precision_p && width-- > 0)
+                  fputc (pad, f);
+              while (*s)
+                {
+                  if (precision_p && width-- == 0)
+                    break;
+                  fputc (*s++, f);
+                }
+              while (!precision_p && width-- > 0)
+                fputc (pad, f);
+              break;
+            }
+          case 's':
+            {
+              char *s = va_arg (ap, char *);
+              if (!precision_p && width >= 0)
+                width = width - strlen (s);
+              if (!left_p && !precision_p)
+                while (!precision_p && width-- > 0)
+                  fputc (pad, f);
+              while (*s)
+                {
+                  if (precision_p && width-- == 0)
+                    break;
+                  fputc (*s++, f);
+                }
+              while (!precision_p && width-- > 0)
+                fputc (pad, f);
+              break;
+            }
           default:
             {
               eputs ("vfprintf: not supported: %");
@@ -474,6 +696,7 @@ vsscanf (char const *s, char const *template, va_list ap)
 {
   char const *p = s;
   char const *t = template;
+  int count = 0;
   while (*t && *p)
     if (*t != '%')
       {
@@ -487,10 +710,22 @@ vsscanf (char const *s, char const *template, va_list ap)
         switch (c)
           {
           case '%': {p++; break;}
-          case 'c': {char *c = va_arg (ap, char*); *c = *p++; break;}
+          case 'c':
+            {
+              char *c = va_arg (ap, char*);
+              *c = *p++;
+              count++;
+              break;
+            }
           case 'd':
           case 'i':
-          case 'u': {int *d = va_arg (ap, int*); *d = abtoi (&p, 10); break;}
+          case 'u':
+            {
+              int *d = va_arg (ap, int*);
+              *d = abtoi (&p, 10);
+              count++;
+              break;
+            }
           default:
             {
               eputs ("vsscanf: not supported: %");
@@ -503,7 +738,7 @@ vsscanf (char const *s, char const *template, va_list ap)
         t++;
       }
   va_end (ap);
-  return 0;
+  return count;
 }
 
 int
@@ -518,12 +753,20 @@ vsprintf (char *str, char const* format, va_list ap)
         p++;
         char c = *p;
         int left_p = 0;
+        int precision_p = 0;
         int width = -1;
+        if (c == 'l')
+          c = *++p;
         if (c == '-')
           {
             left_p = 1;
             c = *++p;
           }
+        if (c == '.')
+          {
+            precision_p = 1;
+            c = *++p;
+          }
         char pad = ' ';
         if (c == '0')
           {
@@ -535,28 +778,64 @@ vsprintf (char *str, char const* format, va_list ap)
             width = abtoi (&p, 10);
             c = *p;
           }
+        else if (c == '*')
+          {
+            width = va_arg (ap, int);
+            c = *++p;
+          }
+        if (c == 'l')
+          c = *++p;
         switch (c)
           {
           case '%': {*str++ = *p; break;}
-          case 'c': {char c; c = va_arg (ap, char); *str++ = c; break;}
+          case 'c': {c = va_arg (ap, int); *str++ = c; break;}
           case 'd':
           case 'i':
+          case 'o':
           case 'u':
+          case 'x':
+          case 'X':
             {
               int d = va_arg (ap, int);
-              char const *s = itoa (d);
-              if (width >= 0)
+              int base = c == 'o' ? 8
+                : c == 'x' || c == 'X' ? 16
+                : 10;
+              char const *s = number_to_ascii (d, base, c != 'u' && c != 'x' && c != 'X');
+              if (c == 'X')
+                strupr (s);
+              if (!precision_p && width >= 0)
+                width = width - strlen (s);
+              if (!left_p && !precision_p)
+                while (!precision_p && width-- > 0)
+                  *str++ = pad;
+              while (*s)
+                {
+                  if (precision_p && width-- == 0)
+                    break;
+                  *str++ = *s++;
+                }
+              while (!precision_p && width-- > 0)
+                *str++ = pad;
+              break;
+            }
+          case 's':
+            {
+              char *s = va_arg (ap, char *);
+              if (!precision_p && width >= 0)
                 width = width - strlen (s);
-              if (!left_p)
-                while (width-- > 0)
+              if (!left_p && !precision_p)
+                while (!precision_p && width-- > 0)
                   *str++ = pad;
               while (*s)
-                *str++ = *s++;
-              while (width-- > 0)
+                {
+                  if (precision_p && width-- == 0)
+                    break;
+                  *str++ = *s++;
+                }
+              while (!precision_p && width-- > 0)
                 *str++ = pad;
               break;
             }
-          case 's': {char *s; s = va_arg (ap, char *); while (*s) *str++ = *s++; break;}
           default:
             {
               eputs ("vsprintf: not supported: %");
index b4c3f19826231aa265ad7c43d00a85dabb1a2356..18eff3213d54ddfb4ab9d2ebd7e4b49fd0590e19 100644 (file)
@@ -1,7 +1,6 @@
 /* -*-comment-start: "//";comment-end:""-*-
  * Mes --- Maxwell Equations of Software
  * Copyright © 2016,2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
- * Copyright © 2018 Jeremiah Orians <jeremiah@pdp10.guru>
  *
  * This file is part of Mes.
  *
@@ -36,7 +35,6 @@
 
 #else // !__MESC__
 
-#include <fcntl.h>
 #include <assert.h>
 
 #include <linux-gcc.c>
@@ -81,20 +79,6 @@ putc (int c, FILE* stream)
   return fdputc (c, (int)stream);
 }
 
-FILE*
-fopen (char const* file_name, char const* mode)
-{
-  int fd;
-  if ('w' == mode[0])
-    /* 577 is O_WRONLY|O_CREAT|O_TRUNC, 384 is 600 in octal */
-    fd = open (file_name, 577 , 384);
-  else
-    /* Everything else is a read */
-    fd = open (file_name, 0, 0);
-
-  return (FILE*)fd;
-}
-
 void
 assert_fail (char* s)
 {
@@ -186,6 +170,8 @@ realloc (void *ptr, size_t size)
 int
 strncmp (char const* a, char const* b, size_t size)
 {
+  if (!size)
+    return 0;
   while (*a && *b && *a == *b && --size)
     {
       a++;
@@ -194,17 +180,6 @@ strncmp (char const* a, char const* b, size_t size)
   return *a - *b;
 }
 
-size_t
-fwrite (void const *data, size_t size, size_t count, FILE *stream)
-{
-  if (! size || !count)
-    return 0;
-  int bytes = write ((int)stream, data, size * count);
-  if (bytes > 0)
-    return count;
-  return bytes;
-}
-
 char *
 getenv (char const* s)
 {
@@ -252,3 +227,9 @@ wait (int *status_ptr)
 {
   return waitpid  (-1, status_ptr, 0);
 }
+
+int
+execv (char const *file_name, char *const argv[])
+{
+  return execve (file_name, argv, environ);
+}
diff --git a/lib/libg.c b/lib/libg.c
new file mode 100644 (file)
index 0000000..2c4a606
--- /dev/null
@@ -0,0 +1,96 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * Mes --- Maxwell Equations of Software
+ * Copyright © 2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of Mes.
+ *
+ * Mes is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * Mes is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+// gcc/xgcc wants -lg with all these
+// what's the story here?
+
+#include <sys/time.h>
+
+#define exit __exit
+#define fprintf _fprintf
+#define longjmp _longjmp
+#define malloc _malloc
+#define printf _printf
+#define putchar _putchar
+#define setjmp _setjmp
+#define signal _signal
+#define strcmp _strcmp
+#define sprintf _sprintf
+#define sscanf _sscanf
+
+#include <libc+tcc.c>
+#include <linux+gnu-gcc.c>
+#include <m4.c>
+#include <binutils.c>
+#include <gcc.c>
+
+int
+__cleanup ()
+{
+  eputs ("cleanup stub\n");
+  return 0;
+}
+
+int
+_dprop ()
+{
+  eputs ("dprop stub\n");
+}
+
+int
+_edprop ()
+{
+  eputs ("edprop stub\n");
+}
+
+int
+_eldprop ()
+{
+  eputs ("eldprop stub\n");
+}
+
+int
+_iprop ()
+{
+  eputs ("iprop stub\n");
+}
+
+int
+_lprop ()
+{
+  eputs ("lprop stub\n");
+}
+
+int
+_ldprop ()
+{
+  eputs ("ldprop stub\n");
+}
+
+int
+_uiprop ()
+{
+  eputs ("uiprop stub\n");
+}
+int
+_ulprop ()
+{
+  eputs ("ulprop stub\n");
+}
index fa67879dc3759c20346e793570f90de2a3c67031..f6a04d7868dae67669e035fb86388bab15a211bb 100644 (file)
@@ -84,7 +84,7 @@ atoi (char const *s)
 }
 
 char const*
-itoa (int x)
+number_to_ascii (int x, int base, int signed_p)
 {
   static char itoa_buf[12];
   char *p = itoa_buf + 11;
@@ -92,7 +92,7 @@ itoa (int x)
 
   int sign = 0;
   unsigned u = x;
-  if (x < 0)
+  if (signed_p && x < 0)
     {
       sign = 1;
       u = -x;
@@ -100,8 +100,9 @@ itoa (int x)
 
   do
      {
-       *p-- = '0' + (u % 10);
-       u = u / 10;
+       int i = u % base;
+       *p-- = i > 9 ? 'a' + i - 10 : '0' + i;
+       u = u / base;
      } while (u);
 
   if (sign && *(p + 1) != '0')
@@ -113,29 +114,19 @@ itoa (int x)
 char const*
 itoab (int x, int base)
 {
-  static char itoa_buf[12];
-  char *p = itoa_buf + 11;
-  *p-- = 0;
-
-  int sign = 0;
-  unsigned u = x;
-  if (x < 0)
-    {
-      sign = 1;
-      u = -x;
-    }
-
-  do
-     {
-       int i = u % base;
-       *p-- = i > 9 ? 'a' + i - 10 : '0' + i;
-       x = u / base;
-     } while (u);
+  return number_to_ascii (x, base, 1);
+}
 
-  if (sign && *(p + 1) != '0')
-    *p-- = '-';
+char const*
+itoa (int x)
+{
+  return number_to_ascii (x, 10, 1);
+}
 
-  return p+1;
+char const*
+utoa (unsigned x)
+{
+  return number_to_ascii (x, 10, 0);
 }
 
 int _ungetc_pos = -1;
@@ -187,7 +178,7 @@ fdungetc (int c, int fd)
   return c;
 }
 
-#if POSIX
+#if POSIX || __x86_64__
 #define STDERR 2
 int
 eputs (char const* s)
diff --git a/lib/linux+gnu-gcc.c b/lib/linux+gnu-gcc.c
new file mode 100644 (file)
index 0000000..e6cd0df
--- /dev/null
@@ -0,0 +1,179 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * Mes --- Maxwell Equations of Software
+ * Copyright © 2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of Mes.
+ *
+ * Mes is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * Mes is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#define SYS_link   "0x09"
+#define SYS_rename "0x26"
+#define SYS_mkdir  "0x27"
+#define SYS_dup    "0x29"
+#define SYS_pipe   "0x2a"
+#define SYS_lstat  "0x6b"
+#define SYS_fstat  "0x6c"
+
+#define SYS_kill 0x25
+#define SYS_nanosleep 0xa2
+
+int
+link (char const *old_name, char const *new_name)
+{
+#if !__TINYC__
+  int r;
+  asm (
+       "mov    %1,%%ebx\n\t"
+       "mov    %2,%%ecx\n\t"
+
+       "mov    $"SYS_link",%%eax\n\t"
+       "int  $0x80\n\t"
+
+       "mov    %%eax,%0\n\t"
+       : "=r" (r)
+       : "" (old_name), "" (new_name)
+       : "eax", "ebx", "ecx"
+       );
+  return r;
+#endif
+}
+
+int
+kill (pid_t pid, int signum)
+{
+  return _sys_call2 (SYS_kill, pid, signum);
+}
+
+int
+rename (char const *old_name, char const *new_name)
+{
+#if !__TINYC__
+  int r;
+  asm (
+       "mov    %1,%%ebx\n\t"
+       "mov    %2,%%ecx\n\t"
+
+       "mov    $"SYS_rename",%%eax\n\t"
+       "int  $0x80\n\t"
+
+       "mov    %%eax,%0\n\t"
+       : "=r" (r)
+       : "" (old_name), "" (new_name)
+       : "eax", "ebx", "ecx"
+       );
+  return r;
+#endif
+}
+
+int
+mkdir (char const *s, mode_t mode)
+{
+#if !__TINYC__
+  int r;
+  asm (
+       "mov    %1,%%ebx\n\t"
+       "mov    %2,%%ecx\n\t"
+       "mov    $"SYS_mkdir",%%eax\n\t"
+       "int    $0x80\n\t"
+       "mov    %%eax,%0\n\t"
+       : "=r" (r)
+       : "" (s), "" (mode)
+       : "eax", "ebx", "ecx"
+       );
+  return r;
+#endif
+}
+
+int
+dup (int old)
+{
+#if !__TINYC__
+  int r;
+  asm (
+       "mov    %0,%%ebx\n\t"
+       "mov    $"SYS_dup",%%eax\n\t"
+       "int    $0x80"
+       : "=r" (r)
+       : "" (old)
+       );
+  return r;
+#endif
+}
+
+int
+pipe (int filedes[2])
+{
+#if !__TINYC__
+  int r;
+  asm (
+       "mov    %0,%%ebx\n\t"
+       "mov    $"SYS_pipe",%%eax\n\t"
+       "int    $0x80"
+       : "=r" (r)
+       : "" (filedes)
+       );
+  return r;
+#endif
+}
+
+int
+lstat (char const *file_name, struct stat *statbuf)
+{
+#if !__TINYC__
+  int r;
+  asm (
+       "mov    %1,%%ebx\n\t"
+       "mov    %2,%%ecx\n\t"
+
+       "mov    $"SYS_lstat",%%eax\n\t"
+       "int  $0x80\n\t"
+
+       "mov    %%eax,%0\n\t"
+       : "=r" (r)
+       : "" (file_name), "" (statbuf)
+       : "eax", "ebx", "ecx"
+       );
+  return r;
+#endif
+}
+
+int
+nanosleep (const struct timespec *requested_time,
+           struct timespec *remaining)
+{
+  return _sys_call2 (SYS_execve, (int)requested_time, (int)remaining);
+}
+
+int
+fstat (int fd, struct stat *statbuf)
+{
+#if !__TINYC__
+  int r;
+  asm (
+       "mov    %1,%%ebx\n\t"
+       "mov    %2,%%ecx\n\t"
+
+       "mov    $"SYS_fstat",%%eax\n\t"
+       //"mov    $"SYS_oldfstat",%%eax\n\t"
+       "int  $0x80\n\t"
+
+       "mov    %%eax,%0\n\t"
+       : "=r" (r)
+       : "" (fd), "" (statbuf)
+       : "eax", "ebx", "ecx"
+       );
+  return r;
+#endif
+}
index 61d0c592347b5fe81ab33cc515d51193608fa417..d73772ad30198b539b2908368d044d14434a9537 100644 (file)
  */
 
 #define SYS_close  "0x06"
-#define SYS_link   "0x09"
-#define SYS_unlink "0x0a"
 #define SYS_lseek  "0x13"
-#define SYS_access "0x21"
-#define SYS_rename "0x26"
-#define SYS_mkdir  "0x27"
+#define SYS_unlink "0x0a"
 #define SYS_rmdir  "0x28"
 #define SYS_stat   "0x6a"
-#define SYS_lstat  "0x6b"
-#define SYS_fstat  "0x6c"
 #define SYS_getcwd "0xb7"
 
 int
@@ -47,43 +41,6 @@ close (int fd)
 #endif
 }
 
-int
-link (char const *old_name, char const *new_name)
-{
-#if !__TINYC__
-  int r;
-  asm (
-       "mov    %1,%%ebx\n\t"
-       "mov    %2,%%ecx\n\t"
-
-       "mov    $"SYS_link",%%eax\n\t"
-       "int  $0x80\n\t"
-
-       "mov    %%eax,%0\n\t"
-       : "=r" (r)
-       : "" (old_name), "" (new_name)
-       : "eax", "ebx", "ecx"
-       );
-  return r;
-#endif
-}
-
-int
-unlink (char const *file_name)
-{
-#if !__TINYC__
-  int r;
-  asm (
-       "mov    %0,%%ebx\n\t"
-       "mov    $"SYS_unlink",%%eax\n\t"
-       "int    $0x80"
-       : "=r" (r)
-       : "" (file_name)
-       );
-  return r;
-#endif
-}
-
 off_t
 lseek (int fd, off_t offset, int whence)
 {
@@ -107,40 +64,16 @@ lseek (int fd, off_t offset, int whence)
 }
 
 int
-rename (char const *old_name, char const *new_name)
-{
-#if !__TINYC__
-  int r;
-  asm (
-       "mov    %1,%%ebx\n\t"
-       "mov    %2,%%ecx\n\t"
-
-       "mov    $"SYS_rename",%%eax\n\t"
-       "int  $0x80\n\t"
-
-       "mov    %%eax,%0\n\t"
-       : "=r" (r)
-       : "" (old_name), "" (new_name)
-       : "eax", "ebx", "ecx"
-       );
-  return r;
-#endif
-}
-
-int
-mkdir (char const *s, mode_t mode)
+unlink (char const *file_name)
 {
 #if !__TINYC__
   int r;
   asm (
-       "mov    %1,%%ebx\n\t"
-       "mov    %2,%%ecx\n\t"
-       "mov    $"SYS_mkdir",%%eax\n\t"
-       "int    $0x80\n\t"
-       "mov    %%eax,%0\n\t"
+       "mov    %0,%%ebx\n\t"
+       "mov    $"SYS_unlink",%%eax\n\t"
+       "int    $0x80"
        : "=r" (r)
-       : "" (s), "" (mode)
-       : "eax", "ebx", "ecx"
+       : "" (file_name)
        );
   return r;
 #endif
@@ -179,49 +112,8 @@ stat (char const *file_name, struct stat *statbuf)
        : "" (file_name), "" (statbuf)
        : "eax", "ebx", "ecx"
        );
-  return r;
-#endif
-}
-
-int
-lstat (char const *file_name, struct stat *statbuf)
-{
-#if !__TINYC__
-  int r;
-  asm (
-       "mov    %1,%%ebx\n\t"
-       "mov    %2,%%ecx\n\t"
-
-       "mov    $"SYS_lstat",%%eax\n\t"
-       "int  $0x80\n\t"
-
-       "mov    %%eax,%0\n\t"
-       : "=r" (r)
-       : "" (file_name), "" (statbuf)
-       : "eax", "ebx", "ecx"
-       );
-  return r;
-#endif
-}
-
-int
-fstat (int fd, struct stat *statbuf)
-{
-#if !__TINYC__
-  int r;
-  asm (
-       "mov    %1,%%ebx\n\t"
-       "mov    %2,%%ecx\n\t"
-
-       "mov    $"SYS_fstat",%%eax\n\t"
-       //"mov    $"SYS_oldfstat",%%eax\n\t"
-       "int  $0x80\n\t"
-
-       "mov    %%eax,%0\n\t"
-       : "=r" (r)
-       : "" (fd), "" (statbuf)
-       : "eax", "ebx", "ecx"
-       );
+  if (r < 0)
+    errno = -r;
   return r;
 #endif
 }
index 435d73eecc3b279f2061903a370e3b979517577b..8013371ac5f1c4fb1eaae74dab9b3df702143e19 100644 (file)
@@ -43,7 +43,7 @@ rmdir (char const *file_name)
 {
   asm ("mov____0x8(%ebp),%ebx !8");
 
-  asm ("mov____$i32,%eax SYS_unlink");
+  asm ("mov____$i32,%eax SYS_rmdir");
   asm ("int____$0x80");
 }
 
index 1b2bde753d6c68dc3a11750f388cf9fe1fb69c5e..5ed78460f859c3c2b403ae05c4173084d2a216ec 100644 (file)
@@ -18,6 +18,7 @@
  * along with Mes.  If not, see <http://www.gnu.org/licenses/>.
  */
 
+#include <errno.h>
 #include <stdio.h>
 #include <libmes.h>
 #include <stdlib.h>
 #define SYS_read    "0x03"
 #define SYS_open    "0x05"
 #define SYS_waitpid "0x07"
-#define SYS_execve  "0x0b"
+#define SYS_execve   0x0b
 #define SYS_chmod   "0x0f"
 #define SYS_access  "0x21"
 #define SYS_brk     "0x2d"
 #define SYS_ioctl   "0x36"
 #define SYS_fsync   "0x76"
 
+#define xSYS_execve   "0x0b"
+
+int
+_sys_call2 (int sys_call, int one, int two)
+{
+#if !__TINYC__
+  int r;
+  asm (
+       "mov    %2,%%ebx\n\t"
+       "mov    %3,%%ecx\n\t"
+
+       "mov    %1,%%eax\n\t"
+       "int    $0x80\n\t"
+       "mov    %%eax,%0\n\t"
+       : "=r" (r)
+       : "" (sys_call), "" (one), "" (two)
+       : "eax", "ebx", "ecx"
+       );
+  if (r < 0)
+    errno = -r;
+  return r;
+#endif
+}
+
+int
+_sys_call3 (int sys_call, int one, int two, int three)
+{
+#if !__TINYC__
+  int r;
+  asm (
+       "mov    %2,%%ebx\n\t"
+       "mov    %3,%%ecx\n\t"
+       "mov    %4,%%edx\n\t"
+
+       "mov    %1,%%eax\n\t"
+       "int    $0x80\n\t"
+
+       "mov    %%eax,%0\n\t"
+       : "=r" (r)
+       : "" (sys_call), "" (one), "" (two), "" (three)
+       : "eax", "ebx", "ecx", "edx"
+       );
+    if (r < 0)
+      errno = -r;
+  return r;
+#endif
+}
+
 int
 fork ()
 {
@@ -131,23 +180,7 @@ waitpid (pid_t pid, int *status_ptr, int options)
 int
 execve (char const* file_name, char *const argv[], char *const env[])
 {
-#if !__TINYC__
-  int r;
-  asm (
-       "mov    %1,%%ebx\n\t"
-       "mov    %2,%%ecx\n\t"
-       "mov    %3,%%edx\n\t"
-
-       "mov    $"SYS_execve",%%eax\n\t"
-       "int    $0x80\n\t"
-
-       "mov    %%eax,%0\n\t"
-       : "=r" (r)
-       : "" (file_name), "" (argv), "" (env)
-       : "eax", "ebx", "ecx", "edx"
-       );
-  return r;
-#endif
+  return _sys_call3 (SYS_execve, (int)file_name, (int)argv, (int)env);
 }
 
 int
index 54326c52fb8f01369406b587159a9a38c6a7f5ef..da1102bbe8098d8cbb31d8d2a74af8f716b7e268 100644 (file)
--- a/lib/m4.c
+++ b/lib/m4.c
@@ -100,12 +100,6 @@ iscntrl (int c)
   return c >= 0 && c < 32;
 }
 
-int
-islower (int c)
-{
-  return c >= 'a' && c <= 'z';
-}
-
 int
 isprint (int c)
 {
@@ -118,17 +112,17 @@ ispunct (int c)
   return isprint (c) && !isspace (c) && !isalnum (c);
 }
 
-int
-isupper (int c)
-{
-  return c >= 'A' && c <= 'Z';
-}
-
 char *
 mktemp (char *template)
 {
-  char *p = strchr (template, '0');
-  *--p = &p;
+  char *p = strchr (template, '\0');
+  int q = (int)template;
+  *--p = ((unsigned char)(q >> 4)) % 26 + 'a';
+  *--p = ((unsigned char)(q >> 8)) % 26 + 'a';
+  *--p = ((unsigned char)(q >> 12)) % 26 + 'a';
+  *--p = ((unsigned char)(q >> 16)) % 26 + 'a';
+  *--p = ((unsigned char)(q >> 20)) % 26 + 'a';
+  *--p = ((unsigned char)(q >> 24)) % 26 + 'a';
   return template;
 }
 
@@ -193,19 +187,3 @@ system (int x)
   eputs ("system stub\n");
   return 0;
 }
-
-int
-tolower (int c)
-{
-  if (isupper (c))
-    return c + ('a' - 'A');
-  return c;
-}
-
-int
-toupper (int c)
-{
-  if (islower (c))
-    return c - ('a' - 'A');
-  return c;
-}
index 3c1e0f6fb8cb2474ce67cfa5dd3f500c0f02bf1b..277c04d8b434174a436d22f9bf63b296c9ebcd69 100644 (file)
@@ -217,6 +217,7 @@ DEFINE movzwl_0x8(%ebp),%eax 0fb745
 DEFINE SYS_exit   01000000
 DEFINE SYS_fork   02000000
 DEFINE SYS_read   03000000
+DEFINE SYS_rmdir  28000000
 DEFINE SYS_write  04000000
 DEFINE SYS_open   05000000
 DEFINE SYS_close  06000000
index 3ab20d30a0b1597db2b2009c17da56201d861f3e..d23126f25954de0f49edd918e04f8c3d26968c20 100644 (file)
 #include <stdio.h>
 #include <string.h>
 
+#if __i386__
+#define strncmp xstrncmp
+int
+strncmp (char const* a, char const* b, size_t size)
+{
+  if (!size)
+    return 0;
+  while (*a && *b && *a == *b && --size)
+    {
+      a++;
+      b++;
+    }
+  return *a - *b;
+}
+#endif
+
 int
 test ()
 {
@@ -69,7 +85,7 @@ test ()
   if (!strncmp ("abc", "x", 1))
     return 10;
 
-  if (!strncmp ("abc", "", 0))
+  if (strncmp ("abc", "", 0))
     return 11;
 
   return 0;
index 46ffcc3a77e0a1023cf3f92dc5249ba18470a646..d62e3825da2207a74566ec1757a756deb78fcaf1 100644 (file)
@@ -21,6 +21,7 @@
 #include "30-test.i"
 #include <stdio.h>
 #include <string.h>
+#include <stdarg.h>
 
 int
 test ()
@@ -66,5 +67,72 @@ test ()
   if (strcmp (buf, ">44<"))
     return 7;
 
+  printf (">>%.*s<<\n", 5, "hello, world");
+  printf (">>%.*s<<\n", 20, "hello, world");
+
+  printf (">>%.*s<<\n", 10, "foo");
+  printf (">>%*s<<\n", 10, "bar");
+  printf (">>%-*s<<\n", 10, "baz");
+
+  sprintf (buf, "%ld", 42);
+  eputs ("buf="); eputs (buf); eputs ("\n");
+  if (strcmp (buf, "42"))
+    return 8;
+
+  sprintf (buf, "%u", -1);
+  eputs ("buf="); eputs (buf); eputs ("\n");
+  if (strcmp (buf, "4294967295"))
+    return 9;
+
+  sprintf (buf, ">>%.5s<<\n", "hello, world");
+  eputs ("buf="); eputs (buf);
+  if (strcmp (buf, ">>hello<<\n"))
+    return 10;
+
+  sprintf (buf, ">>%.*s<<\n", 5, "hello, world");
+  eputs ("buf="); eputs (buf);
+  if (strcmp (buf, ">>hello<<\n"))
+    return 11;
+
+  sprintf (buf, ">>%.*s<<\n", 20, "hello, world");
+  eputs ("buf="); eputs (buf);
+  if (strcmp (buf, ">>hello, world<<\n"))
+    return 12;
+
+  sprintf (buf, ">>%.*s<<\n", 10, "foo");
+  eputs ("buf="); eputs (buf);
+  if (strcmp (buf, ">>foo<<\n"))
+    return 13;
+
+  sprintf (buf, ">>%*s<<\n", 10, "bar");
+  eputs ("buf="); eputs (buf);
+  if (strcmp (buf, ">>       bar<<\n"))
+    return 14;
+
+  sprintf (buf, ">>%-*s<<\n", 10, "baz");
+  eputs ("buf="); eputs (buf);
+  if (strcmp (buf, ">>baz       <<\n"))
+    return 15;
+
+  sprintf (buf, ">>%ld<<\n", 12);
+  eputs ("buf="); eputs (buf);
+  if (strcmp (buf, ">>12<<\n"))
+    return 16;
+
+  sprintf (buf, ">>%o<<\n", 12);
+  eputs ("buf="); eputs (buf);
+  if (strcmp (buf, ">>14<<\n"))
+    return 17;
+
+  sprintf (buf, ">>%x<<\n", 12);
+  eputs ("buf="); eputs (buf);
+  if (strcmp (buf, ">>c<<\n"))
+    return 18;
+
+  sprintf (buf, ">>%X<<\n", 12);
+  eputs ("buf="); eputs (buf);
+  if (strcmp (buf, ">>C<<\n"))
+    return 19;
+
   return 0;
 }
index adfde721190c6c4254979761c6b6fdff2bbb8807..5dd62638aca28dc40f73c5ff9d5de5a33fe226a5 100644 (file)
@@ -26,14 +26,14 @@ test ()
 {
   int i;
   int r = sscanf ("42", "%d", &i);
-  if (r)
+  if (r != 1)
     return 1;
   if (i != 42)
     return 2;
 
   char c;
   r = sscanf ("foo bar", "foo%cbar", &c);
-  if (r)
+  if (r != 1)
     return 3;
   if (c != ' ')
     return 4;
index d0403ce5f9d7953925336cbd97e4e24f1b6a2c34..fc7ddd495f4b8ee9c3a55b24f1594d98ac158b45 100644 (file)
@@ -284,7 +284,7 @@ execl_ (SCM file_name, SCM args) ///((name . "execl"))
       args = CDR (args);
     }
   c_argv[i] = 0;
-  return MAKE_NUMBER (execve (c_argv[0], c_argv, environ));
+  return MAKE_NUMBER (execv (c_argv[0], c_argv));
 }
 
 SCM