astoi.c
上传用户:xiejiait
上传日期:2007-01-06
资源大小:881k
文件大小:2k
源码类别:

SCSI/ASPI

开发平台:

MultiPlatform

  1. /* @(#)astoi.c 1.5 96/05/09 Copyright 1985 J. Schilling */
  2. /*
  3.  * astoi() converts a string to int
  4.  * astol() converts a string to long
  5.  *
  6.  * Leading tabs and spaces are ignored.
  7.  * Both return pointer to the first char that has not been used.
  8.  * Caller must check if this means a bad conversion.
  9.  *
  10.  * leading "+" is ignored
  11.  * leading "0"  makes conversion octal (base 8)
  12.  * leading "0x" makes conversion hex   (base 16)
  13.  *
  14.  * Copyright (c) 1985 J. Schilling
  15.  */
  16. /* This program is free software; you can redistribute it and/or modify
  17.  * it under the terms of the GNU General Public License as published by
  18.  * the Free Software Foundation; either version 2, or (at your option)
  19.  * any later version.
  20.  *
  21.  * This program is distributed in the hope that it will be useful,
  22.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  23.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  24.  * GNU General Public License for more details.
  25.  * 
  26.  * You should have received a copy of the GNU General Public License
  27.  * along with this program; see the file COPYING.  If not, write to
  28.  * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 
  29.  */
  30. #include <standard.h>
  31. #define is_space(c)  ((c) == ' ' || (c) == 't')
  32. #define is_digit(c)  ((c) >= '0' && (c) <= '9')
  33. #define is_hex(c) (((c) >= 'a' && (c) <= 'f') || 
  34.  ((c) >= 'A' && (c) <= 'F'))
  35. #define to_lower(c) (((c) >= 'A' && (c) <= 'Z') ? (c) - 'A'+'a' : (c))
  36. #ifdef notdef
  37. int atoi(s)
  38. char *s;
  39. {
  40. long l;
  41. (void)astol(s, &l);
  42. return (int) l;
  43. }
  44. long atol(s)
  45. char *s;
  46. {
  47. long l;
  48. (void)astol(s, &l);
  49. return l;
  50. }
  51. #endif
  52. char *astoi(s, i)
  53. const char *s;
  54. int *i;
  55. {
  56. long l;
  57. char *ret;
  58. ret = astol(s, &l);
  59. *i = l;
  60. return(ret);
  61. }
  62. char *astol(s, l)
  63. register const char *s;
  64. long *l;
  65. {
  66. int neg = 0;
  67. register long ret = 0L;
  68. register int base = 10;
  69. register int digit;
  70. register char c;
  71. while (is_space(*s))
  72. s++;
  73. if (*s == '+') {
  74. s++;
  75. } else if (*s == '-') {
  76. s++;
  77. neg++;
  78. }
  79. if (*s == '0') {
  80. base = 8;
  81. s++;
  82. if (*s == 'x' || *s == 'X') {
  83. s++;
  84. base = 16;
  85. }
  86. }
  87. for (;(c = *s) != 0; s++) {
  88. if (is_digit(c)) {
  89. digit = c - '0';
  90. } else if (is_hex(c)) {
  91. digit = to_lower(c) - 'a' + 10;
  92. } else {
  93. break;
  94. }
  95. if (digit < base) {
  96. ret *= base;
  97. ret += digit;
  98. } else {
  99. break;
  100. }
  101. }
  102. if (neg)
  103. ret = -ret;
  104. *l = ret;
  105. return ((char *)s);
  106. }