You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

98 lines
2.1 KiB

#include <iostream>
#include <vector>
#include <sstream>
#include <string>
#include <stdio.h>
#include <cstdint>
#include "spell.h"
#include "StringTools.h"
//! Basically what backticks do in a shell
//! Runs a command and returns stdout
std::string Eval(const std::string& cmd) {
FILE *p;
char ch;
p = popen(cmd.c_str(), "r");
if (p == NULL) {
std::cerr << "Unable to open a process. Make sure the requested program is installed! Tried to call:" << std::endl
<< "'" << cmd << "'" << std::endl;
exit(-1);
}
std::stringstream ss;
while ((ch=fgetc(p)) != EOF )
ss << ch;
// Remove terminating linebreak, if present
std::string out = ss.str();
if ((out.length() > 0) && (out[out.length() - 1] == '\n'))
out = out.substr(0, out.length() - 1);
return out;
}
//! I don't have to explain what this is, do I?
static const std::vector<std::string> daynths = {
"first",
"second",
"third",
"fourth",
"fifth",
"sixth",
"seventh",
"eighth",
"ninth",
"tenth",
"eleventh",
"twelfth",
"thirteenth",
"fourteenth",
"fifteenth",
"sixteenth",
"seventeenth",
"eighteenth",
"nineteenth",
"twentieth",
"twentyfirst",
"twentysecond",
"twentythird",
"twentyfourth",
"twentyfifth",
"twentysixth",
"twentyseventh",
"twentyeighth",
"twentyninth",
"thirtieth",
"thirtyfirst"
};
int main() {
std::string weekday = Eval("date +'\%A'");
std::string month = Eval("date +'\%B'");
std::string year = spell(std::stoi(Eval("date +'\%Y'")));
std::string day = daynths[std::stoi(Eval("date +'\%d'")) - 1];
std::string hour = spell(std::stoi(Eval("date +'\%H'")));
std::string minute = spell(std::stoi(Eval("date +'\%M'")));
std::string seconds = spell(std::stoi(Eval("date +'\%S'")));
// Fix minutes being 0
if (minute == "zero")
minute = "o' clock";
std::stringstream ss;
ss << "It is "
<< weekday << ", the "
<< day << " of "
<< month << ", " << year << ". "
<< "It is "
<< hour << " " << minute
<< " and "
<< seconds << " seconds.";
std::cout << ss.str() << std::endl;
return 0;
}