strtoll.c 1.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. #include "lib9.h"
  2. vlong
  3. strtoll(const char *nptr, char **endptr, int base)
  4. {
  5. const char *p;
  6. vlong n;
  7. int c, v, neg, ndig;
  8. p = nptr;
  9. neg = 0;
  10. n = 0;
  11. ndig = 0;
  12. /*
  13. * White space
  14. */
  15. for(;;p++){
  16. switch(*p){
  17. case ' ':
  18. case '\t':
  19. case '\n':
  20. case '\f':
  21. case '\r':
  22. case '\v':
  23. continue;
  24. }
  25. break;
  26. }
  27. /*
  28. * Sign
  29. */
  30. if(*p=='-' || *p=='+')
  31. if(*p++ == '-')
  32. neg = 1;
  33. /*
  34. * Base
  35. */
  36. if(base==0){
  37. if(*p != '0')
  38. base = 10;
  39. else{
  40. base = 8;
  41. if(p[1]=='x' || p[1]=='X'){
  42. p += 2;
  43. base = 16;
  44. }
  45. }
  46. }else if(base==16 && *p=='0'){
  47. if(p[1]=='x' || p[1]=='X')
  48. p += 2;
  49. }else if(base<0 || 36<base)
  50. goto Return;
  51. /*
  52. * Non-empty sequence of digits
  53. */
  54. for(;; p++,ndig++){
  55. c = *p;
  56. v = base;
  57. if('0'<=c && c<='9')
  58. v = c - '0';
  59. else if('a'<=c && c<='z')
  60. v = c - 'a' + 10;
  61. else if('A'<=c && c<='Z')
  62. v = c - 'A' + 10;
  63. if(v >= base)
  64. break;
  65. n = n*base + v;
  66. }
  67. Return:
  68. if(ndig == 0)
  69. p = nptr;
  70. if(endptr)
  71. *endptr = (char*) p;
  72. if(neg)
  73. return -n;
  74. return n;
  75. }