#include <ctype.h>
typedef enum {
  UNK, HEX, DEC, OCT} state;


itoi(s)
     char *s;
{
  /*
   * 01234
   * 0x0123abc
   * 1342
   */
  int n=0;
  state mode = UNK;
  
  while(*s && (mode == UNK))
    {
      switch(*s)
	{
	case ' ':
	case '\t':
	case '\n':
	  break;
	case '0':
	  if(s[1]=='x')
	    {
	      s++;
	      mode = HEX;
	    }
	  else
	    {
	      mode = OCT;
	    }
	  break;
	default:
	  if(!isdigit(*s))
	    {
	      return(0);
	    }
	  else
	    {
	      mode = DEC;
	      s--;
	    }
	}
      s++;
    }

  while(*s && (mode != UNK))
    {
      switch(mode)
	{
	case DEC:
	  if(isdigit(*s))
	    {
	      n *= 10;
	      n += *s - '0';
	    }
	  else
	    {
	      mode = UNK;
	    }
	  break;
	case HEX:
	  if(isxdigit(*s))
	    {
	      n *= 16;
	      if(isdigit(*s))
		n += *s - '0';
	      else
		n += isupper(*s)?tolower(*s):(*s) - 'a';
	    }
	  else
	    {
	      mode = UNK;
	    }
	  break;
	case OCT:
	  if(isdigit(*s) && (*s < '8'))
	    {
	      n *= 8;
	      n += *s - '0';
	    }
	  else
	    {
	      mode = UNK;
	    }
	}
      s++;
    }

  return(n);
}

	  
