From: Arthur Huillet <[email protected]> Replacing shaders isn't easily done on the commandline, so add "@file()" to tell apitrace sed to read pattern or replacement from a file. This replacement is implemented on String-type nodes, so apitrace sed now effectively works on string elements in addition to enum elements.
Signed-off-by: Arthur Huillet <[email protected]> --- cli/cli_sed.cpp | 51 ++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 44 insertions(+), 7 deletions(-) diff --git a/cli/cli_sed.cpp b/cli/cli_sed.cpp index ccb38b0..bb6ea8f 100644 --- a/cli/cli_sed.cpp +++ b/cli/cli_sed.cpp @@ -46,8 +46,9 @@ usage(void) << synopsis << "\n" "\n" " -h, --help Show detailed help for sed options and exit\n" - " -e s/SEARCH/REPLACE/ Search and replace a symbol.\n" - " XXX: Only works for enums.\n" + " -e s,SEARCH,REPLACE, Search and replace a symbol. Use @file(<path>)\n" + " to read SEARCH or REPLACE from a file.\n" + " XXX: Only works for enums and strings.\n" " -o, --output=TRACE_FILE Output trace file\n" ; } @@ -104,6 +105,12 @@ public: } void visit(String *node) { + if (!searchName.compare(node->value)) { + delete [] node->value; + char *str = new char [replaceName.length() + 1]; + strcpy(str, replaceName.c_str()); + node->value = str; + } } void visit(WString *node) { @@ -210,7 +217,7 @@ sed_trace(Replacements &replacements, const char *inFileName, std::string &outFi /** - * Parse a string in the format "s/SEARCH/REPLACE/". + * Parse a string in the format "s,SEARCH,REPLACE,". */ static bool parseSubstOpt(Replacements &replacements, const char *opt) @@ -219,13 +226,13 @@ parseSubstOpt(Replacements &replacements, const char *opt) return false; } - if (*opt++ != '/') { + if (*opt++ != ',') { return false; } // Parse the search pattern const char *search_begin = opt; - while (*opt != '/') { + while (*opt != ',') { if (*opt == 0) { return false; } @@ -235,7 +242,7 @@ parseSubstOpt(Replacements &replacements, const char *opt) // Parse the replace pattern const char *replace_begin = opt; - while (*opt != '/') { + while (*opt != ',') { if (*opt == 0) { return false; } @@ -250,6 +257,36 @@ parseSubstOpt(Replacements &replacements, const char *opt) std::string search(search_begin, search_end); std::string replace(replace_begin, replace_end); + // If search or replace strings are taken from a file, read the file + std::string file_subst = "@file("; + + for (int i = 0; i < 2; i++) { + std::string *str = i ? &search : &replace; + + if (!str->compare(0, file_subst.length(), file_subst)) { + if ((*str)[str->length()-1] != ')') { + return false; + } + + std::string fname = str->substr(file_subst.length()); + fname[fname.length()-1] = 0; + FILE *f = fopen(fname.c_str(), "r"); + if (!f) { + std::cerr << "error: cannot open file " << fname << "\n"; + return false; + } + char buf[1024]; + (*str) = ""; + while (!feof(f)) { + if (fgets(buf, 1024, f)) { + str->append(buf); + } + } + fclose(f); + } + } + + replacements.push_back(Replacer(search, replace)); return true; @@ -273,7 +310,7 @@ command(int argc, char *argv[]) break; case 'e': if (!parseSubstOpt(replacements, optarg)) { - std::cerr << "error: invalid replacement patter `" << optarg << "`\n"; + std::cerr << "error: invalid replacement pattern `" << optarg << "`\n"; } break; default: -- 2.3.5 _______________________________________________ apitrace mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/apitrace
