strtoul.c
上传用户:tany51
上传日期:2013-06-12
资源大小:1397k
文件大小:3k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /*
  2.  * Copyright (C) 1999  Ross Combs (rocombs@cs.nmsu.edu)
  3.  *
  4.  * This program is free software; you can redistribute it and/or
  5.  * modify it under the terms of the GNU General Public License
  6.  * as published by the Free Software Foundation; either version 2
  7.  * of the License, or (at your option) any later version.
  8.  *
  9.  * This program is distributed in the hope that it will be useful,
  10.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12.  * GNU General Public License for more details.
  13.  *
  14.  * You should have received a copy of the GNU General Public License
  15.  * along with this program; if not, write to the Free Software
  16.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  17.  */
  18. #include "common/setup_before.h"
  19. #ifndef HAVE_STRTOUL
  20. #include "strtoul.h"
  21. #include "common/setup_after.h"
  22. extern unsigned long strtoul(char const * str, char * * endptr, int base)
  23. {
  24.     unsigned int  pos;
  25.     unsigned int  i;
  26.     unsigned long val;
  27.     
  28.     if (!str)
  29. return 0; /* EINVAL */
  30.     
  31.     for (pos=0; str[pos]==' ' || str[pos]=='t'; pos++);
  32.     if (str[pos]=='-' || str[pos]=='+')
  33.         pos++;
  34.     if ((base==0 || base==16) && str[pos]=='0' && (str[pos+1]=='x' || str[pos+1]=='X'))
  35.     {
  36. base = 16;
  37. pos += 2; /* skip 0x prefix */
  38.     }
  39.     else if ((base==0 || base==8) && str[pos]=='0')
  40. {
  41.     base = 8;
  42.     pos += 1;
  43. }
  44.     else if (base==0)
  45.      {
  46.          base = 10;
  47.      }
  48.     
  49.     if (base<2 || base>16) /* sorry, not complete emulation (should do up to 36) */
  50. return 0; /* EINVAL */
  51.     
  52.     val = 0;
  53.     for (i=pos; str[i]!=''; i++)
  54.     {
  55.         val *= base;
  56. /* we could assume ASCII and subtraction but this isn't too hard */
  57. if (str[i]=='0')
  58.     val += 0;
  59. else if (str[i]=='1')
  60.     val += 1;
  61. else if (base>2 && str[i]=='2')
  62.     val += 2;
  63. else if (base>3 && str[i]=='3')
  64.     val += 3;
  65. else if (base>4 && str[i]=='4')
  66.     val += 4;
  67. else if (base>5 && str[i]=='5')
  68.     val += 5;
  69. else if (base>6 && str[i]=='6')
  70.     val += 6;
  71. else if (base>7 && str[i]=='7')
  72.     val += 7;
  73. else if (base>8 && str[i]=='8')
  74.     val += 8;
  75. else if (base>9 && str[i]=='9')
  76.     val += 9;
  77. else if (base>10 && (str[i]=='a' || str[i]=='A'))
  78.     val += 10;
  79. else if (base>11 && (str[i]=='b' || str[i]=='B'))
  80.     val += 11;
  81. else if (base>12 && (str[i]=='c' || str[i]=='C'))
  82.     val += 12;
  83. else if (base>13 && (str[i]=='d' || str[i]=='D'))
  84.     val += 13;
  85. else if (base>14 && (str[i]=='e' || str[i]=='E'))
  86.     val += 14;
  87. else if (base>15 && (str[i]=='f' || str[i]=='F'))
  88.     val += 15;
  89. else
  90.     break;
  91.     }
  92.     
  93.     if (endptr)
  94. *endptr = (void *)&str[i]; /* avoid warning */
  95.     
  96.     return val;
  97. }
  98. #else
  99. typedef int filenotempty; /* make ISO standard happy */
  100. #endif