mlibc: Mescc-tools support: getopt, getopt_long.
[mes.git] / mlibc / libc-gcc+tcc.c
1 /* -*-comment-start: "//";comment-end:""-*-
2  * Mes --- Maxwell Equations of Software
3  * Copyright © 2016,2017 Jan Nieuwenhuizen <janneke@gnu.org>
4  *
5  * This file is part of Mes.
6  *
7  * Mes is free software; you can redistribute it and/or modify it
8  * under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 3 of the License, or (at
10  * your option) any later version.
11  *
12  * Mes is distributed in the hope that it will be useful, but
13  * WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with Mes.  If not, see <http://www.gnu.org/licenses/>.
19  */
20
21 #include <libc-gcc.c>
22 #include <libc-mes+tcc.c>
23 #include <getopt.c>
24
25 int errno;
26
27 #include <unistd.h>
28 #include <stdarg.h>
29 #include <signal.h>
30 #include <sys/mman.h>
31 #include <sys/time.h>
32
33 #define SYS_exit   "0x01"
34 #define SYS_read   "0x03"
35 #define SYS_write  "0x04"
36 #define SYS_open   "0x05"
37 #define SYS_close  "0x06"
38 #define SYS_unlink "0x0a"
39 #define SYS_lseek  "0x13"
40 #define SYS_access "0x21"
41 #define SYS_brk    "0x2d"
42 #define SYS_fsync  "0x76"
43 #define SYS_getcwd "0xb7"
44
45 int
46 close (int fd)
47 {
48 #if !__TINYC__
49   int r;
50   asm (
51        "mov    %0,%%ebx\n\t"
52        "mov    $"SYS_close",%%eax\n\t"
53        "int    $0x80"
54        : "=r" (r)
55        : "" (fd)
56        );
57   return r;
58 #endif
59 }
60
61 int
62 unlink (char const *file_name)
63 {
64 #if !__TINYC__
65   int r;
66   asm (
67        "mov    %0,%%ebx\n\t"
68        "mov    $"SYS_unlink",%%eax\n\t"
69        "int    $0x80"
70        : "=r" (r)
71        : "" (file_name)
72        );
73   return r;
74 #endif
75 }
76
77 off_t
78 lseek (int fd, off_t offset, int whence)
79 {
80 #if !__TINYC__
81   int r;
82   asm (
83        "mov    %1,%%ebx\n\t"
84        "mov    %2,%%ecx\n\t"
85        "mov    %3,%%edx\n\t"
86
87        "mov    $"SYS_lseek",%%eax\n\t"
88        "int  $0x80\n\t"
89
90        "mov    %%eax,%0\n\t"
91        : "=r" (r)
92        : "" (fd), "" (offset), "" (whence)
93        : "eax", "ebx", "ecx", "edx"
94        );
95   return r;
96 #endif
97 }
98
99 char *
100 getcwd (char *buf, size_t size)
101 {
102 #if !__TINYC__
103   int r;
104   asm (
105        "mov    %1,%%ebx\n\t"
106        "mov    %2,%%ecx\n\t"
107
108        "mov    $"SYS_getcwd",%%eax\n\t"
109        "int  $0x80\n\t"
110
111        "mov    %%eax,%0\n\t"
112        : "=r" (r)
113        : "" (buf), "" (size)
114        : "eax", "ebx", "ecx"
115        );
116   return r;
117 #endif
118 }
119
120 int
121 __udivdi3 (int a, int b)
122 {
123   return a / b;
124 }
125
126 int
127 __umoddi3 (int a, int b)
128 {
129   return a % b;
130 }