#include "tpTime.h"
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
#include <stdbool.h>
int timeStringToTm(
const char *str,
unsigned len,
struct tm *tmp)
{
char szTemp[5];
bool isUtc = false; bool isCssmTime = false; unsigned x;
unsigned i;
char *cp;
if((str == NULL) || (len == 0) || (tmp == NULL)) {
return 1;
}
if(str[len - 1] == '\0') {
len--;
}
switch(len) {
case UTC_TIME_STRLEN: isUtc = true;
break;
case CSSM_TIME_STRLEN:
isCssmTime = true;
break;
case GENERALIZED_TIME_STRLEN: break;
default: return 1;
}
cp = (char *)str;
for(i=0; i<(len - 1); i++) {
if ( !(isdigit(cp[i])) ) {
return 1;
}
}
if(isCssmTime) {
if(!isdigit(cp[len - 1])) {
return 1;
}
}
else {
if(cp[len - 1] != 'Z' ) {
return 1;
}
}
szTemp[0] = *cp++;
szTemp[1] = *cp++;
if(!isUtc) {
szTemp[2] = *cp++;
szTemp[3] = *cp++;
szTemp[4] = '\0';
}
else {
szTemp[2] = '\0';
}
x = atoi( szTemp );
if(isUtc) {
if(x < 50) {
x += 2000;
}
else if(x < 70) {
return 1;
}
else {
x += 1900;
}
}
tmp->tm_year = x - 1900;
szTemp[0] = *cp++;
szTemp[1] = *cp++;
szTemp[2] = '\0';
x = atoi( szTemp );
if((x > 12) || (x <= 0)) {
return 1;
}
tmp->tm_mon = x - 1;
szTemp[0] = *cp++;
szTemp[1] = *cp++;
szTemp[2] = '\0';
x = atoi( szTemp );
if((x > 31) || (x <= 0)) {
return 1;
}
tmp->tm_mday = x;
szTemp[0] = *cp++;
szTemp[1] = *cp++;
szTemp[2] = '\0';
x = atoi( szTemp );
if((x > 23) || (x < 0)) {
return 1;
}
tmp->tm_hour = x;
szTemp[0] = *cp++;
szTemp[1] = *cp++;
szTemp[2] = '\0';
x = atoi( szTemp );
if((x > 59) || (x < 0)) {
return 1;
}
tmp->tm_min = x;
szTemp[0] = *cp++;
szTemp[1] = *cp++;
szTemp[2] = '\0';
x = atoi( szTemp );
if((x > 59) || (x < 0)) {
return 1;
}
tmp->tm_sec = x;
return 0;
}
void nowTime(
struct tm *now)
{
time_t nowTime = time(NULL);
*now = *gmtime(&nowTime);
}
int compareTimes(
const struct tm *t1,
const struct tm *t2)
{
if(t1->tm_year > t2->tm_year) {
return 1;
}
else if(t1->tm_year < t2->tm_year) {
return -1;
}
else if(t1->tm_mon > t2->tm_mon) {
return 1;
}
else if(t1->tm_mon < t2->tm_mon) {
return -1;
}
else if(t1->tm_mday > t2->tm_mday) {
return 1;
}
else if(t1->tm_mday < t2->tm_mday) {
return -1;
}
else if(t1->tm_hour > t2->tm_hour) {
return 1;
}
else if(t1->tm_hour < t2->tm_hour) {
return -1;
}
else if(t1->tm_min > t2->tm_min) {
return 1;
}
else if(t1->tm_min < t2->tm_min) {
return -1;
}
else if(t1->tm_sec > t2->tm_sec) {
return 1;
}
else if(t1->tm_sec < t2->tm_sec) {
return -1;
}
return 0;
}
void timeAtNowPlus(unsigned secFromNow,
TpTimeSpec timeSpec,
char *outStr)
{
struct tm utc;
time_t baseTime;
baseTime = time(NULL);
baseTime += (time_t)secFromNow;
utc = *gmtime(&baseTime);
if(timeSpec == TIME_UTC) {
if(utc.tm_year >= 100) {
utc.tm_year -= 100;
}
sprintf(outStr, "%02d%02d%02d%02d%02d%02dZ",
utc.tm_year , utc.tm_mon + 1,
utc.tm_mday, utc.tm_hour, utc.tm_min, utc.tm_sec);
}
else {
sprintf(outStr, "%04d%02d%02d%02d%02d%02dZ",
utc.tm_year + 1900, utc.tm_mon + 1,
utc.tm_mday, utc.tm_hour, utc.tm_min, utc.tm_sec);
}
}