xstrtol.h 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. #ifndef XSTRTOL_H_
  2. # define XSTRTOL_H_ 1
  3. # if HAVE_INTTYPES_H
  4. # include <inttypes.h> /* for uintmax_t */
  5. # endif
  6. # ifndef PARAMS
  7. # if defined PROTOTYPES || (defined __STDC__ && __STDC__)
  8. # define PARAMS(Args) Args
  9. # else
  10. # define PARAMS(Args) ()
  11. # endif
  12. # endif
  13. # ifndef _STRTOL_ERROR
  14. enum strtol_error
  15. {
  16. LONGINT_OK, LONGINT_INVALID, LONGINT_INVALID_SUFFIX_CHAR, LONGINT_OVERFLOW
  17. };
  18. typedef enum strtol_error strtol_error;
  19. # endif
  20. # define _DECLARE_XSTRTOL(name, type) \
  21. strtol_error \
  22. name PARAMS ((const char *s, char **ptr, int base, \
  23. type *val, const char *valid_suffixes));
  24. _DECLARE_XSTRTOL (xstrtol, long int)
  25. _DECLARE_XSTRTOL (xstrtoul, unsigned long int)
  26. _DECLARE_XSTRTOL (xstrtoumax, uintmax_t)
  27. # define _STRTOL_ERROR(Exit_code, Str, Argument_type_string, Err) \
  28. do \
  29. { \
  30. switch ((Err)) \
  31. { \
  32. case LONGINT_OK: \
  33. abort (); \
  34. \
  35. case LONGINT_INVALID: \
  36. error ((Exit_code), 0, "invalid %s `%s'", \
  37. (Argument_type_string), (Str)); \
  38. break; \
  39. \
  40. case LONGINT_INVALID_SUFFIX_CHAR: \
  41. error ((Exit_code), 0, "invalid character following %s `%s'", \
  42. (Argument_type_string), (Str)); \
  43. break; \
  44. \
  45. case LONGINT_OVERFLOW: \
  46. error ((Exit_code), 0, "%s `%s' too large", \
  47. (Argument_type_string), (Str)); \
  48. break; \
  49. } \
  50. } \
  51. while (0)
  52. # define STRTOL_FATAL_ERROR(Str, Argument_type_string, Err) \
  53. _STRTOL_ERROR (2, Str, Argument_type_string, Err)
  54. # define STRTOL_FAIL_WARN(Str, Argument_type_string, Err) \
  55. _STRTOL_ERROR (0, Str, Argument_type_string, Err)
  56. #endif /* not XSTRTOL_H_ */