_load_inttype.c 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. /* Copyright (C) 2004 Manuel Novoa III <mjn3@codepoet.org>
  2. *
  3. * GNU Library General Public License (LGPL) version 2 or later.
  4. *
  5. * Dedicated to Toni. See uClibc/DEDICATION.mjn3 for details.
  6. */
  7. #include "_stdio.h"
  8. #include <printf.h>
  9. uintmax_t _load_inttype(int desttype, register const void *src, int uflag)
  10. {
  11. if (uflag >= 0) { /* unsigned */
  12. #if LONG_MAX != INT_MAX
  13. if (desttype & (PA_FLAG_LONG|PA_FLAG_LONG_LONG)) {
  14. #ifdef LLONG_MAX
  15. if (desttype == PA_FLAG_LONG_LONG) {
  16. return *((unsigned long long int *) src);
  17. }
  18. #endif
  19. return *((unsigned long int *) src);
  20. }
  21. #else /* LONG_MAX != INT_MAX */
  22. #ifdef LLONG_MAX
  23. if (desttype & PA_FLAG_LONG_LONG) {
  24. return *((unsigned long long int *) src);
  25. }
  26. #endif
  27. #endif /* LONG_MAX != INT_MAX */
  28. {
  29. unsigned int x;
  30. x = *((unsigned int *) src);
  31. if (desttype == __PA_FLAG_CHAR) x = (unsigned char) x;
  32. #if SHRT_MAX != INT_MAX
  33. if (desttype == PA_FLAG_SHORT) x = (unsigned short int) x;
  34. #endif
  35. return x;
  36. }
  37. } else { /* signed */
  38. #if LONG_MAX != INT_MAX
  39. if (desttype & (PA_FLAG_LONG|PA_FLAG_LONG_LONG)) {
  40. #ifdef LLONG_MAX
  41. if (desttype == PA_FLAG_LONG_LONG) {
  42. return *((long long int *) src);
  43. }
  44. #endif
  45. return *((long int *) src);
  46. }
  47. #else /* LONG_MAX != INT_MAX */
  48. #ifdef LLONG_MAX
  49. if (desttype & PA_FLAG_LONG_LONG) {
  50. return *((long long int *) src);
  51. }
  52. #endif
  53. #endif /* LONG_MAX != INT_MAX */
  54. {
  55. int x;
  56. x = *((int *) src);
  57. if (desttype == __PA_FLAG_CHAR) x = (signed char) x;
  58. #if SHRT_MAX != INT_MAX
  59. if (desttype == PA_FLAG_SHORT) x = (short int) x;
  60. #endif
  61. return x;
  62. }
  63. }
  64. }