From 04fb190243442e83349f129b523ab747e58100bf Mon Sep 17 00:00:00 2001 From: Michael Krelin Date: Sat, 05 Apr 2008 11:17:33 +0000 Subject: Initial commit into public repository Signed-off-by: Michael Krelin --- (limited to 'lib/hypnodata.cc') diff --git a/lib/hypnodata.cc b/lib/hypnodata.cc new file mode 100644 index 0000000..977fb76 --- a/dev/null +++ b/lib/hypnodata.cc @@ -0,0 +1,92 @@ +#include +#include +#include + +namespace napkin { + + void hypnodata_t::clear() { + to_bed = alarm = 0; + data_a = window = 0; + almost_awakes.clear(); + } + + static time_t from_minute_w3c(const string& w3c) { + struct tm t; memset(&t,0,sizeof(t)); t.tm_isdst=-1; + if(sscanf(w3c.c_str(),"%04d-%02d-%02dT%02d:%02d", + &t.tm_year,&t.tm_mon,&t.tm_mday,&t.tm_hour,&t.tm_min)!=5) + throw exception("failed to parse w3c time"); + --t.tm_mon;t.tm_year-=1900; + time_t rv = mktime(&t); + if(rv==(time_t)-1) + throw exception("failed to mktime()"); + return rv; + } + + void hypnodata_t::set_to_bed(const string& w3c) { + to_bed = from_minute_w3c(w3c); } + void hypnodata_t::set_alarm(const string& w3c) { + alarm = from_minute_w3c(w3c); } + void hypnodata_t::set_window(const string& str) { + window = strtol(str.c_str(),0,10); /* TODO: check for error */ + } + void hypnodata_t::set_data_a(const string& str) { + data_a = strtol(str.c_str(),0,10); /* TODO: check for error */ + } + void hypnodata_t::set_almost_awakes(const string& str) { + almost_awakes.clear(); + static const char *significants = "0123456789-T:Z"; + string::size_type p = str.find_first_of(significants); + struct tm t; memset(&t,0,sizeof(t)); t.tm_isdst=-1; + while(p!=string::npos) { + string::size_type ns = str.find_first_not_of(significants,p); + string w3c; + if(ns==string::npos) { + w3c = str.substr(p); + p = string::npos; + }else{ + w3c = str.substr(p,ns-p); + p = str.find_first_of(significants,ns); + } + if(w3c.empty()) continue; + if(sscanf(w3c.c_str(),"%04d-%02d-%02dT%02d:%02d:%02d", + &t.tm_year,&t.tm_mon,&t.tm_mday,&t.tm_hour,&t.tm_min,&t.tm_sec)!=6) + throw exception("failed to parse w3c time"); + --t.tm_mon;t.tm_year-=1900; + time_t aa = mktime(&t); + if(aa==(time_t)-1) + throw exception("failed to mktime()"); + almost_awakes.push_back(aa); + } + } + + const string hypnodata_t::w3c_to_bed() const { + return strftime("%Y-%m-%dT%H:%M",to_bed); } + const string hypnodata_t::w3c_alarm() const { + return strftime("%Y-%m-%dT%H:%M",alarm); } + const string hypnodata_t::w3c_almostawakes() const { + string rv; + for(vector::const_iterator i=almost_awakes.begin();i!=almost_awakes.end();++i) { + if(!rv.empty()) + rv += ','; + rv += strftime("%Y-%m-%dT%H:%M:%S",*i); + } + return rv; + } + + const string hypnodata_t::str_to_bed() const { + return strftime("%H:%M",to_bed); } + const string hypnodata_t::str_alarm() const { + return strftime("%H:%M",alarm); } + const string hypnodata_t::str_date() const { + return strftime("%Y-%m-%d, %a",alarm); } + const string hypnodata_t::str_data_a() const { + char tmp[16]; + snprintf(tmp,sizeof(tmp),"%d:%02d:%02d", + data_a/3600, (data_a%3600)/60, + data_a % 60 ); + return tmp; } + + time_t hypnodata_t::aligned_start() const { + return alarm - (alarm % (24*60*60)) - 24*60*60; } + +} -- cgit v0.9.0.2