mescc: Add missing defines.

* module/language/c99/compiler.mes (mescc): Set STDIN, STDOUT, STDERR,
  INT_MIN, INT_MAX.
This commit is contained in:
Jan Nieuwenhuizen 2017-03-22 07:54:45 +01:00
parent efc02d9746
commit a7f40f71ff
3 changed files with 88 additions and 50 deletions

127
mlibc.c
View file

@ -26,6 +26,9 @@ int open (char const *s, int mode);
int read (int fd, void* buf, size_t n); int read (int fd, void* buf, size_t n);
void write (int fd, char const* s, int n); void write (int fd, char const* s, int n);
#define INT_MIN -2147483648
#define INT_MAX 2147483647
void void
exit (int code) exit (int code)
{ {
@ -40,17 +43,6 @@ exit (int code)
exit (0); exit (0);
} }
void
assert_fail (char* s)
{
eputs ("assert fail: ");
eputs (s);
eputs ("\n");
*((int*)0) = 0;
}
#define assert(x) ((x) ? (void)0 : assert_fail (#x))
char const* char const*
getenv (char const* p) getenv (char const* p)
{ {
@ -66,8 +58,10 @@ read (int fd, void* buf, size_t n)
"movl %1,%%ebx\n\t" "movl %1,%%ebx\n\t"
"movl %2,%%ecx\n\t" "movl %2,%%ecx\n\t"
"movl %3,%%edx\n\t" "movl %3,%%edx\n\t"
"movl $0x3,%%eax\n\t" "movl $0x3,%%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)
: "" (fd), "" (buf), "" (n) : "" (fd), "" (buf), "" (n)
@ -97,36 +91,6 @@ open (char const *s, int mode)
int puts (char const*); int puts (char const*);
char const* itoa (int); char const* itoa (int);
int ungetc_char = -1;
int
getchar ()
{
char c;
int i;
if (ungetc_char == -1)
{
int r = read (g_stdin, &c, 1);
if (r < 1) return -1;
i = c;
}
else
{
i = ungetc_char;
ungetc_char = -1;
}
if (i < 0) i += 256;
return i;
}
int
ungetc (int c, int fd)
{
assert (ungetc_char == -1);
ungetc_char = c;
return c;
}
void void
write (int fd, char const* s, int n) write (int fd, char const* s, int n)
{ {
@ -145,6 +109,24 @@ write (int fd, char const* s, int n)
); );
} }
void *
brk (void *p)
{
void *r;
asm (
"mov %1,%%ebx\n\t"
"mov $0x2d,%%eax\n\t"
"int $0x80\n\t"
"mov %%eax,%0\n\t"
: "=r" (r)
: "" (p)
: "eax", "ebx"
);
return r;
}
int int
putchar (int c) putchar (int c)
{ {
@ -154,14 +136,23 @@ putchar (int c)
return 0; return 0;
} }
void *g_malloc_base = 0;
void * void *
malloc (size_t size) malloc (size_t size)
{ {
int *n; void *p = brk (0);
int len = size + sizeof (size); if (!g_malloc_base) g_malloc_base = p;
//n = mmap (0, len, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, 0, 0 ); brk (p+size);
*n = len; return p;
return (void*)(n+1); }
void *
realloc (void *p, size_t size)
{
(void)p;
brk (g_malloc_base + size);
return g_malloc_base;
} }
void void
@ -218,6 +209,48 @@ puts (char const* s)
return 0; return 0;
} }
void
assert_fail (char* s)
{
eputs ("assert fail: ");
eputs (s);
eputs ("\n");
*((int*)0) = 0;
}
#define assert(x) ((x) ? (void)0 : assert_fail (#x))
int ungetc_char = -1;
int
getchar ()
{
char c;
int i;
if (ungetc_char == -1)
{
int r = read (g_stdin, &c, 1);
if (r < 1) return -1;
i = c;
}
else
{
i = ungetc_char;
ungetc_char = -1;
}
if (i < 0) i += 256;
return i;
}
int
ungetc (int c, int fd)
{
assert (ungetc_char == -1);
ungetc_char = c;
return c;
}
char itoa_buf[10]; char itoa_buf[10];
char const* char const*
@ -248,7 +281,7 @@ itoa (int x)
} }
int int
isdigit (char c) isdigit (int c)
{ {
return (c>='0') && (c<='9'); return (c>='0') && (c<='9');
} }

View file

@ -53,7 +53,15 @@
#:inc-dirs (string-split (getenv "C_INCLUDE_PATH") #\:) #:inc-dirs (string-split (getenv "C_INCLUDE_PATH") #\:)
#:cpp-defs '( #:cpp-defs '(
"__GNUC__=0" "__GNUC__=0"
"__MESCC__=1"
"__NYACC__=1" "__NYACC__=1"
"STDIN=0"
"STDOUT=1"
"STDERR=2"
"INT_MIN=-2147483648"
"INT_MAX=2147483647"
"VERSION=\"0.4\"" "VERSION=\"0.4\""
"PREFIX=\"\"" "PREFIX=\"\""
) )

View file

@ -1422,9 +1422,6 @@ stderr_ (SCM x)
} }
//math.c //math.c
#define INT_MIN -2147483648
#define INT_MAX 2147483647
SCM SCM
greater_p (SCM x) ///((name . ">") (arity . n)) greater_p (SCM x) ///((name . ">") (arity . n))
{ {