mescc: m4 support: WIP
authorJan Nieuwenhuizen <janneke@gnu.org>
Sun, 27 May 2018 08:28:30 +0000 (10:28 +0200)
committerJan Nieuwenhuizen <janneke@gnu.org>
Sun, 27 May 2018 08:28:30 +0000 (10:28 +0200)
15 files changed:
include/errno.h
include/fcntl.h
include/float.h
include/limits.h
include/signal.h
include/stddef.h
include/stdio.h
include/sys/stat.h
include/sys/types.h
include/time.h
lib/libc+tcc-gcc.c
lib/libc+tcc.c
lib/libc.c
lib/linux+tcc-gcc.c
lib/m4.c [new file with mode: 0644]

index 055267a676469d41a78004763edf9aa6f59c20cb..a6ca9e61408299de2765bbba6d5153cda4cda23a 100644 (file)
 #include_next <errno.h>
 #else // ! (__GNUC__ && POSIX)
 int errno;
+#define        ENOENT           2      /* No such file or directory */
+#define        EBADF            9      /* Bad file number */
+#define        ENOMEM          12      /* Out of memory */
+#define        EEXIST          17      /* File exists */
+#define        ENOTDIR         20      /* Not a directory */
+#define        EISDIR          21      /* Is a directory */
+#define        EINVAL          22      /* Invalid argument */
+#define        EMFILE          24      /* Too many open files */
+#define        EPIPE           32      /* Broken pipe */
 #define        ERANGE          34      /* Math result not representable */
+
+#define        ENAMETOOLONG    36      /* File name too long */
+#define        ENOSYS          38      /* Invalid system call number */
+#define        ELOOP           40      /* Too many symbolic links encountered */
+
 #endif // ! (__GNUC__ && POSIX)
 
 #endif // __MES_ERRNO_H
index 920b7e5aeb73c2217581e00f4ce0caa105c0c1ab..e3f1fad3aa21368e38a5a5f528c6f65ef957086d 100644 (file)
 #define O_WRONLY 1
 #define O_RDWR 2
 #define O_CREAT 64
+#define O_EXCL 128
 #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_GETFD 1
+#define F_SETFD 2
+#define F_GETFL 3
+#define F_SETFL 4
+
 int open (char const *s, int flags, ...);
 #endif // ! (__GNUC__ && POSIX)
 
index cc8e4d33884e7b40f166267ea817a4c2d2409ce7..35d9b896384be589b90712651de9e23e6993a3b8 100644 (file)
 #undef __MES_FLOAT_H
 #include_next <float.h>
 #else // ! (__GNUC__ && POSIX)
+
+#define MIN_EXP -1021
+#define DBL_MIN_EXP -1021
+#define LDBL_MIN_EXP -1021
+
 #endif // ! (__GNUC__ && POSIX)
 
 #endif // __MES_FLOAT_H
index 2bd2ee35aa2a72507fa7fb53d5292e8c156fb88d..99e6083e7c519d2dae3aaffb5b3bf11d509b7a1b 100644 (file)
 #include_next <limits.h>
 
 #else // ! (__GNUC__ && POSIX)
+#define CHAR_BIT 8
+#define UCHAR_MAX 255
 #define INT_MIN -2147483648
 #define INT_MAX 2147483647
+#define MB_CUR_MAX 1
+
 #endif // ! (__GNUC__ && POSIX)
 
 #endif // __MES_LIMITS_H
index 574b72240830a9090dce97e4ee8b82629b15e86b..43f2a7e7c94ab9ef469b207d1b3661506d9a1df2 100644 (file)
@@ -28,8 +28,16 @@ typedef int sigset_t;
 
 typedef int stack_t;
 
+#ifndef __MES_PID_T
+#define __MES_PID_T
 typedef int pid_t;
+#endif
+
+#ifndef __MES_UID_T
+#define __MES_UID_T
 typedef int uid_t;
+#endif
+
 typedef int clock_t;
 typedef int sigval_t;
 
