mescc: Support binutils-2.5.1.

* include/stdint.h: #undef types before typedef'ing them.
* include/sys/types.h: Likewise.
* include/string.h (NULL): New define.
* include/stdio.h (BUFSIZ): New define.
This commit is contained in:
Jan Nieuwenhuizen 2018-05-30 21:55:39 +02:00
parent c3f27804f6
commit f1efaa0e93
No known key found for this signature in database
GPG key ID: F3C1A0D9C1D65273
39 changed files with 1102 additions and 181 deletions

View file

@ -65,7 +65,9 @@ C32FLAGS=${C32FLAGS-"
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/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-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/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+tcc
ARCHDIR=1 NOLINK=1 sh build-aux/cc-mes-gcc.sh lib/libc+gnu
sh build-aux/cc-mes-gcc.sh scaffold/main sh build-aux/cc-mes-gcc.sh scaffold/main
sh build-aux/cc-mes-gcc.sh scaffold/hello sh build-aux/cc-mes-gcc.sh scaffold/hello

View file

@ -100,6 +100,7 @@ PREPROCESS=1
ARCHDIR=1 NOLINK=1 sh build-aux/cc-mes.sh lib/crt1 ARCHDIR=1 NOLINK=1 sh build-aux/cc-mes.sh lib/crt1
ARCHDIR=1 NOLINK=1 sh build-aux/cc-mes.sh lib/libc-mini ARCHDIR=1 NOLINK=1 sh build-aux/cc-mes.sh lib/libc-mini
ARCHDIR=1 NOLINK=1 sh build-aux/cc-mes.sh lib/libc ARCHDIR=1 NOLINK=1 sh build-aux/cc-mes.sh lib/libc
ARCHDIR=1 NOLINK=1 sh build-aux/cc-mes.sh lib/libgetopt
ARCHDIR=1 NOLINK=1 sh build-aux/cc-mes.sh lib/libc+tcc ARCHDIR=1 NOLINK=1 sh build-aux/cc-mes.sh lib/libc+tcc
[ -n "$SEED" ] && exit 0 [ -n "$SEED" ] && exit 0

View file

@ -134,10 +134,15 @@ t
85-sizeof 85-sizeof
86-strncpy 86-strncpy
87-sscanf 87-sscanf
90-strpbrk
91-fseek
" "
# 90: needs GNU, fails for mescc, passes for tcc
broken="$broken broken="$broken
7s-struct-short 7s-struct-short
90-strpbrk
91-fseek
" "
set +e set +e
@ -149,9 +154,12 @@ for t in $tests; do
if [ -z "${t/[012][0-9]-*/}" ]; then if [ -z "${t/[012][0-9]-*/}" ]; then
LIBC=c-mini LIBC=c-mini
MESCCLIBS="-l c-mini" MESCCLIBS="-l c-mini"
elif [ -z "${t/8[0-9]-*/}" ]; then elif [ -z "${t/[78][0-9a-z]-*/}" ]; then
LIBC=c+tcc LIBC=c+tcc
MESCCLIBS="-l c+tcc" MESCCLIBS="-l c+tcc"
elif [ -z "${t/9[0-9]-*/}" ]; then
LIBC=c+gnu
MESCCLIBS="-l c+gnu"
else else
LIBC=c LIBC=c
MESCCLIBS= MESCCLIBS=
@ -219,7 +227,6 @@ tests="
43_void_param 43_void_param
44_scoped_declarations 44_scoped_declarations
45_empty_for 45_empty_for
46_grep
47_switch_return 47_switch_return
48_nested_break 48_nested_break
49_bracket_evaluation 49_bracket_evaluation
@ -241,14 +248,11 @@ broken="$broken
27_sizeof 27_sizeof
28_strings 28_strings
31_args
34_array_assignment 34_array_assignment
37_sprintf
39_typedef 39_typedef
40_stdio 40_stdio
42_function_pointer 42_function_pointer
46_grep
49_bracket_evaluation 49_bracket_evaluation
55_lshift_type 55_lshift_type
" "
@ -260,17 +264,18 @@ broken="$broken
#28_strings ; TODO: strncpy strchr strrchr memset memcpy memcmp #28_strings ; TODO: strncpy strchr strrchr memset memcpy memcmp
#30_hanoi ; fails with GCC #30_hanoi ; fails with GCC
#34_array_assignment ; fails with GCC #34_array_assignment ; fails with GCC
#37_sprintf ; integer formatting unsupported
#39_typedef ;unsupported: (decl (decl-spec-list (stor-spec (typedef)) (type-spec (typename "MyFunStruct"))) (init-declr-list (init-declr (ptr-declr (pointer) (ident "MoreFunThanEver"))))) #39_typedef ;unsupported: (decl (decl-spec-list (stor-spec (typedef)) (type-spec (typename "MyFunStruct"))) (init-declr-list (init-declr (ptr-declr (pointer) (ident "MoreFunThanEver")))))
#40_stdio ; f* functions #40_stdio ; f* functions
#42_function_pointer ; f* functions #42_function_pointer ; f* functions
#46_grep ; f* functions
#49_bracket_evaluation ; float #49_bracket_evaluation ; float
LIBC=c+gnu
MESCCLIBS="-l c+tcc"
expect=$(echo $broken | wc -w) expect=$(echo $broken | wc -w)
ARGS="arg1 arg2 arg3 arg4 arg5"
export ARGS
for t in $tests; do for t in $tests; do
if [ ! -f scaffold/tinycc/"$t.c" ]; then if [ ! -f scaffold/tinycc/"$t.c" ]; then
echo ' [SKIP]' echo ' [SKIP]'

View file

@ -41,7 +41,7 @@ if [ -n "$CC32" ]; then
r=0 r=0
[ -f "$t".exit ] && r=$(cat "$t".exit) [ -f "$t".exit ] && r=$(cat "$t".exit)
set +e set +e
"$t".mes-gcc-out > "$t".mes-gcc-stdout "$t".mes-gcc-out $ARGS > "$t".mes-gcc-stdout
m=$? m=$?
cat "$t".mes-gcc-stdout cat "$t".mes-gcc-stdout
set -e set -e
@ -58,7 +58,7 @@ sh build-aux/cc-mes.sh "$t"
r=0 r=0
[ -f "$t".exit ] && r=$(cat "$t".exit) [ -f "$t".exit ] && r=$(cat "$t".exit)
set +e set +e
"$t".mes-out > "$t".mes-stdout "$t".mes-out $ARGS > "$t".mes-stdout
m=$? m=$?
cat "$t".mes-stdout cat "$t".mes-stdout
set -e set -e

View file

@ -29,6 +29,7 @@
#else // ! (__GNUC__ && POSIX) #else // ! (__GNUC__ && POSIX)
int errno; int errno;
#define ENOENT 2 /* No such file or directory */ #define ENOENT 2 /* No such file or directory */
#define EIO 5 /* I/O error */
#define EBADF 9 /* Bad file number */ #define EBADF 9 /* Bad file number */
#define ENOMEM 12 /* Out of memory */ #define ENOMEM 12 /* Out of memory */
#define EEXIST 17 /* File exists */ #define EEXIST 17 /* File exists */

View file

@ -35,11 +35,6 @@
#define O_EXCL 128 #define O_EXCL 128
#define O_TRUNC 512 #define O_TRUNC 512
#define S_IRWXU 00700
#define S_IXUSR 00100
#define S_IWUSR 00200
#define S_IRUSR 00400
#define F_DUPFD 0 #define F_DUPFD 0
#define F_GETFD 1 #define F_GETFD 1
#define F_SETFD 2 #define F_SETFD 2

View file

@ -1,7 +1,7 @@
/* -*-comment-start: "//";comment-end:""-*- /* -*-comment-start: "//";comment-end:""-*-
* Mes --- Maxwell Equations of Software * Mes --- Maxwell Equations of Software
* Copyright (C) 1989, 1990, 1991, 1992 Free Software Foundation, Inc. * Copyright (C) 1989, 1990, 1991, 1992 Free Software Foundation, Inc.
* Copyright © 2017 Jan (janneke) Nieuwenhuizen <janneke@gnu.org> * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
* *
* This file is part of Mes. * This file is part of Mes.
* *
@ -51,11 +51,12 @@ enum _argtype
optional_argument optional_argument
}; };
int getopt (int argc, char *const *argv, char const *shortopts); int getopt (int argc, char *const *argv, char const *options);
int getopt_long (int argc, char *const *argv, char const *shortopts, int getopt_long (int argc, char *const *argv, char const *options,
struct option const *longopts, int *longind); struct option const *long_options, int *opt_index);
int getopt_long_only (int argc, char *const *argv, char const *options,
struct option const *long_options, int *opt_index);
#endif // ! (__GNUC__ && POSIX) #endif // ! (__GNUC__ && POSIX)
#endif // __MES_GETOPT_H #endif // __MES_GETOPT_H

View file

@ -33,6 +33,8 @@
#define INT_MIN -2147483648 #define INT_MIN -2147483648
#define INT_MAX 2147483647 #define INT_MAX 2147483647
#define MB_CUR_MAX 1 #define MB_CUR_MAX 1
#define LONG_MIN -2147483648
#define LONG_MAX 2147483647
#endif // ! (__GNUC__ && POSIX) #endif // ! (__GNUC__ && POSIX)

36
include/memory.h Normal file
View file

@ -0,0 +1,36 @@
/* -*-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/>.
*/
#ifndef __MES_MEMORY_H
#define __MES_MEMORY_H 1
#if __GNUC__ && POSIX
#ifndef _GNU_SOURCE
#define _GNU_SOURCE
#endif
#undef __MES_MEMORY_H
#include_next <memory.h>
#else // ! (__GNUC__ && POSIX)
#include <string.h>
#endif // ! (__GNUC__ && POSIX)
#endif // __MES_MEMORY_H

41
include/pwd.h Normal file
View file

@ -0,0 +1,41 @@
/* -*-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/>.
*/
#ifndef __MES_PWD_H
#define __MES_PWD_H 1
#if __GNUC__ && POSIX
#undef __MES_PWD_H
#include_next <pwd.h>
#else // !(__GNUC__ && POSIX)
struct passwd
{
char *pw_name;
char *pw_passwd;
uid_t pw_uid;
gid_t pw_gid;
char *pw_gecos;
char *pw_dir;
char *pw_shell;
};
#endif // !(__GNUC__ && POSIX)
#endif // __MES_PWD_H

View file

@ -41,6 +41,7 @@ typedef int uid_t;
typedef int clock_t; typedef int clock_t;
typedef int sigval_t; typedef int sigval_t;
#define NSIG 30
#define SIGHUP 1 #define SIGHUP 1
#define SIGINT 2 #define SIGINT 2
#define SIGQUIT 3 #define SIGQUIT 3

View file

@ -29,6 +29,25 @@
#else // ! (__GNUC__ && POSIX) #else // ! (__GNUC__ && POSIX)
#undef unsigned
#undef uint8_t
#undef int8_t
#undef uint16_t
#undef int16_t
#undef uint32_t
#undef int32_t
#undef uint64_t
#undef int64_t
#undef uintptr_t
#undef intmax_t
#undef intptr_t
#undef uintmax_t
#undef ptrdiff_t
typedef unsigned char uint8_t; typedef unsigned char uint8_t;
typedef char int8_t; typedef char int8_t;
typedef unsigned short uint16_t; typedef unsigned short uint16_t;

View file

@ -20,7 +20,7 @@
#ifndef __MES_STDIO_H #ifndef __MES_STDIO_H
#define __MES_STDIO_H 1 #define __MES_STDIO_H 1
char **g_environment; char **environ;
int g_stdin; int g_stdin;
int g_stdout; int g_stdout;
@ -45,6 +45,10 @@ int g_stdout;
#else // ! (__GNUC__ && POSIX) #else // ! (__GNUC__ && POSIX)
#ifndef __MESCCLIB__
#define __MESCCLIB__ 15
#endif
#ifndef EOF #ifndef EOF
#define EOF -1 #define EOF -1
#endif #endif
@ -53,6 +57,14 @@ int g_stdout;
#define NULL 0 #define NULL 0
#endif #endif
#ifndef BUFSIZ
#define BUFSIZ 256
#endif
#ifndef L_tmpnam
#define L_tmpnam 100
#endif
// Hmm // Hmm
#define stdin 0 #define stdin 0
#define stdout 1 #define stdout 1
@ -76,6 +88,7 @@ FILE *fopen (char const *file_name, char const *mode);
int eputc (int c); int eputc (int c);
int eputs (char const* s); int eputs (char const* s);
int fclose (FILE *stream); int fclose (FILE *stream);
int feof (FILE *stream);
int ferror (FILE *stream); int ferror (FILE *stream);
int fflush (FILE *stream); int fflush (FILE *stream);
int fgetc (FILE* stream); int fgetc (FILE* stream);

View file

@ -29,6 +29,10 @@
#else // ! (__GNUC__ && POSIX) #else // ! (__GNUC__ && POSIX)
#ifndef NULL
#define NULL 0
#endif
#ifndef __MES_SIZE_T #ifndef __MES_SIZE_T
#define __MES_SIZE_T #define __MES_SIZE_T
#undef size_t #undef size_t

32
include/sys/dir.h Normal file
View file

@ -0,0 +1,32 @@
/* -*-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/>.
*/
#ifndef __MES_SYS_DIR_H
#define __MES_SYS_DIR_H 1
#if __GNUC__ && POSIX
#undef __MES_SYS_DIR_H
#include_next <sys/dir.h>
#else // !(__GNUC__ && POSIX)
#endif // !(__GNUC__ && POSIX)
#endif // __MES_SYS_DIR_H

32
include/sys/file.h Normal file
View file

@ -0,0 +1,32 @@
/* -*-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/>.
*/
#ifndef __MES_SYS_FILE_H
#define __MES_SYS_FILE_H 1
#if __GNUC__ && POSIX
#undef __MES_SYS_FILE_H
#include_next <sys/file.h>
#else // !(__GNUC__ && POSIX)
#endif // !(__GNUC__ && POSIX)
#endif // __MES_SYS_FILE_H

31
include/sys/param.h Normal file
View file

@ -0,0 +1,31 @@
/* -*-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/>.
*/
#ifndef __MES_SYS_PARAM_H
#define __MES_SYS_PARAM_H 1
#if __GNUC__ && POSIX
#undef __MES_SYS_PARAM_H
#include_next <sys/param.h>
#else // !(__GNUC__ && POSIX)
#endif // !(__GNUC__ && POSIX)
#endif // __MES_SYS_PARAM_H

View file

@ -26,13 +26,13 @@
#else // !(__GNUC__ && POSIX) #else // !(__GNUC__ && POSIX)
#include <sys/types.h>
#ifndef __MES_MODE_T #ifndef __MES_MODE_T
#define __MES_MODE_T #define __MES_MODE_T
typedef int mode_t; typedef int mode_t;
#endif #endif
int chmod (char const *file_name, mode_t mode);
struct stat struct stat
{ {
unsigned long st_dev; /* Device. */ unsigned long st_dev; /* Device. */
@ -57,6 +57,24 @@ struct stat
unsigned int __unused5; unsigned int __unused5;
}; };
int chmod (char const *file_name, mode_t mode);
int mkdir (char const *file_name, mode_t mode);
int chown (char const *file_name, uid_t owner, gid_t group);
int rmdir (char const *file_name);
#define S_IFMT 0170000
#define S_IFDIR 0040000
#define S_IFREG 0100000
#define S_IFLNK 0120000
#define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
#define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
#define S_IRWXU 00700
#define S_IXUSR 00100
#define S_IWUSR 00200
#define S_IRUSR 00400
#endif // !(__GNUC__ && POSIX) #endif // !(__GNUC__ && POSIX)
#endif // __MES_SYS_STAT_H #endif // __MES_SYS_STAT_H

View file

@ -26,19 +26,31 @@
#else // !(__GNUC__ && POSIX) #else // !(__GNUC__ && POSIX)
struct timeval { struct timeval
{
long tv_sec; long tv_sec;
long tv_usec; long tv_usec;
}; };
struct timezone { struct timezone
{
int tz_minuteswest; int tz_minuteswest;
int tz_dsttime; int tz_dsttime;
}; };
struct itimerval
{
struct timeval it_interval;
struct timeval it_value;
};
#define ITIMER_REAL 0
#define ITIMER_VIRTUAL 1
#define ITIMER_PROF 2
int gettimeofday (struct timeval *tv, struct timezone *tz); int gettimeofday (struct timeval *tv, struct timezone *tz);
int setitimer (int which, struct itimerval const *new, struct itimerval *old);
#endif // !(__GNUC__ && POSIX) #endif // !(__GNUC__ && POSIX)
#endif // __MES_SYS_TIME_H #endif // __MES_SYS_TIME_H

View file

@ -34,15 +34,22 @@ typedef unsigned long size_t;
#ifndef __MES_PID_T #ifndef __MES_PID_T
#define __MES_PID_T #define __MES_PID_T
#undef pid_t
typedef int pid_t; typedef int pid_t;
#endif #endif
#ifndef __MES_GID_T
#define __MES_GID_T
#undef gid_t
typedef int gid_t;
#endif
#ifndef __MES_UID_T #ifndef __MES_UID_T
#define __MES_UID_T #define __MES_UID_T
#undef uid_t
typedef int uid_t; typedef int uid_t;
#endif #endif
#endif // ! (__GNUC__ && POSIX) #endif // ! (__GNUC__ && POSIX)
#endif // __MES_SYS_TYPES_H #endif // __MES_SYS_TYPES_H

109
include/sys/user.h Normal file
View file

@ -0,0 +1,109 @@
/* -*-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/>.
*/
#ifndef __MES_SYS_USER_H
#define __MES_SYS_USER_H 1
#if __GNUC__ && POSIX
#undef __MES_SYS_USER_H
#include_next <sys/user.h>
#else // !(__GNUC__ && POSIX)
/* These are the 32-bit x86 structures. */
struct user_fpregs_struct
{
long int cwd;
long int swd;
long int twd;
long int fip;
long int fcs;
long int foo;
long int fos;
long int st_space [20];
};
struct user_fpxregs_struct
{
unsigned short int cwd;
unsigned short int swd;
unsigned short int twd;
unsigned short int fop;
long int fip;
long int fcs;
long int foo;
long int fos;
long int mxcsr;
long int reserved;
long int st_space[32]; /* 8*16 bytes for each FP-reg = 128 bytes */
long int xmm_space[32]; /* 8*16 bytes for each XMM-reg = 128 bytes */
long int padding[56];
};
struct user_regs_struct
{
long int ebx;
long int ecx;
long int edx;
long int esi;
long int edi;
long int ebp;
long int eax;
long int xds;
long int xes;
long int xfs;
long int xgs;
long int orig_eax;
long int eip;
long int xcs;
long int eflags;
long int esp;
long int xss;
};
struct user
{
struct user_regs_struct regs;
int u_fpvalid;
struct user_fpregs_struct i387;
unsigned long int u_tsize;
unsigned long int u_dsize;
unsigned long int u_ssize;
unsigned long int start_code;
unsigned long int start_stack;
long int signal;
int reserved;
struct user_regs_struct* u_ar0;
struct user_fpregs_struct* u_fpstate;
unsigned long int magic;
char u_comm [32];
int u_debugreg [8];
};
#define PAGE_SHIFT 12
#define PAGE_SIZE (1UL << PAGE_SHIFT)
#define PAGE_MASK (~(PAGE_SIZE-1))
#define NBPG PAGE_SIZE
#define UPAGES 1
#define HOST_TEXT_START_ADDR (u.start_code)
#define HOST_STACK_END_ADDR (u.start_stack + u.u_ssize * NBPG)
#endif // !(__GNUC__ && POSIX)
#endif // __MES_SYS_USER_H

View file

@ -29,6 +29,10 @@
#else // ! (__GNUC__ && POSIX) #else // ! (__GNUC__ && POSIX)
#ifndef NULL
#define NULL 0
#endif
#ifndef __MES_OFF_T #ifndef __MES_OFF_T
#define __MES_OFF_T #define __MES_OFF_T
#undef off_t #undef off_t

210
lib/binutils.c Normal file
View file

@ -0,0 +1,210 @@
/* -*-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>
int
abs (int x)
{
if (x < 0)
return -x;
return x;
}
int
chown (char const *file_name, uid_t owner, gid_t group)
{
eputs ("chown stub\n");
return 0;
}
int
ctime (int x)
{
eputs ("ctime stub\n");
return 0;
}
int
fcntl (int x)
{
eputs ("fcntl stub\n");
return 0;
}
char *
fdgets (char *s, int count, int fd)
{
int c = 0;
char *p = s;
while (--count > 0 && c != '\n')
{
c = fdgetc (fd);
if (c == EOF)
break;
*p++ = c;
}
if (p == s && (c == EOF || count == -1))
return 0;
*p = 0;
return s;
}
int
feof (FILE *stream)
{
char c = fgetc (stream);
if (c != EOF)
ungetc (c, stream);
return c == EOF;
}
char *
fgets (char *s, int count, FILE *stream)
{
return fdgets (s, count, (int)stream);
}
int
frexp (int x)
{
eputs ("frexp stub\n");
return 0;
}
int
getgid (int x)
{
eputs ("getgid stub\n");
return 0;
}
int
getpid (int x)
{
eputs ("getpid stub\n");
return 0;
}
int
getuid (int x)
{
eputs ("getuid stub\n");
return 0;
}
int
perror (int x)
{
eputs ("perror stub\n");
return 0;
}
void*
sbrk (ptrdiff_t delta)
{
void *p = malloc (delta);
if (p <= 0)
return 0;
return p+delta;
}
int
setitimer (int which, struct itimerval const *new,
struct itimerval *old)
{
eputs ("setitimer stub\n");
return 0;
}
int
sigsetmask (int x)
{
eputs ("sigsetmask stub\n");
return 0;
}
size_t
strcspn (char const *string, char const *stopset)
{
char *p = string;
while (*p)
if (strchr (stopset, *p))
break;
else
p++;
return p - string;
}
char *
strncat (char *to, char const *from, size_t size)
{
char *p = strchr (to , '\0');
while (*from && size--)
*p++ = *from++;
*p = 0;
return to;
}
char *
strpbrk (char const *string, char const* stopset)
{
char *p = string;
while (*p)
if (strchr (stopset, *p))
break;
else
p++;
return p;
}
size_t
strspn (char const *string, char const *skipset)
{
char *p = string;
while (*p)
if (!strchr (skipset, *p))
break;
else
p++;
return p - string;
}
int
sys_siglist (int x)
{
eputs ("sys_siglist stub\n");
return 0;
}
int
umask (int x)
{
eputs ("umask stub\n");
return 0;
}
int
utime (int x)
{
eputs ("utime stub\n");
return 0;
}

View file

@ -18,7 +18,7 @@
* along with Mes. If not, see <http://www.gnu.org/licenses/>. * along with Mes. If not, see <http://www.gnu.org/licenses/>.
*/ */
char **g_environment = 0; char **environ = 0;
int main (int argc, char *argv[]); int main (int argc, char *argv[]);
#if __GNUC__ #if __GNUC__
@ -34,7 +34,7 @@ _start ()
"shl $2,%%eax\n\t" "shl $2,%%eax\n\t"
"add %%ebp,%%eax\n\t" "add %%ebp,%%eax\n\t"
"movl %%eax,%0\n\t" "movl %%eax,%0\n\t"
: "=g_environment" (g_environment) : "=environ" (environ)
: //no inputs "" : //no inputs ""
); );
asm ( asm (
@ -70,7 +70,7 @@ _start ()
asm ("shl____$i8,%eax !0x02"); asm ("shl____$i8,%eax !0x02");
asm ("add____%ebp,%eax"); asm ("add____%ebp,%eax");
asm ("mov____%eax,0x32 &g_environment"); asm ("mov____%eax,0x32 &environ");
asm ("mov____%ebp,%eax"); asm ("mov____%ebp,%eax");
asm ("add____$i8,%eax !8"); asm ("add____$i8,%eax !8");

View file

@ -1,6 +1,6 @@
/* Getopt for GNU. /* Getopt for GNU.
Copyright (C) 1987, 88, 89, 90, 91, 1992 Free Software Foundation, Inc. Copyright (C) 1987, 88, 89, 90, 91, 1992 Free Software Foundation, Inc.
Copyright (C) 2017 Jan (janneke) Nieuwenhuizen <janneke@gnu.org> Copyright (C) 2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
This program is free software; you can redistribute it and/or modify This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
@ -361,16 +361,22 @@ _getopt_internal (int argc, char *const
} }
int int
getopt (int argc, char *const *argv, char const *optstring) getopt (int argc, char *const *argv, char const *options)
{ {
return _getopt_internal (argc, argv, optstring, return _getopt_internal (argc, argv, options,
(const struct option *) 0, (const struct option *) 0, (int *) 0, 0);
(int *) 0,
0);
} }
int int
getopt_long (int argc, char *const *argv, const char *options, struct option const *long_options, int *opt_index) getopt_long (int argc, char *const *argv, char const *options,
struct option const *long_options, int *opt_index)
{ {
return _getopt_internal (argc, argv, options, long_options, opt_index, 0); return _getopt_internal (argc, argv, options, long_options, opt_index, 0);
} }
int
getopt_long_only (int argc, char *const *argv, char const *options,
struct option const *long_options, int *opt_index)
{
return _getopt_internal (argc, argv, options, long_options, opt_index, 1);
}

23
lib/libc+gnu.c Normal file
View file

@ -0,0 +1,23 @@
/* -*-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 <libc+tcc.c>
#include <m4.c>
#include <binutils.c>

View file

@ -27,6 +27,7 @@
#include <time.h> #include <time.h>
#include <signal.h> #include <signal.h>
#include <sys/mman.h> #include <sys/mman.h>
#include <sys/stat.h>
#include <sys/time.h> #include <sys/time.h>
#include <unistd.h> #include <unistd.h>
@ -36,14 +37,11 @@
#include <linux+tcc-mes.c> #include <linux+tcc-mes.c>
#include <libc+tcc-mes.c> #include <libc+tcc-mes.c>
#include <getopt.c>
#else // !__MESC__ #else // !__MESC__
#include <linux+tcc-gcc.c> #include <linux+tcc-gcc.c>
#include <libc+tcc-gcc.c> #include <libc+tcc-gcc.c>
#include <getopt.c>
#include <m4.c>
#endif // !__MESC__ #endif // !__MESC__
@ -226,8 +224,12 @@ qsort (void *base, size_t count, size_t size, int (*compare)(void const *, void
int int
remove (char const *file_name) remove (char const *file_name)
{ {
eputs ("remove stub\n"); struct stat buf;
return 0; if (stat (file_name, &buf) < 0)
return -1;
if (S_ISDIR (buf.st_mode))
return rmdir (file_name);
return unlink (file_name);
} }
int int
@ -264,12 +266,13 @@ sscanf (char const *str, const char *template, ...)
} }
char * char *
strcat (char *dest, char const *src) strcat (char *to, char const *from)
{ {
char *p = strchr (dest, '\0'); char *p = strchr (to, '\0');
while (*src++) *p++ = *src++; while (*from)
*p++ = *from++;
*p = 0; *p = 0;
return dest; return to;
} }
char * char *
@ -278,7 +281,8 @@ strchr (char const *s, int c)
char const *p = s; char const *p = s;
while (*p || !c) while (*p || !c)
{ {
if (c == *p) return p; if (c == *p)
return p;
*p++; *p++;
} }
return 0; return 0;
@ -360,7 +364,7 @@ strstr (char const *haystack, char const *needle)
double double
strtod (char const *nptr, char **endptr) strtod (char const *nptr, char **endptr)
{ {
eputs ("strtoul stub\n"); eputs ("strtod stub\n");
} }
float float
@ -445,7 +449,13 @@ vfprintf (FILE* f, char const* format, va_list ap)
case 'c': {char c; c = va_arg (ap, char); fputc (c, 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 '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 's': {char *s; s = va_arg (ap, char *); fputs (s, fd); break;}
default: {fputc (*p, fd); break;} default:
{
eputs ("vfprintf: not supported: %");
eputc (c);
eputs ("\n");
p++;
}
} }
p++; p++;
} }
@ -453,6 +463,12 @@ vfprintf (FILE* f, char const* format, va_list ap)
return 0; return 0;
} }
int
vprintf (char const* format, va_list ap)
{
return vfprintf (STDOUT, format, ap);
}
int int
vsscanf (char const *s, char const *template, va_list ap) vsscanf (char const *s, char const *template, va_list ap)
{ {
@ -472,7 +488,9 @@ vsscanf (char const *s, char const *template, va_list ap)
{ {
case '%': {p++; break;} case '%': {p++; break;}
case 'c': {char *c = va_arg (ap, char*); *c = *p++; break;} case 'c': {char *c = va_arg (ap, char*); *c = *p++; break;}
case 'd': {int *d = va_arg (ap, int*); *d = abtoi (&p, 10); break;} case 'd':
case 'i':
case 'u': {int *d = va_arg (ap, int*); *d = abtoi (&p, 10); break;}
default: default:
{ {
eputs ("vsscanf: not supported: %"); eputs ("vsscanf: not supported: %");
@ -487,3 +505,89 @@ vsscanf (char const *s, char const *template, va_list ap)
va_end (ap); va_end (ap);
return 0; return 0;
} }
int
vsprintf (char *str, char const* format, va_list ap)
{
char const *p = format;
while (*p)
if (*p != '%')
*str++ = *p++;
else
{
p++;
char c = *p;
int left_p = 0;
int width = -1;
if (c == '-')
{
left_p = 1;
c = *++p;
}
char pad = ' ';
if (c == '0')
{
pad = c;
c = *p++;
}
if (c >= '0' && c <= '9')
{
width = abtoi (&p, 10);
c = *p;
}
switch (c)
{
case '%': {*str++ = *p; break;}
case 'c': {char c; c = va_arg (ap, char); *str++ = c; break;}
case 'd':
case 'i':
case 'u':
{
int d = va_arg (ap, int);
char const *s = itoa (d);
if (width >= 0)
width = width - strlen (s);
if (!left_p)
while (width-- > 0)
*str++ = pad;
while (*s)
*str++ = *s++;
while (width-- > 0)
*str++ = pad;
break;
}
case 's': {char *s; s = va_arg (ap, char *); while (*s) *str++ = *s++; break;}
default:
{
eputs ("vsprintf: not supported: %");
eputc (c);
eputs ("\n");
p++;
}
}
p++;
}
va_end (ap);
*str = 0;
return strlen (str);
}
int
sprintf (char *str, char const* format, ...)
{
va_list ap;
va_start (ap, format);
int r = vsprintf (str, format, ap);
va_end (ap);
return r;
}
int
printf (char const* format, ...)
{
va_list ap;
va_start (ap, format);
int r = vprintf (format, ap);
va_end (ap);
return r;
}

View file

@ -139,7 +139,6 @@ strcmp (char const* a, char const* b)
return *a - *b; return *a - *b;
} }
char * char *
strcpy (char *dest, char const *src) strcpy (char *dest, char const *src)
{ {
@ -185,9 +184,13 @@ realloc (void *ptr, size_t size)
} }
int int
strncmp (char const* a, char const* b, size_t length) strncmp (char const* a, char const* b, size_t size)
{ {
while (*a && *b && *a == *b && --length) {a++;b++;} while (*a && *b && *a == *b && --size)
{
a++;
b++;
}
return *a - *b; return *a - *b;
} }
@ -205,7 +208,7 @@ fwrite (void const *data, size_t size, size_t count, FILE *stream)
char * char *
getenv (char const* s) getenv (char const* s)
{ {
char **p = g_environment; char **p = environ;
int length = strlen (s); int length = strlen (s);
while (*p) while (*p)
{ {
@ -218,7 +221,7 @@ getenv (char const* s)
int int
setenv (char const* s, char const* v, int overwrite_p) setenv (char const* s, char const* v, int overwrite_p)
{ {
char **p = g_environment; char **p = environ;
int length = strlen (s); int length = strlen (s);
while (*p) while (*p)
{ {
@ -238,77 +241,6 @@ setenv (char const* s, char const* v, int overwrite_p)
return 0; return 0;
} }
int
vprintf (char const* format, va_list ap)
{
char const *p = format;
while (*p)
if (*p != '%')
putchar (*p++);
else
{
p++;
char c = *p;
switch (c)
{
case '%': {putchar (*p); break;}
case 'c': {char c; c = va_arg (ap, char); putchar (c); break;}
case 'd': {int d; d = va_arg (ap, int); puts (itoa (d)); break;}
case 's': {char *s; s = va_arg (ap, char *); puts (s); break;}
default: {putchar (*p); break;}
}
p++;
}
va_end (ap);
return 0;
}
int
printf (char const* format, ...)
{
va_list ap;
va_start (ap, format);
int r = vprintf (format, ap);
va_end (ap);
return r;
}
int
vsprintf (char *str, char const* format, va_list ap)
{
char const *p = format;
while (*p)
if (*p != '%')
*str++ = *p++;
else
{
p++;
char c = *p;
switch (c)
{
case '%': {*str++ = *p; break;}
case 'c': {char c; c = va_arg (ap, char); *str++ = c; break;}
case 'd': {int d; d = va_arg (ap, int); char const *s; s = itoa (d); while (*s) *str++ = *s++; break;}
case 's': {char *s; s = va_arg (ap, char *); while (*s) *str++ = *s++; break;}
default: {*str++ = *p; break;}
}
p++;
}
va_end (ap);
*str = 0;
return strlen (str);
}
int
sprintf (char *str, char const* format, ...)
{
va_list ap;
va_start (ap, format);
int r = vsprintf (str, format, ap);
va_end (ap);
return r;
}
int int
isatty (int fd) isatty (int fd)
{ {

21
lib/libgetopt.c Normal file
View file

@ -0,0 +1,21 @@
/* -*-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 <getopt.c>

View file

@ -1,6 +1,6 @@
/* -*-comment-start: "//";comment-end:""-*- /* -*-comment-start: "//";comment-end:""-*-
* Mes --- Maxwell Equations of Software * Mes --- Maxwell Equations of Software
* Copyright © 2016,2017 Jan (janneke) Nieuwenhuizen <janneke@gnu.org> * Copyright © 2016,2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
* *
* This file is part of Mes. * This file is part of Mes.
* *
@ -18,18 +18,17 @@
* along with Mes. If not, see <http://www.gnu.org/licenses/>. * along with Mes. If not, see <http://www.gnu.org/licenses/>.
*/ */
#define SYS_exit "0x01"
#define SYS_read "0x03"
#define SYS_write "0x04"
#define SYS_open "0x05"
#define SYS_close "0x06" #define SYS_close "0x06"
#define SYS_link "0x09"
#define SYS_unlink "0x0a" #define SYS_unlink "0x0a"
#define SYS_lseek "0x13" #define SYS_lseek "0x13"
#define SYS_access "0x21" #define SYS_access "0x21"
#define SYS_brk "0x2d" #define SYS_rename "0x26"
#define SYS_mkdir "0x27"
#define SYS_rmdir "0x28"
#define SYS_stat "0x6a" #define SYS_stat "0x6a"
#define SYS_lstat "0x6b"
#define SYS_fstat "0x6c" #define SYS_fstat "0x6c"
#define SYS_fsync "0x76"
#define SYS_getcwd "0xb7" #define SYS_getcwd "0xb7"
int int
@ -48,6 +47,27 @@ close (int fd)
#endif #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 int
unlink (char const *file_name) unlink (char const *file_name)
{ {
@ -86,6 +106,61 @@ lseek (int fd, off_t offset, int whence)
#endif #endif
} }
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
rmdir (char const *file_name)
{
#if !__TINYC__
int r;
asm (
"mov %0,%%ebx\n\t"
"mov $"SYS_rmdir",%%eax\n\t"
"int $0x80"
: "=r" (r)
: "" (file_name)
);
return r;
#endif
}
int int
stat (char const *file_name, struct stat *statbuf) stat (char const *file_name, struct stat *statbuf)
@ -108,6 +183,27 @@ stat (char const *file_name, struct stat *statbuf)
#endif #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 int
fstat (int fd, struct stat *statbuf) fstat (int fd, struct stat *statbuf)
{ {

View file

@ -38,6 +38,25 @@ unlink (char const *file_name)
asm ("int____$0x80"); asm ("int____$0x80");
} }
int
rmdir (char const *file_name)
{
asm ("mov____0x8(%ebp),%ebx !8");
asm ("mov____$i32,%eax SYS_unlink");
asm ("int____$0x80");
}
int
stat (char const *file_name, struct stat *statbuf)
{
asm ("mov____0x8(%ebp),%ebx !8");
asm ("mov____0x8(%ebp),%ecx !12");
asm ("mov____$i32,%eax SYS_getcwd");
asm ("int____$0x80");
}
off_t off_t
lseek (int fd, off_t offset, int whence) lseek (int fd, off_t offset, int whence)
{ {

View file

@ -22,16 +22,27 @@
#include <libmes.h> #include <libmes.h>
#include <stdlib.h> #include <stdlib.h>
#include <unistd.h> #include <unistd.h>
#include <sys/stat.h>
#include <sys/wait.h> #include <sys/wait.h>
#define SYS_fork "0x02"
#define SYS_read "0x03"
#define SYS_open "0x05"
#define SYS_waitpid "0x07"
#define SYS_execve "0x0b"
#define SYS_chmod "0x0f"
#define SYS_access "0x21"
#define SYS_brk "0x2d"
#define SYS_ioctl "0x36"
#define SYS_fsync "0x76"
int int
fork () fork ()
{ {
#if !__TINYC__ #if !__TINYC__
int r; int r;
//syscall (SYS_fork, fd));
asm ( asm (
"mov $0x02,%%eax\n\t" "mov $"SYS_fork",%%eax\n\t"
"int $0x80\n\t" "int $0x80\n\t"
"mov %%eax,%0\n\t" "mov %%eax,%0\n\t"
: "=r" (r) : "=r" (r)
@ -47,14 +58,13 @@ read (int fd, void* buf, size_t n)
{ {
#if !__TINYC__ #if !__TINYC__
int r; int r;
//syscall (SYS_write, fd, s, n));
asm ( asm (
"mov %1,%%ebx\n\t" "mov %1,%%ebx\n\t"
"mov %2,%%ecx\n\t" "mov %2,%%ecx\n\t"
"mov %3,%%edx\n\t" "mov %3,%%edx\n\t"
"movl $0x3,%%eax\n\t" "mov $"SYS_read",%%eax\n\t"
"int $0x80\n\t" "int $0x80\n\t"
"mov %%eax,%0\n\t" "mov %%eax,%0\n\t"
: "=r" (r) : "=r" (r)
@ -84,7 +94,8 @@ open (char const *s, int flags, ...)
"mov %1,%%ebx\n\t" "mov %1,%%ebx\n\t"
"mov %2,%%ecx\n\t" "mov %2,%%ecx\n\t"
"mov %3,%%edx\n\t" "mov %3,%%edx\n\t"
"mov $0x5,%%eax\n\t"
"mov $"SYS_open",%%eax\n\t"
"int $0x80\n\t" "int $0x80\n\t"
"mov %%eax,%0\n\t" "mov %%eax,%0\n\t"
: "=r" (r) : "=r" (r)
@ -100,13 +111,12 @@ waitpid (pid_t pid, int *status_ptr, int options)
{ {
#if !__TINYC__ #if !__TINYC__
int r; int r;
//syscall (SYS_execve, file_name, argv, env));
asm ( asm (
"mov %1,%%ebx\n\t" "mov %1,%%ebx\n\t"
"mov %2,%%ecx\n\t" "mov %2,%%ecx\n\t"
"mov %3,%%edx\n\t" "mov %3,%%edx\n\t"
"mov $0x07,%%eax\n\t" "mov $"SYS_waitpid",%%eax\n\t"
"int $0x80\n\t" "int $0x80\n\t"
"mov %%eax,%0\n\t" "mov %%eax,%0\n\t"
@ -123,13 +133,12 @@ execve (char const* file_name, char *const argv[], char *const env[])
{ {
#if !__TINYC__ #if !__TINYC__
int r; int r;
//syscall (SYS_execve, file_name, argv, env));
asm ( asm (
"mov %1,%%ebx\n\t" "mov %1,%%ebx\n\t"
"mov %2,%%ecx\n\t" "mov %2,%%ecx\n\t"
"mov %3,%%edx\n\t" "mov %3,%%edx\n\t"
"mov $0x0b,%%eax\n\t" "mov $"SYS_execve",%%eax\n\t"
"int $0x80\n\t" "int $0x80\n\t"
"mov %%eax,%0\n\t" "mov %%eax,%0\n\t"
@ -142,15 +151,15 @@ execve (char const* file_name, char *const argv[], char *const env[])
} }
int int
chmod (char const *s, int mode) chmod (char const *s, mode_t mode)
{ {
#if !__TINYC__ #if !__TINYC__
int r; int r;
//syscall (SYS_chmod, mode));
asm ( asm (
"mov %1,%%ebx\n\t" "mov %1,%%ebx\n\t"
"mov %2,%%ecx\n\t" "mov %2,%%ecx\n\t"
"mov $0x0f,%%eax\n\t"
"mov $"SYS_chmod",%%eax\n\t"
"int $0x80\n\t" "int $0x80\n\t"
"mov %%eax,%0\n\t" "mov %%eax,%0\n\t"
: "=r" (r) : "=r" (r)
@ -166,11 +175,11 @@ access (char const *s, int mode)
{ {
#if !__TINYC__ #if !__TINYC__
int r; int r;
//syscall (SYS_access, mode));
asm ( asm (
"mov %1,%%ebx\n\t" "mov %1,%%ebx\n\t"
"mov %2,%%ecx\n\t" "mov %2,%%ecx\n\t"
"mov $0x21,%%eax\n\t"
"mov $"SYS_access",%%eax\n\t"
"int $0x80\n\t" "int $0x80\n\t"
"mov %%eax,%0\n\t" "mov %%eax,%0\n\t"
: "=r" (r) : "=r" (r)
@ -189,9 +198,8 @@ brk (void *p)
asm ( asm (
"mov %1,%%ebx\n\t" "mov %1,%%ebx\n\t"
"mov $0x2d,%%eax\n\t" "mov $"SYS_brk",%%eax\n\t"
"int $0x80\n\t" "int $0x80\n\t"
"mov %%eax,%0\n\t" "mov %%eax,%0\n\t"
: "=r" (r) : "=r" (r)
: "" (p) : "" (p)
@ -221,7 +229,7 @@ ioctl (int fd, unsigned long request, ...)
"mov %2,%%ecx\n\t" "mov %2,%%ecx\n\t"
"mov %3,%%edx\n\t" "mov %3,%%edx\n\t"
"mov $0x36, %%eax\n\t" "mov $"SYS_ioctl",%%eax\n\t"
"int $0x80\n\t" "int $0x80\n\t"
"mov %%eax,%0\n\t" "mov %%eax,%0\n\t"
: "=r" (r) : "=r" (r)
@ -241,7 +249,7 @@ fsync (int fd)
asm ( asm (
"mov %1,%%ebx\n\t" "mov %1,%%ebx\n\t"
"mov $0x76, %%eax\n\t" "mov $"SYS_fsync",%%eax\n\t"
"int $0x80\n\t" "int $0x80\n\t"
"mov %%eax,%0\n\t" "mov %%eax,%0\n\t"
: "=r" (r) : "=r" (r)

View file

@ -18,6 +18,9 @@
* along with Mes. If not, see <http://www.gnu.org/licenses/>. * along with Mes. If not, see <http://www.gnu.org/licenses/>.
*/ */
#define SYS_exit "0x01"
#define SYS_write "0x04"
void void
exit (int code) exit (int code)
{ {
@ -32,7 +35,8 @@ exit (int code)
#else // __TINYC__ #else // __TINYC__
asm ( asm (
"mov %0,%%ebx\n\t" "mov %0,%%ebx\n\t"
"mov $1,%%eax\n\t"
"mov $"SYS_exit",%%eax\n\t"
"int $128\n\t" "int $128\n\t"
: // no outputs "=" (r) : // no outputs "=" (r)
: "Ir" (code) : "Ir" (code)
@ -59,15 +63,13 @@ write (int fd, char const* s, int n)
: "" (fd), "" (s), "" (n) : "" (fd), "" (s), "" (n)
: "eax", "ebx", "ecx", "edx" : "eax", "ebx", "ecx", "edx"
); );
//syscall (SYS_write, fd, s, n));
#elif __TINYC__ #elif __TINYC__
asm ( asm (
"mov %1,%%ebx\n\t" "mov %1,%%ebx\n\t"
"mov %2,%%ecx\n\t" "mov %2,%%ecx\n\t"
"mov %3,%%edx\n\t" "mov %3,%%edx\n\t"
"mov $4, %%eax\n\t" "mov $"SYS_write",%%eax\n\t"
"int $128\n\t" "int $128\n\t"
"mov %%eax,%0\n\t" "mov %%eax,%0\n\t"
: "=r" (r) : "=r" (r)

View file

@ -33,17 +33,15 @@ atof (int x)
} }
int int
atol (int x) atol (char const *s)
{ {
eputs ("atol stub\n"); return atoi (s);
return 0;
} }
int int
bcmp (int x) bcmp (void const *s1, void const *s2, size_t size)
{ {
eputs ("bcmp stub\n"); return memcmp (s1, s2, size);
return 0;
} }
void void
@ -53,10 +51,9 @@ bcopy (void const *src, void *dest, size_t n)
} }
int int
bzero (int x) bzero (void *block, size_t size)
{ {
eputs ("bzero stub\n"); return memset (block, 0, size);
return 0;
} }
int int
@ -127,11 +124,12 @@ isupper (int c)
return c >= 'A' && c <= 'Z'; return c >= 'A' && c <= 'Z';
} }
int char *
mktemp (int x) mktemp (char *template)
{ {
eputs ("mktemp stub\n"); char *p = strchr (template, '0');
return 0; *--p = &p;
return template;
} }
int int
@ -197,15 +195,17 @@ system (int x)
} }
int int
tolower (int x) tolower (int c)
{ {
eputs ("tolower stub\n"); if (isupper (c))
return 0; return c + ('a' - 'A');
return c;
} }
int int
toupper (int x) toupper (int c)
{ {
eputs ("toupper stub\n"); if (islower (c))
return 0; return c - ('a' - 'A');
return c;
} }

View file

@ -49,6 +49,7 @@
"__i386__=1" "__i386__=1"
"POSIX=0" "POSIX=0"
"_POSIX_SOURCE=0" "_POSIX_SOURCE=0"
"__STDC__=1"
"__MESC__=1" "__MESC__=1"
,(if mes? "__MESC_MES__=1" "__MESC_MES__=0") ,(if mes? "__MESC_MES__=1" "__MESC_MES__=0")
,@defines) ,@defines)

View file

@ -1,6 +1,6 @@
/* -*-comment-start: "//";comment-end:""-*- /* -*-comment-start: "//";comment-end:""-*-
* Mes --- Maxwell Equations of Software * Mes --- Maxwell Equations of Software
* Copyright © 2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org> * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
* *
* This file is part of Mes. * This file is part of Mes.
* *
@ -28,20 +28,43 @@ test ()
char *s = "mes"; char *s = "mes";
char c = 'm'; char c = 'm';
int i = 3; int i = 3;
char buf[10]; char buf[20];
printf ("c=%c\n", c); printf ("c=%c\n", c);
sprintf (buf, "c=%c\n", c); sprintf (buf, "c=%c\n", c);
if (strcmp (buf, "c=m\n")) return 1; if (strcmp (buf, "c=m\n"))
return 1;
if (i != 3) return 15; if (i != 3) return 15;
printf ("i=%d\n", i); printf ("i=%d\n", i);
sprintf (buf, "i=%d\n", i); sprintf (buf, "i=%d\n", i);
if (strcmp (buf, "i=3\n")) return 2; if (strcmp (buf, "i=3\n"))
return 2;
printf ("s=%s\n", s); printf ("s=%s\n", s);
sprintf (buf, "s=%s\n", s); sprintf (buf, "s=%s\n", s);
if (strcmp (buf, "s=mes\n")) return 3; if (strcmp (buf, "s=mes\n"))
return 3;
sprintf (buf, ">%3d<", 11);
eputs (buf); eputs ("\n");
if (strcmp (buf, "> 11<"))
return 4;
sprintf (buf, ">%03d<", 22);
eputs (buf); eputs ("\n");
if (strcmp (buf, ">022<"))
return 5;
sprintf (buf, ">%-10d<", 33);
eputs (buf); eputs ("\n");
if (strcmp (buf, ">33 <"))
return 6;
sprintf (buf, ">%0d<", 44);
eputs (buf); eputs ("\n");
if (strcmp (buf, ">44<"))
return 7;
return 0; return 0;
} }

View file

@ -0,0 +1,52 @@
/* -*-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 <stdio.h>
int
main ()
{
char buf[100];
strcpy (buf, "foo");
strcat (buf, " bar");
eputs (buf); eputs ("\n");
if (strcmp (buf, "foo bar"))
return 22;
strncat (buf, " bazzzz", 4);
eputs (buf); eputs ("\n");
if (strcmp (buf, "foo bar baz"))
return 2;
char *p = strpbrk ("hello, world", " \t\n,.;!?");
if (strcmp (p, ", world"))
return 3;
eputs ("\n");
if (strspn ("hello, world", "abcdefghijklmnopqrstuvwxyz") != 5)
return 4;
if (strcspn ("hello, world", " \t\n,.;!?") != 5)
return 5;
return 0;
}

58
scaffold/tests/91-fseek.c Normal file
View file

@ -0,0 +1,58 @@
/* -*-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 <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <stdio.h>
int
main ()
{
int fd = open ("COPYING", 0);
if (fd <= 0)
return 1;
FILE* f = fdopen (fd, "r");
int r = fseek (f, 0, SEEK_CUR);
if (r != 0)
return 2;
int pos = ftell (f);
if (pos != 0)
return 3;
r = fseek (f, 0, SEEK_END);
if (r != 0)
return 4;
pos = ftell (f);
eputs ("size="); eputs (itoa (pos)); eputs ("\n");
if (pos != 35147)
return 5;
r = fseek (f, 0, SEEK_SET);
char buf[4096];
fgets (buf, 200, f);
eputs (buf);
if (strcmp (buf, " GNU GENERAL PUBLIC LICENSE\n"))
return 6;
return 0;
}

View file

@ -284,7 +284,7 @@ execl_ (SCM file_name, SCM args) ///((name . "execl"))
args = CDR (args); args = CDR (args);
} }
c_argv[i] = 0; c_argv[i] = 0;
return MAKE_NUMBER (execve (c_argv[0], c_argv, g_environment)); return MAKE_NUMBER (execve (c_argv[0], c_argv, environ));
} }
SCM SCM