#include <stdlib.h>
#include <stdio.h>
int ipow10(int e)
{
if (e == 0)
return 1;
return 10 * ipow10(e - 1);
}
const char *parse_digit(const char *str, int *digit)
{
if (str == NULL || *str < '0' || *str > '9')
return NULL;
*digit = *str - '0';
return str + 1;
}
const char *parse_number(const char *str, int *n, int cnt)
{
int d;
const char *rest = str;
*n = 0;
for (int i = 1; i <= cnt; i++) {
rest = parse_digit(rest, &d);
*n += d * ipow10(cnt - i);
}
return rest;
}
const char *parse_year(const char *str, int *year)
{
return parse_number(str, year, 4);
}
const char *parse_month(const char *str, int *month)
{
return parse_number(str, month, 2);
}
const char *parse_day(const char *str, int *day)
{
return parse_number(str, day, 2);
}
const char *parse_tkn(const char *str, char tkn)
{
if (str && *str == tkn)
return str + 1;
return NULL;
}
const char *parse_date(const char *str, int *year, int *month, int *day)
{
const char *rest;
rest = parse_year(str, year);
rest = parse_tkn(rest, '-');
rest = parse_month(rest, month);
rest = parse_tkn(rest, '-');
return parse_day(rest, day);
}
int main(int argc, char *argv[])
{
int year;
int month;
int day;
if (argc != 2)
{
fprintf(stderr, "Usage: %s <date-string>\n", argv[0]);
return EXIT_FAILURE;
}
if (!parse_date(argv[1], &year, &month, &day))
{
fprintf(stderr, "%s is not a valid date in format yyyy-mm-dd\n", argv[1]);
return EXIT_FAILURE;
}
printf("Year : %d\nMonth : %d\nDay : %d\n", year, month, day);
return EXIT_SUCCESS;
}