Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
Avoid strlen calls after sprintf
- X-seq: zsh-workers 53332
- From: Oliver Kiddle <opk@xxxxxxx>
- To: Zsh workers <zsh-workers@xxxxxxx>
- Subject: Avoid strlen calls after sprintf
- Date: Tue, 28 Jan 2025 02:35:57 +0100
- Archived-at: <https://zsh.org/workers/53332>
- List-id: <zsh-workers.zsh.org>
This change makes use of the return value from sprintf instead of
calling strlen on the resulting buffer.
On a different codebase with some sizeable buffers, the same change was
a significant optimisation so I checked for any obvious simple cases
that could be changed.
Oliver
diff --git a/Src/Modules/stat.c b/Src/Modules/stat.c
index c9f851974..5bf201dd3 100644
--- a/Src/Modules/stat.c
+++ b/Src/Modules/stat.c
@@ -236,9 +236,8 @@ statprint(struct stat *sbuf, char *outbuf, char *fname, int iwhich, int flags)
char *optr = outbuf;
if (flags & STF_NAME) {
- sprintf(outbuf, (flags & (STF_PICK|STF_ARRAY)) ?
+ optr += sprintf(outbuf, (flags & (STF_PICK|STF_ARRAY)) ?
"%s " : "%-8s", statelts[iwhich]);
- optr += strlen(outbuf);
}
*optr = '\0';
diff --git a/Src/Zle/compresult.c b/Src/Zle/compresult.c
index cd8c7dd64..61325ddd2 100644
--- a/Src/Zle/compresult.c
+++ b/Src/Zle/compresult.c
@@ -499,12 +499,11 @@ build_pos_string(LinkList list)
/* This could be used to put an extra colon before the end-of-word
* position if there is nothing missing. */
if (p < 0)
- sprintf(buf, ":%ld", -p);
+ l += 1 + sprintf(buf, ":%ld", -p);
else
#endif
- sprintf(buf, "%ld", p);
+ l += 1 + sprintf(buf, "%ld", p);
setdata(node, dupstring(buf));
- l += 1 + strlen(buf);
}
s = (char *) zalloc(l * sizeof(char));
*s = 0;
diff --git a/Src/Zle/zle_misc.c b/Src/Zle/zle_misc.c
index eba28d1ec..e17a08d53 100644
--- a/Src/Zle/zle_misc.c
+++ b/Src/Zle/zle_misc.c
@@ -841,9 +841,8 @@ whatcursorposition(UNUSED(char **args))
strcpy(s, mbstr);
s += len;
}
- sprintf(s, " (0%o, %u, 0x%x)", (unsigned int)c,
+ s += sprintf(s, " (0%o, %u, 0x%x)", (unsigned int)c,
(unsigned int)c, (unsigned int)c);
- s += strlen(s);
}
sprintf(s, " point %d of %d(%d%%) column %d", zlecs+1, zlell+1,
zlell ? 100 * zlecs / zlell : 0, zlecs - bol);
diff --git a/Src/builtin.c b/Src/builtin.c
index cd0ee7522..18d74b09e 100644
--- a/Src/builtin.c
+++ b/Src/builtin.c
@@ -4809,9 +4809,8 @@ bin_print(char *name, char **args, Options ops, int func)
if (d) {
int dirlen = strlen(d->dir);
char *arg = zhalloc(len[n] - dirlen + strlen(d->node.nam) + 2);
- sprintf(arg, "~%s%s", d->node.nam, args[n] + dirlen);
+ len[n] = sprintf(arg, "~%s%s", d->node.nam, args[n] + dirlen);
args[n] = arg;
- len[n] = strlen(args[n]);
}
unqueue_signals();
}
diff --git a/Src/prompt.c b/Src/prompt.c
index e10b05215..7d4678555 100644
--- a/Src/prompt.c
+++ b/Src/prompt.c
@@ -555,8 +555,7 @@ putpromptchar(int doprint, int endchar)
if (jobtab[j].stat && jobtab[j].procs &&
!(jobtab[j].stat & STAT_NOPRINT)) numjobs++;
addbufspc(DIGBUFSIZE);
- sprintf(bv->bp, "%d", numjobs);
- bv->bp += strlen(bv->bp);
+ bv->bp += sprintf(bv->bp, "%d", numjobs);
break;
case 'M':
queue_signals();
@@ -782,20 +781,18 @@ putpromptchar(int doprint, int endchar)
case 'L':
addbufspc(DIGBUFSIZE);
#if defined(ZLONG_IS_LONG_LONG) && defined(PRINTF_HAS_LLD)
- sprintf(bv->bp, "%lld", shlvl);
+ bv->bp += sprintf(bv->bp, "%lld", shlvl);
#else
- sprintf(bv->bp, "%ld", (long)shlvl);
+ bv->bp += sprintf(bv->bp, "%ld", (long)shlvl);
#endif
- bv->bp += strlen(bv->bp);
break;
case '?':
addbufspc(DIGBUFSIZE);
#if defined(ZLONG_IS_LONG_LONG) && defined(PRINTF_HAS_LLD)
- sprintf(bv->bp, "%lld", lastval);
+ bv->bp += sprintf(bv->bp, "%lld", lastval);
#else
- sprintf(bv->bp, "%ld", (long)lastval);
+ bv->bp += sprintf(bv->bp, "%ld", (long)lastval);
#endif
- bv->bp += strlen(bv->bp);
break;
case '%':
case ')':
@@ -886,8 +883,7 @@ putpromptchar(int doprint, int endchar)
fsptr = fsptr->prev;
}
addbufspc(DIGBUFSIZE);
- sprintf(bv->bp, "%d", depth);
- bv->bp += strlen(bv->bp);
+ bv->bp += sprintf(bv->bp, "%d", depth);
break;
}
case 'I':
@@ -904,11 +900,10 @@ putpromptchar(int doprint, int endchar)
lineno--;
addbufspc(DIGBUFSIZE);
#if defined(ZLONG_IS_LONG_LONG) && defined(PRINTF_HAS_LLD)
- sprintf(bv->bp, "%lld", flineno);
+ bv->bp += sprintf(bv->bp, "%lld", flineno);
#else
- sprintf(bv->bp, "%ld", (long)flineno);
+ bv->bp += sprintf(bv->bp, "%ld", (long)flineno);
#endif
- bv->bp += strlen(bv->bp);
break;
}
/* else we're in a file and lineno is already correct */
@@ -916,11 +911,10 @@ putpromptchar(int doprint, int endchar)
case 'i':
addbufspc(DIGBUFSIZE);
#if defined(ZLONG_IS_LONG_LONG) && defined(PRINTF_HAS_LLD)
- sprintf(bv->bp, "%lld", lineno);
+ bv->bp += sprintf(bv->bp, "%lld", lineno);
#else
- sprintf(bv->bp, "%ld", (long)lineno);
+ bv->bp += sprintf(bv->bp, "%ld", (long)lineno);
#endif
- bv->bp += strlen(bv->bp);
break;
case 'x':
if (funcstack && funcstack->tp != FS_SOURCE &&
@@ -1990,7 +1984,7 @@ match_highlight(const char *teststr, zattr *on_var, int *layer)
static int
output_colour(int colour, int fg_bg, int truecol, char *buf)
{
- int atrlen = 3, len;
+ int atrlen = 3;
char *ptr = buf;
if (buf) {
strcpy(ptr, fg_bg == COL_SEQ_FG ? "fg=" : "bg=");
@@ -2008,14 +2002,11 @@ output_colour(int colour, int fg_bg, int truecol, char *buf)
*/
} else if (colour > 7) {
char digbuf[DIGBUFSIZE];
- sprintf(digbuf, "%d", colour);
- len = strlen(digbuf);
- atrlen += len;
+ atrlen += sprintf(digbuf, "%d", colour);
if (buf)
strcpy(ptr, digbuf);
} else {
- len = strlen(ansi_colours[colour]);
- atrlen += len;
+ atrlen += strlen(ansi_colours[colour]);
if (buf)
strcpy(ptr, ansi_colours[colour]);
}
Messages sorted by:
Reverse Date,
Date,
Thread,
Author