
/* strtol.c */

#include <stdlib.h>
#include <ctype.h>
#include <errno.h>
#include <limits.h>

unsigned long __strtoul (const char *nptr, char **endptr, int base);

long
strtol (const char *nptr, char **endptr, int base)
{
  const char *p, *q;
  unsigned long ul_value;
  long value;
  int negative;

  p = nptr;

  while (isspace (*p))
    p++;

  negative = 0;
  if (*p == '-')
    {
      negative = 1;
      p++;
    }
  else
    if (*p == '+')
      p++;

  ul_value = __strtoul (p, (char **) &q, base);

  if (negative)
    {
      if (ul_value <= -LONG_MIN)
	value = -(long)ul_value;
      else
	{
	  value = LONG_MAX;
	  errno = ERANGE;
	}
    }
  else
    {
      if (ul_value <= LONG_MAX)
	value = (long)ul_value;
      else
	{
	  value = LONG_MAX;
	  errno = ERANGE;
	}
    }

  if (endptr != NULL)
    *endptr = (char *) (p != q ? q : nptr);

  return value;
}
