#include <errno.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>

/* Return 0 on success or -1 on failure (with errno set).
   On failure, leave *result unchanged. */
int parse_int(const char *text, int *result)
{
    if (text == NULL || result == NULL) {
        errno = EINVAL;
        return -1;
    }

    errno = 0;  // strtol() needs this to detect overflow
    char *end;
    long value = strtol(text, &end, 10);

    if (end == text || *end != '\0') {
        errno = EINVAL;  // Not a valid integer
        return -1;
    }
    if (errno == ERANGE || value < INT_MIN || value > INT_MAX) {
        errno = ERANGE;  // Not representable as an int
        return -1;
    }

    *result = (int)value;
    return 0;
}

int main(int argc, char *argv[])
{
    if (argc != 2) {
        fprintf(stderr, "Usage: %s INTEGER\n", argv[0]);
        return EXIT_FAILURE;
    }

    int number;
    if (parse_int(argv[1], &number) == -1) {
        perror("parse_int");  // Uses errno set by our function
        return EXIT_FAILURE;
    }

    printf("Parsed value: %d\n", number);
    return EXIT_SUCCESS;
}
