From eb3c0cf8069a004512aac23d85c87c2ee348f8cd Mon Sep 17 00:00:00 2001 From: Hans de Goede Date: Fri, 19 Dec 2014 14:27:46 +0100 Subject: [PATCH] videomodes: Add helper functions to parse video-mode env-var extra options Add 2 helper functions to get strings, respectively integers from the options value returned by video_get_video_mode() / video_get_ctfb_res_modes(). Signed-off-by: Hans de Goede Acked-by: Anatolij Gustschin --- drivers/video/videomodes.c | 60 +++++++++++++++++++++++++++++++++++++- drivers/video/videomodes.h | 5 ++++ 2 files changed, 64 insertions(+), 1 deletion(-) diff --git a/drivers/video/videomodes.c b/drivers/video/videomodes.c index 45ccb36e84..40c3315aa9 100644 --- a/drivers/video/videomodes.c +++ b/drivers/video/videomodes.c @@ -113,7 +113,7 @@ const struct ctfb_res_modes res_mode_init[RES_MODES_COUNT] = { * returns the length to the next seperator */ static int -video_get_param_len (char *start, char sep) +video_get_param_len(const char *start, char sep) { int i = 0; while ((*start != 0) && (*start != sep)) { @@ -315,3 +315,61 @@ void video_get_ctfb_res_modes(int default_mode, unsigned int default_depth, xres, yres, depth, refresh, (*mode_ret)->xres, (*mode_ret)->yres, *depth_ret, (*mode_ret)->refresh); } + +/* + * Find the named string option within the ',' separated options string, and + * store its value in dest. + * + * @options: ',' separated options string + * @name: name of the option to look for + * @dest: destination buffer to store the value of the option in + * @dest_len: length of dest + * @def: value to store in dest if the option is not present in options + */ +void video_get_option_string(const char *options, const char *name, + char *dest, int dest_len, const char *def) +{ + const char *p = options; + const int name_len = strlen(name); + int i, len; + + while (p && (i = video_get_param_len(p, ',')) != 0) { + if (strncmp(p, name, name_len) == 0 && p[name_len] == '=') { + len = i - (name_len + 1); + if (len >= dest_len) + len = dest_len - 1; + memcpy(dest, &p[name_len + 1], len); + dest[len] = 0; + return; + } + p += i; + if (*p != 0) + p++; /* skip ',' */ + } + strcpy(dest, def); +} + +/* + * Find the named integer option within the ',' separated options string, and + * return its value. + * + * @options: ',' separated options string + * @name: name of the option to look for + * @def: value to return if the option is not present in options + */ +int video_get_option_int(const char *options, const char *name, int def) +{ + const char *p = options; + const int name_len = strlen(name); + int i; + + while (p && (i = video_get_param_len(p, ',')) != 0) { + if (strncmp(p, name, name_len) == 0 && p[name_len] == '=') + return simple_strtoul(&p[name_len + 1], NULL, 10); + + p += i; + if (*p != 0) + p++; /* skip ',' */ + } + return def; +} diff --git a/drivers/video/videomodes.h b/drivers/video/videomodes.h index 02419cdeac..047b8a9838 100644 --- a/drivers/video/videomodes.h +++ b/drivers/video/videomodes.h @@ -84,3 +84,8 @@ void video_get_ctfb_res_modes(int default_mode, unsigned int default_depth, const struct ctfb_res_modes **mode_ret, unsigned int *depth_ret, const char **options); + +void video_get_option_string(const char *options, const char *name, + char *dest, int dest_len, const char *def); + +int video_get_option_int(const char *options, const char *name, int def); -- 2.39.5