#include <stdio.h>

double myStrtod(const char *string)
{
    double number = 0.0;
    double decimalPlace = 0.1;
    int sign = 1;
    int i = 0;

    while (string[i] == ' ')
    {
        ++i;
    }

    if (string[i] == '-')
    {
        sign = -1;
        ++i;
    }
    else if (string[i] == '+')
    {
        ++i;
    }

    while (string[i] >= '0' &&
           string[i] <= '9')
    {
        number = number * 10 +
                 (string[i] - '0');

        ++i;
    }

    if (string[i] == '.')
    {
        ++i;

        while (string[i] >= '0' &&
               string[i] <= '9')
        {
            number +=
                (string[i] - '0') * decimalPlace;

            decimalPlace *= 0.1;
            ++i;
        }
    }

    return sign * number;
}

long myStrtol(const char *string)
{
    long number = 0;
    int sign = 1;
    int i = 0;

    while (string[i] == ' ')
    {
        ++i;
    }

    if (string[i] == '-')
    {
        sign = -1;
        ++i;
    }
    else if (string[i] == '+')
    {
        ++i;
    }

    while (string[i] >= '0' &&
           string[i] <= '9')
    {
        number = number * 10 +
                 (string[i] - '0');

        ++i;
    }

    return sign * number;
}

unsigned long myStrtoul(const char *string)
{
    unsigned long number = 0;
    int i = 0;

    while (string[i] == ' ')
    {
        ++i;
    }

    while (string[i] >= '0' &&
           string[i] <= '9')
    {
        number = number * 10 +
                 (string[i] - '0');

        ++i;
    }

    return number;
}

int main(void)
{
    char doubleString[] = "-123.456";
    char longString[] = "-1234567";
    char unsignedString[] = "1234567";

    printf("Double value = %.3f\n",
           myStrtod(doubleString));

    printf("Long value = %ld\n",
           myStrtol(longString));

    printf("Unsigned long value = %lu\n",
           myStrtoul(unsignedString));

    return 0;
}