#include #include #include #include #include #include char *strncpy0(char *dest, const char *src, size_t count) { char *tmp = dest; while (count-- && (*tmp++ = *src++) != '\0') /* nothing */; return dest; } char *strncpy0a(char *dest, const char *src, size_t count) { char *tmp = dest; while (count && (*dest++ = *src++) != '\0') count--; while (count > 1) { *dest++ = 0; count--; } return tmp; } char *strncpy0b(char *dest, const char *src, size_t count) { char *tmp = dest; while (count && (*tmp++ = *src++) != '\0') count--; while (count > 1) { *tmp++ = 0; count--; } return dest; } char *strncpy0x(char *dest, const char *src, size_t count) { char *tmp = dest; while (count) { if (!(*tmp = *src++)) break; tmp++; count--; } return dest; } char *strncpy1(char *dest, const char *src, size_t count) { char *tmp = dest; while (count) { if ((*tmp = *src)) src++; tmp++; count--; } return dest; } char *strncpy1x(char *dest, const char *src, size_t count) { char *tmp = dest; for (; count; count--) { if ((*tmp = *src)) src++; tmp++; } return dest; } char *strncpy2(char *dest, const char *src, size_t count) { char *tmp = dest; while (count--) { if ((*tmp++ = *src)) src++; } return dest; } char *strncpy3(char *dest, const char *src, size_t count) { if (count) { char *tmp = dest; while (1) { *tmp = *src; if (*src) src++; tmp++; if (!count--) break; } } return dest; } char *strncpy4(char *dest, const char *src, size_t count) { if (count) { char *tmp = dest; do { if ((*tmp = *src)) ++src; ++tmp; } while (--count); } return dest; } char *strncpy5(char *dest, const char *src, size_t count) { char *tmp = dest; while (count && *src) { count--; *tmp++ = *src++; } while (count--) { *tmp++ = 0; } return dest; } char *strncpy5w(char *dest, const char *src, size_t count) { char *tmp = dest; while (count) { if (*src == '\0') break; *tmp++ = *src++; count--; } while (count) { *tmp++ = 0; count--; } return dest; } char *strncpy5x(char *dest, const char *src, size_t count) { char *tmp = dest; while (count) { count--; if (!(*tmp++ = *src++)) break; } while (count) { count--; *tmp++ = 0; } return dest; } char *strncpy5y(char *dest, const char *src, size_t count) { char *tmp = dest; for (; count && *src; count--) *tmp++ = *src++; for (; count; count--) *tmp++ = '\0'; return dest; } #define likely(x) __builtin_expect(!!(x),1) #define unlikely(x) __builtin_expect(!!(x),0) char *strncpy6(char *dest, const char *src, size_t count) { char *tmp = dest; if (unlikely(!count)) goto end; loop1: if ((*tmp = *src++) == '\0') goto next; tmp++; if (likely(--count)) goto loop1; else goto end; loop2: *tmp = '\0'; next: tmp++; if (likely(--count)) goto loop2; end: return dest; } char *strncpy6x(char *dest, const char *src, size_t count) { char *tmp = dest; if (unlikely(!count)) goto end; loop1: if ((*tmp = *src++) == '\0') goto loop2; tmp++; if (likely(--count)) goto loop1; else goto end; loop2: *tmp++ = '\0'; if (likely(--count)) goto loop2; end: return dest; } void time_it(char *(*func)(char *dest, const char *src, size_t count), size_t size) { struct timeval start; struct timeval end; long sec, usec; static char *string = "asdl hfaslkfh alksjfh laksjh lkajsdflkasflksdf ljhfljshf laksflaksfhlaksjhflaksfh lakshf lkds hflsd"; static char buffer[1000]; #ifdef __CRIS__ int count = 500000; #else int count = 20000000; #endif if (size > sizeof buffer) { fprintf(stderr, "Buffer too small!\n"); exit(1); } gettimeofday(&start, NULL); while (count) { func(buffer, string, size); count--; } gettimeofday(&end, NULL); sec = end.tv_sec - start.tv_sec; if ((usec = end.tv_usec - start.tv_usec) < 0) { sec--; usec += 1000000; } printf("%3ld.%06ld ", sec, usec); fflush(stdout); } void do_it(const char *name, char *(*func)(char *dest, const char *src, size_t count)) { printf("%-12s ", name); fflush(stdout); time_it(func, 50); time_it(func, 100); time_it(func, 200); time_it(func, 1000); printf("\n"); } #define TIME_IT(func) time_it(#func, func) int main(int argc, char* argv[]) { do_it("Original", strncpy0a); do_it("Eric's", strncpy1); do_it("Timothy's", strncpy5); do_it("My first", strncpy5x); do_it("For loops", strncpy5y); do_it("Algorithmic", strncpy6); exit(0); }