datacpy.c 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. #define _POSIX_C_SOURCE 200112L
  2. #define _GNU_SOURCE
  3. #include <stdio.h>
  4. #include <string.h>
  5. #include <unistd.h>
  6. #include <stdint.h>
  7. #include <assert.h>
  8. #include <ctype.h>
  9. #include <time.h>
  10. #include <sched.h>
  11. #include <arpa/inet.h>
  12. #include <sys/time.h>
  13. #include "pci.h"
  14. #include "tools.h"
  15. #include "error.h"
  16. void *pcilib_datacpy32(void * dst, void const * src, size_t n, pcilib_endianess_t endianess) {
  17. uint32_t * plDst = (uint32_t *) dst;
  18. uint32_t const * plSrc = (uint32_t const *) src;
  19. int swap = 0;
  20. if (endianess)
  21. swap = (endianess == PCILIB_BIG_ENDIAN)?(ntohs(1)!=1):(ntohs(1)==1);
  22. if (swap) {
  23. while (n > 0) {
  24. *plDst = ntohl(*plSrc);
  25. ++plSrc;
  26. ++plDst;
  27. --n;
  28. }
  29. } else {
  30. while (n > 0) {
  31. *plDst = *plSrc;
  32. ++plSrc;
  33. ++plDst;
  34. --n;
  35. }
  36. }
  37. return dst;
  38. }
  39. void *pcilib_datacpy64(void * dst, void const * src, size_t n, pcilib_endianess_t endianess) {
  40. uint64_t * plDst = (uint64_t *) dst;
  41. uint64_t const * plSrc = (uint64_t const *) src;
  42. int swap = 0;
  43. if (endianess)
  44. swap = (endianess == PCILIB_BIG_ENDIAN)?(be64toh(1)!=1):(be64toh(1)==1);
  45. if (swap) {
  46. while (n > 0) {
  47. *plDst = ntohl(*plSrc);
  48. ++plSrc;
  49. ++plDst;
  50. --n;
  51. }
  52. } else {
  53. while (n > 0) {
  54. *plDst = *plSrc;
  55. ++plSrc;
  56. ++plDst;
  57. --n;
  58. }
  59. }
  60. return dst;
  61. }
  62. typedef void* (*pcilib_datacpy_routine_t)(void * dst, void const * src, size_t n, pcilib_endianess_t endianess);
  63. static pcilib_datacpy_routine_t pcilib_datacpy_routines[4] = {
  64. NULL, NULL, pcilib_datacpy32, pcilib_datacpy64
  65. };
  66. void *pcilib_datacpy(void * dst, void const * src, uint8_t size, size_t n, pcilib_endianess_t endianess) {
  67. size_t pos = 0;
  68. pcilib_datacpy_routine_t routine;
  69. assert((size)&&(size <= 8));
  70. while (size >>= 1) ++pos;
  71. routine = pcilib_datacpy_routines[pos];
  72. return routine(dst, src, n, endianess);
  73. }