2 * GRUB -- GRand Unified Bootloader
3 * Copyright (C) 2005,2007,2009,2010 Free Software Foundation, Inc.
5 * GRUB is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
10 * GRUB 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
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
19 #include <grub/misc.h>
20 #include <grub/script_sh.h>
21 #include <grub/parser.h>
23 #include <grub/charset.h>
25 grub_script_function_t grub_script_function_list
;
27 grub_script_function_t
28 grub_script_function_create (struct grub_script_arg
*functionname_arg
,
29 struct grub_script
*cmd
)
31 grub_script_function_t func
;
32 grub_script_function_t
*p
;
34 func
= (grub_script_function_t
) grub_malloc (sizeof (*func
));
38 func
->name
= grub_strdup (functionname_arg
->str
);
47 /* Keep the list sorted for simplicity. */
48 p
= &grub_script_function_list
;
51 if (grub_strcmp ((*p
)->name
, func
->name
) >= 0)
57 /* If the function already exists, overwrite the old function. */
58 if (*p
&& grub_strcmp ((*p
)->name
, func
->name
) == 0)
60 grub_script_function_t q
;
63 grub_script_free (q
->func
);
78 grub_script_function_remove (const char *name
)
80 grub_script_function_t
*p
, q
;
82 for (p
= &grub_script_function_list
, q
= *p
; q
; p
= &(q
->next
), q
= q
->next
)
83 if (grub_strcmp (name
, q
->name
) == 0)
87 grub_script_free (q
->func
);
93 grub_script_function_t
94 grub_script_function_find (char *functionname
)
96 grub_script_function_t func
;
98 for (func
= grub_script_function_list
; func
; func
= func
->next
)
99 if (grub_strcmp (functionname
, func
->name
) == 0)
105 grub_strncpy (tmp
, functionname
, 20);
107 /* Avoid truncating inside UTF-8 character. */
108 tmp
[grub_getend (tmp
, tmp
+ grub_strlen (tmp
))] = 0;
109 grub_error (GRUB_ERR_UNKNOWN_COMMAND
, N_("can't find command `%s'"), tmp
);