summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 4a0051e)
raw | patch | inline | side by side (parent: 4a0051e)
author | Florian Forster <octo@noris.net> | |
Wed, 27 Aug 2008 09:58:09 +0000 (11:58 +0200) | ||
committer | Florian Forster <octo@noris.net> | |
Wed, 27 Aug 2008 09:58:09 +0000 (11:58 +0200) |
This function can be used by the command handlers to parse simple string
arguments. It's used by `parse_option', too, to avoid redundand code.
Signed-off-by: Florian Forster <octo@noris.net>
arguments. It's used by `parse_option', too, to avoid redundand code.
Signed-off-by: Florian Forster <octo@noris.net>
src/utils_parse_option.c | patch | blob | history | |
src/utils_parse_option.h | patch | blob | history |
index 6ed2301fea1e7e37585053f796c92e3a559b06b3..1531485f59f8906d4de217cdb44837aa47fdc59b 100644 (file)
--- a/src/utils_parse_option.c
+++ b/src/utils_parse_option.c
#include "plugin.h"
#include "utils_parse_option.h"
-/*
- * parse_option
- * ------------
- * Parses an ``option'' as used with the unixsock and exec commands. An
- * option is of the form:
- * name0="value"
- * name1="value with \"quotes\""
- * name2="value \\ backslash"
- * However, if the value does *not* contain a space character, you can skip
- * the quotes.
- */
-int parse_option (char **ret_buffer, char **ret_key, char **ret_value)
+int parse_string (char **ret_buffer, char **ret_string)
{
char *buffer;
- char *key;
- char *value;
+ char *string;
buffer = *ret_buffer;
- /* Eat up leading spaces */
- key = buffer;
- while (isspace ((int) *key))
- key++;
- if (*key == 0)
- return (1);
-
- /* Look for the equal sign */
- value = key;
- while (isalnum ((int) *value))
- value++;
- if ((*value != '=') || (value == key))
+ /* Eat up leading spaces. */
+ string = buffer;
+ while (isspace ((int) *string))
+ string++;
+ if (*string == 0)
return (1);
- *value = 0;
- value++;
- /* Empty values must be written as "" */
- if (isspace ((int) *value) || (*value == 0))
- return (-1);
- /* A quoted value */
- if (*value == '"')
+ /* A quoted string */
+ if (*string == '"')
{
char *dst;
- value++;
- if (*value == 0)
- return (-1);
+ string++;
+ if (*string == 0)
+ return (1);
- dst = value;
- buffer = value;
+ dst = string;
+ buffer = string;
while ((*buffer != '"') && (*buffer != 0))
{
/* Un-escape backslashes */
if ((*buffer != 0) && !isspace ((int) *buffer))
return (-1);
}
- else /* an unquoted value */
+ else /* an unquoted string */
{
- buffer = value;
+ buffer = string;
while ((*buffer != 0) && !isspace ((int) *buffer))
buffer++;
if (*buffer != 0)
buffer++;
}
}
-
+
/* Eat up trailing spaces */
while (isspace ((int) *buffer))
buffer++;
+ *ret_buffer = buffer;
+ *ret_string = string;
+
+ return (0);
+} /* int parse_string */
+
+/*
+ * parse_option
+ * ------------
+ * Parses an ``option'' as used with the unixsock and exec commands. An
+ * option is of the form:
+ * name0="value"
+ * name1="value with \"quotes\""
+ * name2="value \\ backslash"
+ * However, if the value does *not* contain a space character, you can skip
+ * the quotes.
+ */
+int parse_option (char **ret_buffer, char **ret_key, char **ret_value)
+{
+ char *buffer;
+ char *key;
+ char *value;
+ int status;
+
+ buffer = *ret_buffer;
+
+ /* Eat up leading spaces */
+ key = buffer;
+ while (isspace ((int) *key))
+ key++;
+ if (*key == 0)
+ return (1);
+
+ /* Look for the equal sign */
+ buffer = key;
+ while (isalnum ((int) *buffer))
+ buffer++;
+ if ((*buffer != '=') || (buffer == key))
+ return (1);
+ *buffer = 0;
+ buffer++;
+ /* Empty values must be written as "" */
+ if (isspace ((int) *buffer) || (*buffer == 0))
+ return (-1);
+
+ status = parse_string (&buffer, &value);
+ if (status != 0)
+ return (-1);
+
+ /* NB: parse_string will have eaten up all trailing spaces. */
+
*ret_buffer = buffer;
*ret_key = key;
*ret_value = value;
index 1cd91dee5b8c35ee1bb293ee79fedcb7482f9a4a..cb7f6d32112582e1fe1b069508b13d92e419847a 100644 (file)
--- a/src/utils_parse_option.h
+++ b/src/utils_parse_option.h
#ifndef UTILS_PARSE_OPTION
#define UTILS_PARSE_OPTION 1
+int parse_string (char **ret_buffer, char **ret_string);
int parse_option (char **ret_buffer, char **ret_key, char **ret_value);
#endif /* UTILS_PARSE_OPTION */