fork download
  1. /* Shao Miller, 2012 */
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5.  
  6. void * pmemcpy(void * s1, const void * s2, size_t n);
  7. void * pmemmove(void * s1, const void * s2, size_t n);
  8.  
  9. int main(void) {
  10. char test1[] = "0123456789";
  11. char test2[] = "ABCDEFGHIJ";
  12. char * t1;
  13. char * t2;
  14.  
  15. t1 = pmemmove(test1, test1 + 5, 5);
  16. t2 = pmemmove(test2 + 5, test2, 5);
  17. (void) t2;
  18.  
  19. printf("%s\n%s\n", t1, test2);
  20.  
  21. return EXIT_SUCCESS;
  22. }
  23.  
  24. void * pmemcpy(void * s1, const void * s2, size_t n) {
  25. unsigned char * dest;
  26. const unsigned char * src;
  27.  
  28. if (!s1 || !s2 || !n)
  29. return s1;
  30.  
  31. dest = s1;
  32. src = s2;
  33.  
  34. while (n--)
  35. *dest++ = *src++;
  36.  
  37. return s1;
  38. }
  39.  
  40. /* Portability wins over performance, here */
  41. void * pmemmove(void * s1, const void * s2, size_t n) {
  42. unsigned char * dest;
  43. const unsigned char * src;
  44. const unsigned char * src_end;
  45.  
  46. if (!s1 || !s2 || !n || s1 == s2)
  47. return s1;
  48.  
  49. dest = s1;
  50. src = s2;
  51.  
  52. /* The only interesting case is where src < dest with overlap */
  53. for (src_end = src + n; src < src_end; ++src) {
  54. if (src == dest)
  55. break;
  56. }
  57.  
  58. /* Is src > dest or non-overlapping? */
  59. if (src == src_end)
  60. return pmemcpy(s1, s2, n);
  61.  
  62. /* Otherwise, src < dest with overlap */
  63. dest += n;
  64. src = src_end;
  65.  
  66. while (n--)
  67. *dest-- = *src--;
  68.  
  69. return s1;
  70. }
  71.  
Success #stdin #stdout 0.01s 1676KB
stdin
Standard input is empty
stdout
5678956789
ABCDEABCDE