]> granicus.if.org Git - graphviz/commitdiff
common printTok: remove use of 'agxbstart' to access agxbuf data
authorMatthew Fernandez <matthew.fernandez@gmail.com>
Sat, 10 Dec 2022 20:54:40 +0000 (12:54 -0800)
committerMatthew Fernandez <matthew.fernandez@gmail.com>
Sun, 11 Dec 2022 20:49:49 +0000 (12:49 -0800)
Reaching into something that is notionally the internals of the `agxbuf` type
was causing some complications in upcoming changes. Specifically, the lifetime
of the pointer returned from `agxbstart` makes it error prone. Any operation
that appends more data to the `agxbuf` must conservatively be assumed to
invalidate a pointer previously returned from `agxbstart`.

Although this instance was not retaining the returned pointer, the `agxbstart`
interface seems dangerous to provide given that it is difficult to use safely.
By removing its sole use here, we clear the way for its removal in future.

This new phrasing is potentially less efficient, as data is now extracted from
the buffer and then written back into the same buffer. However (1) a good
contemporary compiler will inline all calls and realize the accumulated
operation on the buffer is a no-op and (2) this is debug code, so performance is
not critical.

Gitlab: related to #2325

lib/common/htmllex.c

index 5fb76ac1cbb2fded8721b5ae02f4a4083f36d020..ca3ed3b60686b097fce358f6855da1d6eda98cb9 100644 (file)
@@ -1032,9 +1032,9 @@ static void printTok(int tok)
        s = "<unknown>";
     }
     if (tok == T_string) {
-       fprintf(stderr, "%s \"", s);
-       fwrite(agxbstart(state.xb), 1, agxblen(state.xb), stderr);
-       fprintf(stderr, "\"\n");
+       const char *token_text = agxbuse(state.xb);
+       fprintf(stderr, "%s \"%s\"\n", s, token_text);
+       agxbput(state.xb, token_text);
     } else
        fprintf(stderr, "%s\n", s);
 }