BBN-Vax-TCP/src/libbbn/atolv.c

/*
 * C library - atolv: get a long
 * from a string and return it where the second argument
 * points (with pointer to next char returned directly).
 * Atolong is like atolv except third argument
 * is base if non-zero (0 defaults to octal on leading zero, else decimal).
 */

char *atolv (astring, apointer)
char *astring;
long *apointer;
{
  extern char *atolong ();
  return (atolong (astring, apointer, 0));
}

char *atolong (astring, apointer, abase)
char *astring;
long *apointer;
int   abase;
{
  register char *pointer;
  long	number;
  register int	base;
  int	negative;

  for (pointer = astring; *pointer == ' ' || *pointer == '\t'; pointer++)
    ;
  for (negative = 0; *pointer == '-'; pointer++)
    negative++;
  if (abase != 0)
    base = abase;
  else
  {
    base = 10;
    if (*pointer == '0')
    {
      base = 8;
      pointer++;
      if ((*pointer == 'x') || (*pointer == 'X'))
      {
	base = 16;
	pointer++;
      }
    }
  }
  for (number = 0; *pointer; pointer++)
  {
    if ((*pointer >= '0') && (*pointer <= '9'))
    {
      number = (number * base) + (*pointer - '0');
      continue;
    }
    if (base <= 10)
      break;
    if ((*pointer >= 'A') && (*pointer <= 'Z'))
    {
      number = (number * base) + ((*pointer - 'A') + 10);
      continue;
    }
    if ((*pointer >= 'a') && (*pointer <= 'z'))
    {
      number = (number * base) + ((*pointer - 'a') + 10);
      continue;
    }
    break;
  }
  if (negative)
    number = -number;
  *apointer = number;
  return (pointer);
}