xpath UPDATE do not use memstream
Not supported on Windows.
diff --git a/src/xpath.c b/src/xpath.c
index da1107d..309150b 100644
--- a/src/xpath.c
+++ b/src/xpath.c
@@ -219,17 +219,53 @@
}
/**
- * @brief Print the whole expression \p exp to debug output.
+ * @brief Append a string to a dynamic string variable.
+ *
+ * @param[in,out] str String to use.
+ * @param[in,out] size String size.
+ * @param[in,out] used String used size excluding terminating zero.
+ * @param[in] format Message format.
+ * @param[in] ... Message format arguments.
+ */
+static void
+print_expr_str(char **str, size_t *size, size_t *used, const char *format, ...)
+{
+ int p;
+ va_list ap;
+
+ va_start(ap, format);
+
+ /* try to append the string */
+ p = vsnprintf(*str + *used, *size - *used, format, ap);
+
+ if ((unsigned)p >= *size - *used) {
+ /* realloc */
+ *str = ly_realloc(*str, *size + p + 1);
+ *size += p + 1;
+
+ /* restart ap */
+ va_end(ap);
+ va_start(ap, format);
+
+ /* print */
+ p = vsnprintf(*str + *used, *size - *used, format, ap);
+ }
+
+ *used += p;
+ va_end(ap);
+}
+
+/**
+ * @brief Print the whole expression @p exp to debug output.
*
* @param[in] exp Expression to use.
*/
static void
print_expr_struct_debug(const struct lyxp_expr *exp)
{
- char *tmp;
+ char *buf = NULL;
uint32_t i, j;
- FILE *fp;
- size_t s;
+ size_t size = 0, used = 0;
if (!exp || (ly_ll < LY_LLDBG)) {
return;
@@ -237,21 +273,21 @@
LOGDBG(LY_LDGXPATH, "expression \"%s\":", exp->expr);
for (i = 0; i < exp->used; ++i) {
- fp = open_memstream(&tmp, &s);
- fprintf(fp, "\ttoken %s, in expression \"%.*s\"", lyxp_token2str(exp->tokens[i]), exp->tok_len[i],
- &exp->expr[exp->tok_pos[i]]);
+ print_expr_str(&buf, &size, &used, "\ttoken %s, in expression \"%.*s\"",
+ lyxp_token2str(exp->tokens[i]), exp->tok_len[i], &exp->expr[exp->tok_pos[i]]);
+
if (exp->repeat && exp->repeat[i]) {
- fprintf(fp, " (repeat %d", exp->repeat[i][0]);
+ print_expr_str(&buf, &size, &used, " (repeat %d", exp->repeat[i][0]);
for (j = 1; exp->repeat[i][j]; ++j) {
- fprintf(fp, ", %d", exp->repeat[i][j]);
+ print_expr_str(&buf, &size, &used, ", %d", exp->repeat[i][j]);
}
- fprintf(fp, ")");
+ print_expr_str(&buf, &size, &used, ")");
}
- fflush(fp);
- LOGDBG(LY_LDGXPATH, tmp);
- fclose(fp);
- free(tmp);
+ LOGDBG(LY_LDGXPATH, buf);
+ used = 0;
}
+
+ free(buf);
}
#ifndef NDEBUG