db_getlong.c
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:4k
源码类别:

MySQL数据库

开发平台:

Visual C++

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