#include <stdio.h>

double atof(char c[]);

main() {
  char str1[255] = "255.123E02";
  char str2[255] = "255E02";
  char str3[255] = ".123E02";
  char str4[255] = ".123";
  printf("%s\t%f\n", str1, atof(str1));
  printf("%s\t%f\n", str2, atof(str2));
  printf("%s\t%f\n", str3, atof(str3));
  printf("%s\t%f\n", str4, atof(str4));
}

int power (int base, int pow) {
  int res = 1; int i;
  for (i = 0; i < pow; i++) {
    res *= base;
  }
  return res;
}

double fe_StringToDouble(char c[]) {
  int i = 0; int sign = 1; int esign = 1;
  int value = 0; int evalue = 0; int st = 0; int stcal;
  if (c[i] == '+') i++;
  else if (c[i] == '-') { sign = -1; i++; }

  while (c[i] <= '9' && c[i] >= '0') {
    value *= 10;
    value += c[i] - '0';
    i++;
  }
  if (c[i] == '.') {
    i++;
    while (c[i] <= '9' && c[i] >= '0') {
      value *= 10;
      value += c[i] - '0';
      st--;
      i++;
    }
  }
  if ((c[i] == 'E') || (c[i] == 'e')) {
    i++;
    if (c[i] == '+') i++;
    else if (c[i] == '-') { esign = -1; i++; }

    while (c[i] <= '9' && c[i] >= '0') {
      evalue *= 10;
      evalue += c[i] - '0';
      i++;
    }
    st = st + evalue * esign;
  }
  if (st < 0) {
    stcal = power (10, -st);
    return (sign * value) / (double)stcal;
  } else {
    stcal = power (10, st);
    return (sign * value) * (double)stcal;
  }
}

double atof(char c[]) {
  return fe_StringToDouble(c);
}