replaced with grub_strchrsub function

This commit is contained in:
BVK Chaitanya 2010-11-25 18:56:20 +05:30
parent d7647bb670
commit 5b08062083
5 changed files with 31 additions and 28 deletions

View file

@ -228,7 +228,7 @@ setparams_prefix (int argc, char **args)
{ {
*p++ = ' '; *p++ = ' ';
*p++ = '\''; *p++ = '\'';
p = grub_script_escape_squotes (p, args[j], grub_strlen (args[j])); p = grub_strchrsub (p, args[j], '\'', "'\\''");
*p++ = '\''; *p++ = '\'';
} }
*p++ = '\n'; *p++ = '\n';

View file

@ -323,16 +323,23 @@ struct legacy_command legacy_commands[] =
char * char *
grub_legacy_escape (const char *in, grub_size_t len) grub_legacy_escape (const char *in, grub_size_t len)
{ {
const char *ptr; char saved;
char *ptr;
char *outptr; char *outptr;
int overhead = 0; int overhead = 0;
for (ptr = in; ptr < in + len && *ptr; ptr++)
for (ptr = (char*)in; ptr < in + len && *ptr; ptr++)
if (*ptr == '\'') if (*ptr == '\'')
overhead += 3; overhead += 3;
outptr = grub_malloc (ptr - in + overhead + 1); outptr = grub_malloc (ptr - in + overhead + 1);
if (!outptr) if (!outptr)
return NULL; return NULL;
grub_script_escape_squotes (outptr, in, len);
ptr = (char*)in;
saved = ptr[len];
ptr[len] = '\0';
grub_strchrsub (outptr, in, '\'', "'\\''");
ptr[len] = saved;
return outptr; return outptr;
} }

View file

@ -22,27 +22,6 @@
#include <grub/parser.h> #include <grub/parser.h>
#include <grub/mm.h> #include <grub/mm.h>
/* Escape single quotes in first `len' characters of `in' into a GRUB
script argument form into `out'; return address of the end in
`out'. */
char *
grub_script_escape_squotes (char *out, const char *in, grub_size_t len)
{
while (*in && len--)
{
*out++ = *in;
if (*in == '\'')
{
*out++ = '\\';
*out++ = '\'';
*out++ = '\'';
}
in++;
}
*out = '\0';
return out;
}
/* It is not possible to deallocate the memory when a syntax error was /* It is not possible to deallocate the memory when a syntax error was
found. Because of that it is required to keep track of all memory found. Because of that it is required to keep track of all memory
allocations. The memory is freed in case of an error, or assigned allocations. The memory is freed in case of an error, or assigned

View file

@ -193,6 +193,26 @@ grub_strncasecmp (const char *s1, const char *s2, grub_size_t n)
return (int) grub_tolower (*s1) - (int) grub_tolower (*s2); return (int) grub_tolower (*s1) - (int) grub_tolower (*s2);
} }
/* Replace all `ch' characters of `input' with `with' and copy the
result into `output'; return address of the end in `output'. */
static inline char *
grub_strchrsub (char *output, const char *input, char ch, const char *with)
{
grub_size_t grub_strlen (const char *s);
while (*input)
{
if (*input == ch)
{
grub_strcpy (output, with);
output += grub_strlen (with);
input++;
continue;
}
*output++ = *input++;
}
*output = '\0';
return output;
}
unsigned long EXPORT_FUNC(grub_strtoul) (const char *str, char **end, int base); unsigned long EXPORT_FUNC(grub_strtoul) (const char *str, char **end, int base);
unsigned long long EXPORT_FUNC(grub_strtoull) (const char *str, char **end, int base); unsigned long long EXPORT_FUNC(grub_strtoull) (const char *str, char **end, int base);

View file

@ -382,9 +382,6 @@ grub_script_execute_arglist_to_argv (struct grub_script_arglist *arglist, int *c
grub_err_t grub_err_t
grub_normal_parse_line (char *line, grub_reader_getline_t getline); grub_normal_parse_line (char *line, grub_reader_getline_t getline);
char *
grub_script_escape_squotes (char *out, const char *in, grub_size_t len);
static inline struct grub_script * static inline struct grub_script *
grub_script_ref (struct grub_script *script) grub_script_ref (struct grub_script *script)
{ {