mescc: Support binutils-2.10.1: Stubs set errno to 0.
[mes.git] / lib / gcc.c
1 /* -*-comment-start: "//";comment-end:""-*-
2  * Mes --- Maxwell Equations of Software
3  * Copyright © 2018 Jan (janneke) 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 <libmes.h>
22 #include <stdint.h>
23 #include <time.h>
24 #include <sys/times.h>
25 #include <sys/time.h>
26
27 FILE *
28 freopen (char const *file_name, char const *opentype, FILE *stream)
29 {
30   fclose (stream);
31   return fopen (file_name, opentype);
32 }
33
34 clock_t
35 times (struct tms *buffer)
36 {
37 #if NOISY_TIMES
38   eputs ("times stub\n");
39 #endif
40   return 0;
41 }
42
43 unsigned int
44 sleep (unsigned int seconds)
45 {
46   struct timespec requested_time;
47   struct timespec remaining;
48   requested_time.tv_sec = seconds;
49   requested_time.tv_nsec = 0;
50   return nanosleep (&requested_time, &remaining);
51 }
52
53 // gcc-3.2
54 double
55 __divdi3 (double a, double b)
56 {
57   eputs ("__divdi3 stub\n");
58   return ((int)a / (int)b);
59 }
60
61 double
62 __moddi3 (double a, double b)
63 {
64   eputs ("__moddi3 stub\n");
65   return ((int) a %(int)b);
66 }
67
68 // gcc-3.4
69 void
70 unsetenv (char const *name)
71 {
72   int length = strlen (name);
73   char **p = environ;
74   while (*p)
75     {
76       if (!strncmp (name, *p, length) && *(*p + length) == '=')
77         {
78           char **q = p;
79           q[0] = q[1];
80           while (*q++)
81             q[0] = q[1];
82         }
83       p++;
84     }
85 }
86
87 // gcc-3.0
88 int
89 atexit (void (*function) (void))
90 {
91   __call_at_exit = function;
92 }
93
94 unsigned int
95 alarm (unsigned int seconds)
96 {
97 #if !__MESC__
98   struct itimerval old;
99   struct itimerval new;
100   new.it_interval.tv_usec = 0;
101   new.it_interval.tv_sec = 0;
102   new.it_value.tv_usec = 0;
103   new.it_value.tv_sec = (long int) seconds;
104   if (setitimer (ITIMER_REAL, &new, &old) < 0)
105     return 0;
106   return old.it_value.tv_sec;
107 #endif
108 }
109
110 // gcc-2.95.3
111
112 struct passwd *
113 getpwnam (const char *NAME)
114 {
115   eputs ("getpwnam stub\n");
116   errno = 0;
117   return 0;
118 }