Hi Dan, I have written this function to parse expressions of the form "name[x]" for parsing the list of transform feedback varyings with indexing. It's good enough to pass the piglit tests, but I am not sure whether it's good enough for GLSL 1.3. I use this code to query locations of indexed varyings, particularly "gl_TexCoord[1]" in one of my tests. Feel free to use this code.
My question to the others is whether this is the way it should be done, or whether there is a better way. Thanks. Marek #include <cmath> #ifndef Elements #define Elements(x) (sizeof(x)/sizeof(*(x))) #endif struct tfeedback_decl { char name[1024]; bool is_array; unsigned array_index; }; /* This expects expressions of the form "var" and "var[i]", * where i is a literal. * * We don't have to be pedantic about what is a valid GLSL variable name, * because any variable with an invalid name can't exist in the IR anyway. */ static bool parse_tfeedback_decl(const char *input, struct tfeedback_decl *decl) { unsigned name_index = 0; decl->is_array = false; /* Parse the variable name. */ while (*input && ((*input > 'a' && *input < 'z') || (*input > 'A' && *input < 'Z') || (*input > '0' && *input < '9') || *input == '_') && name_index < Elements(decl->name)-1) { decl->name[name_index++] = *input; input++; } decl->name[name_index++] = 0; if (!*input) { return true; } /* Parse the array index. */ if (*input == '[') { input++; if (*input && *input >= '0' && *input <= '9' && sscanf(input, "%u", &decl->array_index) == 1) { decl->is_array = true; input += (unsigned)(log(decl->array_index)/log(10)) + 1; if (*input && *input == ']') { input++; if (!*input) { return true; } } } } return false; } _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev