/* written by folkert@vanheusden.com */ #include #include #include #include #include #if __GNUC__ == 2 && __GNUC_MINOR__ < 96 #define __builtin_expect(x, expected_value) (x) #endif #ifndef __builtin_expect #define __builtin_expect(x, expected_value) (x) #endif #define likely(x) __builtin_expect((x),1) #define unlikely(x) __builtin_expect((x),0) #define NIT 10000000 #define FROM_SIZE 234 #define TO_SIZE 2345 double get_cpu_usage(void) { struct rusage usage; if (getrusage(RUSAGE_SELF, &usage) == -1) printf("getrusage error\n"); return (double)usage.ru_utime.tv_sec + (double)usage.ru_utime.tv_usec / 1000000.0 + (double)usage.ru_stime.tv_sec + (double)usage.ru_stime.tv_usec / 1000000.0; } size_t strlcpynew(char *dest, const char *src, size_t size) { char *tmp = dest; for(;;) { *dest = *src; if (unlikely(!*src)) break; if (unlikely(--size == 0)) break; dest++; src++; } *dest = 0x00; return dest - tmp; } size_t strlcpyorg(char *dest, const char *src, size_t size) { size_t ret = strlen(src); if (size) { size_t len = (ret >= size) ? size - 1 : ret; memcpy(dest, src, len); dest[len] = '\0'; } return ret; } int main(int argc, char *argv[]) { int loop; double ts; char from[FROM_SIZE] = { 0x00 }; char to1[TO_SIZE], to2[TO_SIZE]; char *teststring = "Dit is een test."; while(strlen(from) + strlen(teststring) < sizeof(from)) strcat(from, teststring); strlcpyorg(to1, from, sizeof(to1)); strlcpynew(to2, from, sizeof(to2)); printf("%d\n", strcmp(to1, to2)); printf("%s\n", to1); printf("%s\n", to2); ts = get_cpu_usage(); for(loop=0; loop