1 /* You don't really want to know what this hack is for.
2 Copyright (C) 1996-2014 Free Software Foundation, Inc.
3 This file is part of the GNU C Library.
5 The GNU C Library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
10 The GNU C Library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
15 You should have received a copy of the GNU Lesser General Public
16 License along with the GNU C Library; if not, see
17 <http://www.gnu.org/licenses/>. */
29 static void *funcall (char **stringp
) __attribute_noinline__
;
30 static void *eval (char **stringp
);
33 long int weak_function
34 __strtol_internal (const char *nptr
, char **endptr
, int base
, int group
)
36 unsigned long int result
= 0;
39 while (*nptr
== ' ' || *nptr
== '\t')
47 else if (*nptr
== '+')
50 if (*nptr
< '0' || *nptr
> '9')
53 *endptr
= (char *) nptr
;
61 if (nptr
[1] == 'x' || nptr
[1] == 'X')
70 while (*nptr
>= '0' && *nptr
<= '9')
72 unsigned long int digval
= *nptr
- '0';
73 if (result
> LONG_MAX
/ 10
74 || (sign
> 0 ? result
== LONG_MAX
/ 10 && digval
> LONG_MAX
% 10
75 : (result
== ((unsigned long int) LONG_MAX
+ 1) / 10
76 && digval
> ((unsigned long int) LONG_MAX
+ 1) % 10)))
79 return sign
> 0 ? LONG_MAX
: LONG_MIN
;
86 return (long int) result
* sign
;
91 funcall (char **stringp
)
93 void *args
[strlen (*stringp
)], **ap
= args
;
94 void *argcookie
= &args
[1];
98 /* Evaluate the next token. */
99 *ap
++ = eval (stringp
);
101 /* Whitespace is irrelevant. */
102 while (isspace (**stringp
))
105 /* Terminate at closing paren or end of line. */
106 } while (**stringp
!= '\0' && **stringp
!= ')');
107 if (**stringp
!= '\0')
108 /* Swallow closing paren. */
113 static const char unknown
[] = "Unknown function\n";
114 write (1, unknown
, sizeof unknown
- 1);
119 __builtin_return (__builtin_apply (args
[0],
121 (char *) ap
- (char *) &args
[1]));
125 eval (char **stringp
)
128 char *p
= *stringp
, c
;
130 /* Whitespace is irrelevant. */
137 /* String constant. */
142 switch (*strcpy (p
, p
+ 1))
153 while (*p
!= '\0' && *p
++ != '"');
160 return funcall (stringp
);
163 /* Try to parse it as a number. */
164 value
= (void *) __strtol_internal (p
, stringp
, 0, 0);
168 /* Anything else is a symbol that produces its address. */
172 while (*p
!= '\0' && !isspace (*p
) && (!ispunct (*p
) || *p
== '_'));
175 value
= dlsym (NULL
, value
);
185 extern void _start (void) __attribute__ ((noreturn
));
187 __attribute__ ((noreturn
))
193 while (__getdelim (&buf
, &bufsz
, '\n', stdin
) > 0)