Remove platform and api lists, and instead use waffle_string_to_enum() to parse command line platform and api arguments. Also use waffle_enum_to_string() when printing platform and api. This means it now prints "GLX" instead of "glx" and "GL_ES2" instead of "gles2," for example.
Signed-off-by: Frank Henigman <fjhenig...@google.com> --- src/utils/wflinfo.c | 80 ++++++++--------------------------------------------- 1 file changed, 11 insertions(+), 69 deletions(-) diff --git a/src/utils/wflinfo.c b/src/utils/wflinfo.c index 268d4b8..f75ffc0 100644 --- a/src/utils/wflinfo.c +++ b/src/utils/wflinfo.c @@ -237,10 +237,10 @@ static const GLubyte * (APIENTRY *glGetStringi)(GLenum name, GLint i); /// @brief Command line options. struct options { /// @brief One of `WAFFLE_PLATFORM_*`. - int platform; + int32_t platform; /// @brief One of `WAFFLE_CONTEXT_OPENGL_*`. - int context_api; + int32_t context_api; /// @brief One of `WAFFLE_CONTEXT_PROFILE_*` or `WAFFLE_NONE`. int context_profile; @@ -257,70 +257,12 @@ struct options { int dl; }; -struct enum_map { - int i; - const char *s; -}; - -static const struct enum_map platform_map[] = { - {WAFFLE_PLATFORM_ANDROID, "android" }, - {WAFFLE_PLATFORM_CGL, "cgl", }, - {WAFFLE_PLATFORM_GBM, "gbm" }, - {WAFFLE_PLATFORM_GLX, "glx" }, - {WAFFLE_PLATFORM_WAYLAND, "wayland" }, - {WAFFLE_PLATFORM_WGL, "wgl" }, - {WAFFLE_PLATFORM_X11_EGL, "x11_egl" }, - {0, 0 }, -}; - -static const struct enum_map context_api_map[] = { - {WAFFLE_CONTEXT_OPENGL, "gl" }, - {WAFFLE_CONTEXT_OPENGL_ES1, "gles1" }, - {WAFFLE_CONTEXT_OPENGL_ES2, "gles2" }, - {WAFFLE_CONTEXT_OPENGL_ES3, "gles3" }, - {0, 0 }, -}; - -/// @brief Translate string to `enum waffle_enum`. -/// -/// @param self is a list of map items. The last item must be zero-filled. -/// @param result is altered only if @a s if found. -/// @return true if @a s was found in @a map. -static bool -enum_map_translate_str( - const struct enum_map *self, - const char *s, - int *result) -{ - for (const struct enum_map *i = self; i->i != 0; ++i) { - if (!strncmp(s, i->s, strlen(i->s) + 1)) { - *result = i->i; - return true; - } - } - - return false; -} - -static const char * -enum_map_to_str(const struct enum_map *self, - int val) -{ - for (const struct enum_map *i = self; i->i != 0; ++i) { - if (i->i == val) { - return i->s; - } - } - - return NULL; -} - /// @return true on success. static bool parse_args(int argc, char *argv[], struct options *opts) { - bool ok; bool loop_get_opt = true; + char ename[99]; #ifdef __APPLE__ removeXcodeArgs(&argc, argv); @@ -343,17 +285,15 @@ parse_args(int argc, char *argv[], struct options *opts) case '?': goto error_unrecognized_arg; case OPT_PLATFORM: - ok = enum_map_translate_str(platform_map, optarg, - &opts->platform); - if (!ok) { + snprintf(ename, sizeof(ename), "WAFFLE_PLATFORM_%s", optarg); + if (!waffle_string_to_enum(ename, &opts->platform)) { usage_error_printf("'%s' is not a valid platform", optarg); } break; case OPT_API: - ok = enum_map_translate_str(context_api_map, optarg, - &opts->context_api); - if (!ok) { + snprintf(ename, sizeof(ename), "WAFFLE_CONTEXT_OPEN%s", optarg); + if (!waffle_string_to_enum(ename, &opts->context_api)) { usage_error_printf("'%s' is not a valid API for an OpenGL " "context", optarg); } @@ -551,12 +491,14 @@ print_wflinfo(const struct options *opts) version_str = "WFLINFO_GL_ERROR"; } - const char *platform = enum_map_to_str(platform_map, opts->platform); + const char *platform = waffle_enum_to_string(opts->platform); assert(platform != NULL); + platform += sizeof "WAFFLE_PLATFORM_" - 1; printf("Waffle platform: %s\n", platform); - const char *api = enum_map_to_str(context_api_map, opts->context_api); + const char *api = waffle_enum_to_string(opts->context_api); assert(api != NULL); + api += sizeof "WAFFLE_CONTEXT_OPEN" - 1; printf("Waffle api: %s\n", api); printf("OpenGL vendor string: %s\n", vendor); -- 2.2.0.rc0.207.ga3a616c _______________________________________________ waffle mailing list waffle@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/waffle