extern void read_date(int *py, int *pm, int *pd) { int y = 0, m = 0, d = 0; filepos fp_date; skipblanks(); get_pos(&fp_date); y = read_uint_internal(/*Expecting date, found “%s”*/198, &fp_date); /* Two digit year is 19xx. */ if (y < 100) y += 1900; if (y < 1900 || y > 2078) { set_pos(&fp_date); compile_diagnostic(DIAG_WARN|DIAG_UINT, /*Invalid year (< 1900 or > 2078)*/58); LONGJMP(file.jbSkipLine); return; /* for brain-fried compilers */ } if (ch == '.') { filepos fp; nextch(); get_pos(&fp); m = read_uint_internal(/*Expecting date, found “%s”*/198, &fp_date); if (m < 1 || m > 12) { set_pos(&fp); compile_diagnostic(DIAG_WARN|DIAG_UINT, /*Invalid month*/86); LONGJMP(file.jbSkipLine); return; /* for brain-fried compilers */ } if (ch == '.') { nextch(); get_pos(&fp); d = read_uint_internal(/*Expecting date, found “%s”*/198, &fp_date); if (d < 1 || d > last_day(y, m)) { set_pos(&fp); /* TRANSLATORS: e.g. 31st of April, or 32nd of any month */ compile_diagnostic(DIAG_WARN|DIAG_UINT, /*Invalid day of the month*/87); LONGJMP(file.jbSkipLine); return; /* for brain-fried compilers */ } } } if (py) *py = y; if (pm) *pm = m; if (pd) *pd = d; }
static void cmd_date(void) { int year, month, day; int days1, days2; bool implicit_range = fFalse; read_date(&year, &month, &day); days1 = days_since_1900(year, month ? month : 1, day ? day : 1); if (days1 > current_days_since_1900) { compile_warning(-/*Date is in the future!*/80); } skipblanks(); if (ch == '-') { nextch(); read_date(&year, &month, &day); } else { if (month && day) { days2 = days1; goto read; } implicit_range = fTrue; } if (month == 0) month = 12; if (day == 0) day = last_day(year, month); days2 = days_since_1900(year, month, day); if (!implicit_range && days2 > current_days_since_1900) { compile_warning(-/*Date is in the future!*/80); } if (days2 < days1) { compile_error(-/*End of date range is before the start*/81); } read: copy_on_write_meta(pcs); pcs->meta->days1 = days1; pcs->meta->days2 = days2; }
extern void read_date(int *py, int *pm, int *pd) { int y = 0, m = 0, d = 0; filepos fp; skipblanks(); get_pos(&fp); y = read_uint_internal(/*Expecting date, found “%s”*/198, &fp); /* Two digit year is 19xx. */ if (y < 100) y += 1900; if (y < 1900 || y > 2078) { compile_warning(/*Invalid year (< 1900 or > 2078)*/58); LONGJMP(file.jbSkipLine); return; /* for brain-fried compilers */ } if (ch == '.') { nextch(); m = read_uint_internal(/*Expecting date, found “%s”*/198, &fp); if (m < 1 || m > 12) { compile_warning(/*Invalid month*/86); LONGJMP(file.jbSkipLine); return; /* for brain-fried compilers */ } if (ch == '.') { nextch(); d = read_uint_internal(/*Expecting date, found “%s”*/198, &fp); if (d < 1 || d > last_day(y, m)) { compile_warning(/*Invalid day of the month*/87); LONGJMP(file.jbSkipLine); return; /* for brain-fried compilers */ } } } if (py) *py = y; if (pm) *pm = m; if (pd) *pd = d; }