Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Avoid strlen calls after sprintf



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