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)