Skip to content

Instantly share code, notes, and snippets.

Created April 22, 2014 06:58
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save anonymous/11167905 to your computer and use it in GitHub Desktop.
Save anonymous/11167905 to your computer and use it in GitHub Desktop.
A date Validator in C
//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