@@ -116,14 +124,20 @@ typedef struct siginfo_t {
 
 // typedef void __signalfn_t(int);
 // typedef __signalfn_t *__sighandler_t;
+// typedef __signalfn_t *__sighandler_t;
+typedef void __sighandler_t(int);
 
 struct sigaction {
  void (*sa_sigaction) (int, siginfo_t *, void *);
   //__sighandler_t sa_handler;
+  void (*sa_handler) (int);
   unsigned long sa_flags;
   sigset_t sa_mask;
 };
 
+#define SIG_DFL        ((__sighandler_t)0)     /* default signal handling */
+#define SIG_IGN        ((__sighandler_t)1)     /* ignore signal */
+#define SIG_ERR        ((__sighandler_t)-1)    /* error return from signal */
 
 #ifdef __i386__
 
@@ -206,4 +220,3 @@ int sigemptyset (sigset_t *set);
 #endif //! (__GNUC__ && POSIX)
 
 #endif // __MES_SIGNAL_H
-
index 7d619a7087a756291609c7a4fb192749556cf592..20174580a1d80226edc3f7ddcbd05f2f3bebf376 100644 (file)
 #else // ! (__GNUC__ && POSIX)
 #include <stdint.h>
 #include <unistd.h>
+
+#ifndef offsetof
+#if __MESC__
+#define offsetof(type, field) (&((type *)0)->field)
+#else // !__MESC__
+#define offsetof(type, field) ((size_t)&((type *)0)->field)
+#endif // !__MESC__
+#endif // offsetof
+
 #endif // ! (__GNUC__ && POSIX)
 
 #endif // __MES_STDDEF_H
index 230eb05747687bb6dc971bb3213c6b16421d8928..c568ed6cb62a62fb9fbebe1d87c9126d5ed9578c 100644 (file)
@@ -87,8 +87,8 @@ int fdungetc (int c, int fd);
 int fdputs (char const* s, int fd);
 #endif // __MES_GNUC__
 
-#define fputs fdputs
-#define fputc fdputc
+//#define fputs fdputs
+//#define fputc fdputc
 
 typedef int FILE;
 
@@ -98,16 +98,27 @@ typedef int FILE;
 typedef unsigned long size_t;
 #endif
 
+int getc (FILE *stream);
+int fputc (int c, FILE* stream);
+int fdputs (char const* s, int fd);
+int fputs (char const* s, FILE *stream);
+int putc (int c, FILE* stream);
+//int putc (int c, int fd);
+
 int eputc (int c);
 int eputs (char const* s);
 int fclose (FILE *stream);
 FILE *fdopen (int fd, char const *mode);
+int fdputc (int c, int fd);
 int fflush (FILE *stream);
-FILE *fopen (char const *file_name, char const *mode);
 int ferror (FILE *stream);
+FILE *fopen (char const *file_name, char const *mode);
+int fpurge (FILE *stream);
+//void __fpurge (FILE *stream);
 int fprintf (FILE *stream, char const *format, ...);
-int fdputc (int c, int fd);
 size_t fread (void *ptr, size_t size, size_t nmemb, FILE *stream);
+size_t __freadahead (FILE *fp);
+//size_t freadahead (FILE *fp);
 int fseek (FILE *stream, long offset, int whence);
 long ftell (FILE *stream);
 size_t fwrite (void const *ptr, size_t size, size_t nmemb, FILE *stream);
index 8513a3c9686a7c4c78a920bedb8b656966e7497d..d377d7173e3b461cfce932e730f71645bc11a02c 100644 (file)
@@ -18,7 +18,7 @@
  * along with Mes.  If not, see <http://www.gnu.org/licenses/>.
  */
 #ifndef __MES_SYS_STAT_H
-#define __MES_SYS_STAT_H 1
+#define __MES_SYS_STAT_H 1lei
 
 #if __GNUC__ && POSIX
 #undef __MES_SYS_STAT_H
@@ -33,23 +33,30 @@ typedef int mode_t;
 
 int chmod (char const *file_name, mode_t mode);
 
-struct stat {
-  int st_dev;
-  int st_ino;
-  int st_mode;
-  int st_nlink;
-  int st_uid;
-  int st_gid;
-  int st_rdev;
-  int st_size;
-  int st_blksize;
-  int st_blocks;
-  int st_atime;
-  int st_mtime;
-  int st_ctime;
+struct stat
+{
+  unsigned long        st_dev;         /* Device.  */
+  unsigned long        st_ino;         /* File serial number.  */
+  unsigned int st_mode;        /* File mode.  */
+  unsigned int st_nlink;       /* Link count.  */
+  unsigned int st_uid;         /* User ID of the file's owner.  */
+  unsigned int st_gid;         /* Group ID of the file's group. */
+  unsigned long        st_rdev;        /* Device number, if device.  */
+  unsigned long        __pad1;
+  long         st_size;        /* Size of file, in bytes.  */
+  int          st_blksize;     /* Optimal block size for I/O.  */
+  int          __pad2;
+  long         st_blocks;      /* Number 512-byte blocks allocated. */
+  long         st_atime;       /* Time of last access.  */
+  unsigned long        st_atime_nsec;
+  long         st_mtime;       /* Time of last modification.  */
+  unsigned long        st_mtime_nsec;
+  long         st_ctime;       /* Time of last status change.  */
+  unsigned long        st_ctime_nsec;
+  unsigned int __unused4;
+  unsigned int __unused5;
 };
 
 #endif // !(__GNUC__ && POSIX)
 
 #endif // __MES_SYS_STAT_H
-
index e59df775fe726aa3e179c714ae06b8d476ad4b44..33681f919aa7eb3f8be8e9c0604d7f6918626785 100644 (file)
 typedef unsigned long size_t;
 #endif
 
+#ifndef __MES_PID_T
+#define __MES_PID_T
+typedef int pid_t;
+#endif
+
+#ifndef __MES_UID_T
+#define __MES_UID_T
+typedef int uid_t;
+#endif
+
 #endif // ! (__GNUC__ && POSIX)
 
 #endif // __MES_SYS_TYPES_H
index 6e87257b2b4e4506f8183977f32a53b2678ad2f8..e5219f6bb78c6b97cdd74da64a1381014bcccd6d 100644 (file)
@@ -41,7 +41,24 @@ struct tm {
 struct tm *localtime (time_t const *timep);
 time_t time (time_t *tloc);
 
+#ifndef __MES_STRUCT_TIMESPEC
+#define __MES_STRUCT_TIMESPEC
+
+#ifndef __kernel_long_t
+typedef long           __kernel_long_t;
+typedef unsigned long  __kernel_ulong_t;
+#endif
+
+typedef __kernel_long_t        __kernel_time_t;
+
+struct timespec
+{
+  __kernel_time_t tv_sec;
+  long tv_nsec;
+};
+
+#endif // __MES_STRUCT_TIMESPEC
+
 #endif // ! (__GNUC__ && POSIX)
 
 #endif // __MES_TIME_H
-
index bfacb8d85dbaef2ecee14b884e430ae727fb3aef..f53480b2cf72d630f8f86f982b0a23101122ccc6 100644 (file)
@@ -150,4 +150,7 @@ __fixsfdi (double a1)
   eputs ("__fixsfdi stub\n");
   return 0;
 }
+
+#include <m4.c>
+
 #endif // !POSIX
index 3a0b425b43e511e60ffe474cd2d16f772504589a..e9b77cbdfb526f983041dd32e59ddc9a31b69682 100644 (file)
@@ -87,10 +87,15 @@ fprintf (FILE *stream, char const *format, ...)
 }
 
 size_t
-fread (void *ptr, size_t size, size_t nmemb, FILE *stream)
+fread (void *data, size_t size, size_t count, FILE *stream)
 {
-  eputs ("fread stub\n");
-  return 0;
+  if (! size || !count)
+    return 0;
+  int bytes = read ((int)stream, data, size * count);
+  if (bytes > 0)
+    return bytes/size;
+
+  return bytes;
 }
 
 int
@@ -107,13 +112,6 @@ ftell (FILE *stream)
   return 0;
 }
 
