db_getlong.c
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:3k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /*-
  2.  * See the file LICENSE for redistribution information.
  3.  *
  4.  * Copyright (c) 1996-2002
  5.  * Sleepycat Software.  All rights reserved.
  6.  */
  7. #include "db_config.h"
  8. #ifndef lint
  9. static const char revid[] = "$Id: db_getlong.c,v 11.18 2002/03/28 20:13:33 bostic Exp $";
  10. #endif /* not lint */
  11. #ifndef NO_SYSTEM_INCLUDES
  12. #include <sys/types.h>
  13. #include <limits.h>
  14. #include <stdlib.h>
  15. #include <string.h>
  16. #endif
  17. #include "db_int.h"
  18. /*
  19.  * __db_getlong --
  20.  * Return a long value inside of basic parameters.
  21.  *
  22.  * PUBLIC: int __db_getlong
  23.  * PUBLIC:     __P((DB *, const char *, char *, long, long, long *));
  24.  */
  25. int
  26. __db_getlong(dbp, progname, p, min, max, storep)
  27. DB *dbp;
  28. const char *progname;
  29. char *p;
  30. long min, max, *storep;
  31. {
  32. long val;
  33. char *end;
  34. __os_set_errno(0);
  35. val = strtol(p, &end, 10);
  36. if ((val == LONG_MIN || val == LONG_MAX) &&
  37.     __os_get_errno() == ERANGE) {
  38. if (dbp == NULL)
  39. fprintf(stderr,
  40.     "%s: %s: %sn", progname, p, strerror(ERANGE));
  41. else
  42. dbp->err(dbp, ERANGE, "%s", p);
  43. return (1);
  44. }
  45. if (p[0] == '' || (end[0] != '' && end[0] != 'n')) {
  46. if (dbp == NULL)
  47. fprintf(stderr,
  48.     "%s: %s: Invalid numeric argumentn", progname, p);
  49. else
  50. dbp->errx(dbp, "%s: Invalid numeric argument", p);
  51. return (1);
  52. }
  53. if (val < min) {
  54. if (dbp == NULL)
  55. fprintf(stderr,
  56.     "%s: %s: Less than minimum value (%ld)n",
  57.     progname, p, min);
  58. else
  59. dbp->errx(dbp,
  60.     "%s: Less than minimum value (%ld)", p, min);
  61. return (1);
  62. }
  63. if (val > max) {
  64. if (dbp == NULL)
  65. fprintf(stderr,
  66.     "%s: %s: Greater than maximum value (%ld)n",
  67.     progname, p, max);
  68. else
  69. dbp->errx(dbp,
  70.     "%s: Greater than maximum value (%ld)", p, max);
  71. return (1);
  72. }
  73. *storep = val;
  74. return (0);
  75. }
  76. /*
  77.  * __db_getulong --
  78.  * Return an unsigned long value inside of basic parameters.
  79.  *
  80.  * PUBLIC: int __db_getulong
  81.  * PUBLIC:     __P((DB *, const char *, char *, u_long, u_long, u_long *));
  82.  */
  83. int
  84. __db_getulong(dbp, progname, p, min, max, storep)
  85. DB *dbp;
  86. const char *progname;
  87. char *p;
  88. u_long min, max, *storep;
  89. {
  90. #if !defined(HAVE_STRTOUL)
  91. COMPQUIET(min, 0);
  92. return (__db_getlong(dbp, progname, p, 0, max, (long *)storep));
  93. #else
  94. u_long val;
  95. char *end;
  96. __os_set_errno(0);
  97. val = strtoul(p, &end, 10);
  98. if (val == ULONG_MAX && __os_get_errno() == ERANGE) {
  99. if (dbp == NULL)
  100. fprintf(stderr,
  101.     "%s: %s: %sn", progname, p, strerror(ERANGE));
  102. else
  103. dbp->err(dbp, ERANGE, "%s", p);
  104. return (1);
  105. }
  106. if (p[0] == '' || (end[0] != '' && end[0] != 'n')) {
  107. if (dbp == NULL)
  108. fprintf(stderr,
  109.     "%s: %s: Invalid numeric argumentn", progname, p);
  110. else
  111. dbp->errx(dbp, "%s: Invalid numeric argument", p);
  112. return (1);
  113. }
  114. if (val < min) {
  115. if (dbp == NULL)
  116. fprintf(stderr,
  117.     "%s: %s: Less than minimum value (%lu)n",
  118.     progname, p, min);
  119. else
  120. dbp->errx(dbp,
  121.     "%s: Less than minimum value (%lu)", p, min);
  122. return (1);
  123. }
  124. /*
  125.  * We allow a 0 to substitute as a max value for ULONG_MAX because
  126.  * 1) accepting only a 0 value is unlikely to be necessary, and 2)
  127.  * we don't want callers to have to use ULONG_MAX explicitly, as it
  128.  * may not exist on all platforms.
  129.  */
  130. if (max != 0 && val > max) {
  131. if (dbp == NULL)
  132. fprintf(stderr,
  133.     "%s: %s: Greater than maximum value (%lu)n",
  134.     progname, p, max);
  135. else
  136. dbp->errx(dbp,
  137.     "%s: Greater than maximum value (%lu)", p, max);
  138. return (1);
  139. }
  140. *storep = val;
  141. return (0);
  142. #endif /* !defined(HAVE_STRTOUL) */
  143. }