diff options
author | Paul Smith <psmith@gnu.org> | 2012-01-16 03:32:49 +0000 |
---|---|---|
committer | Paul Smith <psmith@gnu.org> | 2012-01-16 03:32:49 +0000 |
commit | 49cc211819851b76c58fb37eeb579bd88a5ac65a (patch) | |
tree | 7846b379f1444f31458313bc97b2acf24c8a2a87 /function.c | |
parent | 4e2e5eb199b5fbaf7cfdb203c64099b514fba5d0 (diff) | |
download | gunmake-49cc211819851b76c58fb37eeb579bd88a5ac65a.tar.gz |
Create a new internal interface for defining new make functions.
This allows us to create new functions without changing function.c.
You still have to modify the GNU make code (for now) though: this is
simply a preliminary step to possibly allowing make to load modules.
Modify the Guile integration to use this method rather than ifdefs
in function.c.
Diffstat (limited to 'function.c')
-rw-r--r-- | function.c | 45 |
1 files changed, 27 insertions, 18 deletions
@@ -2103,21 +2103,6 @@ func_abspath (char *o, char **argv, const char *funcname UNUSED) return o; } -#ifdef HAVE_GUILE -static char * -func_guile (char *o, char **argv, const char *funcname UNUSED) -{ - if (argv[0] && argv[0][0] != '\0') - { - char *str = guile_eval_string (argv[0]); - o = variable_buffer_output (o, str, strlen (str)); - free (str); - } - - return o; -} -#endif - /* Lookup table for builtin functions. This doesn't have to be sorted; we use a straight lookup. We might gain @@ -2171,9 +2156,6 @@ static struct function_table_entry function_table_init[] = { STRING_SIZE_TUPLE("and"), 1, 0, 0, func_and}, { STRING_SIZE_TUPLE("value"), 0, 1, 1, func_value}, { STRING_SIZE_TUPLE("eval"), 0, 1, 1, func_eval}, -#ifdef HAVE_GUILE - { STRING_SIZE_TUPLE("guile"), 0, 1, 1, func_guile}, -#endif #ifdef EXPERIMENTAL { STRING_SIZE_TUPLE("eq"), 2, 2, 1, func_eq}, { STRING_SIZE_TUPLE("not"), 0, 1, 1, func_not}, @@ -2432,6 +2414,33 @@ func_call (char *o, char **argv, const char *funcname UNUSED) } void +define_new_function(const struct floc *flocp, + const char *name, int min, int max, int expand, + char *(*func)(char *, char **, const char *)) +{ + size_t len = strlen (name); + struct function_table_entry *ent = xmalloc (sizeof (struct function_table_entry)); + + if (len > 255) + fatal (flocp, _("Function name too long: %s\n"), name); + if (min < 0 || min > 255) + fatal (flocp, _("Invalid minimum argument count (%d) for function %s%s\n"), + min, name); + if (max < 0 || max > 255 || max < min) + fatal (flocp, _("Invalid maximum argument count (%d) for function %s%s\n"), + max, name); + + ent->name = name; + ent->len = len; + ent->minimum_args = min; + ent->maximum_args = max; + ent->expand_args = expand ? 1 : 0; + ent->func_ptr = func; + + hash_insert (&function_table, ent); +} + +void hash_init_function_table (void) { hash_init (&function_table, FUNCTION_TABLE_ENTRIES * 2, |