-size_t
-fwrite (void const *ptr, size_t size, size_t nmemb, FILE *stream)
-{
-  int fd = (int)stream;
-  return write (fd, ptr, size * nmemb);
-}
-
 int
 gettimeofday (struct timeval *tv, struct timezone *tz)
 {
index 639395657406f956febb519d652d9326ceba1d41..8a8af86b0279e4bdb84340b507cb15115430c679 100644 (file)
@@ -175,6 +175,24 @@ eputc (int c)
   return fdputc (c, STDERR);
 }
 
+int
+fputc (int c, FILE* stream)
+{
+  return fdputc (c, (int)stream);
+}
+
+int
+fputs (char const* s, FILE* stream)
+{
+  return fdputs (s, (int)stream);
+}
+
+int
+putc (int c, FILE* stream)
+{
+  return fdputc (c, (int)stream);
+}
+
 FILE*
 fopen (char const* file_name, char const* mode)
 {
@@ -331,6 +349,18 @@ strncmp (char const* a, char const* b, size_t length)
   return *a - *b;
 }
 
+size_t
+fwrite (void const *data, size_t size, size_t count, FILE *stream)
+{
+  if (! size || !count)
+    return 0;
+  int bytes = write ((int)stream, data, size * count);
+  if (bytes > 0)
+    //return bytes/size;
+    return count;
+  return bytes;
+}
+
 char *
 getenv (char const* s)
 {
index 9c5a8d45f70eadb66540eccdb116c732d82ca3e8..61d195f983cd64c95961fd679cea3ad469e13fae 100644 (file)
@@ -27,6 +27,8 @@
 #define SYS_lseek  "0x13"
 #define SYS_access "0x21"
 #define SYS_brk    "0x2d"
+#define SYS_stat   "0x6a"
+#define SYS_fstat  "0x6c"
 #define SYS_fsync  "0x76"
 #define SYS_getcwd "0xb7"
 
@@ -84,6 +86,50 @@ lseek (int fd, off_t offset, int whence)
 #endif
 }
 
