strtol.c 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. /*
  2. * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
  3. * See the copyright notice in the ACK home directory, in the file "Copyright".
  4. */
  5. /* $Id$ */
  6. #include <ctype.h>
  7. long int
  8. strtol(nptr, endptr, base)
  9. register char *nptr;
  10. char **endptr;
  11. {
  12. register int v;
  13. register long val = 0;
  14. register int c;
  15. int sign = 1;
  16. char *startnptr = nptr, *nrstart;
  17. if (endptr) *endptr = (char *)nptr;
  18. while (isspace(*nptr)) nptr++;
  19. c = *nptr;
  20. if (c == '-' || c == '+') {
  21. if (c == '-') sign = -1;
  22. nptr++;
  23. }
  24. nrstart = nptr; /* start of the number */
  25. /* When base is 0, the syntax determines the actual base */
  26. if (base == 0)
  27. if (*nptr == '0')
  28. if (*++nptr == 'x' || *nptr == 'X') {
  29. base = 16;
  30. nptr++;
  31. }
  32. else base = 8;
  33. else base = 10;
  34. else if (base==16 && *nptr=='0' && (*++nptr =='x' || *nptr =='X'))
  35. nptr++;
  36. while (isdigit(c = *nptr) || isalpha(c)) {
  37. if (isalpha(c))
  38. v = 10 + (isupper(c) ? c - 'A' : c - 'a');
  39. else
  40. v = c - '0';
  41. if (v >= base) break;
  42. val = (val * base) + v;
  43. nptr++;
  44. }
  45. if (endptr) {
  46. if (nrstart == nptr) *endptr = (char *)startnptr;
  47. else *endptr = (char *)nptr;
  48. }
  49. return (long) sign * val;
  50. }