1 /* You don't really want to know what this hack is for.
2 Copyright (C) 1996, 1997 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 Library General Public License as
7 published by the Free Software Foundation; either version 2 of the
8 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 Library General Public License for more details.
15 You should have received a copy of the GNU Library General Public
16 License along with the GNU C Library; see the file COPYING.LIB. If not,
17 write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA. */
27 static void *funcall (char **stringp);
28 static void *eval (char **stringp);
31 funcall (char **stringp)
33 void *args[strlen (*stringp)], **ap = args;
34 void *argcookie = &args[1];
38 /* Evaluate the next token. */
39 *ap++ = eval (stringp);
41 /* Whitespace is irrelevant. */
42 while (isspace (**stringp))
45 /* Terminate at closing paren or end of line. */
46 } while (**stringp != '\0' && **stringp != ')');
47 if (**stringp != '\0')
48 /* Swallow closing paren. */
53 static const char unknown[] = "Unknown function\n";
54 write (1, unknown, sizeof unknown - 1);
59 __builtin_return (__builtin_apply (args[0],
61 (char *) ap - (char *) &args[1]));
68 char *p = *stringp, c;
70 /* Whitespace is irrelevant. */
77 /* String constant. */
82 switch (*strcpy (p, p + 1))
93 while (*p != '\0' && *p++ != '"');
100 return funcall (stringp);
103 /* Try to parse it as a number. */
104 value = (void *) strtol (p, stringp, 0);
108 /* Anything else is a symbol that produces its address. */
112 while (*p != '\0' && !isspace (*p) && (!ispunct (*p) || *p == '_'));
115 value = dlsym (NULL, value);
131 while (__getdelim (&buf, &bufsz, '\n', stdin) > 0)