1 /* You don't really want to know what this hack is for.
2 Copyright (C) 1996-2013 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)