1 /* You don't really want to know what this hack is for.
2 Copyright (C) 1996, 1997, 2000, 2001 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, write to the Free
17 Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
30 static void *funcall (char **stringp
) __attribute_noinline__
;
31 static void *eval (char **stringp
);
34 long int weak_function
35 __strtol_internal (const char *nptr
, char **endptr
, int base
, int group
)
37 unsigned long int result
= 0;
40 while (*nptr
== ' ' || *nptr
== '\t')
48 else if (*nptr
== '+')
51 if (*nptr
< '0' || *nptr
> '9')
54 *endptr
= (char *) nptr
;
62 if (nptr
[1] == 'x' || nptr
[1] == 'X')
71 while (*nptr
>= '0' && *nptr
<= '9')
73 unsigned long int digval
= *nptr
- '0';
74 if (result
> LONG_MAX
/ 10
75 || (sign
> 0 ? result
== LONG_MAX
/ 10 && digval
> LONG_MAX
% 10
76 : (result
== ((unsigned long int) LONG_MAX
+ 1) / 10
77 && digval
> ((unsigned long int) LONG_MAX
+ 1) % 10)))
80 return sign
> 0 ? LONG_MAX
: LONG_MIN
;
87 return (long int) result
* sign
;
92 funcall (char **stringp
)
94 void *args
[strlen (*stringp
)], **ap
= args
;
95 void *argcookie
= &args
[1];
99 /* Evaluate the next token. */
100 *ap
++ = eval (stringp
);
102 /* Whitespace is irrelevant. */
103 while (isspace (**stringp
))
106 /* Terminate at closing paren or end of line. */
107 } while (**stringp
!= '\0' && **stringp
!= ')');
108 if (**stringp
!= '\0')
109 /* Swallow closing paren. */
114 static const char unknown
[] = "Unknown function\n";
115 write (1, unknown
, sizeof unknown
- 1);
120 __builtin_return (__builtin_apply (args
[0],
122 (char *) ap
- (char *) &args
[1]));
126 eval (char **stringp
)
129 char *p
= *stringp
, c
;
131 /* Whitespace is irrelevant. */
138 /* String constant. */
143 switch (*strcpy (p
, p
+ 1))
154 while (*p
!= '\0' && *p
++ != '"');
161 return funcall (stringp
);
164 /* Try to parse it as a number. */
165 value
= (void *) __strtol_internal (p
, stringp
, 0, 0);
169 /* Anything else is a symbol that produces its address. */
173 while (*p
!= '\0' && !isspace (*p
) && (!ispunct (*p
) || *p
== '_'));
176 value
= dlsym (NULL
, value
);
186 extern void _start (void) __attribute__ ((noreturn
));
188 __attribute__ ((noreturn
))
194 while (__getdelim (&buf
, &bufsz
, '\n', stdin
) > 0)