/* datedif - calculates the difference in days between two dates * Copyright (C) 2000 Micael Widell contact: xeniac@linux.nu * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include #include int isDateArgument(char* dateString) { const int MONTHS[] = {31,0,31,30,31,30,31,31,30,31,30,31}; int i, day, month, year; char buffer[5]; /* 'today' is a valid date */ if (strcmp(dateString, "today") == 0) return 1; /* Numeric dates must be eight characters long */ if (8 != strlen(dateString)) return 0; /* Check that the date is entirely formed of numbers */ for (i = 0; i < 8; i++) { if (dateString[i] < '0' || dateString[i] > '9') return 0; } /* Check that the date exists */ memset(buffer, 0, 5); strncpy(buffer, dateString + 6, 2); day = atoi(buffer); strncpy(buffer, dateString + 4, 2); month = atoi(buffer); month -= 1; strncpy(buffer, dateString, 4); year = atoi(buffer); /* Validate month */ if (month < 0 || month > 11) return 0; /* Validating dates is simple when the date does not fall into February */ if (1 != month) { if (day < 1 || day > MONTHS[month]) return 0; } else { int feb = 28; /* Februarys are a bit tougher issue */ if (0 == year % 4) { if (0 == year % 100) { if (0 == year % 400) { feb = 29; } else { feb = 28; } } else { feb = 29; } } if (day < 1 || day > feb) return 0; } /* Avoid user from using dates before 16000301, since those will result in incorrect output */ if(16000301 > atoi(dateString)) return 0; return 1; }