9ae9d04248156afc5b655321de0fdcab8a8d5b16 angie Wed Nov 9 13:55:34 2011 -0800 Performance improvement for safencpy when src is a very long string(e.g. chrom sequence): don't do a full strlen; count chars and stop counting if/when we get to specified limit n. diff --git src/lib/common.c src/lib/common.c index 98df2f3..8b513e0 100644 --- src/lib/common.c +++ src/lib/common.c @@ -3134,33 +3134,35 @@ void safecpy(char *buf, size_t bufSize, const char *src) /* copy a string to a buffer, with bounds checking.*/ { size_t slen = strlen(src); if (slen > bufSize-1) errAbort("buffer overflow, size %lld, string size: %lld", (long long)bufSize, (long long)slen); strcpy(buf, src); } void safencpy(char *buf, size_t bufSize, const char *src, size_t n) /* copy n characters from a string to a buffer, with bounds checking. * Unlike strncpy, always null terminates the result */ { if (n > bufSize-1) errAbort("buffer overflow, size %lld, substring size: %lld", (long long)bufSize, (long long)n); -size_t slen = strlen(src); -if (slen > n) - slen = n; +// strlen(src) can take a long time when src is for example a pointer into a chromosome sequence. +// Instead of setting slen to max(strlen(src), n), just stop counting length at n. +size_t slen = 0; +while (src[slen] != '\0' && slen < n) + slen++; strncpy(buf, src, n); buf[slen] = '\0'; } void safecat(char *buf, size_t bufSize, const char *src) /* Append a string to a buffer, with bounds checking.*/ { size_t blen = strlen(buf); size_t slen = strlen(src); if (blen+slen > bufSize-1) errAbort("buffer overflow, size %lld, new string size: %lld", (long long)bufSize, (long long)(blen+slen)); strcat(buf, src); } void safencat(char *buf, size_t bufSize, const char *src, size_t n)