X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=interpolate.c;h=6ef53f246511a1943e375d5d5913a4ec52e2c663;hb=7ee906694c28ab7281492d5114d2afabd964bd41;hp=2f727cd05b0d071d9aa750b90fe3c16c12ccbe5e;hpb=55246aac6717e86c14f31391ac903ed810d1a9a0;p=git.git diff --git a/interpolate.c b/interpolate.c index 2f727cd05..6ef53f246 100644 --- a/interpolate.c +++ b/interpolate.c @@ -44,9 +44,8 @@ void interp_clear_table(struct interp *table, int ninterps) * { "%%", "%"}, * } * - * Returns 0 on a successful substitution pass that fits in result, - * Returns a number of bytes needed to hold the full substituted - * string otherwise. + * Returns the length of the substituted string (not including the final \0). + * Like with snprintf, if the result is >= reslen, then it overflowed. */ unsigned long interpolate(char *result, unsigned long reslen, @@ -61,8 +60,6 @@ unsigned long interpolate(char *result, unsigned long reslen, int i; char c; - memset(result, 0, reslen); - while ((c = *src)) { if (c == '%') { /* Try to match an interpolation string. */ @@ -82,9 +79,9 @@ unsigned long interpolate(char *result, unsigned long reslen, } valuelen = strlen(value); - if (newlen + valuelen + 1 < reslen) { + if (newlen + valuelen < reslen) { /* Substitute. */ - strncpy(dest, value, valuelen); + memcpy(dest, value, valuelen); dest += valuelen; } newlen += valuelen; @@ -99,8 +96,9 @@ unsigned long interpolate(char *result, unsigned long reslen, newlen++; } - if (newlen + 1 < reslen) - return 0; - else - return newlen + 2; + /* XXX: the previous loop always keep room for the ending NUL, + we just need to check if there was room for a NUL in the first place */ + if (reslen > 0) + *dest = '\0'; + return newlen; }