+
+int
+stat (char const *file_name, struct stat *statbuf)
+{
+#if !__TINYC__
+  int r;
+  asm (
+       "mov    %1,%%ebx\n\t"
+       "mov    %2,%%ecx\n\t"
+
+       "mov    $"SYS_stat",%%eax\n\t"
+       "int  $0x80\n\t"
+
+       "mov    %%eax,%0\n\t"
+       : "=r" (r)
+       : "" (file_name), "" (statbuf)
+       : "eax", "ebx", "ecx"
+       );
+  return r;
+#endif
+}
+
+int
+fstat (int fd, struct stat *statbuf)
+{
+#if !__TINYC__
+  int r;
+  asm (
+       "mov    %1,%%ebx\n\t"
+       "mov    %2,%%ecx\n\t"
+
+       "mov    $"SYS_fstat",%%eax\n\t"
+       //"mov    $"SYS_oldfstat",%%eax\n\t"
+       "int  $0x80\n\t"
+
+       "mov    %%eax,%0\n\t"
+       : "=r" (r)
+       : "" (fd), "" (statbuf)
+       : "eax", "ebx", "ecx"
+       );
+  return r;
+#endif
+}
+
 char *
 getcwd (char *buf, size_t size)
 {
diff --git a/lib/m4.c b/lib/m4.c
new file mode 100644 (file)
index 0000000..af2343e
--- /dev/null
+++ b/lib/m4.c
@@ -0,0 +1,224 @@
+/* -*-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/>.
+ */
+
+int
+abort (int x)
+{
+  eputs ("abort stub\n");
+  return 0;
+}
+
+int
+atof (int x)
+{
+  eputs ("atof stub\n");
+  return 0;
+}
+
+int
+atol (int x)
+{
+  eputs ("atol stub\n");
+  return 0;
+}
+
+int
+bcmp (int x)
+{
+  eputs ("bcmp stub\n");
+  return 0;
+}
+
+void
+bcopy (void const *src, void *dest, size_t n)
+{
+  return memmove (dest, src, n);
+}
+
+int
+bzero (int x)
+{
+  eputs ("bzero stub\n");
+  return 0;
+}
+
+int
+fileno (FILE *stream)
+{
+  return (int)stream;
+}
+
+// void
+// __fpurge (FILE *stream)
+// {
+//   eputs ("__fpurge stub\n");
+//   return 0;
+// }
+
+int
+fpurge (FILE *stream)
+{
+  eputs ("fpurge stub\n");
+  return 0;
+}
+
+// size_t
+// __freadahead (FILE *fp)
+// {
+//   eputs ("__freadahead stub\n");
+//   return 0;
+// }
+
+size_t
+freadahead (FILE *fp)
+{
+  eputs ("freadahead stub\n");
+  return 0;
+}
+
+int
+getc (FILE *stream)
+{
+  return fgetc ((int)stream);
+}
+
+int
+index (char const *s, int c)
+{
+  return strchr (s, c);
+}
+
+int
+isalnum (int c)
+{
+  return isdigit (c) || isalpha (c);
+}
+
+int
+isalpha (int c)
+{
+  return islower (c) || isupper (c);
+}
+
+int
+iscntrl (int c)
+{
+  return c >= 0 && c < 32;
+}
+
+int
+islower (int c)
+{
+  return c >= 'a' && c <= 'z';
+}
+
+int
+isprint (int c)
+{
+  return c >= 32 && c < 127;
+}
+
+int
+ispunct (int c)
+{
+  return isprint (c) && !isspace (c) && !isalnum (c);
+}
+
+int
+isupper (int c)
+{
+  return c >= 'A' && c <= 'Z';
+}
+
+int
+mktemp (int x)
+{
+  eputs ("mktemp stub\n");
+  return 0;
+}
+
+int
+pclose (int x)
+{
+  eputs ("pclose stub\n");
+  return 0;
+}
+
+int
+popen (int x)
+{
+  eputs ("popen stub\n");
+  return 0;
+}
+
+int
+rindex (char const *s, int c)
+{
+  return strrchr (s, c);
+}
+
+int
+rewind (int x)
+{
+  eputs ("rewind stub\n");
+  return 0;
+}
+
+int
+setbuf (int x)
+{
+  eputs ("setbuf stub\n");
+  return 0;
+}
+
+int
+signal (int x)
+{
+  eputs ("signal stub\n");
+  return 0;
+}
+
+int
+sys_errlist (int x)
+{
+  eputs ("sys_errlist stub\n");
+  return 0;
+}
+
+int
+sys_nerr (int x)
+{
+  eputs ("sys_nerr stub\n");
+  return 0;
+}
+
+int
+system (int x)
+{
+  eputs ("system stub\n");
+  return 0;
+}
+
+int
+tolower (int x)
+{
+  eputs ("tolower stub\n");
+  return 0;
+}