`sqlite3_createstmt` contains a variable `stmt_pos` which points to the end of the SQL already written, at which the next chunk should be appended. Hitherto, this was assigned after every write: sprintf(stmt_pos, ...); stmt_pos = priv->stmt + strlen(priv->stmt); However, since `sprintf` returns the number of bytes written, we can avoid the repeated `strlen` calls by incrementing `stmt_pos` by the return-value of `sprintf`. Signed-off-by: Jeremy Sowden <jeremy@xxxxxxxxxx> --- output/sqlite3/ulogd_output_SQLITE3.c | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/output/sqlite3/ulogd_output_SQLITE3.c b/output/sqlite3/ulogd_output_SQLITE3.c index 41aeeec27854..da1c09f08047 100644 --- a/output/sqlite3/ulogd_output_SQLITE3.c +++ b/output/sqlite3/ulogd_output_SQLITE3.c @@ -226,9 +226,9 @@ sqlite3_createstmt(struct ulogd_pluginstance *pi) ulogd_log(ULOGD_ERROR, "SQLITE3: out of memory\n"); return -1; } + stmt_pos = priv->stmt; - sprintf(priv->stmt, "insert into %s (", table_ce(pi)); - stmt_pos = priv->stmt + strlen(priv->stmt); + stmt_pos += sprintf(stmt_pos, "insert into %s (", table_ce(pi)); tailq_for_each(f, priv->fields, link) { strncpy(buf, f->name, ULOGD_MAX_KEYLEN); @@ -236,19 +236,17 @@ sqlite3_createstmt(struct ulogd_pluginstance *pi) while ((underscore = strchr(buf, '.'))) *underscore = '_'; - sprintf(stmt_pos, "%s,", buf); - stmt_pos = priv->stmt + strlen(priv->stmt); + stmt_pos += sprintf(stmt_pos, "%s,", buf); cols++; } *(stmt_pos - 1) = ')'; - sprintf(stmt_pos, " values ("); - stmt_pos = priv->stmt + strlen(priv->stmt); + stmt_pos += sprintf(stmt_pos, " values ("); for (i = 0; i < cols - 1; i++) { - sprintf(stmt_pos,"?,"); + strcpy(stmt_pos, "?,"); stmt_pos += 2; } -- 2.33.0