<div dir="ltr">I'm OK with the functionality, but I'd prefer `apitrace sed` to say similar in look-n-feel to the true sed, so one can use it intuitvely.<div><br></div><div>One solution would be to read apitrace sed commands from a file (like </div><div><br></div><div>  $ cat my_shader_replacement.script</div><div>  s/"A</div><div>  multi-line</div><div>  shader"/"a different</div><div>  shader/</div><div>  </div><div>  $ apitrace sed -f my_shader_replacement.script foo.trace</div><div><br></div><div>The draw back would be that that would require escaping the shader text.</div><div><br></div><div>Another (maybe simpler solution) would be, instead of replace '/' with ',', allow any character, as long it is consistent ("/foo/boo/", ";foo;boo;" ), just like true sed allows.</div><div><br></div><div>Jose</div><div><br></div><div><br></div><div><div><div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, May 29, 2015 at 2:31 PM, Arthur Huillet <span dir="ltr"><<a href="mailto:arthur.huillet@free.fr" target="_blank">arthur.huillet@free.fr</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">From: Arthur Huillet <<a href="mailto:ahuillet@nvidia.com">ahuillet@nvidia.com</a>><br>
<br>
Replacing shaders isn't easily done on the commandline, so add "@file()" to<br>
tell apitrace sed to read pattern or replacement from a file.<br>
This replacement is implemented on String-type nodes, so apitrace sed now<br>
effectively works on string elements in addition to enum elements.<br>
<br>
Signed-off-by: Arthur Huillet <<a href="mailto:ahuillet@nvidia.com">ahuillet@nvidia.com</a>><br>
---<br>
 cli/cli_sed.cpp | 51 ++++++++++++++++++++++++++++++++++++++++++++-------<br>
 1 file changed, 44 insertions(+), 7 deletions(-)<br>
<br>
diff --git a/cli/cli_sed.cpp b/cli/cli_sed.cpp<br>
index ccb38b0..bb6ea8f 100644<br>
--- a/cli/cli_sed.cpp<br>
+++ b/cli/cli_sed.cpp<br>
@@ -46,8 +46,9 @@ usage(void)<br>
         << synopsis << "\n"<br>
         "\n"<br>
         "    -h, --help               Show detailed help for sed options and exit\n"<br>
-        "    -e s/SEARCH/REPLACE/     Search and replace a symbol.\n"<br>
-        "                             XXX: Only works for enums.\n"<br>
+        "    -e s,SEARCH,REPLACE,     Search and replace a symbol. Use @file(<path>)\n"<br>
+        "                             to read SEARCH or REPLACE from a file.\n"<br>
+        "                             XXX: Only works for enums and strings.\n"<br>
         "    -o, --output=TRACE_FILE  Output trace file\n"<br>
     ;<br>
 }<br>
@@ -104,6 +105,12 @@ public:<br>
     }<br>
<br>
     void visit(String *node) {<br>
+        if (!searchName.compare(node->value)) {<br>
+                delete [] node->value;<br>
+                char *str = new char [replaceName.length() + 1];<br>
+                strcpy(str, replaceName.c_str());<br>
+                node->value = str;<br>
+        }<br>
     }<br>
<br>
     void visit(WString *node) {<br>
@@ -210,7 +217,7 @@ sed_trace(Replacements &replacements, const char *inFileName, std::string &outFi<br>
<br>
<br>
 /**<br>
- * Parse a string in the format "s/SEARCH/REPLACE/".<br>
+ * Parse a string in the format "s,SEARCH,REPLACE,".<br>
  */<br>
 static bool<br>
 parseSubstOpt(Replacements &replacements, const char *opt)<br>
@@ -219,13 +226,13 @@ parseSubstOpt(Replacements &replacements, const char *opt)<br>
         return false;<br>
     }<br>
<br>
-    if (*opt++ != '/') {<br>
+    if (*opt++ != ',') {<br>
         return false;<br>
     }<br>
<br>
     // Parse the search pattern<br>
     const char *search_begin = opt;<br>
-    while (*opt != '/') {<br>
+    while (*opt != ',') {<br>
         if (*opt == 0) {<br>
             return false;<br>
         }<br>
@@ -235,7 +242,7 @@ parseSubstOpt(Replacements &replacements, const char *opt)<br>
<br>
     // Parse the replace pattern<br>
     const char *replace_begin = opt;<br>
-    while (*opt != '/') {<br>
+    while (*opt != ',') {<br>
         if (*opt == 0) {<br>
             return false;<br>
         }<br>
@@ -250,6 +257,36 @@ parseSubstOpt(Replacements &replacements, const char *opt)<br>
     std::string search(search_begin, search_end);<br>
     std::string replace(replace_begin, replace_end);<br>
<br>
+    // If search or replace strings are taken from a file, read the file<br>
+    std::string file_subst = "@file(";<br>
+<br>
+    for (int i = 0; i < 2; i++) {<br>
+        std::string *str = i ? &search : &replace;<br>
+<br>
+        if (!str->compare(0, file_subst.length(), file_subst)) {<br>
+            if ((*str)[str->length()-1] != ')') {<br>
+                return false;<br>
+            }<br>
+<br>
+            std::string fname = str->substr(file_subst.length());<br>
+            fname[fname.length()-1] = 0;<br>
+            FILE *f = fopen(fname.c_str(), "r");<br>
+            if (!f) {<br>
+                std::cerr << "error: cannot open file " << fname << "\n";<br>
+                return false;<br>
+            }<br>
+            char buf[1024];<br>
+            (*str) = "";<br>
+            while (!feof(f)) {<br>
+                if (fgets(buf, 1024, f)) {<br>
+                    str->append(buf);<br>
+                }<br>
+            }<br>
+            fclose(f);<br>
+        }<br>
+    }<br>
+<br>
+<br>
     replacements.push_back(Replacer(search, replace));<br>
<br>
     return true;<br>
@@ -273,7 +310,7 @@ command(int argc, char *argv[])<br>
             break;<br>
         case 'e':<br>
             if (!parseSubstOpt(replacements, optarg)) {<br>
-                std::cerr << "error: invalid replacement patter `" << optarg << "`\n";<br>
+                std::cerr << "error: invalid replacement pattern `" << optarg << "`\n";<br>
             }<br>
             break;<br>
         default:<br>
<span class=""><font color="#888888">--<br>
2.3.5<br>
_______________________________________________<br>
apitrace mailing list<br>
<a href="mailto:apitrace@lists.freedesktop.org">apitrace@lists.freedesktop.org</a><br>
<a href="http://lists.freedesktop.org/mailman/listinfo/apitrace" target="_blank">http://lists.freedesktop.org/mailman/listinfo/apitrace</a><br>
</font></span></blockquote></div><br></div></div></div></div></div>