#include <stdio.h>
#include <string.h>

typedef int boolean;
typedef enum {false, true};

unsigned long foo(char * cp)
{
  unsigned long retVal = 0;
  while ((*cp >= '0') && (*cp <= '9')) {
    retVal *= 10;
    retVal += *cp++ - '0';
  }   
  return retVal;
}

// Does not support xxEyy notation!

float goo(char *cp)
{
  unsigned long integral;
  unsigned long fractional;
  float fracScaled;
  int i, precision;
  float retVal = 0.0;
  boolean invert = false;

  // eatWhiteSpace(&cp);

  // handle any prefix 
  switch(*cp) {
  case '-':
    invert = true;
    cp++;
    break;
  case '+':
    invert = false;
    cp++;
    break;
  default:
    break;
  }

  integral = foo(cp);

  // skip over the decimal point
  while ((*cp != '\0') && (*cp != '.'))
    cp++;

  if (*cp != '.') {
    return (float)integral;
  }

  // get the 'whole' fractional part
  cp++;
  fractional = foo(cp);
  precision = strlen(cp);

  printf("precision=%d\n",precision);

  // calculate the fractional divisor
  fracScaled = (float)fractional;
  for(i=0;i<precision;i++)
    fracScaled /= (float)10.0;
  
  // calculate composite result (unsigned)
  retVal = (float)integral + fracScaled;

  // invert if negative number
  if (invert == true) {
    retVal = -retVal;
  }

  return retVal;
}


void main(void)
{
  static char * gag = "3456.67";
  printf("gag[%s], goo[%f]\n",gag,goo(gag));
}
