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:
parent
c3f27804f6
commit
f1efaa0e93
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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]'
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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
36
include/memory.h
Normal 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
41
include/pwd.h
Normal 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
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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
32
include/sys/dir.h
Normal 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
32
include/sys/file.h
Normal 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
31
include/sys/param.h
Normal 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
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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
109
include/sys/user.h
Normal 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
|
|
@ -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
210
lib/binutils.c
Normal 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;
|
||||||
|
}
|
|
@ -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");
|
||||||
|
|
20
lib/getopt.c
20
lib/getopt.c
|
@ -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
23
lib/libc+gnu.c
Normal 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>
|
130
lib/libc+tcc.c
130
lib/libc+tcc.c
|
@ -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;
|
||||||
|
}
|
||||||
|
|
84
lib/libc.c
84
lib/libc.c
|
@ -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
21
lib/libgetopt.c
Normal 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>
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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,13 +58,12 @@ 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"
|
||||||
|
@ -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)
|
||||||
|
|
|
@ -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)
|
||||||
|
|
38
lib/m4.c
38
lib/m4.c
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
52
scaffold/tests/90-strpbrk.c
Normal file
52
scaffold/tests/90-strpbrk.c
Normal 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
58
scaffold/tests/91-fseek.c
Normal 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;
|
||||||
|
}
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue