Created
April 22, 2014 06:58
-
-
Save anonymous/11167905 to your computer and use it in GitHub Desktop.
A date Validator in C
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//Header files: | |
#ifndef ALARM_H | |
#define ALARM_H | |
/* 0 is AM, 1 is PM */ | |
typedef struct { | |
int year; | |
int month; | |
int day; | |
int hour; | |
int minute; | |
int second; | |
int am_or_pm; | |
struct tm time_s; | |
time_t unix_tm; | |
int set; | |
int finished; | |
} alarm_t; | |
#endif | |
#ifndef Calarm_t_H | |
#define Calarm_t_H | |
#include <time.h> | |
#include "alarm.h" | |
int validate(char c, alarm_t* alarm_ptr, int val); | |
int validate_year(alarm_t* alarm_ptr, int val); | |
int validate_month(alarm_t* alarm_ptr, int val); | |
int validate_day(alarm_t* alarm_ptr, int val); | |
int validate_hour(alarm_t* alarm_ptr, int val); | |
int validate_minute(alarm_t* alarm_ptr, int val); | |
int validate_second(alarm_t* alarm_ptr, int val); | |
#endif | |
//C Code: | |
#include <stdio.h> | |
#include "curtime.h" | |
#include "validate.h" | |
#include "calarm.h" | |
int validate(char c, alarm_t* alarm_ptr, int val) { | |
struct tm time_s; | |
/* optimize */ | |
switch(c) { | |
case 'Y': | |
return (validate_year(alarm_ptr, val) == 0 || validate_year(alarm_ptr, val) == 1); | |
break; | |
case 'M': | |
if (validate_year(alarm_ptr, alarm_ptr->year) == 1) { | |
return (validate_month(alarm_ptr, val) != -1); | |
} else if (validate_year(alarm_ptr, alarm_ptr->year) == 0) { | |
return (val <= 11 && val >= 0); | |
} | |
break; | |
case 'D': | |
if (validate_year(alarm_ptr, alarm_ptr->year) == 1) { | |
if (validate_month(alarm_ptr, alarm_ptr->month) == 1) { | |
return (validate_day(alarm_ptr, val) != -1); | |
} else if (validate_month(alarm_ptr, alarm_ptr->month) == 0) { | |
/* Possible bug */ | |
return (val <= 31 && val >= 1); | |
} | |
} else if (validate_year(alarm_ptr, alarm_ptr->year) == 0) { | |
return (val <= 31 && val >= 1); | |
} | |
break; | |
case 'h': | |
if (validate_year(alarm_ptr, alarm_ptr->year) == 1) { | |
if (validate_month(alarm_ptr, alarm_ptr->month) == 1) { | |
if (validate_day(alarm_ptr, alarm_ptr->day) == 1) { | |
return (validate_hour(alarm_ptr, val) != -1); | |
} else if (validate_day(alarm_ptr, alarm_ptr->day) == 0) { | |
return (val <= 23 && val >= 0); | |
} | |
} else if (validate_month(alarm_ptr, alarm_ptr->month) == 0) { | |
return (val <= 23 && val >= 0); | |
} | |
} else if (validate_year(alarm_ptr, alarm_ptr->year) == 0) { | |
return (val <= 23 && val >= 0); | |
} | |
break; | |
case 'm': | |
if (validate_year(alarm_ptr, alarm_ptr->year) == 1) { | |
if (validate_month(alarm_ptr, alarm_ptr->month) == 1) { | |
if (validate_day(alarm_ptr, alarm_ptr->day) == 1) { | |
if (validate_hour(alarm_ptr, alarm_ptr->hour) == 1) { | |
return (validate_minute(alarm_ptr, val) != -1); | |
} else if (validate_hour(alarm_ptr, alarm_ptr->hour) == 0) { | |
return (val <= 59 && val >= 0); | |
} | |
} else if (validate_day(alarm_ptr, alarm_ptr->day) == 0) { | |
return (val <= 59 && val >= 0); | |
} | |
} else if (validate_month(alarm_ptr, alarm_ptr->month) == 0) { | |
return (val <= 59 && val >= 0); | |
} | |
} else if (validate_year(alarm_ptr, alarm_ptr->year) == 0) { | |
return (val <= 59 && val >= 0); | |
} | |
break; | |
case 's': | |
if (validate_year(alarm_ptr, alarm_ptr->year) == 1) { | |
if (validate_month(alarm_ptr, alarm_ptr->month) == 1) { | |
if (validate_day(alarm_ptr, alarm_ptr->day) == 1) { | |
if (validate_hour(alarm_ptr, alarm_ptr->hour) == 1) { | |
if (validate_minute(alarm_ptr, alarm_ptr->minute) == 1) { | |
return (validate_second(alarm_ptr, val) != -1); | |
} else if (validate_minute(alarm_ptr, val) == 0) { | |
return (val <= 61 && val >= 0); | |
} | |
} else if (validate_hour(alarm_ptr, alarm_ptr->hour) == 0) { | |
return (val <= 61 && val >= 0); | |
} | |
} else if (validate_day(alarm_ptr, alarm_ptr->day) == 0) { | |
return (val <= 61 && val >= 0); | |
} | |
} else if (validate_month(alarm_ptr, alarm_ptr->month) == 0) { | |
return (val <= 61 && val >= 0); | |
} | |
} else if (validate_year(alarm_ptr, alarm_ptr->year) == 0) { | |
return (val <= 61 && val >= 0); | |
} | |
break; | |
} | |
return 0; | |
} | |
int validate_year(alarm_t* alarm_ptr, int val) { | |
if (val == -1) { | |
return 0; | |
} else { | |
struct tm time_s; | |
time_s = build_cur_tm(); | |
if (val - (time_s.tm_year + 1900) == 0) { | |
return 1; | |
} else if (val - (time_s.tm_mon + 1900) > 0) { | |
return 0; | |
} | |
} | |
return -1; | |
} | |
int validate_month(alarm_t* alarm_ptr, int val) { | |
if (val >= 12 || val < 0) { | |
return -1; | |
} | |
if (val == -1) { | |
return 0; | |
} else { | |
struct tm time_s; | |
time_s = build_cur_tm(); | |
if (val - time_s.tm_mon == 0) { | |
return 1; | |
} else if (val - time_s.tm_mon > 0) { | |
return 0; | |
} | |
} | |
return -1; | |
} | |
int validate_day(alarm_t* alarm_ptr, int val) { | |
if (val >= 31 || val < 0) { | |
return -1; | |
} | |
if (val == -1) { | |
return 0; | |
} else { | |
struct tm time_s; | |
time_s = build_cur_tm(); | |
if (val >= time_s.tm_mday) { | |
/* 30 days hath september */ | |
if (alarm_ptr->month == -1) { | |
return 1; /* 1 or 0? */ | |
} else { | |
if (alarm_ptr->month == 1) { | |
return (val <= 28 && val >= 0); | |
} | |
if (alarm_ptr->month == 3 || alarm_ptr->month == 5 || alarm_ptr->month == 8 || alarm_ptr->month == 10) { | |
return (val <= 30 && val >= 0); | |
} else { | |
return (val <= 31 && val >= 0); | |
} | |
} | |
} | |
} | |
return -1; | |
} | |
int validate_hour(alarm_t* alarm_ptr, int val) { | |
if (val >= 24 || val < 0) { | |
return -1; | |
} | |
if (val == -1) { | |
return 0; | |
} else { | |
struct tm time_s; | |
time_s = build_cur_tm(); | |
return (val >= time_s.tm_hour); | |
} | |
return -1; | |
} | |
int validate_minute(alarm_t* alarm_ptr, int val) { | |
if (val >= 60 || val < 0) { | |
return -1; | |
} | |
if (val == -1) { | |
return 0; | |
} else { | |
struct tm time_s; | |
time_s = build_cur_tm(); | |
return (val >= time_s.tm_min); | |
} | |
return -1; | |
} | |
int validate_second(alarm_t* alarm_ptr, int val) { | |
if (val >= 62 || val < 0) { | |
return -1; | |
} | |
if (val == -1) { | |
return 0; | |
} else { | |
struct tm time_s; | |
time_s = build_cur_tm(); | |
return (val >= time_s.tm_sec); | |
} | |
return -1; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment