This commit is contained in:
Ren Juan 2024-09-21 06:03:47 +00:00
parent e3895ab1a0
commit ed12148c37
242 changed files with 83174 additions and 0 deletions

BIN
src/._CMakeLists.txt Normal file

Binary file not shown.

484
src/AtomicFile.cpp Normal file
View File

@ -0,0 +1,484 @@
////////////////////////////////////////////////////////////////////////////////
//
// Copyright 2020 - 2023, Shaun Ruffell, Thomas Lauf.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
// https://www.opensource.org/licenses/mit-license.php
//
////////////////////////////////////////////////////////////////////////////////
#include <AtomicFile.h>
#include <FS.h>
#include <cassert>
#include <cerrno>
#include <csignal>
#include <cstdio>
#include <cstring>
#include <format.h>
#include <iostream>
#include <timew.h>
#include <unistd.h>
#include <vector>
struct AtomicFile::impl
{
using value_type = std::shared_ptr <AtomicFile::impl>;
// Since it should be relatively small, keep the atomic files in a vector
using atomic_files_t = std::vector <value_type>;
using iterator = atomic_files_t::iterator;
File temp_file;
File real_file;
// After the file is modified in any way, all operations should deal only with
// the temp file until finalization.
bool is_temp_active {false};
explicit impl (const Path& path);
~impl ();
std::string name () const;
const std::string& path () const;
bool exists () const;
bool open ();
void close ();
size_t size () const;
void truncate ();
void remove ();
void read (std::string& content);
void read (std::vector <std::string>& lines);
void append (const std::string& content);
void write_raw (const std::string& content);
void finalize ();
static atomic_files_t::iterator find (const std::string& path) = delete;
static atomic_files_t::iterator find (const Path& path);
// Static members
// If there is a problem writing to any of the temporary files, we do not want
// any of them to be copied over the "real" file.
static bool allow_atomics;
static atomic_files_t atomic_files;
};
AtomicFile::impl::atomic_files_t AtomicFile::impl::atomic_files {};
bool AtomicFile::impl::allow_atomics {true};
////////////////////////////////////////////////////////////////////////////////
AtomicFile::impl::impl (const Path& path)
{
static pid_t s_pid = ::getpid ();
static int s_count = 0;
std::stringstream str;
std::string real_path;
if (path.is_link ())
{
real_path = path.realpath ();
}
else
{
real_path = path._data;
}
str << real_path << '.' << s_pid << '-' << ++s_count << ".tmp";
temp_file = File (str.str ());
real_file = File (real_path);
}
////////////////////////////////////////////////////////////////////////////////
AtomicFile::impl::~impl ()
{
// Make sure we remove any temporary files if AtomicFile::finalize_all was
// never called. Typically, this will happen when there are exceptions.
try
{
std::remove (temp_file._data.c_str ());
}
catch (...)
{
}
}
////////////////////////////////////////////////////////////////////////////////
std::string AtomicFile::impl::name () const
{
return real_file.name ();
}
////////////////////////////////////////////////////////////////////////////////
const std::string& AtomicFile::impl::path () const
{
return real_file._data;
}
////////////////////////////////////////////////////////////////////////////////
bool AtomicFile::impl::exists () const
{
return real_file.exists ();
}
////////////////////////////////////////////////////////////////////////////////
bool AtomicFile::impl::open ()
{
assert (! temp_file._data.empty () && ! real_file._data.empty ());
return real_file.open ();
}
////////////////////////////////////////////////////////////////////////////////
void AtomicFile::impl::close ()
{
try
{
temp_file.close ();
real_file.close ();
}
catch (...)
{
allow_atomics = false;
throw;
}
}
////////////////////////////////////////////////////////////////////////////////
size_t AtomicFile::impl::size () const
{
struct stat s;
const char *filename = (is_temp_active) ? temp_file._data.c_str () : real_file._data.c_str ();
if (stat (filename, &s))
{
throw format ("stat error {1}: {2}", errno, strerror (errno));
}
return s.st_size;
}
////////////////////////////////////////////////////////////////////////////////
void AtomicFile::impl::truncate ()
{
try
{
temp_file.truncate ();
is_temp_active = true;
}
catch (...)
{
allow_atomics = false;
throw;
}
}
////////////////////////////////////////////////////////////////////////////////
void AtomicFile::impl::remove ()
{
try
{
temp_file.remove ();
is_temp_active = true;
}
catch (...)
{
allow_atomics = false;
throw;
}
}
////////////////////////////////////////////////////////////////////////////////
void AtomicFile::impl::read (std::string& content)
{
if (is_temp_active)
{
// Close the file before reading it in order to flush any buffers.
temp_file.close ();
}
return (is_temp_active) ? temp_file.read (content) :
real_file.read (content);
}
////////////////////////////////////////////////////////////////////////////////
void AtomicFile::impl::read (std::vector <std::string>& lines)
{
if (is_temp_active)
{
// Close the file before reading it in order to flush any buffers.
temp_file.close ();
}
return (is_temp_active) ? temp_file.read (lines) :
real_file.read (lines);
}
////////////////////////////////////////////////////////////////////////////////
void AtomicFile::impl::append (const std::string& content)
{
try
{
if (! is_temp_active)
{
is_temp_active = true;
if (real_file.exists () && ! File::copy (real_file, temp_file))
{
throw format ("Failed to copy '{1}' to '{2}'",
real_file.name (), temp_file.name ());
}
}
return temp_file.append (content);
}
catch (...)
{
allow_atomics = false;
throw;
}
}
////////////////////////////////////////////////////////////////////////////////
void AtomicFile::impl::write_raw (const std::string& content)
{
try
{
temp_file.write_raw (content);
is_temp_active = true;
}
catch (...)
{
allow_atomics = false;
throw;
}
}
////////////////////////////////////////////////////////////////////////////////
void AtomicFile::impl::finalize ()
{
if (is_temp_active && impl::allow_atomics)
{
if (temp_file.exists ())
{
debug (format ("Moving '{1}' -> '{2}'", temp_file._data, real_file._data));
if (std::rename (temp_file._data.c_str (), real_file._data.c_str ()))
{
throw format("Failed copying '{1}' to '{2}'. Database corruption possible.",
temp_file._data, real_file._data);
}
}
else
{
debug (format ("Removing '{1}'", real_file._data));
std::remove (real_file._data.c_str ());
}
is_temp_active = false;
}
}
////////////////////////////////////////////////////////////////////////////////
AtomicFile::AtomicFile (const Path& path)
{
auto end = impl::atomic_files.end ();
auto it = std::find_if (impl::atomic_files.begin (), end,
[&path] (const impl::value_type& p)
{
return p->real_file == path;
});
if (it == end)
{
pimpl = std::make_shared <impl> (path);
impl::atomic_files.push_back (pimpl);
}
else
{
pimpl = *it;
}
}
////////////////////////////////////////////////////////////////////////////////
AtomicFile::AtomicFile (std::string path) : AtomicFile (Path (path))
{
}
////////////////////////////////////////////////////////////////////////////////
AtomicFile::~AtomicFile()
{
try
{
pimpl->close ();
}
catch (...)
{
}
}
AtomicFile::AtomicFile (AtomicFile&&) = default;
AtomicFile& AtomicFile::operator= (AtomicFile&&) = default;
////////////////////////////////////////////////////////////////////////////////
const std::string& AtomicFile::path () const
{
return pimpl->path ();
}
////////////////////////////////////////////////////////////////////////////////
std::string AtomicFile::name () const
{
return pimpl->name ();
}
////////////////////////////////////////////////////////////////////////////////
bool AtomicFile::exists () const
{
return pimpl->exists ();
}
////////////////////////////////////////////////////////////////////////////////
bool AtomicFile::open ()
{
return pimpl->open ();
}
////////////////////////////////////////////////////////////////////////////////
void AtomicFile::close ()
{
pimpl->close ();
}
////////////////////////////////////////////////////////////////////////////////
size_t AtomicFile::size () const
{
return pimpl->size ();
}
////////////////////////////////////////////////////////////////////////////////
void AtomicFile::truncate ()
{
pimpl->truncate ();
}
////////////////////////////////////////////////////////////////////////////////
void AtomicFile::remove ()
{
pimpl->remove ();
}
////////////////////////////////////////////////////////////////////////////////
void AtomicFile::read (std::string& content)
{
pimpl->read (content);
}
////////////////////////////////////////////////////////////////////////////////
void AtomicFile::read (std::vector <std::string>& lines)
{
pimpl->read (lines);
}
////////////////////////////////////////////////////////////////////////////////
void AtomicFile::append (const std::string& content)
{
pimpl->append (content);
}
////////////////////////////////////////////////////////////////////////////////
void AtomicFile::write_raw (const std::string& content)
{
pimpl->write_raw (content);
}
////////////////////////////////////////////////////////////////////////////////
void AtomicFile::write (const Path& path, const std::string& data)
{
AtomicFile file (path);
file.truncate ();
file.write_raw (data);
}
////////////////////////////////////////////////////////////////////////////////
void AtomicFile::write (const Path& path, const std::vector <std::string>& lines)
{
AtomicFile file (path);
file.truncate ();
for (const auto& line : lines)
{
file.append (line + '\n');
}
}
////////////////////////////////////////////////////////////////////////////////
void AtomicFile::read (const Path& path, std::string& content)
{
AtomicFile (path).read (content);
}
void AtomicFile::read (const Path& path, std::vector <std::string>& lines)
{
AtomicFile (path).read (lines);
}
////////////////////////////////////////////////////////////////////////////////
// finalize_all - Close / Flush all temporary files and rename to final.
void AtomicFile::finalize_all ()
{
if (! impl::allow_atomics)
{
throw std::string {"Unable to update database."};
}
// Step 1: Close / Flush all the atomic files that may still be open. If any
// of the files fail this step (close () will throw) then we do not want to
// move on to step 2
for (auto& file : impl::atomic_files)
{
file->close ();
}
sigset_t new_mask;
sigset_t old_mask;
sigfillset (&new_mask);
// Step 2: Rename the temp files to the *real* file
sigprocmask (SIG_SETMASK, &new_mask, &old_mask);
for (auto& file : impl::atomic_files)
{
file->finalize ();
}
sigprocmask (SIG_SETMASK, &old_mask, nullptr);
// Step 3: Cleanup any references
impl::atomic_files_t new_atomic_files;
for (auto& file : impl::atomic_files)
{
// Delete entry if we are holding the last reference
if (file.use_count () > 1)
{
new_atomic_files.push_back(file);
}
}
new_atomic_files.swap(impl::atomic_files);
}
////////////////////////////////////////////////////////////////////////////////
// reset - Removes all current atomic files from finalization
void AtomicFile::reset ()
{
impl::atomic_files.clear ();
impl::allow_atomics = true;
}

75
src/AtomicFile.h Normal file
View File

@ -0,0 +1,75 @@
////////////////////////////////////////////////////////////////////////////////
//
// Copyright 2020 - 2022, Shaun Ruffell, Thomas Lauf.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
// https://www.opensource.org/licenses/mit-license.php
//
////////////////////////////////////////////////////////////////////////////////
#ifndef INCLUDED_ATOMICFILE
#define INCLUDED_ATOMICFILE
#include <memory>
#include <vector>
class Path;
class AtomicFile
{
public:
explicit AtomicFile (const Path& path);
explicit AtomicFile (std::string path);
AtomicFile (const AtomicFile&) = delete;
AtomicFile (AtomicFile&&);
AtomicFile& operator= (const AtomicFile&) = delete;
AtomicFile& operator= (AtomicFile&&);
~AtomicFile ();
std::string name () const;
const std::string& path () const;
bool exists () const;
bool open ();
void close ();
void remove ();
void truncate ();
size_t size () const;
void read (std::string& content);
void read (std::vector <std::string>& lines);
void append (const std::string& content);
void write_raw (const std::string& content);
static void append (const Path& path, const std::string& data);
static void write (const Path& path, const std::string& data);
static void write (const Path& path, const std::vector <std::string>& lines);
static void read (const Path& path, std::string& content);
static void read (const Path& path, std::vector <std::string>& lines);
static void finalize_all ();
static void reset ();
private:
struct impl;
std::shared_ptr <impl> pimpl;
};
#endif // INCLUDED_ATOMICFILE

855
src/CLI.cpp Normal file
View File

@ -0,0 +1,855 @@
////////////////////////////////////////////////////////////////////////////////
//
// Copyright 2016 - 2023, Thomas Lauf, Paul Beckingham, Federico Hernandez.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
// https://www.opensource.org/licenses/mit-license.php
//
////////////////////////////////////////////////////////////////////////////////
#include <CLI.h>
#include <Color.h>
#include <DatetimeParser.h>
#include <Duration.h>
#include <Pig.h>
#include <algorithm>
#include <format.h>
#include <set>
#include <shared.h>
#include <sstream>
#include <timew.h>
#include <utf8.h>
////////////////////////////////////////////////////////////////////////////////
A2::A2 (const std::string& raw, Lexer::Type lextype)
{
_lextype = lextype;
attribute ("raw", raw);
}
////////////////////////////////////////////////////////////////////////////////
bool A2::hasTag (const std::string& tag) const
{
return std::find (_tags.begin (), _tags.end (), tag) != _tags.end ();
}
////////////////////////////////////////////////////////////////////////////////
void A2::tag (const std::string& tag)
{
if (! hasTag (tag))
_tags.push_back (tag);
}
////////////////////////////////////////////////////////////////////////////////
void A2::unTag (const std::string& tag)
{
for (auto i = _tags.begin (); i != _tags.end (); ++i)
{
if (*i == tag)
{
_tags.erase (i);
break;
}
}
}
////////////////////////////////////////////////////////////////////////////////
// Accessor for attributes.
void A2::attribute (const std::string& name, const std::string& value)
{
_attributes[name] = value;
}
////////////////////////////////////////////////////////////////////////////////
// Accessor for attributes.
void A2::attribute (const std::string& name, int value)
{
_attributes[name] = format ("{1}", value);
}
////////////////////////////////////////////////////////////////////////////////
// Accessor for attributes.
std::string A2::attribute (const std::string& name) const
{
// Prevent autovivification.
auto i = _attributes.find (name);
if (i != _attributes.end ())
return i->second;
return "";
}
////////////////////////////////////////////////////////////////////////////////
std::string A2::getToken () const
{
auto i = _attributes.find ("canonical");
if (i == _attributes.end ())
i = _attributes.find ("raw");
return i->second;
}
////////////////////////////////////////////////////////////////////////////////
std::string A2::dump () const
{
auto output = Lexer::typeToString (_lextype);
// Dump attributes.
std::string atts;
for (auto& a : _attributes)
atts += a.first + "='\033[33m" + a.second + "\033[0m' ";
// Dump tags.
std::string tags;
for (const auto& tag : _tags)
{
if (tag == "BINARY") tags += "\033[1;37;44m" + tag + "\033[0m ";
else if (tag == "CMD") tags += "\033[1;37;46m" + tag + "\033[0m ";
else if (tag == "EXT") tags += "\033[1;37;42m" + tag + "\033[0m ";
else if (tag == "HINT") tags += "\033[1;37;43m" + tag + "\033[0m ";
else if (tag == "FILTER") tags += "\033[1;37;45m" + tag + "\033[0m ";
else if (tag == "CONFIG") tags += "\033[1;37;101m" + tag + "\033[0m ";
else if (tag == "ID") tags += "\033[38;5;7m\033[48;5;34m" + tag + "\033[0m ";
else tags += "\033[32m" + tag + "\033[0m ";
}
return output + " " + atts + tags;
}
////////////////////////////////////////////////////////////////////////////////
void CLI::entity (const std::string& category, const std::string& name)
{
// Walk the list of entities for category.
auto c = _entities.equal_range (category);
for (auto e = c.first; e != c.second; ++e)
if (e->second == name)
return;
// The category/name pair was not found, therefore add it.
_entities.insert (std::pair <std::string, std::string> (category, name));
}
////////////////////////////////////////////////////////////////////////////////
// Capture a single argument.
void CLI::add (const std::string& argument)
{
// Sanitize the input: Convert control charts to spaces. Then trim.
std::string clean;
std::string::size_type i = 0;
int character;
while ((character = utf8_next_char (argument.c_str (), i)))
{
if (character <= 32)
clean += ' ';
else
clean += utf8_character (character);
}
A2 arg (Lexer::trim (clean), Lexer::Type::word);
arg.tag ("ORIGINAL");
_original_args.push_back (arg);
// Adding a new argument invalidates prior analysis.
_args.clear ();
}
////////////////////////////////////////////////////////////////////////////////
// Arg0 is the first argument, which is the name and potentially a relative or
// absolute path to the invoked binary.
//
// The binary name is 'timew', but if the binary is reported as 'foo' then it
// was invoked via symbolic link, in which case capture the first argument as
// 'foo'. This should allow any command/extension to do this.
//
void CLI::handleArg0 ()
{
// Capture arg0 separately, because it is the command that was run, and could
// need special handling.
auto raw = _original_args[0].attribute ("raw");
A2 a (raw, Lexer::Type::word);
a.tag ("BINARY");
std::string basename = "timew";
auto slash = raw.rfind ('/');
if (slash != std::string::npos)
basename = raw.substr (slash + 1);
a.attribute ("basename", basename);
if (basename != "timew")
{
A2 cal (basename, Lexer::Type::word);
_args.push_back (cal);
}
_args.push_back (a);
}
////////////////////////////////////////////////////////////////////////////////
// All arguments must be individually and wholly recognized by the Lexer. Any
// argument not recognized is considered a Lexer::Type::word.
void CLI::lexArguments ()
{
// Note: Starts iterating at index 1, because ::handleArg0 has already
// processed 0.
for (unsigned int i = 1; i < _original_args.size (); ++i)
{
bool quoted = Lexer::wasQuoted (_original_args[i].attribute ("raw"));
std::string lexeme;
Lexer::Type type;
Lexer lex (_original_args[i].attribute ("raw"));
if (lex.token (lexeme, type) &&
lex.isEOS ())
{
A2 a (_original_args[i].attribute ("raw"), type);
if (quoted)
a.tag ("QUOTED");
if (_original_args[i].hasTag ("ORIGINAL"))
a.tag ("ORIGINAL");
_args.push_back (a);
}
else
{
std::string quote = "'";
auto escaped = str_replace (_original_args[i].attribute ("raw"), quote, "\\'");
std::string::size_type cursor = 0;
std::string word;
if (Lexer::readWord (quote + escaped + quote, quote, cursor, word))
{
A2 unknown (Lexer::dequote (word), Lexer::Type::word);
if (Lexer::wasQuoted (_original_args[i].attribute ("raw")))
unknown.tag ("QUOTED");
if (_original_args[i].hasTag ("ORIGINAL"))
unknown.tag ("ORIGINAL");
_args.push_back (unknown);
}
// This branch may have no use-case.
else
{
A2 unknown (Lexer::dequote (_original_args[i].attribute ("raw")), Lexer::Type::word);
unknown.tag ("UNKNOWN");
if (Lexer::wasQuoted (_original_args[i].attribute ("raw")))
unknown.tag ("QUOTED");
if (_original_args[i].hasTag ("ORIGINAL"))
unknown.tag ("ORIGINAL");
_args.push_back (unknown);
}
}
}
}
////////////////////////////////////////////////////////////////////////////////
// Intended to be called after ::add() to perform the final analysis.
void CLI::analyze ()
{
// Process _original_args.
_args.clear ();
handleArg0 ();
lexArguments ();
identifyOverrides ();
identifyIds ();
canonicalizeNames ();
identifyFilter ();
}
////////////////////////////////////////////////////////////////////////////////
// Return all the unknown args.
std::vector <std::string> CLI::getWords () const
{
std::vector <std::string> words;
for (const auto& a : _args)
if (! a.hasTag ("BINARY") &&
! a.hasTag ("CMD") &&
! a.hasTag ("CONFIG") &&
! a.hasTag ("HINT"))
words.push_back (a.attribute ("raw"));
return words;
}
////////////////////////////////////////////////////////////////////////////////
// Search for 'value' in _entities category, return canonicalized value.
bool CLI::canonicalize (
std::string& canonicalized,
const std::string& category,
const std::string& value) const
{
// Extract a list of entities for category.
std::vector <std::string> options;
auto c = _entities.equal_range (category);
for (auto e = c.first; e != c.second; ++e)
{
// Shortcut: if an exact match is found, success.
if (value == e->second)
{
canonicalized = value;
return true;
}
options.push_back (e->second);
}
// Match against the options, throw away results.
std::vector <std::string> matches;
if (autoComplete (value, options, matches) == 1)
{
canonicalized = matches[0];
return true;
}
return false;
}
////////////////////////////////////////////////////////////////////////////////
std::string CLI::getBinary () const
{
if (! _args.empty ())
return _args[0].attribute ("raw");
return "";
}
////////////////////////////////////////////////////////////////////////////////
std::string CLI::getCommand () const
{
for (const auto& a : _args)
if (a.hasTag ("CMD"))
return a.attribute ("canonical");
for (const auto& a : _args)
if (a.hasTag ("EXT"))
return a.attribute ("canonical");
return "";
}
////////////////////////////////////////////////////////////////////////////////
std::string CLI::dump (const std::string& title) const
{
std::stringstream out;
out << "\033[1m" << title << "\033[0m\n"
<< " _original_args\n ";
Color colorArgs ("gray10 on gray4");
for (auto i = _original_args.begin (); i != _original_args.end (); ++i)
{
if (i != _original_args.begin ())
out << ' ';
out << colorArgs.colorize (i->attribute ("raw"));
}
out << '\n';
if (! _args.empty ())
{
out << " _args\n";
for (auto& a : _args)
out << " " << a.dump () << '\n';
}
return out.str ();
}
////////////////////////////////////////////////////////////////////////////////
// Scan all arguments and identify instances of 'rc.<name>[:=]<value>'.
void CLI::identifyOverrides ()
{
for (auto& a : _args)
{
auto raw = a.attribute ("raw");
if (raw.length () > 3 &&
raw.substr (0, 3) == "rc.")
{
auto sep = raw.find ('=', 3);
if (sep == std::string::npos)
sep = raw.find (':', 3);
if (sep != std::string::npos)
{
a.tag ("CONFIG");
a.attribute ("name", raw.substr (3, sep - 3));
a.attribute ("value", raw.substr (sep + 1));
}
}
}
}
////////////////////////////////////////////////////////////////////////////////
// Scan all arguments and identify instances of '@<integer>'.
void CLI::identifyIds ()
{
for (auto& a : _args)
{
if (a._lextype == Lexer::Type::word)
{
Pig pig (a.attribute ("raw"));
int digits;
if (pig.skipLiteral ("@") &&
pig.getDigits (digits) &&
pig.eos ())
{
if (digits <= 0)
throw format ("'@{1}' is not a valid ID.", digits);
a.tag ("ID");
a.attribute ("value", digits);
}
}
}
}
////////////////////////////////////////////////////////////////////////////////
// Scan all arguments and canonicalize names that need it.
void CLI::canonicalizeNames ()
{
bool alreadyFoundCmd = false;
for (auto& a : _args)
{
auto raw = a.attribute ("raw");
std::string canonical = raw;
// Commands.
if (! alreadyFoundCmd &&
(exactMatch ("command", raw) ||
canonicalize (canonical, "command", raw)))
{
a.attribute ("canonical", canonical);
a.tag ("CMD");
alreadyFoundCmd = true;
}
// 'timew <command> --help|-h' should be treated the same as 'timew help <command>'.
// Therefore, '--help|-h' on the command line should always become the command.
else if (alreadyFoundCmd && (raw == "--help" || raw == "-h"))
{
for (auto& b : _args) {
if (b.hasTag ("CMD"))
{
b.unTag ("CMD");
break;
}
}
a.tag ("CMD");
a.attribute ("canonical", canonical);
}
// Hints.
else if (exactMatch ("hint", raw) ||
canonicalize (canonical, "hint", raw))
{
a.attribute ("canonical", canonical);
a.tag ("HINT");
}
// Extensions.
else if (exactMatch ("extension", raw) ||
canonicalize (canonical, "extension", raw))
{
a.attribute ("canonical", canonical);
a.tag ("EXT");
alreadyFoundCmd = true;
}
}
}
////////////////////////////////////////////////////////////////////////////////
// Locate arguments that are part of a filter.
void CLI::identifyFilter ()
{
for (auto& a : _args)
{
if (a.hasTag ("CMD") ||
a.hasTag ("EXT") ||
a.hasTag ("CONFIG") ||
a.hasTag ("BINARY"))
continue;
auto raw = a.attribute ("raw");
if (a.hasTag ("HINT"))
a.tag ("FILTER");
else if (a.hasTag ("ID"))
a.tag ("FILTER");
else if (a._lextype == Lexer::Type::date ||
a._lextype == Lexer::Type::duration)
{
a.tag ("FILTER");
}
else if (raw == "from" ||
raw == "since" ||
raw == "to" ||
raw == "for" ||
raw == "until" ||
raw == "-" ||
raw == "before" ||
raw == "after" ||
raw == "ago")
{
a.tag ("FILTER");
a.tag ("KEYWORD");
}
else if (raw.rfind ("dom.",0) == 0)
{
a.tag ("DOM");
}
else
{
a.tag ("FILTER");
a.tag ("TAG");
}
}
}
////////////////////////////////////////////////////////////////////////////////
// Search for exact 'value' in _entities category.
bool CLI::exactMatch (
const std::string& category,
const std::string& value) const
{
// Extract a list of entities for category.
auto c = _entities.equal_range (category);
for (auto e = c.first; e != c.second; ++e)
if (value == e->second)
return true;
return false;
}
////////////////////////////////////////////////////////////////////////////////
std::set <int> CLI::getIds () const
{
std::set <int> ids;
for (auto& arg : _args)
{
if (arg.hasTag ("ID"))
ids.insert (strtol (arg.attribute ("value").c_str (), nullptr, 10));
}
return ids;
}
////////////////////////////////////////////////////////////////////////////////
std::set <std::string> CLI::getTags () const
{
std::set <std::string> tags;
for (auto& arg : _args)
{
if (arg.hasTag ("TAG"))
tags.insert (arg.attribute ("raw"));
}
return tags;
}
////////////////////////////////////////////////////////////////////////////////
std::string CLI::getAnnotation () const
{
std::string annotation;
for (auto& arg : _args)
{
if (arg.hasTag ("TAG"))
{
annotation = (arg.attribute ("raw"));
}
}
return annotation;
}
////////////////////////////////////////////////////////////////////////////////
Duration CLI::getDuration () const
{
std::string delta;
for (auto& arg : _args)
{
if (arg.hasTag ("FILTER") &&
arg._lextype == Lexer::Type::duration)
{
delta = arg.attribute ("raw");
}
}
Duration dur (delta);
return dur;
}
////////////////////////////////////////////////////////////////////////////////
std::vector <std::string> CLI::getDomReferences () const
{
std::vector <std::string> references;
for (auto& arg : _args)
{
if (arg.hasTag ("DOM"))
{
references.emplace_back (arg.attribute ("raw"));
}
}
return references;
}
////////////////////////////////////////////////////////////////////////////////
//
// Supported range forms:
// ["from"] <date> ["to"|"-" <date>]
// ["from"] <date> "for" <duration>
// <duration> ["before"|"after" <date>]
// <duration> "ago"
//
Range CLI::getRange (const Range& default_range) const
{
Datetime now;
Range the_range;
std::string start;
std::string end;
std::string duration;
std::vector <std::string> args;
for (auto& arg : _args)
{
if (arg.hasTag ("BINARY") ||
arg.hasTag ("CMD") ||
arg.hasTag ("EXT"))
continue;
if (arg.hasTag ("FILTER"))
{
auto canonical = arg.attribute ("canonical");
auto raw = arg.attribute ("raw");
if (arg.hasTag ("HINT"))
{
Range range;
if (expandIntervalHint (canonical, range))
{
if (range.is_empty ())
{
args.emplace_back ("<all>");
}
else
{
start = range.start.toISO ();
end = range.end.toISO ();
args.emplace_back ("<date>");
args.emplace_back ("-");
args.emplace_back ("<date>");
}
}
// Hints that are not expandable to a date range are ignored.
}
else if (arg._lextype == Lexer::Type::date)
{
if (start.empty ())
start = raw;
else if (end.empty ())
end = raw;
args.emplace_back ("<date>");
}
else if (arg._lextype == Lexer::Type::duration)
{
if (duration.empty ())
duration = raw;
args.emplace_back ("<duration>");
}
else if (arg.hasTag ("KEYWORD"))
{
// Note: that KEYWORDS are not entities (why not?) and there is a list
// in CLI.cpp of them that must be maintained and synced with this
// function.
args.push_back (raw);
}
}
}
if (args.empty ())
{
the_range = default_range;
}
// <date>
else if (args.size () == 1 &&
args[0] == "<date>")
{
DatetimeParser dtp;
Range range = dtp.parse_range (start);
the_range = Range (range);
}
// from <date>
else if (args.size () == 2 &&
args[0] == "from" &&
args[1] == "<date>")
{
the_range = Range {Datetime (start), 0};
}
// <date> to/- <date>
else if (args.size () == 3 &&
args[0] == "<date>" &&
(args[1] == "to" || args[1] == "-") &&
args[2] == "<date>")
{
the_range = Range {Datetime (start), Datetime (end)};
}
// from <date> to/- <date>
else if (args.size () == 4 &&
args[0] == "from" &&
args[1] == "<date>" &&
(args[2] == "to" || args[2] == "-") &&
args[3] == "<date>")
{
the_range = Range {Datetime (start), Datetime (end)};
}
// <date> for <duration>
else if (args.size () == 3 &&
args[0] == "<date>" &&
args[1] == "for" &&
args[2] == "<duration>")
{
the_range = Range {Datetime (start), Datetime (start) + Duration (duration).toTime_t ()};
}
// from <date> for <duration>
else if (args.size () == 4 &&
args[0] == "from" &&
args[1] == "<date>" &&
args[2] == "for" &&
args[3] == "<duration>")
{
the_range = Range {Datetime (start), Datetime (start) + Duration (duration).toTime_t ()};
}
// <duration> before <date>
else if (args.size () == 3 &&
args[0] == "<duration>" &&
args[1] == "before" &&
args[2] == "<date>")
{
the_range = Range {Datetime (start) - Duration (duration).toTime_t (), Datetime (start)};
}
// <duration> after <date>
else if (args.size () == 3 &&
args[0] == "<duration>" &&
args[1] == "after" &&
args[2] == "<date>")
{
the_range = Range {Datetime (start), Datetime (start) + Duration (duration).toTime_t ()};
}
// <duration> ago
else if (args.size () == 2 &&
args[0] == "<duration>" &&
args[1] == "ago")
{
the_range = Range {now - Duration (duration).toTime_t (), 0};
}
// for <duration>
else if (args.size () == 2 &&
args[0] == "for" &&
args[1] == "<duration>")
{
the_range = Range {now - Duration (duration).toTime_t (), now};
}
// <duration>
else if (args.size () == 1 &&
args[0] == "<duration>")
{
the_range = Range {now - Duration (duration).toTime_t (), now};
}
// :all
else if (args.size () == 1 && args[0] == "<all>")
{
the_range = Range (0, 0);
}
// Unrecognized date range construct.
else if (! args.empty ())
{
throw std::string ("Unrecognized date range: '") + join (" ", args) + "'.";
}
if (the_range.end != 0 && the_range.start > the_range.end)
{
throw std::string ("The end of a date range must be after the start.");
}
return the_range;
}
////////////////////////////////////////////////////////////////////////////////
bool CLI::findHint (const std::string& hint) const
{
for (auto& arg : _args)
{
if (arg.hasTag ("HINT") &&
arg.getToken () == ":" + hint)
{
return true;
}
}
return false;
}
////////////////////////////////////////////////////////////////////////////////
bool CLI::getComplementaryHint (const std::string& base, const bool default_value) const
{
if (findHint (base))
{
return true;
}
else if (findHint ("no-" + base))
{
return false;
}
return default_value;
}
////////////////////////////////////////////////////////////////////////////////
bool CLI::getHint (const std::string& base, const bool default_value) const
{
if (findHint (base))
{
return true;
}
return default_value;
}

97
src/CLI.h Normal file
View File

@ -0,0 +1,97 @@
////////////////////////////////////////////////////////////////////////////////
//
// Copyright 2016 - 2023, Thomas Lauf, Paul Beckingham, Federico Hernandez.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
// https://www.opensource.org/licenses/mit-license.php
//
////////////////////////////////////////////////////////////////////////////////
#ifndef INCLUDED_CLI
#define INCLUDED_CLI
#include <Duration.h>
#include <Interval.h>
#include <Lexer.h>
#include <map>
#include <set>
#include <string>
#include <vector>
// Represents a single argument.
class A2
{
public:
A2 (const std::string&, Lexer::Type);
bool hasTag (const std::string&) const;
void tag (const std::string&);
void unTag (const std::string&);
void attribute (const std::string&, const std::string&);
void attribute (const std::string&, int);
std::string attribute (const std::string&) const;
std::string getToken () const;
std::string dump () const;
public:
Lexer::Type _lextype {Lexer::Type::word};
std::vector <std::string> _tags {};
std::map <std::string, std::string> _attributes {};
};
// Represents the command line.
class CLI
{
public:
CLI () = default;
void entity (const std::string&, const std::string&);
void add (const std::string&);
void analyze ();
std::vector <std::string> getWords () const;
bool canonicalize (std::string&, const std::string&, const std::string&) const;
std::string getBinary () const;
std::string getCommand () const;
bool getComplementaryHint (const std::string&, bool) const;
bool getHint(const std::string&, bool) const;
std::set <int> getIds () const;
std::set <std::string> getTags () const;
std::string getAnnotation() const;
Duration getDuration() const;
std::vector <std::string> getDomReferences () const;
Range getRange (const Range& default_range = {0, 0}) const;
std::string dump (const std::string& title = "CLI Parser") const;
private:
void handleArg0 ();
void lexArguments ();
void identifyOverrides ();
void identifyIds ();
void canonicalizeNames ();
void identifyFilter ();
bool exactMatch (const std::string&, const std::string&) const;
bool findHint (const std::string&) const;
public:
std::multimap <std::string, std::string> _entities {};
std::vector <A2> _original_args {};
std::vector <A2> _args {};
};
#endif

View File

@ -0,0 +1,16 @@
# CMAKE generated file: DO NOT EDIT!
# Generated by "Unix Makefiles" Generator, CMake Version 3.23
# Relative path conversion top directories.
set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/home/jdaugherty/work/pkgs/taskw/timew-1.7.1")
set(CMAKE_RELATIVE_PATH_TOP_BINARY "/home/jdaugherty/work/pkgs/taskw/timew-1.7.1")
# Force unix paths in dependencies.
set(CMAKE_FORCE_UNIX_PATHS 1)
# The C and CXX include file regular expressions for this directory.
set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$")
set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$")
set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN})
set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN})

View File

@ -0,0 +1,21 @@
# Consider dependencies only in project.
set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF)
# The set of languages for which implicit dependencies are needed:
set(CMAKE_DEPENDS_LANGUAGES
)
# The set of dependency files which are needed:
set(CMAKE_DEPENDS_DEPENDENCY_FILES
"/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/lex.cpp" "src/CMakeFiles/lex_executable.dir/lex.cpp.o" "gcc" "src/CMakeFiles/lex_executable.dir/lex.cpp.o.d"
)
# Targets to which this target links.
set(CMAKE_TARGET_LINKED_INFO_FILES
"/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/CMakeFiles/timew.dir/DependInfo.cmake"
"/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/CMakeFiles/libshared.dir/DependInfo.cmake"
)
# Fortran module output directory.
set(CMAKE_Fortran_TARGET_MODULE_DIR "")

View File

@ -0,0 +1,112 @@
# CMAKE generated file: DO NOT EDIT!
# Generated by "Unix Makefiles" Generator, CMake Version 3.23
# Delete rule output on recipe failure.
.DELETE_ON_ERROR:
#=============================================================================
# Special targets provided by cmake.
# Disable implicit rules so canonical targets will work.
.SUFFIXES:
# Disable VCS-based implicit rules.
% : %,v
# Disable VCS-based implicit rules.
% : RCS/%
# Disable VCS-based implicit rules.
% : RCS/%,v
# Disable VCS-based implicit rules.
% : SCCS/s.%
# Disable VCS-based implicit rules.
% : s.%
.SUFFIXES: .hpux_make_needs_suffix_list
# Command-line flag to silence nested $(MAKE).
$(VERBOSE)MAKESILENT = -s
#Suppress display of executed commands.
$(VERBOSE).SILENT:
# A target that is always out of date.
cmake_force:
.PHONY : cmake_force
#=============================================================================
# Set environment variables for the build.
# The shell in which to execute make rules.
SHELL = /bin/sh
# The CMake executable.
CMAKE_COMMAND = /usr/local/bin/cmake
# The command to remove a file.
RM = /usr/local/bin/cmake -E rm -f
# Escaping for special characters.
EQUALS = =
# The top-level source directory on which CMake was run.
CMAKE_SOURCE_DIR = /home/jdaugherty/work/pkgs/taskw/timew-1.7.1
# The top-level build directory on which CMake was run.
CMAKE_BINARY_DIR = /home/jdaugherty/work/pkgs/taskw/timew-1.7.1
# Include any dependencies generated for this target.
include src/CMakeFiles/lex_executable.dir/depend.make
# Include any dependencies generated by the compiler for this target.
include src/CMakeFiles/lex_executable.dir/compiler_depend.make
# Include the progress variables for this target.
include src/CMakeFiles/lex_executable.dir/progress.make
# Include the compile flags for this target's objects.
include src/CMakeFiles/lex_executable.dir/flags.make
src/CMakeFiles/lex_executable.dir/lex.cpp.o: src/CMakeFiles/lex_executable.dir/flags.make
src/CMakeFiles/lex_executable.dir/lex.cpp.o: src/lex.cpp
src/CMakeFiles/lex_executable.dir/lex.cpp.o: src/CMakeFiles/lex_executable.dir/compiler_depend.ts
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Building CXX object src/CMakeFiles/lex_executable.dir/lex.cpp.o"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT src/CMakeFiles/lex_executable.dir/lex.cpp.o -MF CMakeFiles/lex_executable.dir/lex.cpp.o.d -o CMakeFiles/lex_executable.dir/lex.cpp.o -c /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/lex.cpp
src/CMakeFiles/lex_executable.dir/lex.cpp.i: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/lex_executable.dir/lex.cpp.i"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/lex.cpp > CMakeFiles/lex_executable.dir/lex.cpp.i
src/CMakeFiles/lex_executable.dir/lex.cpp.s: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/lex_executable.dir/lex.cpp.s"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/lex.cpp -o CMakeFiles/lex_executable.dir/lex.cpp.s
# Object files for target lex_executable
lex_executable_OBJECTS = \
"CMakeFiles/lex_executable.dir/lex.cpp.o"
# External object files for target lex_executable
lex_executable_EXTERNAL_OBJECTS =
src/lex: src/CMakeFiles/lex_executable.dir/lex.cpp.o
src/lex: src/CMakeFiles/lex_executable.dir/build.make
src/lex: src/libtimew.a
src/lex: src/liblibshared.a
src/lex: src/CMakeFiles/lex_executable.dir/link.txt
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --bold --progress-dir=/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/CMakeFiles --progress-num=$(CMAKE_PROGRESS_2) "Linking CXX executable lex"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/lex_executable.dir/link.txt --verbose=$(VERBOSE)
# Rule to build all files generated by this target.
src/CMakeFiles/lex_executable.dir/build: src/lex
.PHONY : src/CMakeFiles/lex_executable.dir/build
src/CMakeFiles/lex_executable.dir/clean:
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && $(CMAKE_COMMAND) -P CMakeFiles/lex_executable.dir/cmake_clean.cmake
.PHONY : src/CMakeFiles/lex_executable.dir/clean
src/CMakeFiles/lex_executable.dir/depend:
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1 && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/jdaugherty/work/pkgs/taskw/timew-1.7.1 /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src /home/jdaugherty/work/pkgs/taskw/timew-1.7.1 /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/CMakeFiles/lex_executable.dir/DependInfo.cmake --color=$(COLOR)
.PHONY : src/CMakeFiles/lex_executable.dir/depend

View File

@ -0,0 +1,11 @@
file(REMOVE_RECURSE
"CMakeFiles/lex_executable.dir/lex.cpp.o"
"CMakeFiles/lex_executable.dir/lex.cpp.o.d"
"lex"
"lex.pdb"
)
# Per-language clean rules from dependency scanning.
foreach(lang CXX)
include(CMakeFiles/lex_executable.dir/cmake_clean_${lang}.cmake OPTIONAL)
endforeach()

View File

@ -0,0 +1,195 @@
# CMAKE generated file: DO NOT EDIT!
# Generated by "Unix Makefiles" Generator, CMake Version 3.23
src/CMakeFiles/lex_executable.dir/lex.cpp.o
/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/lex.cpp
/usr/include/stdc-predef.h
/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src/Lexer.h
/usr/include/c++/8/cstddef
/usr/include/x86_64-linux-gnu/c++/8/bits/c++config.h
/usr/include/x86_64-linux-gnu/c++/8/bits/os_defines.h
/usr/include/features.h
/usr/include/x86_64-linux-gnu/sys/cdefs.h
/usr/include/x86_64-linux-gnu/bits/wordsize.h
/usr/include/x86_64-linux-gnu/bits/long-double.h
/usr/include/x86_64-linux-gnu/gnu/stubs.h
/usr/include/x86_64-linux-gnu/gnu/stubs-64.h
/usr/include/x86_64-linux-gnu/c++/8/bits/cpu_defines.h
/usr/lib/gcc/x86_64-linux-gnu/8/include/stddef.h
/usr/include/c++/8/map
/usr/include/c++/8/bits/stl_tree.h
/usr/include/c++/8/bits/stl_algobase.h
/usr/include/c++/8/bits/functexcept.h
/usr/include/c++/8/bits/exception_defines.h
/usr/include/c++/8/bits/cpp_type_traits.h
/usr/include/c++/8/ext/type_traits.h
/usr/include/c++/8/ext/numeric_traits.h
/usr/include/c++/8/bits/stl_pair.h
/usr/include/c++/8/bits/move.h
/usr/include/c++/8/bits/concept_check.h
/usr/include/c++/8/type_traits
/usr/include/c++/8/bits/stl_iterator_base_types.h
/usr/include/c++/8/bits/stl_iterator_base_funcs.h
/usr/include/c++/8/debug/assertions.h
/usr/include/c++/8/bits/stl_iterator.h
/usr/include/c++/8/bits/ptr_traits.h
/usr/include/c++/8/debug/debug.h
/usr/include/c++/8/bits/predefined_ops.h
/usr/include/c++/8/bits/allocator.h
/usr/include/x86_64-linux-gnu/c++/8/bits/c++allocator.h
/usr/include/c++/8/ext/new_allocator.h
/usr/include/c++/8/new
/usr/include/c++/8/exception
/usr/include/c++/8/bits/exception.h
/usr/include/c++/8/bits/exception_ptr.h
/usr/include/c++/8/bits/cxxabi_init_exception.h
/usr/include/c++/8/typeinfo
/usr/include/c++/8/bits/hash_bytes.h
/usr/include/c++/8/bits/nested_exception.h
/usr/include/c++/8/bits/memoryfwd.h
/usr/include/c++/8/bits/stl_function.h
/usr/include/c++/8/backward/binders.h
/usr/include/c++/8/ext/alloc_traits.h
/usr/include/c++/8/bits/alloc_traits.h
/usr/include/c++/8/ext/aligned_buffer.h
/usr/include/c++/8/bits/node_handle.h
/usr/include/c++/8/optional
/usr/include/c++/8/utility
/usr/include/c++/8/bits/stl_relops.h
/usr/include/c++/8/initializer_list
/usr/include/c++/8/stdexcept
/usr/include/c++/8/string
/usr/include/c++/8/bits/stringfwd.h
/usr/include/c++/8/bits/char_traits.h
/usr/include/c++/8/bits/postypes.h
/usr/include/c++/8/cwchar
/usr/include/wchar.h
/usr/include/x86_64-linux-gnu/bits/libc-header-start.h
/usr/include/x86_64-linux-gnu/bits/floatn.h
/usr/include/x86_64-linux-gnu/bits/floatn-common.h
/usr/lib/gcc/x86_64-linux-gnu/8/include/stdarg.h
/usr/include/x86_64-linux-gnu/bits/wchar.h
/usr/include/x86_64-linux-gnu/bits/types/wint_t.h
/usr/include/x86_64-linux-gnu/bits/types/mbstate_t.h
/usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h
/usr/include/x86_64-linux-gnu/bits/types/__FILE.h
/usr/include/x86_64-linux-gnu/bits/types/FILE.h
/usr/include/x86_64-linux-gnu/bits/types/locale_t.h
/usr/include/x86_64-linux-gnu/bits/types/__locale_t.h
/usr/include/c++/8/cstdint
/usr/lib/gcc/x86_64-linux-gnu/8/include/stdint.h
/usr/include/stdint.h
/usr/include/x86_64-linux-gnu/bits/types.h
/usr/include/x86_64-linux-gnu/bits/typesizes.h
/usr/include/x86_64-linux-gnu/bits/stdint-intn.h
/usr/include/x86_64-linux-gnu/bits/stdint-uintn.h
/usr/include/c++/8/bits/localefwd.h
/usr/include/x86_64-linux-gnu/c++/8/bits/c++locale.h
/usr/include/c++/8/clocale
/usr/include/locale.h
/usr/include/x86_64-linux-gnu/bits/locale.h
/usr/include/c++/8/iosfwd
/usr/include/c++/8/cctype
/usr/include/ctype.h
/usr/include/endian.h
/usr/include/x86_64-linux-gnu/bits/endian.h
/usr/include/x86_64-linux-gnu/bits/byteswap.h
/usr/include/x86_64-linux-gnu/bits/byteswap-16.h
/usr/include/x86_64-linux-gnu/bits/uintn-identity.h
/usr/include/c++/8/bits/ostream_insert.h
/usr/include/c++/8/bits/cxxabi_forced.h
/usr/include/c++/8/bits/range_access.h
/usr/include/c++/8/bits/basic_string.h
/usr/include/c++/8/ext/atomicity.h
/usr/include/x86_64-linux-gnu/c++/8/bits/gthr.h
/usr/include/x86_64-linux-gnu/c++/8/bits/gthr-default.h
/usr/include/pthread.h
/usr/include/sched.h
/usr/include/x86_64-linux-gnu/bits/types/time_t.h
/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h
/usr/include/x86_64-linux-gnu/bits/sched.h
/usr/include/x86_64-linux-gnu/bits/cpu-set.h
/usr/include/time.h
/usr/include/x86_64-linux-gnu/bits/time.h
/usr/include/x86_64-linux-gnu/bits/timex.h
/usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h
/usr/include/x86_64-linux-gnu/bits/types/clock_t.h
/usr/include/x86_64-linux-gnu/bits/types/struct_tm.h
/usr/include/x86_64-linux-gnu/bits/types/clockid_t.h
/usr/include/x86_64-linux-gnu/bits/types/timer_t.h
/usr/include/x86_64-linux-gnu/bits/types/struct_itimerspec.h
/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h
/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h
/usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h
/usr/include/x86_64-linux-gnu/bits/setjmp.h
/usr/include/x86_64-linux-gnu/c++/8/bits/atomic_word.h
/usr/include/c++/8/string_view
/usr/include/c++/8/limits
/usr/include/c++/8/bits/functional_hash.h
/usr/include/c++/8/bits/string_view.tcc
/usr/include/c++/8/ext/string_conversions.h
/usr/include/c++/8/cstdlib
/usr/include/stdlib.h
/usr/include/x86_64-linux-gnu/bits/waitflags.h
/usr/include/x86_64-linux-gnu/bits/waitstatus.h
/usr/include/x86_64-linux-gnu/sys/types.h
/usr/include/x86_64-linux-gnu/sys/select.h
/usr/include/x86_64-linux-gnu/bits/select.h
/usr/include/x86_64-linux-gnu/bits/types/sigset_t.h
/usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h
/usr/include/x86_64-linux-gnu/sys/sysmacros.h
/usr/include/x86_64-linux-gnu/bits/sysmacros.h
/usr/include/alloca.h
/usr/include/x86_64-linux-gnu/bits/stdlib-float.h
/usr/include/c++/8/bits/std_abs.h
/usr/include/c++/8/cstdio
/usr/include/stdio.h
/usr/include/x86_64-linux-gnu/bits/libio.h
/usr/include/x86_64-linux-gnu/bits/_G_config.h
/usr/include/x86_64-linux-gnu/bits/stdio_lim.h
/usr/include/x86_64-linux-gnu/bits/sys_errlist.h
/usr/include/c++/8/cerrno
/usr/include/errno.h
/usr/include/x86_64-linux-gnu/bits/errno.h
/usr/include/linux/errno.h
/usr/include/x86_64-linux-gnu/asm/errno.h
/usr/include/asm-generic/errno.h
/usr/include/asm-generic/errno-base.h
/usr/include/c++/8/bits/basic_string.tcc
/usr/include/c++/8/bits/enable_special_members.h
/usr/include/c++/8/bits/stl_map.h
/usr/include/c++/8/tuple
/usr/include/c++/8/array
/usr/include/c++/8/bits/uses_allocator.h
/usr/include/c++/8/bits/invoke.h
/usr/include/c++/8/bits/stl_multimap.h
/usr/include/c++/8/vector
/usr/include/c++/8/bits/stl_construct.h
/usr/include/c++/8/bits/stl_uninitialized.h
/usr/include/c++/8/bits/stl_vector.h
/usr/include/c++/8/bits/stl_bvector.h
/usr/include/c++/8/bits/vector.tcc
/usr/include/c++/8/iostream
/usr/include/c++/8/ostream
/usr/include/c++/8/ios
/usr/include/c++/8/bits/ios_base.h
/usr/include/c++/8/bits/locale_classes.h
/usr/include/c++/8/bits/locale_classes.tcc
/usr/include/c++/8/system_error
/usr/include/x86_64-linux-gnu/c++/8/bits/error_constants.h
/usr/include/c++/8/streambuf
/usr/include/c++/8/bits/streambuf.tcc
/usr/include/c++/8/bits/basic_ios.h
/usr/include/c++/8/bits/locale_facets.h
/usr/include/c++/8/cwctype
/usr/include/wctype.h
/usr/include/x86_64-linux-gnu/bits/wctype-wchar.h
/usr/include/x86_64-linux-gnu/c++/8/bits/ctype_base.h
/usr/include/c++/8/bits/streambuf_iterator.h
/usr/include/x86_64-linux-gnu/c++/8/bits/ctype_inline.h
/usr/include/c++/8/bits/locale_facets.tcc
/usr/include/c++/8/bits/basic_ios.tcc
/usr/include/c++/8/bits/ostream.tcc
/usr/include/c++/8/istream
/usr/include/c++/8/bits/istream.tcc

View File

@ -0,0 +1,574 @@
# CMAKE generated file: DO NOT EDIT!
# Generated by "Unix Makefiles" Generator, CMake Version 3.23
src/CMakeFiles/lex_executable.dir/lex.cpp.o: src/lex.cpp \
/usr/include/stdc-predef.h \
src/libshared/src/Lexer.h \
/usr/include/c++/8/cstddef \
/usr/include/x86_64-linux-gnu/c++/8/bits/c++config.h \
/usr/include/x86_64-linux-gnu/c++/8/bits/os_defines.h \
/usr/include/features.h \
/usr/include/x86_64-linux-gnu/sys/cdefs.h \
/usr/include/x86_64-linux-gnu/bits/wordsize.h \
/usr/include/x86_64-linux-gnu/bits/long-double.h \
/usr/include/x86_64-linux-gnu/gnu/stubs.h \
/usr/include/x86_64-linux-gnu/gnu/stubs-64.h \
/usr/include/x86_64-linux-gnu/c++/8/bits/cpu_defines.h \
/usr/lib/gcc/x86_64-linux-gnu/8/include/stddef.h \
/usr/include/c++/8/map \
/usr/include/c++/8/bits/stl_tree.h \
/usr/include/c++/8/bits/stl_algobase.h \
/usr/include/c++/8/bits/functexcept.h \
/usr/include/c++/8/bits/exception_defines.h \
/usr/include/c++/8/bits/cpp_type_traits.h \
/usr/include/c++/8/ext/type_traits.h \
/usr/include/c++/8/ext/numeric_traits.h \
/usr/include/c++/8/bits/stl_pair.h \
/usr/include/c++/8/bits/move.h \
/usr/include/c++/8/bits/concept_check.h \
/usr/include/c++/8/type_traits \
/usr/include/c++/8/bits/stl_iterator_base_types.h \
/usr/include/c++/8/bits/stl_iterator_base_funcs.h \
/usr/include/c++/8/debug/assertions.h \
/usr/include/c++/8/bits/stl_iterator.h \
/usr/include/c++/8/bits/ptr_traits.h \
/usr/include/c++/8/debug/debug.h \
/usr/include/c++/8/bits/predefined_ops.h \
/usr/include/c++/8/bits/allocator.h \
/usr/include/x86_64-linux-gnu/c++/8/bits/c++allocator.h \
/usr/include/c++/8/ext/new_allocator.h \
/usr/include/c++/8/new \
/usr/include/c++/8/exception \
/usr/include/c++/8/bits/exception.h \
/usr/include/c++/8/bits/exception_ptr.h \
/usr/include/c++/8/bits/cxxabi_init_exception.h \
/usr/include/c++/8/typeinfo \
/usr/include/c++/8/bits/hash_bytes.h \
/usr/include/c++/8/bits/nested_exception.h \
/usr/include/c++/8/bits/memoryfwd.h \
/usr/include/c++/8/bits/stl_function.h \
/usr/include/c++/8/backward/binders.h \
/usr/include/c++/8/ext/alloc_traits.h \
/usr/include/c++/8/bits/alloc_traits.h \
/usr/include/c++/8/ext/aligned_buffer.h \
/usr/include/c++/8/bits/node_handle.h \
/usr/include/c++/8/optional \
/usr/include/c++/8/utility \
/usr/include/c++/8/bits/stl_relops.h \
/usr/include/c++/8/initializer_list \
/usr/include/c++/8/stdexcept \
/usr/include/c++/8/string \
/usr/include/c++/8/bits/stringfwd.h \
/usr/include/c++/8/bits/char_traits.h \
/usr/include/c++/8/bits/postypes.h \
/usr/include/c++/8/cwchar \
/usr/include/wchar.h \
/usr/include/x86_64-linux-gnu/bits/libc-header-start.h \
/usr/include/x86_64-linux-gnu/bits/floatn.h \
/usr/include/x86_64-linux-gnu/bits/floatn-common.h \
/usr/lib/gcc/x86_64-linux-gnu/8/include/stdarg.h \
/usr/include/x86_64-linux-gnu/bits/wchar.h \
/usr/include/x86_64-linux-gnu/bits/types/wint_t.h \
/usr/include/x86_64-linux-gnu/bits/types/mbstate_t.h \
/usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h \
/usr/include/x86_64-linux-gnu/bits/types/__FILE.h \
/usr/include/x86_64-linux-gnu/bits/types/FILE.h \
/usr/include/x86_64-linux-gnu/bits/types/locale_t.h \
/usr/include/x86_64-linux-gnu/bits/types/__locale_t.h \
/usr/include/c++/8/cstdint \
/usr/lib/gcc/x86_64-linux-gnu/8/include/stdint.h \
/usr/include/stdint.h \
/usr/include/x86_64-linux-gnu/bits/types.h \
/usr/include/x86_64-linux-gnu/bits/typesizes.h \
/usr/include/x86_64-linux-gnu/bits/stdint-intn.h \
/usr/include/x86_64-linux-gnu/bits/stdint-uintn.h \
/usr/include/c++/8/bits/localefwd.h \
/usr/include/x86_64-linux-gnu/c++/8/bits/c++locale.h \
/usr/include/c++/8/clocale \
/usr/include/locale.h \
/usr/include/x86_64-linux-gnu/bits/locale.h \
/usr/include/c++/8/iosfwd \
/usr/include/c++/8/cctype \
/usr/include/ctype.h \
/usr/include/endian.h \
/usr/include/x86_64-linux-gnu/bits/endian.h \
/usr/include/x86_64-linux-gnu/bits/byteswap.h \
/usr/include/x86_64-linux-gnu/bits/byteswap-16.h \
/usr/include/x86_64-linux-gnu/bits/uintn-identity.h \
/usr/include/c++/8/bits/ostream_insert.h \
/usr/include/c++/8/bits/cxxabi_forced.h \
/usr/include/c++/8/bits/range_access.h \
/usr/include/c++/8/bits/basic_string.h \
/usr/include/c++/8/ext/atomicity.h \
/usr/include/x86_64-linux-gnu/c++/8/bits/gthr.h \
/usr/include/x86_64-linux-gnu/c++/8/bits/gthr-default.h \
/usr/include/pthread.h \
/usr/include/sched.h \
/usr/include/x86_64-linux-gnu/bits/types/time_t.h \
/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h \
/usr/include/x86_64-linux-gnu/bits/sched.h \
/usr/include/x86_64-linux-gnu/bits/cpu-set.h \
/usr/include/time.h \
/usr/include/x86_64-linux-gnu/bits/time.h \
/usr/include/x86_64-linux-gnu/bits/timex.h \
/usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h \
/usr/include/x86_64-linux-gnu/bits/types/clock_t.h \
/usr/include/x86_64-linux-gnu/bits/types/struct_tm.h \
/usr/include/x86_64-linux-gnu/bits/types/clockid_t.h \
/usr/include/x86_64-linux-gnu/bits/types/timer_t.h \
/usr/include/x86_64-linux-gnu/bits/types/struct_itimerspec.h \
/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h \
/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h \
/usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h \
/usr/include/x86_64-linux-gnu/bits/setjmp.h \
/usr/include/x86_64-linux-gnu/c++/8/bits/atomic_word.h \
/usr/include/c++/8/string_view \
/usr/include/c++/8/limits \
/usr/include/c++/8/bits/functional_hash.h \
/usr/include/c++/8/bits/string_view.tcc \
/usr/include/c++/8/ext/string_conversions.h \
/usr/include/c++/8/cstdlib \
/usr/include/stdlib.h \
/usr/include/x86_64-linux-gnu/bits/waitflags.h \
/usr/include/x86_64-linux-gnu/bits/waitstatus.h \
/usr/include/x86_64-linux-gnu/sys/types.h \
/usr/include/x86_64-linux-gnu/sys/select.h \
/usr/include/x86_64-linux-gnu/bits/select.h \
/usr/include/x86_64-linux-gnu/bits/types/sigset_t.h \
/usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h \
/usr/include/x86_64-linux-gnu/sys/sysmacros.h \
/usr/include/x86_64-linux-gnu/bits/sysmacros.h \
/usr/include/alloca.h \
/usr/include/x86_64-linux-gnu/bits/stdlib-float.h \
/usr/include/c++/8/bits/std_abs.h \
/usr/include/c++/8/cstdio \
/usr/include/stdio.h \
/usr/include/x86_64-linux-gnu/bits/libio.h \
/usr/include/x86_64-linux-gnu/bits/_G_config.h \
/usr/include/x86_64-linux-gnu/bits/stdio_lim.h \
/usr/include/x86_64-linux-gnu/bits/sys_errlist.h \
/usr/include/c++/8/cerrno \
/usr/include/errno.h \
/usr/include/x86_64-linux-gnu/bits/errno.h \
/usr/include/linux/errno.h \
/usr/include/x86_64-linux-gnu/asm/errno.h \
/usr/include/asm-generic/errno.h \
/usr/include/asm-generic/errno-base.h \
/usr/include/c++/8/bits/basic_string.tcc \
/usr/include/c++/8/bits/enable_special_members.h \
/usr/include/c++/8/bits/stl_map.h \
/usr/include/c++/8/tuple \
/usr/include/c++/8/array \
/usr/include/c++/8/bits/uses_allocator.h \
/usr/include/c++/8/bits/invoke.h \
/usr/include/c++/8/bits/stl_multimap.h \
/usr/include/c++/8/vector \
/usr/include/c++/8/bits/stl_construct.h \
/usr/include/c++/8/bits/stl_uninitialized.h \
/usr/include/c++/8/bits/stl_vector.h \
/usr/include/c++/8/bits/stl_bvector.h \
/usr/include/c++/8/bits/vector.tcc \
/usr/include/c++/8/iostream \
/usr/include/c++/8/ostream \
/usr/include/c++/8/ios \
/usr/include/c++/8/bits/ios_base.h \
/usr/include/c++/8/bits/locale_classes.h \
/usr/include/c++/8/bits/locale_classes.tcc \
/usr/include/c++/8/system_error \
/usr/include/x86_64-linux-gnu/c++/8/bits/error_constants.h \
/usr/include/c++/8/streambuf \
/usr/include/c++/8/bits/streambuf.tcc \
/usr/include/c++/8/bits/basic_ios.h \
/usr/include/c++/8/bits/locale_facets.h \
/usr/include/c++/8/cwctype \
/usr/include/wctype.h \
/usr/include/x86_64-linux-gnu/bits/wctype-wchar.h \
/usr/include/x86_64-linux-gnu/c++/8/bits/ctype_base.h \
/usr/include/c++/8/bits/streambuf_iterator.h \
/usr/include/x86_64-linux-gnu/c++/8/bits/ctype_inline.h \
/usr/include/c++/8/bits/locale_facets.tcc \
/usr/include/c++/8/bits/basic_ios.tcc \
/usr/include/c++/8/bits/ostream.tcc \
/usr/include/c++/8/istream \
/usr/include/c++/8/bits/istream.tcc
/usr/include/c++/8/istream:
/usr/include/c++/8/bits/ostream.tcc:
/usr/include/c++/8/bits/basic_ios.tcc:
/usr/include/c++/8/bits/streambuf_iterator.h:
/usr/include/x86_64-linux-gnu/bits/wctype-wchar.h:
/usr/include/wctype.h:
/usr/include/c++/8/cwctype:
/usr/include/c++/8/bits/locale_facets.h:
/usr/include/c++/8/bits/basic_ios.h:
/usr/include/x86_64-linux-gnu/c++/8/bits/error_constants.h:
/usr/include/c++/8/system_error:
/usr/include/c++/8/bits/locale_classes.tcc:
/usr/include/c++/8/ios:
/usr/include/c++/8/ostream:
/usr/include/c++/8/iostream:
/usr/include/c++/8/bits/vector.tcc:
/usr/include/x86_64-linux-gnu/bits/types.h:
/usr/include/wchar.h:
/usr/include/c++/8/array:
/usr/include/c++/8/streambuf:
/usr/include/x86_64-linux-gnu/bits/types/mbstate_t.h:
/usr/include/x86_64-linux-gnu/bits/setjmp.h:
/usr/lib/gcc/x86_64-linux-gnu/8/include/stdarg.h:
/usr/include/c++/8/bits/predefined_ops.h:
/usr/include/c++/8/ext/new_allocator.h:
/usr/include/c++/8/bits/stl_uninitialized.h:
/usr/include/x86_64-linux-gnu/bits/floatn.h:
/usr/include/x86_64-linux-gnu/bits/types/locale_t.h:
/usr/include/x86_64-linux-gnu/bits/libc-header-start.h:
/usr/include/x86_64-linux-gnu/bits/types/struct_tm.h:
/usr/include/x86_64-linux-gnu/bits/wchar.h:
/usr/include/c++/8/bits/exception_ptr.h:
/usr/include/c++/8/bits/char_traits.h:
/usr/include/c++/8/string:
/usr/include/c++/8/bits/stl_relops.h:
/usr/include/c++/8/bits/range_access.h:
/usr/include/c++/8/bits/alloc_traits.h:
/usr/include/c++/8/ext/alloc_traits.h:
/usr/include/c++/8/new:
/usr/include/c++/8/stdexcept:
/usr/include/x86_64-linux-gnu/bits/floatn-common.h:
/usr/include/x86_64-linux-gnu/bits/locale.h:
/usr/include/c++/8/bits/ostream_insert.h:
/usr/include/x86_64-linux-gnu/bits/types/__locale_t.h:
/usr/include/c++/8/bits/stl_iterator_base_funcs.h:
/usr/include/x86_64-linux-gnu/bits/types/wint_t.h:
/usr/include/c++/8/bits/cxxabi_init_exception.h:
/usr/include/x86_64-linux-gnu/bits/wordsize.h:
/usr/include/c++/8/ext/string_conversions.h:
/usr/include/c++/8/initializer_list:
/usr/include/c++/8/bits/nested_exception.h:
/usr/include/c++/8/backward/binders.h:
/usr/include/c++/8/exception:
/usr/include/stdint.h:
/usr/include/c++/8/cstdint:
/usr/include/c++/8/map:
/usr/include/x86_64-linux-gnu/c++/8/bits/c++allocator.h:
/usr/include/c++/8/bits/stl_tree.h:
/usr/include/x86_64-linux-gnu/c++/8/bits/os_defines.h:
/usr/include/x86_64-linux-gnu/gnu/stubs.h:
/usr/include/c++/8/cstddef:
/usr/include/c++/8/bits/istream.tcc:
/usr/include/c++/8/debug/assertions.h:
/usr/include/x86_64-linux-gnu/bits/libio.h:
/usr/include/x86_64-linux-gnu/sys/cdefs.h:
/usr/include/c++/8/bits/allocator.h:
/usr/include/stdc-predef.h:
/usr/include/c++/8/limits:
/usr/include/c++/8/bits/basic_string.tcc:
/usr/include/c++/8/optional:
/usr/lib/gcc/x86_64-linux-gnu/8/include/stddef.h:
/usr/include/x86_64-linux-gnu/bits/waitflags.h:
/usr/include/x86_64-linux-gnu/bits/types/__FILE.h:
/usr/include/c++/8/bits/invoke.h:
src/lex.cpp:
/usr/include/c++/8/bits/locale_classes.h:
/usr/include/c++/8/type_traits:
/usr/lib/gcc/x86_64-linux-gnu/8/include/stdint.h:
src/libshared/src/Lexer.h:
/usr/include/x86_64-linux-gnu/bits/stdlib-float.h:
/usr/include/x86_64-linux-gnu/c++/8/bits/c++config.h:
/usr/include/x86_64-linux-gnu/bits/types/FILE.h:
/usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h:
/usr/include/x86_64-linux-gnu/bits/select.h:
/usr/include/c++/8/bits/stl_iterator_base_types.h:
/usr/include/c++/8/bits/postypes.h:
/usr/include/c++/8/bits/stl_algobase.h:
/usr/include/c++/8/bits/functexcept.h:
/usr/include/c++/8/ext/aligned_buffer.h:
/usr/include/x86_64-linux-gnu/bits/types/time_t.h:
/usr/include/x86_64-linux-gnu/bits/types/timer_t.h:
/usr/include/stdlib.h:
/usr/include/c++/8/cwchar:
/usr/include/ctype.h:
/usr/include/x86_64-linux-gnu/bits/errno.h:
/usr/include/c++/8/bits/cpp_type_traits.h:
/usr/include/x86_64-linux-gnu/c++/8/bits/ctype_inline.h:
/usr/include/c++/8/ext/type_traits.h:
/usr/include/x86_64-linux-gnu/gnu/stubs-64.h:
/usr/include/c++/8/clocale:
/usr/include/c++/8/bits/stringfwd.h:
/usr/include/c++/8/bits/node_handle.h:
/usr/include/c++/8/bits/stl_iterator.h:
/usr/include/c++/8/bits/ptr_traits.h:
/usr/include/x86_64-linux-gnu/bits/byteswap.h:
/usr/include/x86_64-linux-gnu/bits/types/struct_itimerspec.h:
/usr/include/c++/8/bits/stl_pair.h:
/usr/include/c++/8/bits/concept_check.h:
/usr/include/x86_64-linux-gnu/c++/8/bits/cpu_defines.h:
/usr/include/c++/8/debug/debug.h:
/usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h:
/usr/include/c++/8/bits/exception.h:
/usr/include/c++/8/bits/localefwd.h:
/usr/include/x86_64-linux-gnu/bits/typesizes.h:
/usr/include/x86_64-linux-gnu/sys/sysmacros.h:
/usr/include/x86_64-linux-gnu/bits/stdint-intn.h:
/usr/include/x86_64-linux-gnu/bits/stdint-uintn.h:
/usr/include/x86_64-linux-gnu/c++/8/bits/c++locale.h:
/usr/include/c++/8/bits/streambuf.tcc:
/usr/include/x86_64-linux-gnu/bits/cpu-set.h:
/usr/include/c++/8/bits/hash_bytes.h:
/usr/include/x86_64-linux-gnu/bits/uintn-identity.h:
/usr/include/c++/8/iosfwd:
/usr/include/locale.h:
/usr/include/c++/8/cctype:
/usr/include/c++/8/bits/uses_allocator.h:
/usr/include/endian.h:
/usr/include/c++/8/bits/ios_base.h:
/usr/include/x86_64-linux-gnu/bits/endian.h:
/usr/include/x86_64-linux-gnu/bits/byteswap-16.h:
/usr/include/c++/8/bits/cxxabi_forced.h:
/usr/include/c++/8/bits/locale_facets.tcc:
/usr/include/c++/8/bits/basic_string.h:
/usr/include/linux/errno.h:
/usr/include/c++/8/bits/move.h:
/usr/include/c++/8/ext/atomicity.h:
/usr/include/x86_64-linux-gnu/c++/8/bits/gthr.h:
/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h:
/usr/include/x86_64-linux-gnu/c++/8/bits/gthr-default.h:
/usr/include/pthread.h:
/usr/include/errno.h:
/usr/include/x86_64-linux-gnu/c++/8/bits/ctype_base.h:
/usr/include/sched.h:
/usr/include/c++/8/typeinfo:
/usr/include/c++/8/bits/string_view.tcc:
/usr/include/time.h:
/usr/include/x86_64-linux-gnu/bits/time.h:
/usr/include/alloca.h:
/usr/include/x86_64-linux-gnu/bits/timex.h:
/usr/include/x86_64-linux-gnu/bits/types/clock_t.h:
/usr/include/x86_64-linux-gnu/bits/types/clockid_t.h:
/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h:
/usr/include/x86_64-linux-gnu/bits/long-double.h:
/usr/include/c++/8/string_view:
/usr/include/c++/8/bits/functional_hash.h:
/usr/include/c++/8/cstdlib:
/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h:
/usr/include/x86_64-linux-gnu/bits/waitstatus.h:
/usr/include/c++/8/ext/numeric_traits.h:
/usr/include/c++/8/bits/exception_defines.h:
/usr/include/c++/8/bits/std_abs.h:
/usr/include/x86_64-linux-gnu/sys/types.h:
/usr/include/x86_64-linux-gnu/sys/select.h:
/usr/include/x86_64-linux-gnu/bits/types/sigset_t.h:
/usr/include/stdio.h:
/usr/include/features.h:
/usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h:
/usr/include/x86_64-linux-gnu/bits/sysmacros.h:
/usr/include/c++/8/bits/stl_vector.h:
/usr/include/c++/8/bits/memoryfwd.h:
/usr/include/c++/8/cstdio:
/usr/include/c++/8/utility:
/usr/include/x86_64-linux-gnu/bits/_G_config.h:
/usr/include/x86_64-linux-gnu/bits/stdio_lim.h:
/usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h:
/usr/include/x86_64-linux-gnu/bits/sched.h:
/usr/include/x86_64-linux-gnu/bits/sys_errlist.h:
/usr/include/c++/8/cerrno:
/usr/include/x86_64-linux-gnu/asm/errno.h:
/usr/include/asm-generic/errno.h:
/usr/include/asm-generic/errno-base.h:
/usr/include/c++/8/bits/stl_construct.h:
/usr/include/c++/8/bits/enable_special_members.h:
/usr/include/c++/8/bits/stl_function.h:
/usr/include/c++/8/bits/stl_map.h:
/usr/include/x86_64-linux-gnu/c++/8/bits/atomic_word.h:
/usr/include/c++/8/tuple:
/usr/include/c++/8/bits/stl_multimap.h:
/usr/include/c++/8/vector:
/usr/include/c++/8/bits/stl_bvector.h:

View File

@ -0,0 +1,2 @@
# CMAKE generated file: DO NOT EDIT!
# Timestamp file for compiler generated dependencies management for lex_executable.

View File

@ -0,0 +1,2 @@
# Empty dependencies file for lex_executable.
# This may be replaced when dependencies are built.

View File

@ -0,0 +1,10 @@
# CMAKE generated file: DO NOT EDIT!
# Generated by "Unix Makefiles" Generator, CMake Version 3.23
# compile CXX with /usr/bin/c++
CXX_DEFINES =
CXX_INCLUDES = -I/home/jdaugherty/work/pkgs/taskw/timew-1.7.1 -I/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src -I/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/commands -I/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src
CXX_FLAGS = -Wall -Wextra -Wsign-compare -Wreturn-type -g -std=gnu++17

View File

@ -0,0 +1 @@
/usr/bin/c++ -Wall -Wextra -Wsign-compare -Wreturn-type -g CMakeFiles/lex_executable.dir/lex.cpp.o -o lex libtimew.a liblibshared.a

View File

@ -0,0 +1,3 @@
CMAKE_PROGRESS_1 =
CMAKE_PROGRESS_2 = 35

View File

@ -0,0 +1,37 @@
# Consider dependencies only in project.
set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF)
# The set of languages for which implicit dependencies are needed:
set(CMAKE_DEPENDS_LANGUAGES
)
# The set of dependency files which are needed:
set(CMAKE_DEPENDS_DEPENDENCY_FILES
"/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src/Args.cpp" "src/CMakeFiles/libshared.dir/libshared/src/Args.cpp.o" "gcc" "src/CMakeFiles/libshared.dir/libshared/src/Args.cpp.o.d"
"/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src/Color.cpp" "src/CMakeFiles/libshared.dir/libshared/src/Color.cpp.o" "gcc" "src/CMakeFiles/libshared.dir/libshared/src/Color.cpp.o.d"
"/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src/Composite.cpp" "src/CMakeFiles/libshared.dir/libshared/src/Composite.cpp.o" "gcc" "src/CMakeFiles/libshared.dir/libshared/src/Composite.cpp.o.d"
"/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src/Configuration.cpp" "src/CMakeFiles/libshared.dir/libshared/src/Configuration.cpp.o" "gcc" "src/CMakeFiles/libshared.dir/libshared/src/Configuration.cpp.o.d"
"/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src/Datetime.cpp" "src/CMakeFiles/libshared.dir/libshared/src/Datetime.cpp.o" "gcc" "src/CMakeFiles/libshared.dir/libshared/src/Datetime.cpp.o.d"
"/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src/Duration.cpp" "src/CMakeFiles/libshared.dir/libshared/src/Duration.cpp.o" "gcc" "src/CMakeFiles/libshared.dir/libshared/src/Duration.cpp.o.d"
"/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src/FS.cpp" "src/CMakeFiles/libshared.dir/libshared/src/FS.cpp.o" "gcc" "src/CMakeFiles/libshared.dir/libshared/src/FS.cpp.o.d"
"/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src/JSON.cpp" "src/CMakeFiles/libshared.dir/libshared/src/JSON.cpp.o" "gcc" "src/CMakeFiles/libshared.dir/libshared/src/JSON.cpp.o.d"
"/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src/Lexer.cpp" "src/CMakeFiles/libshared.dir/libshared/src/Lexer.cpp.o" "gcc" "src/CMakeFiles/libshared.dir/libshared/src/Lexer.cpp.o.d"
"/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src/Msg.cpp" "src/CMakeFiles/libshared.dir/libshared/src/Msg.cpp.o" "gcc" "src/CMakeFiles/libshared.dir/libshared/src/Msg.cpp.o.d"
"/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src/Palette.cpp" "src/CMakeFiles/libshared.dir/libshared/src/Palette.cpp.o" "gcc" "src/CMakeFiles/libshared.dir/libshared/src/Palette.cpp.o.d"
"/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src/Pig.cpp" "src/CMakeFiles/libshared.dir/libshared/src/Pig.cpp.o" "gcc" "src/CMakeFiles/libshared.dir/libshared/src/Pig.cpp.o.d"
"/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src/RX.cpp" "src/CMakeFiles/libshared.dir/libshared/src/RX.cpp.o" "gcc" "src/CMakeFiles/libshared.dir/libshared/src/RX.cpp.o.d"
"/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src/Table.cpp" "src/CMakeFiles/libshared.dir/libshared/src/Table.cpp.o" "gcc" "src/CMakeFiles/libshared.dir/libshared/src/Table.cpp.o.d"
"/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src/Timer.cpp" "src/CMakeFiles/libshared.dir/libshared/src/Timer.cpp.o" "gcc" "src/CMakeFiles/libshared.dir/libshared/src/Timer.cpp.o.d"
"/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src/format.cpp" "src/CMakeFiles/libshared.dir/libshared/src/format.cpp.o" "gcc" "src/CMakeFiles/libshared.dir/libshared/src/format.cpp.o.d"
"/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src/shared.cpp" "src/CMakeFiles/libshared.dir/libshared/src/shared.cpp.o" "gcc" "src/CMakeFiles/libshared.dir/libshared/src/shared.cpp.o.d"
"/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src/unicode.cpp" "src/CMakeFiles/libshared.dir/libshared/src/unicode.cpp.o" "gcc" "src/CMakeFiles/libshared.dir/libshared/src/unicode.cpp.o.d"
"/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src/utf8.cpp" "src/CMakeFiles/libshared.dir/libshared/src/utf8.cpp.o" "gcc" "src/CMakeFiles/libshared.dir/libshared/src/utf8.cpp.o.d"
)
# Targets to which this target links.
set(CMAKE_TARGET_LINKED_INFO_FILES
)
# Fortran module output directory.
set(CMAKE_Fortran_TARGET_MODULE_DIR "")

View File

@ -0,0 +1,399 @@
# CMAKE generated file: DO NOT EDIT!
# Generated by "Unix Makefiles" Generator, CMake Version 3.23
# Delete rule output on recipe failure.
.DELETE_ON_ERROR:
#=============================================================================
# Special targets provided by cmake.
# Disable implicit rules so canonical targets will work.
.SUFFIXES:
# Disable VCS-based implicit rules.
% : %,v
# Disable VCS-based implicit rules.
% : RCS/%
# Disable VCS-based implicit rules.
% : RCS/%,v
# Disable VCS-based implicit rules.
% : SCCS/s.%
# Disable VCS-based implicit rules.
% : s.%
.SUFFIXES: .hpux_make_needs_suffix_list
# Command-line flag to silence nested $(MAKE).
$(VERBOSE)MAKESILENT = -s
#Suppress display of executed commands.
$(VERBOSE).SILENT:
# A target that is always out of date.
cmake_force:
.PHONY : cmake_force
#=============================================================================
# Set environment variables for the build.
# The shell in which to execute make rules.
SHELL = /bin/sh
# The CMake executable.
CMAKE_COMMAND = /usr/local/bin/cmake
# The command to remove a file.
RM = /usr/local/bin/cmake -E rm -f
# Escaping for special characters.
EQUALS = =
# The top-level source directory on which CMake was run.
CMAKE_SOURCE_DIR = /home/jdaugherty/work/pkgs/taskw/timew-1.7.1
# The top-level build directory on which CMake was run.
CMAKE_BINARY_DIR = /home/jdaugherty/work/pkgs/taskw/timew-1.7.1
# Include any dependencies generated for this target.
include src/CMakeFiles/libshared.dir/depend.make
# Include any dependencies generated by the compiler for this target.
include src/CMakeFiles/libshared.dir/compiler_depend.make
# Include the progress variables for this target.
include src/CMakeFiles/libshared.dir/progress.make
# Include the compile flags for this target's objects.
include src/CMakeFiles/libshared.dir/flags.make
src/CMakeFiles/libshared.dir/libshared/src/Args.cpp.o: src/CMakeFiles/libshared.dir/flags.make
src/CMakeFiles/libshared.dir/libshared/src/Args.cpp.o: src/libshared/src/Args.cpp
src/CMakeFiles/libshared.dir/libshared/src/Args.cpp.o: src/CMakeFiles/libshared.dir/compiler_depend.ts
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Building CXX object src/CMakeFiles/libshared.dir/libshared/src/Args.cpp.o"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT src/CMakeFiles/libshared.dir/libshared/src/Args.cpp.o -MF CMakeFiles/libshared.dir/libshared/src/Args.cpp.o.d -o CMakeFiles/libshared.dir/libshared/src/Args.cpp.o -c /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src/Args.cpp
src/CMakeFiles/libshared.dir/libshared/src/Args.cpp.i: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/libshared.dir/libshared/src/Args.cpp.i"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src/Args.cpp > CMakeFiles/libshared.dir/libshared/src/Args.cpp.i
src/CMakeFiles/libshared.dir/libshared/src/Args.cpp.s: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/libshared.dir/libshared/src/Args.cpp.s"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src/Args.cpp -o CMakeFiles/libshared.dir/libshared/src/Args.cpp.s
src/CMakeFiles/libshared.dir/libshared/src/Color.cpp.o: src/CMakeFiles/libshared.dir/flags.make
src/CMakeFiles/libshared.dir/libshared/src/Color.cpp.o: src/libshared/src/Color.cpp
src/CMakeFiles/libshared.dir/libshared/src/Color.cpp.o: src/CMakeFiles/libshared.dir/compiler_depend.ts
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/CMakeFiles --progress-num=$(CMAKE_PROGRESS_2) "Building CXX object src/CMakeFiles/libshared.dir/libshared/src/Color.cpp.o"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT src/CMakeFiles/libshared.dir/libshared/src/Color.cpp.o -MF CMakeFiles/libshared.dir/libshared/src/Color.cpp.o.d -o CMakeFiles/libshared.dir/libshared/src/Color.cpp.o -c /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src/Color.cpp
src/CMakeFiles/libshared.dir/libshared/src/Color.cpp.i: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/libshared.dir/libshared/src/Color.cpp.i"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src/Color.cpp > CMakeFiles/libshared.dir/libshared/src/Color.cpp.i
src/CMakeFiles/libshared.dir/libshared/src/Color.cpp.s: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/libshared.dir/libshared/src/Color.cpp.s"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src/Color.cpp -o CMakeFiles/libshared.dir/libshared/src/Color.cpp.s
src/CMakeFiles/libshared.dir/libshared/src/Composite.cpp.o: src/CMakeFiles/libshared.dir/flags.make
src/CMakeFiles/libshared.dir/libshared/src/Composite.cpp.o: src/libshared/src/Composite.cpp
src/CMakeFiles/libshared.dir/libshared/src/Composite.cpp.o: src/CMakeFiles/libshared.dir/compiler_depend.ts
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/CMakeFiles --progress-num=$(CMAKE_PROGRESS_3) "Building CXX object src/CMakeFiles/libshared.dir/libshared/src/Composite.cpp.o"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT src/CMakeFiles/libshared.dir/libshared/src/Composite.cpp.o -MF CMakeFiles/libshared.dir/libshared/src/Composite.cpp.o.d -o CMakeFiles/libshared.dir/libshared/src/Composite.cpp.o -c /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src/Composite.cpp
src/CMakeFiles/libshared.dir/libshared/src/Composite.cpp.i: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/libshared.dir/libshared/src/Composite.cpp.i"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src/Composite.cpp > CMakeFiles/libshared.dir/libshared/src/Composite.cpp.i
src/CMakeFiles/libshared.dir/libshared/src/Composite.cpp.s: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/libshared.dir/libshared/src/Composite.cpp.s"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src/Composite.cpp -o CMakeFiles/libshared.dir/libshared/src/Composite.cpp.s
src/CMakeFiles/libshared.dir/libshared/src/Configuration.cpp.o: src/CMakeFiles/libshared.dir/flags.make
src/CMakeFiles/libshared.dir/libshared/src/Configuration.cpp.o: src/libshared/src/Configuration.cpp
src/CMakeFiles/libshared.dir/libshared/src/Configuration.cpp.o: src/CMakeFiles/libshared.dir/compiler_depend.ts
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/CMakeFiles --progress-num=$(CMAKE_PROGRESS_4) "Building CXX object src/CMakeFiles/libshared.dir/libshared/src/Configuration.cpp.o"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT src/CMakeFiles/libshared.dir/libshared/src/Configuration.cpp.o -MF CMakeFiles/libshared.dir/libshared/src/Configuration.cpp.o.d -o CMakeFiles/libshared.dir/libshared/src/Configuration.cpp.o -c /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src/Configuration.cpp
src/CMakeFiles/libshared.dir/libshared/src/Configuration.cpp.i: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/libshared.dir/libshared/src/Configuration.cpp.i"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src/Configuration.cpp > CMakeFiles/libshared.dir/libshared/src/Configuration.cpp.i
src/CMakeFiles/libshared.dir/libshared/src/Configuration.cpp.s: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/libshared.dir/libshared/src/Configuration.cpp.s"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src/Configuration.cpp -o CMakeFiles/libshared.dir/libshared/src/Configuration.cpp.s
src/CMakeFiles/libshared.dir/libshared/src/Datetime.cpp.o: src/CMakeFiles/libshared.dir/flags.make
src/CMakeFiles/libshared.dir/libshared/src/Datetime.cpp.o: src/libshared/src/Datetime.cpp
src/CMakeFiles/libshared.dir/libshared/src/Datetime.cpp.o: src/CMakeFiles/libshared.dir/compiler_depend.ts
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/CMakeFiles --progress-num=$(CMAKE_PROGRESS_5) "Building CXX object src/CMakeFiles/libshared.dir/libshared/src/Datetime.cpp.o"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT src/CMakeFiles/libshared.dir/libshared/src/Datetime.cpp.o -MF CMakeFiles/libshared.dir/libshared/src/Datetime.cpp.o.d -o CMakeFiles/libshared.dir/libshared/src/Datetime.cpp.o -c /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src/Datetime.cpp
src/CMakeFiles/libshared.dir/libshared/src/Datetime.cpp.i: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/libshared.dir/libshared/src/Datetime.cpp.i"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src/Datetime.cpp > CMakeFiles/libshared.dir/libshared/src/Datetime.cpp.i
src/CMakeFiles/libshared.dir/libshared/src/Datetime.cpp.s: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/libshared.dir/libshared/src/Datetime.cpp.s"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src/Datetime.cpp -o CMakeFiles/libshared.dir/libshared/src/Datetime.cpp.s
src/CMakeFiles/libshared.dir/libshared/src/Duration.cpp.o: src/CMakeFiles/libshared.dir/flags.make
src/CMakeFiles/libshared.dir/libshared/src/Duration.cpp.o: src/libshared/src/Duration.cpp
src/CMakeFiles/libshared.dir/libshared/src/Duration.cpp.o: src/CMakeFiles/libshared.dir/compiler_depend.ts
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/CMakeFiles --progress-num=$(CMAKE_PROGRESS_6) "Building CXX object src/CMakeFiles/libshared.dir/libshared/src/Duration.cpp.o"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT src/CMakeFiles/libshared.dir/libshared/src/Duration.cpp.o -MF CMakeFiles/libshared.dir/libshared/src/Duration.cpp.o.d -o CMakeFiles/libshared.dir/libshared/src/Duration.cpp.o -c /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src/Duration.cpp
src/CMakeFiles/libshared.dir/libshared/src/Duration.cpp.i: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/libshared.dir/libshared/src/Duration.cpp.i"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src/Duration.cpp > CMakeFiles/libshared.dir/libshared/src/Duration.cpp.i
src/CMakeFiles/libshared.dir/libshared/src/Duration.cpp.s: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/libshared.dir/libshared/src/Duration.cpp.s"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src/Duration.cpp -o CMakeFiles/libshared.dir/libshared/src/Duration.cpp.s
src/CMakeFiles/libshared.dir/libshared/src/FS.cpp.o: src/CMakeFiles/libshared.dir/flags.make
src/CMakeFiles/libshared.dir/libshared/src/FS.cpp.o: src/libshared/src/FS.cpp
src/CMakeFiles/libshared.dir/libshared/src/FS.cpp.o: src/CMakeFiles/libshared.dir/compiler_depend.ts
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/CMakeFiles --progress-num=$(CMAKE_PROGRESS_7) "Building CXX object src/CMakeFiles/libshared.dir/libshared/src/FS.cpp.o"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT src/CMakeFiles/libshared.dir/libshared/src/FS.cpp.o -MF CMakeFiles/libshared.dir/libshared/src/FS.cpp.o.d -o CMakeFiles/libshared.dir/libshared/src/FS.cpp.o -c /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src/FS.cpp
src/CMakeFiles/libshared.dir/libshared/src/FS.cpp.i: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/libshared.dir/libshared/src/FS.cpp.i"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src/FS.cpp > CMakeFiles/libshared.dir/libshared/src/FS.cpp.i
src/CMakeFiles/libshared.dir/libshared/src/FS.cpp.s: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/libshared.dir/libshared/src/FS.cpp.s"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src/FS.cpp -o CMakeFiles/libshared.dir/libshared/src/FS.cpp.s
src/CMakeFiles/libshared.dir/libshared/src/JSON.cpp.o: src/CMakeFiles/libshared.dir/flags.make
src/CMakeFiles/libshared.dir/libshared/src/JSON.cpp.o: src/libshared/src/JSON.cpp
src/CMakeFiles/libshared.dir/libshared/src/JSON.cpp.o: src/CMakeFiles/libshared.dir/compiler_depend.ts
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/CMakeFiles --progress-num=$(CMAKE_PROGRESS_8) "Building CXX object src/CMakeFiles/libshared.dir/libshared/src/JSON.cpp.o"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT src/CMakeFiles/libshared.dir/libshared/src/JSON.cpp.o -MF CMakeFiles/libshared.dir/libshared/src/JSON.cpp.o.d -o CMakeFiles/libshared.dir/libshared/src/JSON.cpp.o -c /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src/JSON.cpp
src/CMakeFiles/libshared.dir/libshared/src/JSON.cpp.i: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/libshared.dir/libshared/src/JSON.cpp.i"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src/JSON.cpp > CMakeFiles/libshared.dir/libshared/src/JSON.cpp.i
src/CMakeFiles/libshared.dir/libshared/src/JSON.cpp.s: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/libshared.dir/libshared/src/JSON.cpp.s"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src/JSON.cpp -o CMakeFiles/libshared.dir/libshared/src/JSON.cpp.s
src/CMakeFiles/libshared.dir/libshared/src/Lexer.cpp.o: src/CMakeFiles/libshared.dir/flags.make
src/CMakeFiles/libshared.dir/libshared/src/Lexer.cpp.o: src/libshared/src/Lexer.cpp
src/CMakeFiles/libshared.dir/libshared/src/Lexer.cpp.o: src/CMakeFiles/libshared.dir/compiler_depend.ts
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/CMakeFiles --progress-num=$(CMAKE_PROGRESS_9) "Building CXX object src/CMakeFiles/libshared.dir/libshared/src/Lexer.cpp.o"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT src/CMakeFiles/libshared.dir/libshared/src/Lexer.cpp.o -MF CMakeFiles/libshared.dir/libshared/src/Lexer.cpp.o.d -o CMakeFiles/libshared.dir/libshared/src/Lexer.cpp.o -c /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src/Lexer.cpp
src/CMakeFiles/libshared.dir/libshared/src/Lexer.cpp.i: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/libshared.dir/libshared/src/Lexer.cpp.i"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src/Lexer.cpp > CMakeFiles/libshared.dir/libshared/src/Lexer.cpp.i
src/CMakeFiles/libshared.dir/libshared/src/Lexer.cpp.s: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/libshared.dir/libshared/src/Lexer.cpp.s"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src/Lexer.cpp -o CMakeFiles/libshared.dir/libshared/src/Lexer.cpp.s
src/CMakeFiles/libshared.dir/libshared/src/Msg.cpp.o: src/CMakeFiles/libshared.dir/flags.make
src/CMakeFiles/libshared.dir/libshared/src/Msg.cpp.o: src/libshared/src/Msg.cpp
src/CMakeFiles/libshared.dir/libshared/src/Msg.cpp.o: src/CMakeFiles/libshared.dir/compiler_depend.ts
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/CMakeFiles --progress-num=$(CMAKE_PROGRESS_10) "Building CXX object src/CMakeFiles/libshared.dir/libshared/src/Msg.cpp.o"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT src/CMakeFiles/libshared.dir/libshared/src/Msg.cpp.o -MF CMakeFiles/libshared.dir/libshared/src/Msg.cpp.o.d -o CMakeFiles/libshared.dir/libshared/src/Msg.cpp.o -c /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src/Msg.cpp
src/CMakeFiles/libshared.dir/libshared/src/Msg.cpp.i: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/libshared.dir/libshared/src/Msg.cpp.i"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src/Msg.cpp > CMakeFiles/libshared.dir/libshared/src/Msg.cpp.i
src/CMakeFiles/libshared.dir/libshared/src/Msg.cpp.s: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/libshared.dir/libshared/src/Msg.cpp.s"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src/Msg.cpp -o CMakeFiles/libshared.dir/libshared/src/Msg.cpp.s
src/CMakeFiles/libshared.dir/libshared/src/Palette.cpp.o: src/CMakeFiles/libshared.dir/flags.make
src/CMakeFiles/libshared.dir/libshared/src/Palette.cpp.o: src/libshared/src/Palette.cpp
src/CMakeFiles/libshared.dir/libshared/src/Palette.cpp.o: src/CMakeFiles/libshared.dir/compiler_depend.ts
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/CMakeFiles --progress-num=$(CMAKE_PROGRESS_11) "Building CXX object src/CMakeFiles/libshared.dir/libshared/src/Palette.cpp.o"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT src/CMakeFiles/libshared.dir/libshared/src/Palette.cpp.o -MF CMakeFiles/libshared.dir/libshared/src/Palette.cpp.o.d -o CMakeFiles/libshared.dir/libshared/src/Palette.cpp.o -c /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src/Palette.cpp
src/CMakeFiles/libshared.dir/libshared/src/Palette.cpp.i: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/libshared.dir/libshared/src/Palette.cpp.i"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src/Palette.cpp > CMakeFiles/libshared.dir/libshared/src/Palette.cpp.i
src/CMakeFiles/libshared.dir/libshared/src/Palette.cpp.s: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/libshared.dir/libshared/src/Palette.cpp.s"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src/Palette.cpp -o CMakeFiles/libshared.dir/libshared/src/Palette.cpp.s
src/CMakeFiles/libshared.dir/libshared/src/Pig.cpp.o: src/CMakeFiles/libshared.dir/flags.make
src/CMakeFiles/libshared.dir/libshared/src/Pig.cpp.o: src/libshared/src/Pig.cpp
src/CMakeFiles/libshared.dir/libshared/src/Pig.cpp.o: src/CMakeFiles/libshared.dir/compiler_depend.ts
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/CMakeFiles --progress-num=$(CMAKE_PROGRESS_12) "Building CXX object src/CMakeFiles/libshared.dir/libshared/src/Pig.cpp.o"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT src/CMakeFiles/libshared.dir/libshared/src/Pig.cpp.o -MF CMakeFiles/libshared.dir/libshared/src/Pig.cpp.o.d -o CMakeFiles/libshared.dir/libshared/src/Pig.cpp.o -c /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src/Pig.cpp
src/CMakeFiles/libshared.dir/libshared/src/Pig.cpp.i: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/libshared.dir/libshared/src/Pig.cpp.i"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src/Pig.cpp > CMakeFiles/libshared.dir/libshared/src/Pig.cpp.i
src/CMakeFiles/libshared.dir/libshared/src/Pig.cpp.s: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/libshared.dir/libshared/src/Pig.cpp.s"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src/Pig.cpp -o CMakeFiles/libshared.dir/libshared/src/Pig.cpp.s
src/CMakeFiles/libshared.dir/libshared/src/RX.cpp.o: src/CMakeFiles/libshared.dir/flags.make
src/CMakeFiles/libshared.dir/libshared/src/RX.cpp.o: src/libshared/src/RX.cpp
src/CMakeFiles/libshared.dir/libshared/src/RX.cpp.o: src/CMakeFiles/libshared.dir/compiler_depend.ts
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/CMakeFiles --progress-num=$(CMAKE_PROGRESS_13) "Building CXX object src/CMakeFiles/libshared.dir/libshared/src/RX.cpp.o"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT src/CMakeFiles/libshared.dir/libshared/src/RX.cpp.o -MF CMakeFiles/libshared.dir/libshared/src/RX.cpp.o.d -o CMakeFiles/libshared.dir/libshared/src/RX.cpp.o -c /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src/RX.cpp
src/CMakeFiles/libshared.dir/libshared/src/RX.cpp.i: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/libshared.dir/libshared/src/RX.cpp.i"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src/RX.cpp > CMakeFiles/libshared.dir/libshared/src/RX.cpp.i
src/CMakeFiles/libshared.dir/libshared/src/RX.cpp.s: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/libshared.dir/libshared/src/RX.cpp.s"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src/RX.cpp -o CMakeFiles/libshared.dir/libshared/src/RX.cpp.s
src/CMakeFiles/libshared.dir/libshared/src/Table.cpp.o: src/CMakeFiles/libshared.dir/flags.make
src/CMakeFiles/libshared.dir/libshared/src/Table.cpp.o: src/libshared/src/Table.cpp
src/CMakeFiles/libshared.dir/libshared/src/Table.cpp.o: src/CMakeFiles/libshared.dir/compiler_depend.ts
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/CMakeFiles --progress-num=$(CMAKE_PROGRESS_14) "Building CXX object src/CMakeFiles/libshared.dir/libshared/src/Table.cpp.o"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT src/CMakeFiles/libshared.dir/libshared/src/Table.cpp.o -MF CMakeFiles/libshared.dir/libshared/src/Table.cpp.o.d -o CMakeFiles/libshared.dir/libshared/src/Table.cpp.o -c /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src/Table.cpp
src/CMakeFiles/libshared.dir/libshared/src/Table.cpp.i: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/libshared.dir/libshared/src/Table.cpp.i"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src/Table.cpp > CMakeFiles/libshared.dir/libshared/src/Table.cpp.i
src/CMakeFiles/libshared.dir/libshared/src/Table.cpp.s: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/libshared.dir/libshared/src/Table.cpp.s"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src/Table.cpp -o CMakeFiles/libshared.dir/libshared/src/Table.cpp.s
src/CMakeFiles/libshared.dir/libshared/src/Timer.cpp.o: src/CMakeFiles/libshared.dir/flags.make
src/CMakeFiles/libshared.dir/libshared/src/Timer.cpp.o: src/libshared/src/Timer.cpp
src/CMakeFiles/libshared.dir/libshared/src/Timer.cpp.o: src/CMakeFiles/libshared.dir/compiler_depend.ts
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/CMakeFiles --progress-num=$(CMAKE_PROGRESS_15) "Building CXX object src/CMakeFiles/libshared.dir/libshared/src/Timer.cpp.o"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT src/CMakeFiles/libshared.dir/libshared/src/Timer.cpp.o -MF CMakeFiles/libshared.dir/libshared/src/Timer.cpp.o.d -o CMakeFiles/libshared.dir/libshared/src/Timer.cpp.o -c /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src/Timer.cpp
src/CMakeFiles/libshared.dir/libshared/src/Timer.cpp.i: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/libshared.dir/libshared/src/Timer.cpp.i"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src/Timer.cpp > CMakeFiles/libshared.dir/libshared/src/Timer.cpp.i
src/CMakeFiles/libshared.dir/libshared/src/Timer.cpp.s: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/libshared.dir/libshared/src/Timer.cpp.s"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src/Timer.cpp -o CMakeFiles/libshared.dir/libshared/src/Timer.cpp.s
src/CMakeFiles/libshared.dir/libshared/src/format.cpp.o: src/CMakeFiles/libshared.dir/flags.make
src/CMakeFiles/libshared.dir/libshared/src/format.cpp.o: src/libshared/src/format.cpp
src/CMakeFiles/libshared.dir/libshared/src/format.cpp.o: src/CMakeFiles/libshared.dir/compiler_depend.ts
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/CMakeFiles --progress-num=$(CMAKE_PROGRESS_16) "Building CXX object src/CMakeFiles/libshared.dir/libshared/src/format.cpp.o"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT src/CMakeFiles/libshared.dir/libshared/src/format.cpp.o -MF CMakeFiles/libshared.dir/libshared/src/format.cpp.o.d -o CMakeFiles/libshared.dir/libshared/src/format.cpp.o -c /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src/format.cpp
src/CMakeFiles/libshared.dir/libshared/src/format.cpp.i: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/libshared.dir/libshared/src/format.cpp.i"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src/format.cpp > CMakeFiles/libshared.dir/libshared/src/format.cpp.i
src/CMakeFiles/libshared.dir/libshared/src/format.cpp.s: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/libshared.dir/libshared/src/format.cpp.s"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src/format.cpp -o CMakeFiles/libshared.dir/libshared/src/format.cpp.s
src/CMakeFiles/libshared.dir/libshared/src/shared.cpp.o: src/CMakeFiles/libshared.dir/flags.make
src/CMakeFiles/libshared.dir/libshared/src/shared.cpp.o: src/libshared/src/shared.cpp
src/CMakeFiles/libshared.dir/libshared/src/shared.cpp.o: src/CMakeFiles/libshared.dir/compiler_depend.ts
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/CMakeFiles --progress-num=$(CMAKE_PROGRESS_17) "Building CXX object src/CMakeFiles/libshared.dir/libshared/src/shared.cpp.o"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT src/CMakeFiles/libshared.dir/libshared/src/shared.cpp.o -MF CMakeFiles/libshared.dir/libshared/src/shared.cpp.o.d -o CMakeFiles/libshared.dir/libshared/src/shared.cpp.o -c /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src/shared.cpp
src/CMakeFiles/libshared.dir/libshared/src/shared.cpp.i: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/libshared.dir/libshared/src/shared.cpp.i"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src/shared.cpp > CMakeFiles/libshared.dir/libshared/src/shared.cpp.i
src/CMakeFiles/libshared.dir/libshared/src/shared.cpp.s: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/libshared.dir/libshared/src/shared.cpp.s"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src/shared.cpp -o CMakeFiles/libshared.dir/libshared/src/shared.cpp.s
src/CMakeFiles/libshared.dir/libshared/src/unicode.cpp.o: src/CMakeFiles/libshared.dir/flags.make
src/CMakeFiles/libshared.dir/libshared/src/unicode.cpp.o: src/libshared/src/unicode.cpp
src/CMakeFiles/libshared.dir/libshared/src/unicode.cpp.o: src/CMakeFiles/libshared.dir/compiler_depend.ts
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/CMakeFiles --progress-num=$(CMAKE_PROGRESS_18) "Building CXX object src/CMakeFiles/libshared.dir/libshared/src/unicode.cpp.o"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT src/CMakeFiles/libshared.dir/libshared/src/unicode.cpp.o -MF CMakeFiles/libshared.dir/libshared/src/unicode.cpp.o.d -o CMakeFiles/libshared.dir/libshared/src/unicode.cpp.o -c /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src/unicode.cpp
src/CMakeFiles/libshared.dir/libshared/src/unicode.cpp.i: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/libshared.dir/libshared/src/unicode.cpp.i"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src/unicode.cpp > CMakeFiles/libshared.dir/libshared/src/unicode.cpp.i
src/CMakeFiles/libshared.dir/libshared/src/unicode.cpp.s: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/libshared.dir/libshared/src/unicode.cpp.s"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src/unicode.cpp -o CMakeFiles/libshared.dir/libshared/src/unicode.cpp.s
src/CMakeFiles/libshared.dir/libshared/src/utf8.cpp.o: src/CMakeFiles/libshared.dir/flags.make
src/CMakeFiles/libshared.dir/libshared/src/utf8.cpp.o: src/libshared/src/utf8.cpp
src/CMakeFiles/libshared.dir/libshared/src/utf8.cpp.o: src/CMakeFiles/libshared.dir/compiler_depend.ts
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/CMakeFiles --progress-num=$(CMAKE_PROGRESS_19) "Building CXX object src/CMakeFiles/libshared.dir/libshared/src/utf8.cpp.o"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT src/CMakeFiles/libshared.dir/libshared/src/utf8.cpp.o -MF CMakeFiles/libshared.dir/libshared/src/utf8.cpp.o.d -o CMakeFiles/libshared.dir/libshared/src/utf8.cpp.o -c /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src/utf8.cpp
src/CMakeFiles/libshared.dir/libshared/src/utf8.cpp.i: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/libshared.dir/libshared/src/utf8.cpp.i"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src/utf8.cpp > CMakeFiles/libshared.dir/libshared/src/utf8.cpp.i
src/CMakeFiles/libshared.dir/libshared/src/utf8.cpp.s: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/libshared.dir/libshared/src/utf8.cpp.s"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src/utf8.cpp -o CMakeFiles/libshared.dir/libshared/src/utf8.cpp.s
# Object files for target libshared
libshared_OBJECTS = \
"CMakeFiles/libshared.dir/libshared/src/Args.cpp.o" \
"CMakeFiles/libshared.dir/libshared/src/Color.cpp.o" \
"CMakeFiles/libshared.dir/libshared/src/Composite.cpp.o" \
"CMakeFiles/libshared.dir/libshared/src/Configuration.cpp.o" \
"CMakeFiles/libshared.dir/libshared/src/Datetime.cpp.o" \
"CMakeFiles/libshared.dir/libshared/src/Duration.cpp.o" \
"CMakeFiles/libshared.dir/libshared/src/FS.cpp.o" \
"CMakeFiles/libshared.dir/libshared/src/JSON.cpp.o" \
"CMakeFiles/libshared.dir/libshared/src/Lexer.cpp.o" \
"CMakeFiles/libshared.dir/libshared/src/Msg.cpp.o" \
"CMakeFiles/libshared.dir/libshared/src/Palette.cpp.o" \
"CMakeFiles/libshared.dir/libshared/src/Pig.cpp.o" \
"CMakeFiles/libshared.dir/libshared/src/RX.cpp.o" \
"CMakeFiles/libshared.dir/libshared/src/Table.cpp.o" \
"CMakeFiles/libshared.dir/libshared/src/Timer.cpp.o" \
"CMakeFiles/libshared.dir/libshared/src/format.cpp.o" \
"CMakeFiles/libshared.dir/libshared/src/shared.cpp.o" \
"CMakeFiles/libshared.dir/libshared/src/unicode.cpp.o" \
"CMakeFiles/libshared.dir/libshared/src/utf8.cpp.o"
# External object files for target libshared
libshared_EXTERNAL_OBJECTS =
src/liblibshared.a: src/CMakeFiles/libshared.dir/libshared/src/Args.cpp.o
src/liblibshared.a: src/CMakeFiles/libshared.dir/libshared/src/Color.cpp.o
src/liblibshared.a: src/CMakeFiles/libshared.dir/libshared/src/Composite.cpp.o
src/liblibshared.a: src/CMakeFiles/libshared.dir/libshared/src/Configuration.cpp.o
src/liblibshared.a: src/CMakeFiles/libshared.dir/libshared/src/Datetime.cpp.o
src/liblibshared.a: src/CMakeFiles/libshared.dir/libshared/src/Duration.cpp.o
src/liblibshared.a: src/CMakeFiles/libshared.dir/libshared/src/FS.cpp.o
src/liblibshared.a: src/CMakeFiles/libshared.dir/libshared/src/JSON.cpp.o
src/liblibshared.a: src/CMakeFiles/libshared.dir/libshared/src/Lexer.cpp.o
src/liblibshared.a: src/CMakeFiles/libshared.dir/libshared/src/Msg.cpp.o
src/liblibshared.a: src/CMakeFiles/libshared.dir/libshared/src/Palette.cpp.o
src/liblibshared.a: src/CMakeFiles/libshared.dir/libshared/src/Pig.cpp.o
src/liblibshared.a: src/CMakeFiles/libshared.dir/libshared/src/RX.cpp.o
src/liblibshared.a: src/CMakeFiles/libshared.dir/libshared/src/Table.cpp.o
src/liblibshared.a: src/CMakeFiles/libshared.dir/libshared/src/Timer.cpp.o
src/liblibshared.a: src/CMakeFiles/libshared.dir/libshared/src/format.cpp.o
src/liblibshared.a: src/CMakeFiles/libshared.dir/libshared/src/shared.cpp.o
src/liblibshared.a: src/CMakeFiles/libshared.dir/libshared/src/unicode.cpp.o
src/liblibshared.a: src/CMakeFiles/libshared.dir/libshared/src/utf8.cpp.o
src/liblibshared.a: src/CMakeFiles/libshared.dir/build.make
src/liblibshared.a: src/CMakeFiles/libshared.dir/link.txt
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --bold --progress-dir=/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/CMakeFiles --progress-num=$(CMAKE_PROGRESS_20) "Linking CXX static library liblibshared.a"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && $(CMAKE_COMMAND) -P CMakeFiles/libshared.dir/cmake_clean_target.cmake
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/libshared.dir/link.txt --verbose=$(VERBOSE)
# Rule to build all files generated by this target.
src/CMakeFiles/libshared.dir/build: src/liblibshared.a
.PHONY : src/CMakeFiles/libshared.dir/build
src/CMakeFiles/libshared.dir/clean:
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && $(CMAKE_COMMAND) -P CMakeFiles/libshared.dir/cmake_clean.cmake
.PHONY : src/CMakeFiles/libshared.dir/clean
src/CMakeFiles/libshared.dir/depend:
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1 && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/jdaugherty/work/pkgs/taskw/timew-1.7.1 /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src /home/jdaugherty/work/pkgs/taskw/timew-1.7.1 /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/CMakeFiles/libshared.dir/DependInfo.cmake --color=$(COLOR)
.PHONY : src/CMakeFiles/libshared.dir/depend

View File

@ -0,0 +1,47 @@
file(REMOVE_RECURSE
"CMakeFiles/libshared.dir/libshared/src/Args.cpp.o"
"CMakeFiles/libshared.dir/libshared/src/Args.cpp.o.d"
"CMakeFiles/libshared.dir/libshared/src/Color.cpp.o"
"CMakeFiles/libshared.dir/libshared/src/Color.cpp.o.d"
"CMakeFiles/libshared.dir/libshared/src/Composite.cpp.o"
"CMakeFiles/libshared.dir/libshared/src/Composite.cpp.o.d"
"CMakeFiles/libshared.dir/libshared/src/Configuration.cpp.o"
"CMakeFiles/libshared.dir/libshared/src/Configuration.cpp.o.d"
"CMakeFiles/libshared.dir/libshared/src/Datetime.cpp.o"
"CMakeFiles/libshared.dir/libshared/src/Datetime.cpp.o.d"
"CMakeFiles/libshared.dir/libshared/src/Duration.cpp.o"
"CMakeFiles/libshared.dir/libshared/src/Duration.cpp.o.d"
"CMakeFiles/libshared.dir/libshared/src/FS.cpp.o"
"CMakeFiles/libshared.dir/libshared/src/FS.cpp.o.d"
"CMakeFiles/libshared.dir/libshared/src/JSON.cpp.o"
"CMakeFiles/libshared.dir/libshared/src/JSON.cpp.o.d"
"CMakeFiles/libshared.dir/libshared/src/Lexer.cpp.o"
"CMakeFiles/libshared.dir/libshared/src/Lexer.cpp.o.d"
"CMakeFiles/libshared.dir/libshared/src/Msg.cpp.o"
"CMakeFiles/libshared.dir/libshared/src/Msg.cpp.o.d"
"CMakeFiles/libshared.dir/libshared/src/Palette.cpp.o"
"CMakeFiles/libshared.dir/libshared/src/Palette.cpp.o.d"
"CMakeFiles/libshared.dir/libshared/src/Pig.cpp.o"
"CMakeFiles/libshared.dir/libshared/src/Pig.cpp.o.d"
"CMakeFiles/libshared.dir/libshared/src/RX.cpp.o"
"CMakeFiles/libshared.dir/libshared/src/RX.cpp.o.d"
"CMakeFiles/libshared.dir/libshared/src/Table.cpp.o"
"CMakeFiles/libshared.dir/libshared/src/Table.cpp.o.d"
"CMakeFiles/libshared.dir/libshared/src/Timer.cpp.o"
"CMakeFiles/libshared.dir/libshared/src/Timer.cpp.o.d"
"CMakeFiles/libshared.dir/libshared/src/format.cpp.o"
"CMakeFiles/libshared.dir/libshared/src/format.cpp.o.d"
"CMakeFiles/libshared.dir/libshared/src/shared.cpp.o"
"CMakeFiles/libshared.dir/libshared/src/shared.cpp.o.d"
"CMakeFiles/libshared.dir/libshared/src/unicode.cpp.o"
"CMakeFiles/libshared.dir/libshared/src/unicode.cpp.o.d"
"CMakeFiles/libshared.dir/libshared/src/utf8.cpp.o"
"CMakeFiles/libshared.dir/libshared/src/utf8.cpp.o.d"
"liblibshared.a"
"liblibshared.pdb"
)
# Per-language clean rules from dependency scanning.
foreach(lang CXX)
include(CMakeFiles/libshared.dir/cmake_clean_${lang}.cmake OPTIONAL)
endforeach()

View File

@ -0,0 +1,3 @@
file(REMOVE_RECURSE
"liblibshared.a"
)

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,2 @@
# CMAKE generated file: DO NOT EDIT!
# Timestamp file for compiler generated dependencies management for libshared.

View File

@ -0,0 +1,2 @@
# Empty dependencies file for libshared.
# This may be replaced when dependencies are built.

View File

@ -0,0 +1,10 @@
# CMAKE generated file: DO NOT EDIT!
# Generated by "Unix Makefiles" Generator, CMake Version 3.23
# compile CXX with /usr/bin/c++
CXX_DEFINES =
CXX_INCLUDES = -I/home/jdaugherty/work/pkgs/taskw/timew-1.7.1 -I/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src -I/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/commands -I/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src
CXX_FLAGS = -Wall -Wextra -Wsign-compare -Wreturn-type -g -std=gnu++17

View File

@ -0,0 +1,2 @@
/usr/bin/ar qc liblibshared.a CMakeFiles/libshared.dir/libshared/src/Args.cpp.o CMakeFiles/libshared.dir/libshared/src/Color.cpp.o CMakeFiles/libshared.dir/libshared/src/Composite.cpp.o CMakeFiles/libshared.dir/libshared/src/Configuration.cpp.o CMakeFiles/libshared.dir/libshared/src/Datetime.cpp.o CMakeFiles/libshared.dir/libshared/src/Duration.cpp.o CMakeFiles/libshared.dir/libshared/src/FS.cpp.o CMakeFiles/libshared.dir/libshared/src/JSON.cpp.o CMakeFiles/libshared.dir/libshared/src/Lexer.cpp.o CMakeFiles/libshared.dir/libshared/src/Msg.cpp.o CMakeFiles/libshared.dir/libshared/src/Palette.cpp.o CMakeFiles/libshared.dir/libshared/src/Pig.cpp.o CMakeFiles/libshared.dir/libshared/src/RX.cpp.o CMakeFiles/libshared.dir/libshared/src/Table.cpp.o CMakeFiles/libshared.dir/libshared/src/Timer.cpp.o CMakeFiles/libshared.dir/libshared/src/format.cpp.o CMakeFiles/libshared.dir/libshared/src/shared.cpp.o CMakeFiles/libshared.dir/libshared/src/unicode.cpp.o CMakeFiles/libshared.dir/libshared/src/utf8.cpp.o
/usr/bin/ranlib liblibshared.a

View File

@ -0,0 +1,21 @@
CMAKE_PROGRESS_1 = 36
CMAKE_PROGRESS_2 =
CMAKE_PROGRESS_3 = 37
CMAKE_PROGRESS_4 =
CMAKE_PROGRESS_5 = 38
CMAKE_PROGRESS_6 = 39
CMAKE_PROGRESS_7 =
CMAKE_PROGRESS_8 = 40
CMAKE_PROGRESS_9 =
CMAKE_PROGRESS_10 = 41
CMAKE_PROGRESS_11 = 42
CMAKE_PROGRESS_12 =
CMAKE_PROGRESS_13 = 43
CMAKE_PROGRESS_14 =
CMAKE_PROGRESS_15 = 44
CMAKE_PROGRESS_16 =
CMAKE_PROGRESS_17 = 45
CMAKE_PROGRESS_18 = 46
CMAKE_PROGRESS_19 =
CMAKE_PROGRESS_20 = 47

View File

@ -0,0 +1 @@
57

View File

@ -0,0 +1,56 @@
# Consider dependencies only in project.
set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF)
# The set of languages for which implicit dependencies are needed:
set(CMAKE_DEPENDS_LANGUAGES
)
# The set of dependency files which are needed:
set(CMAKE_DEPENDS_DEPENDENCY_FILES
"/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/AtomicFile.cpp" "src/CMakeFiles/timew.dir/AtomicFile.cpp.o" "gcc" "src/CMakeFiles/timew.dir/AtomicFile.cpp.o.d"
"/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/CLI.cpp" "src/CMakeFiles/timew.dir/CLI.cpp.o" "gcc" "src/CMakeFiles/timew.dir/CLI.cpp.o.d"
"/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/Chart.cpp" "src/CMakeFiles/timew.dir/Chart.cpp.o" "gcc" "src/CMakeFiles/timew.dir/Chart.cpp.o.d"
"/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/Database.cpp" "src/CMakeFiles/timew.dir/Database.cpp.o" "gcc" "src/CMakeFiles/timew.dir/Database.cpp.o.d"
"/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/Datafile.cpp" "src/CMakeFiles/timew.dir/Datafile.cpp.o" "gcc" "src/CMakeFiles/timew.dir/Datafile.cpp.o.d"
"/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/DatetimeParser.cpp" "src/CMakeFiles/timew.dir/DatetimeParser.cpp.o" "gcc" "src/CMakeFiles/timew.dir/DatetimeParser.cpp.o.d"
"/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/Exclusion.cpp" "src/CMakeFiles/timew.dir/Exclusion.cpp.o" "gcc" "src/CMakeFiles/timew.dir/Exclusion.cpp.o.d"
"/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/Extensions.cpp" "src/CMakeFiles/timew.dir/Extensions.cpp.o" "gcc" "src/CMakeFiles/timew.dir/Extensions.cpp.o.d"
"/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/ExtensionsTable.cpp" "src/CMakeFiles/timew.dir/ExtensionsTable.cpp.o" "gcc" "src/CMakeFiles/timew.dir/ExtensionsTable.cpp.o.d"
"/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/GapsTable.cpp" "src/CMakeFiles/timew.dir/GapsTable.cpp.o" "gcc" "src/CMakeFiles/timew.dir/GapsTable.cpp.o.d"
"/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/Interval.cpp" "src/CMakeFiles/timew.dir/Interval.cpp.o" "gcc" "src/CMakeFiles/timew.dir/Interval.cpp.o.d"
"/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/IntervalFactory.cpp" "src/CMakeFiles/timew.dir/IntervalFactory.cpp.o" "gcc" "src/CMakeFiles/timew.dir/IntervalFactory.cpp.o.d"
"/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/IntervalFilter.cpp" "src/CMakeFiles/timew.dir/IntervalFilter.cpp.o" "gcc" "src/CMakeFiles/timew.dir/IntervalFilter.cpp.o.d"
"/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/IntervalFilterAllInRange.cpp" "src/CMakeFiles/timew.dir/IntervalFilterAllInRange.cpp.o" "gcc" "src/CMakeFiles/timew.dir/IntervalFilterAllInRange.cpp.o.d"
"/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/IntervalFilterAllWithIds.cpp" "src/CMakeFiles/timew.dir/IntervalFilterAllWithIds.cpp.o" "gcc" "src/CMakeFiles/timew.dir/IntervalFilterAllWithIds.cpp.o.d"
"/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/IntervalFilterAllWithTags.cpp" "src/CMakeFiles/timew.dir/IntervalFilterAllWithTags.cpp.o" "gcc" "src/CMakeFiles/timew.dir/IntervalFilterAllWithTags.cpp.o.d"
"/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/IntervalFilterAndGroup.cpp" "src/CMakeFiles/timew.dir/IntervalFilterAndGroup.cpp.o" "gcc" "src/CMakeFiles/timew.dir/IntervalFilterAndGroup.cpp.o.d"
"/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/IntervalFilterFirstOf.cpp" "src/CMakeFiles/timew.dir/IntervalFilterFirstOf.cpp.o" "gcc" "src/CMakeFiles/timew.dir/IntervalFilterFirstOf.cpp.o.d"
"/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/IntervalFilterTagsDisjoint.cpp" "src/CMakeFiles/timew.dir/IntervalFilterTagsDisjoint.cpp.o" "gcc" "src/CMakeFiles/timew.dir/IntervalFilterTagsDisjoint.cpp.o.d"
"/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/Journal.cpp" "src/CMakeFiles/timew.dir/Journal.cpp.o" "gcc" "src/CMakeFiles/timew.dir/Journal.cpp.o.d"
"/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/Range.cpp" "src/CMakeFiles/timew.dir/Range.cpp.o" "gcc" "src/CMakeFiles/timew.dir/Range.cpp.o.d"
"/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/Rules.cpp" "src/CMakeFiles/timew.dir/Rules.cpp.o" "gcc" "src/CMakeFiles/timew.dir/Rules.cpp.o.d"
"/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/SummaryTable.cpp" "src/CMakeFiles/timew.dir/SummaryTable.cpp.o" "gcc" "src/CMakeFiles/timew.dir/SummaryTable.cpp.o.d"
"/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/TagDescription.cpp" "src/CMakeFiles/timew.dir/TagDescription.cpp.o" "gcc" "src/CMakeFiles/timew.dir/TagDescription.cpp.o.d"
"/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/TagInfo.cpp" "src/CMakeFiles/timew.dir/TagInfo.cpp.o" "gcc" "src/CMakeFiles/timew.dir/TagInfo.cpp.o.d"
"/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/TagInfoDatabase.cpp" "src/CMakeFiles/timew.dir/TagInfoDatabase.cpp.o" "gcc" "src/CMakeFiles/timew.dir/TagInfoDatabase.cpp.o.d"
"/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/TagsTable.cpp" "src/CMakeFiles/timew.dir/TagsTable.cpp.o" "gcc" "src/CMakeFiles/timew.dir/TagsTable.cpp.o.d"
"/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/Transaction.cpp" "src/CMakeFiles/timew.dir/Transaction.cpp.o" "gcc" "src/CMakeFiles/timew.dir/Transaction.cpp.o.d"
"/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/TransactionsFactory.cpp" "src/CMakeFiles/timew.dir/TransactionsFactory.cpp.o" "gcc" "src/CMakeFiles/timew.dir/TransactionsFactory.cpp.o.d"
"/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/UndoAction.cpp" "src/CMakeFiles/timew.dir/UndoAction.cpp.o" "gcc" "src/CMakeFiles/timew.dir/UndoAction.cpp.o.d"
"/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/data.cpp" "src/CMakeFiles/timew.dir/data.cpp.o" "gcc" "src/CMakeFiles/timew.dir/data.cpp.o.d"
"/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/dom.cpp" "src/CMakeFiles/timew.dir/dom.cpp.o" "gcc" "src/CMakeFiles/timew.dir/dom.cpp.o.d"
"/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/helper.cpp" "src/CMakeFiles/timew.dir/helper.cpp.o" "gcc" "src/CMakeFiles/timew.dir/helper.cpp.o.d"
"/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/init.cpp" "src/CMakeFiles/timew.dir/init.cpp.o" "gcc" "src/CMakeFiles/timew.dir/init.cpp.o.d"
"/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/log.cpp" "src/CMakeFiles/timew.dir/log.cpp.o" "gcc" "src/CMakeFiles/timew.dir/log.cpp.o.d"
"/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/paths.cpp" "src/CMakeFiles/timew.dir/paths.cpp.o" "gcc" "src/CMakeFiles/timew.dir/paths.cpp.o.d"
"/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/util.cpp" "src/CMakeFiles/timew.dir/util.cpp.o" "gcc" "src/CMakeFiles/timew.dir/util.cpp.o.d"
"/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/validate.cpp" "src/CMakeFiles/timew.dir/validate.cpp.o" "gcc" "src/CMakeFiles/timew.dir/validate.cpp.o.d"
)
# Targets to which this target links.
set(CMAKE_TARGET_LINKED_INFO_FILES
)
# Fortran module output directory.
set(CMAKE_Fortran_TARGET_MODULE_DIR "")

View File

@ -0,0 +1,703 @@
# CMAKE generated file: DO NOT EDIT!
# Generated by "Unix Makefiles" Generator, CMake Version 3.23
# Delete rule output on recipe failure.
.DELETE_ON_ERROR:
#=============================================================================
# Special targets provided by cmake.
# Disable implicit rules so canonical targets will work.
.SUFFIXES:
# Disable VCS-based implicit rules.
% : %,v
# Disable VCS-based implicit rules.
% : RCS/%
# Disable VCS-based implicit rules.
% : RCS/%,v
# Disable VCS-based implicit rules.
% : SCCS/s.%
# Disable VCS-based implicit rules.
% : s.%
.SUFFIXES: .hpux_make_needs_suffix_list
# Command-line flag to silence nested $(MAKE).
$(VERBOSE)MAKESILENT = -s
#Suppress display of executed commands.
$(VERBOSE).SILENT:
# A target that is always out of date.
cmake_force:
.PHONY : cmake_force
#=============================================================================
# Set environment variables for the build.
# The shell in which to execute make rules.
SHELL = /bin/sh
# The CMake executable.
CMAKE_COMMAND = /usr/local/bin/cmake
# The command to remove a file.
RM = /usr/local/bin/cmake -E rm -f
# Escaping for special characters.
EQUALS = =
# The top-level source directory on which CMake was run.
CMAKE_SOURCE_DIR = /home/jdaugherty/work/pkgs/taskw/timew-1.7.1
# The top-level build directory on which CMake was run.
CMAKE_BINARY_DIR = /home/jdaugherty/work/pkgs/taskw/timew-1.7.1
# Include any dependencies generated for this target.
include src/CMakeFiles/timew.dir/depend.make
# Include any dependencies generated by the compiler for this target.
include src/CMakeFiles/timew.dir/compiler_depend.make
# Include the progress variables for this target.
include src/CMakeFiles/timew.dir/progress.make
# Include the compile flags for this target's objects.
include src/CMakeFiles/timew.dir/flags.make
src/CMakeFiles/timew.dir/AtomicFile.cpp.o: src/CMakeFiles/timew.dir/flags.make
src/CMakeFiles/timew.dir/AtomicFile.cpp.o: src/AtomicFile.cpp
src/CMakeFiles/timew.dir/AtomicFile.cpp.o: src/CMakeFiles/timew.dir/compiler_depend.ts
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Building CXX object src/CMakeFiles/timew.dir/AtomicFile.cpp.o"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT src/CMakeFiles/timew.dir/AtomicFile.cpp.o -MF CMakeFiles/timew.dir/AtomicFile.cpp.o.d -o CMakeFiles/timew.dir/AtomicFile.cpp.o -c /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/AtomicFile.cpp
src/CMakeFiles/timew.dir/AtomicFile.cpp.i: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/timew.dir/AtomicFile.cpp.i"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/AtomicFile.cpp > CMakeFiles/timew.dir/AtomicFile.cpp.i
src/CMakeFiles/timew.dir/AtomicFile.cpp.s: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/timew.dir/AtomicFile.cpp.s"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/AtomicFile.cpp -o CMakeFiles/timew.dir/AtomicFile.cpp.s
src/CMakeFiles/timew.dir/CLI.cpp.o: src/CMakeFiles/timew.dir/flags.make
src/CMakeFiles/timew.dir/CLI.cpp.o: src/CLI.cpp
src/CMakeFiles/timew.dir/CLI.cpp.o: src/CMakeFiles/timew.dir/compiler_depend.ts
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/CMakeFiles --progress-num=$(CMAKE_PROGRESS_2) "Building CXX object src/CMakeFiles/timew.dir/CLI.cpp.o"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT src/CMakeFiles/timew.dir/CLI.cpp.o -MF CMakeFiles/timew.dir/CLI.cpp.o.d -o CMakeFiles/timew.dir/CLI.cpp.o -c /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/CLI.cpp
src/CMakeFiles/timew.dir/CLI.cpp.i: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/timew.dir/CLI.cpp.i"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/CLI.cpp > CMakeFiles/timew.dir/CLI.cpp.i
src/CMakeFiles/timew.dir/CLI.cpp.s: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/timew.dir/CLI.cpp.s"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/CLI.cpp -o CMakeFiles/timew.dir/CLI.cpp.s
src/CMakeFiles/timew.dir/Chart.cpp.o: src/CMakeFiles/timew.dir/flags.make
src/CMakeFiles/timew.dir/Chart.cpp.o: src/Chart.cpp
src/CMakeFiles/timew.dir/Chart.cpp.o: src/CMakeFiles/timew.dir/compiler_depend.ts
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/CMakeFiles --progress-num=$(CMAKE_PROGRESS_3) "Building CXX object src/CMakeFiles/timew.dir/Chart.cpp.o"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT src/CMakeFiles/timew.dir/Chart.cpp.o -MF CMakeFiles/timew.dir/Chart.cpp.o.d -o CMakeFiles/timew.dir/Chart.cpp.o -c /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/Chart.cpp
src/CMakeFiles/timew.dir/Chart.cpp.i: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/timew.dir/Chart.cpp.i"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/Chart.cpp > CMakeFiles/timew.dir/Chart.cpp.i
src/CMakeFiles/timew.dir/Chart.cpp.s: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/timew.dir/Chart.cpp.s"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/Chart.cpp -o CMakeFiles/timew.dir/Chart.cpp.s
src/CMakeFiles/timew.dir/Database.cpp.o: src/CMakeFiles/timew.dir/flags.make
src/CMakeFiles/timew.dir/Database.cpp.o: src/Database.cpp
src/CMakeFiles/timew.dir/Database.cpp.o: src/CMakeFiles/timew.dir/compiler_depend.ts
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/CMakeFiles --progress-num=$(CMAKE_PROGRESS_4) "Building CXX object src/CMakeFiles/timew.dir/Database.cpp.o"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT src/CMakeFiles/timew.dir/Database.cpp.o -MF CMakeFiles/timew.dir/Database.cpp.o.d -o CMakeFiles/timew.dir/Database.cpp.o -c /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/Database.cpp
src/CMakeFiles/timew.dir/Database.cpp.i: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/timew.dir/Database.cpp.i"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/Database.cpp > CMakeFiles/timew.dir/Database.cpp.i
src/CMakeFiles/timew.dir/Database.cpp.s: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/timew.dir/Database.cpp.s"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/Database.cpp -o CMakeFiles/timew.dir/Database.cpp.s
src/CMakeFiles/timew.dir/Datafile.cpp.o: src/CMakeFiles/timew.dir/flags.make
src/CMakeFiles/timew.dir/Datafile.cpp.o: src/Datafile.cpp
src/CMakeFiles/timew.dir/Datafile.cpp.o: src/CMakeFiles/timew.dir/compiler_depend.ts
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/CMakeFiles --progress-num=$(CMAKE_PROGRESS_5) "Building CXX object src/CMakeFiles/timew.dir/Datafile.cpp.o"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT src/CMakeFiles/timew.dir/Datafile.cpp.o -MF CMakeFiles/timew.dir/Datafile.cpp.o.d -o CMakeFiles/timew.dir/Datafile.cpp.o -c /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/Datafile.cpp
src/CMakeFiles/timew.dir/Datafile.cpp.i: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/timew.dir/Datafile.cpp.i"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/Datafile.cpp > CMakeFiles/timew.dir/Datafile.cpp.i
src/CMakeFiles/timew.dir/Datafile.cpp.s: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/timew.dir/Datafile.cpp.s"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/Datafile.cpp -o CMakeFiles/timew.dir/Datafile.cpp.s
src/CMakeFiles/timew.dir/DatetimeParser.cpp.o: src/CMakeFiles/timew.dir/flags.make
src/CMakeFiles/timew.dir/DatetimeParser.cpp.o: src/DatetimeParser.cpp
src/CMakeFiles/timew.dir/DatetimeParser.cpp.o: src/CMakeFiles/timew.dir/compiler_depend.ts
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/CMakeFiles --progress-num=$(CMAKE_PROGRESS_6) "Building CXX object src/CMakeFiles/timew.dir/DatetimeParser.cpp.o"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT src/CMakeFiles/timew.dir/DatetimeParser.cpp.o -MF CMakeFiles/timew.dir/DatetimeParser.cpp.o.d -o CMakeFiles/timew.dir/DatetimeParser.cpp.o -c /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/DatetimeParser.cpp
src/CMakeFiles/timew.dir/DatetimeParser.cpp.i: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/timew.dir/DatetimeParser.cpp.i"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/DatetimeParser.cpp > CMakeFiles/timew.dir/DatetimeParser.cpp.i
src/CMakeFiles/timew.dir/DatetimeParser.cpp.s: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/timew.dir/DatetimeParser.cpp.s"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/DatetimeParser.cpp -o CMakeFiles/timew.dir/DatetimeParser.cpp.s
src/CMakeFiles/timew.dir/Exclusion.cpp.o: src/CMakeFiles/timew.dir/flags.make
src/CMakeFiles/timew.dir/Exclusion.cpp.o: src/Exclusion.cpp
src/CMakeFiles/timew.dir/Exclusion.cpp.o: src/CMakeFiles/timew.dir/compiler_depend.ts
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/CMakeFiles --progress-num=$(CMAKE_PROGRESS_7) "Building CXX object src/CMakeFiles/timew.dir/Exclusion.cpp.o"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT src/CMakeFiles/timew.dir/Exclusion.cpp.o -MF CMakeFiles/timew.dir/Exclusion.cpp.o.d -o CMakeFiles/timew.dir/Exclusion.cpp.o -c /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/Exclusion.cpp
src/CMakeFiles/timew.dir/Exclusion.cpp.i: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/timew.dir/Exclusion.cpp.i"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/Exclusion.cpp > CMakeFiles/timew.dir/Exclusion.cpp.i
src/CMakeFiles/timew.dir/Exclusion.cpp.s: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/timew.dir/Exclusion.cpp.s"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/Exclusion.cpp -o CMakeFiles/timew.dir/Exclusion.cpp.s
src/CMakeFiles/timew.dir/Extensions.cpp.o: src/CMakeFiles/timew.dir/flags.make
src/CMakeFiles/timew.dir/Extensions.cpp.o: src/Extensions.cpp
src/CMakeFiles/timew.dir/Extensions.cpp.o: src/CMakeFiles/timew.dir/compiler_depend.ts
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/CMakeFiles --progress-num=$(CMAKE_PROGRESS_8) "Building CXX object src/CMakeFiles/timew.dir/Extensions.cpp.o"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT src/CMakeFiles/timew.dir/Extensions.cpp.o -MF CMakeFiles/timew.dir/Extensions.cpp.o.d -o CMakeFiles/timew.dir/Extensions.cpp.o -c /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/Extensions.cpp
src/CMakeFiles/timew.dir/Extensions.cpp.i: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/timew.dir/Extensions.cpp.i"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/Extensions.cpp > CMakeFiles/timew.dir/Extensions.cpp.i
src/CMakeFiles/timew.dir/Extensions.cpp.s: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/timew.dir/Extensions.cpp.s"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/Extensions.cpp -o CMakeFiles/timew.dir/Extensions.cpp.s
src/CMakeFiles/timew.dir/ExtensionsTable.cpp.o: src/CMakeFiles/timew.dir/flags.make
src/CMakeFiles/timew.dir/ExtensionsTable.cpp.o: src/ExtensionsTable.cpp
src/CMakeFiles/timew.dir/ExtensionsTable.cpp.o: src/CMakeFiles/timew.dir/compiler_depend.ts
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/CMakeFiles --progress-num=$(CMAKE_PROGRESS_9) "Building CXX object src/CMakeFiles/timew.dir/ExtensionsTable.cpp.o"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT src/CMakeFiles/timew.dir/ExtensionsTable.cpp.o -MF CMakeFiles/timew.dir/ExtensionsTable.cpp.o.d -o CMakeFiles/timew.dir/ExtensionsTable.cpp.o -c /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/ExtensionsTable.cpp
src/CMakeFiles/timew.dir/ExtensionsTable.cpp.i: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/timew.dir/ExtensionsTable.cpp.i"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/ExtensionsTable.cpp > CMakeFiles/timew.dir/ExtensionsTable.cpp.i
src/CMakeFiles/timew.dir/ExtensionsTable.cpp.s: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/timew.dir/ExtensionsTable.cpp.s"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/ExtensionsTable.cpp -o CMakeFiles/timew.dir/ExtensionsTable.cpp.s
src/CMakeFiles/timew.dir/GapsTable.cpp.o: src/CMakeFiles/timew.dir/flags.make
src/CMakeFiles/timew.dir/GapsTable.cpp.o: src/GapsTable.cpp
src/CMakeFiles/timew.dir/GapsTable.cpp.o: src/CMakeFiles/timew.dir/compiler_depend.ts
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/CMakeFiles --progress-num=$(CMAKE_PROGRESS_10) "Building CXX object src/CMakeFiles/timew.dir/GapsTable.cpp.o"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT src/CMakeFiles/timew.dir/GapsTable.cpp.o -MF CMakeFiles/timew.dir/GapsTable.cpp.o.d -o CMakeFiles/timew.dir/GapsTable.cpp.o -c /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/GapsTable.cpp
src/CMakeFiles/timew.dir/GapsTable.cpp.i: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/timew.dir/GapsTable.cpp.i"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/GapsTable.cpp > CMakeFiles/timew.dir/GapsTable.cpp.i
src/CMakeFiles/timew.dir/GapsTable.cpp.s: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/timew.dir/GapsTable.cpp.s"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/GapsTable.cpp -o CMakeFiles/timew.dir/GapsTable.cpp.s
src/CMakeFiles/timew.dir/Interval.cpp.o: src/CMakeFiles/timew.dir/flags.make
src/CMakeFiles/timew.dir/Interval.cpp.o: src/Interval.cpp
src/CMakeFiles/timew.dir/Interval.cpp.o: src/CMakeFiles/timew.dir/compiler_depend.ts
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/CMakeFiles --progress-num=$(CMAKE_PROGRESS_11) "Building CXX object src/CMakeFiles/timew.dir/Interval.cpp.o"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT src/CMakeFiles/timew.dir/Interval.cpp.o -MF CMakeFiles/timew.dir/Interval.cpp.o.d -o CMakeFiles/timew.dir/Interval.cpp.o -c /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/Interval.cpp
src/CMakeFiles/timew.dir/Interval.cpp.i: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/timew.dir/Interval.cpp.i"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/Interval.cpp > CMakeFiles/timew.dir/Interval.cpp.i
src/CMakeFiles/timew.dir/Interval.cpp.s: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/timew.dir/Interval.cpp.s"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/Interval.cpp -o CMakeFiles/timew.dir/Interval.cpp.s
src/CMakeFiles/timew.dir/IntervalFactory.cpp.o: src/CMakeFiles/timew.dir/flags.make
src/CMakeFiles/timew.dir/IntervalFactory.cpp.o: src/IntervalFactory.cpp
src/CMakeFiles/timew.dir/IntervalFactory.cpp.o: src/CMakeFiles/timew.dir/compiler_depend.ts
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/CMakeFiles --progress-num=$(CMAKE_PROGRESS_12) "Building CXX object src/CMakeFiles/timew.dir/IntervalFactory.cpp.o"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT src/CMakeFiles/timew.dir/IntervalFactory.cpp.o -MF CMakeFiles/timew.dir/IntervalFactory.cpp.o.d -o CMakeFiles/timew.dir/IntervalFactory.cpp.o -c /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/IntervalFactory.cpp
src/CMakeFiles/timew.dir/IntervalFactory.cpp.i: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/timew.dir/IntervalFactory.cpp.i"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/IntervalFactory.cpp > CMakeFiles/timew.dir/IntervalFactory.cpp.i
src/CMakeFiles/timew.dir/IntervalFactory.cpp.s: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/timew.dir/IntervalFactory.cpp.s"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/IntervalFactory.cpp -o CMakeFiles/timew.dir/IntervalFactory.cpp.s
src/CMakeFiles/timew.dir/IntervalFilter.cpp.o: src/CMakeFiles/timew.dir/flags.make
src/CMakeFiles/timew.dir/IntervalFilter.cpp.o: src/IntervalFilter.cpp
src/CMakeFiles/timew.dir/IntervalFilter.cpp.o: src/CMakeFiles/timew.dir/compiler_depend.ts
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/CMakeFiles --progress-num=$(CMAKE_PROGRESS_13) "Building CXX object src/CMakeFiles/timew.dir/IntervalFilter.cpp.o"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT src/CMakeFiles/timew.dir/IntervalFilter.cpp.o -MF CMakeFiles/timew.dir/IntervalFilter.cpp.o.d -o CMakeFiles/timew.dir/IntervalFilter.cpp.o -c /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/IntervalFilter.cpp
src/CMakeFiles/timew.dir/IntervalFilter.cpp.i: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/timew.dir/IntervalFilter.cpp.i"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/IntervalFilter.cpp > CMakeFiles/timew.dir/IntervalFilter.cpp.i
src/CMakeFiles/timew.dir/IntervalFilter.cpp.s: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/timew.dir/IntervalFilter.cpp.s"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/IntervalFilter.cpp -o CMakeFiles/timew.dir/IntervalFilter.cpp.s
src/CMakeFiles/timew.dir/IntervalFilterAndGroup.cpp.o: src/CMakeFiles/timew.dir/flags.make
src/CMakeFiles/timew.dir/IntervalFilterAndGroup.cpp.o: src/IntervalFilterAndGroup.cpp
src/CMakeFiles/timew.dir/IntervalFilterAndGroup.cpp.o: src/CMakeFiles/timew.dir/compiler_depend.ts
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/CMakeFiles --progress-num=$(CMAKE_PROGRESS_14) "Building CXX object src/CMakeFiles/timew.dir/IntervalFilterAndGroup.cpp.o"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT src/CMakeFiles/timew.dir/IntervalFilterAndGroup.cpp.o -MF CMakeFiles/timew.dir/IntervalFilterAndGroup.cpp.o.d -o CMakeFiles/timew.dir/IntervalFilterAndGroup.cpp.o -c /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/IntervalFilterAndGroup.cpp
src/CMakeFiles/timew.dir/IntervalFilterAndGroup.cpp.i: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/timew.dir/IntervalFilterAndGroup.cpp.i"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/IntervalFilterAndGroup.cpp > CMakeFiles/timew.dir/IntervalFilterAndGroup.cpp.i
src/CMakeFiles/timew.dir/IntervalFilterAndGroup.cpp.s: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/timew.dir/IntervalFilterAndGroup.cpp.s"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/IntervalFilterAndGroup.cpp -o CMakeFiles/timew.dir/IntervalFilterAndGroup.cpp.s
src/CMakeFiles/timew.dir/IntervalFilterAllInRange.cpp.o: src/CMakeFiles/timew.dir/flags.make
src/CMakeFiles/timew.dir/IntervalFilterAllInRange.cpp.o: src/IntervalFilterAllInRange.cpp
src/CMakeFiles/timew.dir/IntervalFilterAllInRange.cpp.o: src/CMakeFiles/timew.dir/compiler_depend.ts
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/CMakeFiles --progress-num=$(CMAKE_PROGRESS_15) "Building CXX object src/CMakeFiles/timew.dir/IntervalFilterAllInRange.cpp.o"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT src/CMakeFiles/timew.dir/IntervalFilterAllInRange.cpp.o -MF CMakeFiles/timew.dir/IntervalFilterAllInRange.cpp.o.d -o CMakeFiles/timew.dir/IntervalFilterAllInRange.cpp.o -c /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/IntervalFilterAllInRange.cpp
src/CMakeFiles/timew.dir/IntervalFilterAllInRange.cpp.i: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/timew.dir/IntervalFilterAllInRange.cpp.i"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/IntervalFilterAllInRange.cpp > CMakeFiles/timew.dir/IntervalFilterAllInRange.cpp.i
src/CMakeFiles/timew.dir/IntervalFilterAllInRange.cpp.s: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/timew.dir/IntervalFilterAllInRange.cpp.s"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/IntervalFilterAllInRange.cpp -o CMakeFiles/timew.dir/IntervalFilterAllInRange.cpp.s
src/CMakeFiles/timew.dir/IntervalFilterAllWithIds.cpp.o: src/CMakeFiles/timew.dir/flags.make
src/CMakeFiles/timew.dir/IntervalFilterAllWithIds.cpp.o: src/IntervalFilterAllWithIds.cpp
src/CMakeFiles/timew.dir/IntervalFilterAllWithIds.cpp.o: src/CMakeFiles/timew.dir/compiler_depend.ts
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/CMakeFiles --progress-num=$(CMAKE_PROGRESS_16) "Building CXX object src/CMakeFiles/timew.dir/IntervalFilterAllWithIds.cpp.o"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT src/CMakeFiles/timew.dir/IntervalFilterAllWithIds.cpp.o -MF CMakeFiles/timew.dir/IntervalFilterAllWithIds.cpp.o.d -o CMakeFiles/timew.dir/IntervalFilterAllWithIds.cpp.o -c /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/IntervalFilterAllWithIds.cpp
src/CMakeFiles/timew.dir/IntervalFilterAllWithIds.cpp.i: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/timew.dir/IntervalFilterAllWithIds.cpp.i"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/IntervalFilterAllWithIds.cpp > CMakeFiles/timew.dir/IntervalFilterAllWithIds.cpp.i
src/CMakeFiles/timew.dir/IntervalFilterAllWithIds.cpp.s: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/timew.dir/IntervalFilterAllWithIds.cpp.s"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/IntervalFilterAllWithIds.cpp -o CMakeFiles/timew.dir/IntervalFilterAllWithIds.cpp.s
src/CMakeFiles/timew.dir/IntervalFilterAllWithTags.cpp.o: src/CMakeFiles/timew.dir/flags.make
src/CMakeFiles/timew.dir/IntervalFilterAllWithTags.cpp.o: src/IntervalFilterAllWithTags.cpp
src/CMakeFiles/timew.dir/IntervalFilterAllWithTags.cpp.o: src/CMakeFiles/timew.dir/compiler_depend.ts
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/CMakeFiles --progress-num=$(CMAKE_PROGRESS_17) "Building CXX object src/CMakeFiles/timew.dir/IntervalFilterAllWithTags.cpp.o"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT src/CMakeFiles/timew.dir/IntervalFilterAllWithTags.cpp.o -MF CMakeFiles/timew.dir/IntervalFilterAllWithTags.cpp.o.d -o CMakeFiles/timew.dir/IntervalFilterAllWithTags.cpp.o -c /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/IntervalFilterAllWithTags.cpp
src/CMakeFiles/timew.dir/IntervalFilterAllWithTags.cpp.i: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/timew.dir/IntervalFilterAllWithTags.cpp.i"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/IntervalFilterAllWithTags.cpp > CMakeFiles/timew.dir/IntervalFilterAllWithTags.cpp.i
src/CMakeFiles/timew.dir/IntervalFilterAllWithTags.cpp.s: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/timew.dir/IntervalFilterAllWithTags.cpp.s"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/IntervalFilterAllWithTags.cpp -o CMakeFiles/timew.dir/IntervalFilterAllWithTags.cpp.s
src/CMakeFiles/timew.dir/IntervalFilterTagsDisjoint.cpp.o: src/CMakeFiles/timew.dir/flags.make
src/CMakeFiles/timew.dir/IntervalFilterTagsDisjoint.cpp.o: src/IntervalFilterTagsDisjoint.cpp
src/CMakeFiles/timew.dir/IntervalFilterTagsDisjoint.cpp.o: src/CMakeFiles/timew.dir/compiler_depend.ts
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/CMakeFiles --progress-num=$(CMAKE_PROGRESS_18) "Building CXX object src/CMakeFiles/timew.dir/IntervalFilterTagsDisjoint.cpp.o"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT src/CMakeFiles/timew.dir/IntervalFilterTagsDisjoint.cpp.o -MF CMakeFiles/timew.dir/IntervalFilterTagsDisjoint.cpp.o.d -o CMakeFiles/timew.dir/IntervalFilterTagsDisjoint.cpp.o -c /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/IntervalFilterTagsDisjoint.cpp
src/CMakeFiles/timew.dir/IntervalFilterTagsDisjoint.cpp.i: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/timew.dir/IntervalFilterTagsDisjoint.cpp.i"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/IntervalFilterTagsDisjoint.cpp > CMakeFiles/timew.dir/IntervalFilterTagsDisjoint.cpp.i
src/CMakeFiles/timew.dir/IntervalFilterTagsDisjoint.cpp.s: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/timew.dir/IntervalFilterTagsDisjoint.cpp.s"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/IntervalFilterTagsDisjoint.cpp -o CMakeFiles/timew.dir/IntervalFilterTagsDisjoint.cpp.s
src/CMakeFiles/timew.dir/IntervalFilterFirstOf.cpp.o: src/CMakeFiles/timew.dir/flags.make
src/CMakeFiles/timew.dir/IntervalFilterFirstOf.cpp.o: src/IntervalFilterFirstOf.cpp
src/CMakeFiles/timew.dir/IntervalFilterFirstOf.cpp.o: src/CMakeFiles/timew.dir/compiler_depend.ts
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/CMakeFiles --progress-num=$(CMAKE_PROGRESS_19) "Building CXX object src/CMakeFiles/timew.dir/IntervalFilterFirstOf.cpp.o"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT src/CMakeFiles/timew.dir/IntervalFilterFirstOf.cpp.o -MF CMakeFiles/timew.dir/IntervalFilterFirstOf.cpp.o.d -o CMakeFiles/timew.dir/IntervalFilterFirstOf.cpp.o -c /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/IntervalFilterFirstOf.cpp
src/CMakeFiles/timew.dir/IntervalFilterFirstOf.cpp.i: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/timew.dir/IntervalFilterFirstOf.cpp.i"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/IntervalFilterFirstOf.cpp > CMakeFiles/timew.dir/IntervalFilterFirstOf.cpp.i
src/CMakeFiles/timew.dir/IntervalFilterFirstOf.cpp.s: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/timew.dir/IntervalFilterFirstOf.cpp.s"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/IntervalFilterFirstOf.cpp -o CMakeFiles/timew.dir/IntervalFilterFirstOf.cpp.s
src/CMakeFiles/timew.dir/Journal.cpp.o: src/CMakeFiles/timew.dir/flags.make
src/CMakeFiles/timew.dir/Journal.cpp.o: src/Journal.cpp
src/CMakeFiles/timew.dir/Journal.cpp.o: src/CMakeFiles/timew.dir/compiler_depend.ts
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/CMakeFiles --progress-num=$(CMAKE_PROGRESS_20) "Building CXX object src/CMakeFiles/timew.dir/Journal.cpp.o"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT src/CMakeFiles/timew.dir/Journal.cpp.o -MF CMakeFiles/timew.dir/Journal.cpp.o.d -o CMakeFiles/timew.dir/Journal.cpp.o -c /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/Journal.cpp
src/CMakeFiles/timew.dir/Journal.cpp.i: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/timew.dir/Journal.cpp.i"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/Journal.cpp > CMakeFiles/timew.dir/Journal.cpp.i
src/CMakeFiles/timew.dir/Journal.cpp.s: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/timew.dir/Journal.cpp.s"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/Journal.cpp -o CMakeFiles/timew.dir/Journal.cpp.s
src/CMakeFiles/timew.dir/Range.cpp.o: src/CMakeFiles/timew.dir/flags.make
src/CMakeFiles/timew.dir/Range.cpp.o: src/Range.cpp
src/CMakeFiles/timew.dir/Range.cpp.o: src/CMakeFiles/timew.dir/compiler_depend.ts
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/CMakeFiles --progress-num=$(CMAKE_PROGRESS_21) "Building CXX object src/CMakeFiles/timew.dir/Range.cpp.o"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT src/CMakeFiles/timew.dir/Range.cpp.o -MF CMakeFiles/timew.dir/Range.cpp.o.d -o CMakeFiles/timew.dir/Range.cpp.o -c /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/Range.cpp
src/CMakeFiles/timew.dir/Range.cpp.i: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/timew.dir/Range.cpp.i"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/Range.cpp > CMakeFiles/timew.dir/Range.cpp.i
src/CMakeFiles/timew.dir/Range.cpp.s: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/timew.dir/Range.cpp.s"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/Range.cpp -o CMakeFiles/timew.dir/Range.cpp.s
src/CMakeFiles/timew.dir/Rules.cpp.o: src/CMakeFiles/timew.dir/flags.make
src/CMakeFiles/timew.dir/Rules.cpp.o: src/Rules.cpp
src/CMakeFiles/timew.dir/Rules.cpp.o: src/CMakeFiles/timew.dir/compiler_depend.ts
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/CMakeFiles --progress-num=$(CMAKE_PROGRESS_22) "Building CXX object src/CMakeFiles/timew.dir/Rules.cpp.o"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT src/CMakeFiles/timew.dir/Rules.cpp.o -MF CMakeFiles/timew.dir/Rules.cpp.o.d -o CMakeFiles/timew.dir/Rules.cpp.o -c /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/Rules.cpp
src/CMakeFiles/timew.dir/Rules.cpp.i: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/timew.dir/Rules.cpp.i"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/Rules.cpp > CMakeFiles/timew.dir/Rules.cpp.i
src/CMakeFiles/timew.dir/Rules.cpp.s: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/timew.dir/Rules.cpp.s"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/Rules.cpp -o CMakeFiles/timew.dir/Rules.cpp.s
src/CMakeFiles/timew.dir/SummaryTable.cpp.o: src/CMakeFiles/timew.dir/flags.make
src/CMakeFiles/timew.dir/SummaryTable.cpp.o: src/SummaryTable.cpp
src/CMakeFiles/timew.dir/SummaryTable.cpp.o: src/CMakeFiles/timew.dir/compiler_depend.ts
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/CMakeFiles --progress-num=$(CMAKE_PROGRESS_23) "Building CXX object src/CMakeFiles/timew.dir/SummaryTable.cpp.o"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT src/CMakeFiles/timew.dir/SummaryTable.cpp.o -MF CMakeFiles/timew.dir/SummaryTable.cpp.o.d -o CMakeFiles/timew.dir/SummaryTable.cpp.o -c /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/SummaryTable.cpp
src/CMakeFiles/timew.dir/SummaryTable.cpp.i: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/timew.dir/SummaryTable.cpp.i"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/SummaryTable.cpp > CMakeFiles/timew.dir/SummaryTable.cpp.i
src/CMakeFiles/timew.dir/SummaryTable.cpp.s: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/timew.dir/SummaryTable.cpp.s"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/SummaryTable.cpp -o CMakeFiles/timew.dir/SummaryTable.cpp.s
src/CMakeFiles/timew.dir/TagDescription.cpp.o: src/CMakeFiles/timew.dir/flags.make
src/CMakeFiles/timew.dir/TagDescription.cpp.o: src/TagDescription.cpp
src/CMakeFiles/timew.dir/TagDescription.cpp.o: src/CMakeFiles/timew.dir/compiler_depend.ts
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/CMakeFiles --progress-num=$(CMAKE_PROGRESS_24) "Building CXX object src/CMakeFiles/timew.dir/TagDescription.cpp.o"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT src/CMakeFiles/timew.dir/TagDescription.cpp.o -MF CMakeFiles/timew.dir/TagDescription.cpp.o.d -o CMakeFiles/timew.dir/TagDescription.cpp.o -c /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/TagDescription.cpp
src/CMakeFiles/timew.dir/TagDescription.cpp.i: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/timew.dir/TagDescription.cpp.i"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/TagDescription.cpp > CMakeFiles/timew.dir/TagDescription.cpp.i
src/CMakeFiles/timew.dir/TagDescription.cpp.s: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/timew.dir/TagDescription.cpp.s"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/TagDescription.cpp -o CMakeFiles/timew.dir/TagDescription.cpp.s
src/CMakeFiles/timew.dir/TagInfo.cpp.o: src/CMakeFiles/timew.dir/flags.make
src/CMakeFiles/timew.dir/TagInfo.cpp.o: src/TagInfo.cpp
src/CMakeFiles/timew.dir/TagInfo.cpp.o: src/CMakeFiles/timew.dir/compiler_depend.ts
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/CMakeFiles --progress-num=$(CMAKE_PROGRESS_25) "Building CXX object src/CMakeFiles/timew.dir/TagInfo.cpp.o"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT src/CMakeFiles/timew.dir/TagInfo.cpp.o -MF CMakeFiles/timew.dir/TagInfo.cpp.o.d -o CMakeFiles/timew.dir/TagInfo.cpp.o -c /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/TagInfo.cpp
src/CMakeFiles/timew.dir/TagInfo.cpp.i: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/timew.dir/TagInfo.cpp.i"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/TagInfo.cpp > CMakeFiles/timew.dir/TagInfo.cpp.i
src/CMakeFiles/timew.dir/TagInfo.cpp.s: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/timew.dir/TagInfo.cpp.s"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/TagInfo.cpp -o CMakeFiles/timew.dir/TagInfo.cpp.s
src/CMakeFiles/timew.dir/TagInfoDatabase.cpp.o: src/CMakeFiles/timew.dir/flags.make
src/CMakeFiles/timew.dir/TagInfoDatabase.cpp.o: src/TagInfoDatabase.cpp
src/CMakeFiles/timew.dir/TagInfoDatabase.cpp.o: src/CMakeFiles/timew.dir/compiler_depend.ts
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/CMakeFiles --progress-num=$(CMAKE_PROGRESS_26) "Building CXX object src/CMakeFiles/timew.dir/TagInfoDatabase.cpp.o"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT src/CMakeFiles/timew.dir/TagInfoDatabase.cpp.o -MF CMakeFiles/timew.dir/TagInfoDatabase.cpp.o.d -o CMakeFiles/timew.dir/TagInfoDatabase.cpp.o -c /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/TagInfoDatabase.cpp
src/CMakeFiles/timew.dir/TagInfoDatabase.cpp.i: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/timew.dir/TagInfoDatabase.cpp.i"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/TagInfoDatabase.cpp > CMakeFiles/timew.dir/TagInfoDatabase.cpp.i
src/CMakeFiles/timew.dir/TagInfoDatabase.cpp.s: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/timew.dir/TagInfoDatabase.cpp.s"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/TagInfoDatabase.cpp -o CMakeFiles/timew.dir/TagInfoDatabase.cpp.s
src/CMakeFiles/timew.dir/TagsTable.cpp.o: src/CMakeFiles/timew.dir/flags.make
src/CMakeFiles/timew.dir/TagsTable.cpp.o: src/TagsTable.cpp
src/CMakeFiles/timew.dir/TagsTable.cpp.o: src/CMakeFiles/timew.dir/compiler_depend.ts
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/CMakeFiles --progress-num=$(CMAKE_PROGRESS_27) "Building CXX object src/CMakeFiles/timew.dir/TagsTable.cpp.o"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT src/CMakeFiles/timew.dir/TagsTable.cpp.o -MF CMakeFiles/timew.dir/TagsTable.cpp.o.d -o CMakeFiles/timew.dir/TagsTable.cpp.o -c /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/TagsTable.cpp
src/CMakeFiles/timew.dir/TagsTable.cpp.i: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/timew.dir/TagsTable.cpp.i"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/TagsTable.cpp > CMakeFiles/timew.dir/TagsTable.cpp.i
src/CMakeFiles/timew.dir/TagsTable.cpp.s: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/timew.dir/TagsTable.cpp.s"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/TagsTable.cpp -o CMakeFiles/timew.dir/TagsTable.cpp.s
src/CMakeFiles/timew.dir/Transaction.cpp.o: src/CMakeFiles/timew.dir/flags.make
src/CMakeFiles/timew.dir/Transaction.cpp.o: src/Transaction.cpp
src/CMakeFiles/timew.dir/Transaction.cpp.o: src/CMakeFiles/timew.dir/compiler_depend.ts
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/CMakeFiles --progress-num=$(CMAKE_PROGRESS_28) "Building CXX object src/CMakeFiles/timew.dir/Transaction.cpp.o"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT src/CMakeFiles/timew.dir/Transaction.cpp.o -MF CMakeFiles/timew.dir/Transaction.cpp.o.d -o CMakeFiles/timew.dir/Transaction.cpp.o -c /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/Transaction.cpp
src/CMakeFiles/timew.dir/Transaction.cpp.i: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/timew.dir/Transaction.cpp.i"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/Transaction.cpp > CMakeFiles/timew.dir/Transaction.cpp.i
src/CMakeFiles/timew.dir/Transaction.cpp.s: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/timew.dir/Transaction.cpp.s"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/Transaction.cpp -o CMakeFiles/timew.dir/Transaction.cpp.s
src/CMakeFiles/timew.dir/TransactionsFactory.cpp.o: src/CMakeFiles/timew.dir/flags.make
src/CMakeFiles/timew.dir/TransactionsFactory.cpp.o: src/TransactionsFactory.cpp
src/CMakeFiles/timew.dir/TransactionsFactory.cpp.o: src/CMakeFiles/timew.dir/compiler_depend.ts
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/CMakeFiles --progress-num=$(CMAKE_PROGRESS_29) "Building CXX object src/CMakeFiles/timew.dir/TransactionsFactory.cpp.o"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT src/CMakeFiles/timew.dir/TransactionsFactory.cpp.o -MF CMakeFiles/timew.dir/TransactionsFactory.cpp.o.d -o CMakeFiles/timew.dir/TransactionsFactory.cpp.o -c /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/TransactionsFactory.cpp
src/CMakeFiles/timew.dir/TransactionsFactory.cpp.i: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/timew.dir/TransactionsFactory.cpp.i"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/TransactionsFactory.cpp > CMakeFiles/timew.dir/TransactionsFactory.cpp.i
src/CMakeFiles/timew.dir/TransactionsFactory.cpp.s: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/timew.dir/TransactionsFactory.cpp.s"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/TransactionsFactory.cpp -o CMakeFiles/timew.dir/TransactionsFactory.cpp.s
src/CMakeFiles/timew.dir/UndoAction.cpp.o: src/CMakeFiles/timew.dir/flags.make
src/CMakeFiles/timew.dir/UndoAction.cpp.o: src/UndoAction.cpp
src/CMakeFiles/timew.dir/UndoAction.cpp.o: src/CMakeFiles/timew.dir/compiler_depend.ts
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/CMakeFiles --progress-num=$(CMAKE_PROGRESS_30) "Building CXX object src/CMakeFiles/timew.dir/UndoAction.cpp.o"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT src/CMakeFiles/timew.dir/UndoAction.cpp.o -MF CMakeFiles/timew.dir/UndoAction.cpp.o.d -o CMakeFiles/timew.dir/UndoAction.cpp.o -c /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/UndoAction.cpp
src/CMakeFiles/timew.dir/UndoAction.cpp.i: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/timew.dir/UndoAction.cpp.i"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/UndoAction.cpp > CMakeFiles/timew.dir/UndoAction.cpp.i
src/CMakeFiles/timew.dir/UndoAction.cpp.s: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/timew.dir/UndoAction.cpp.s"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/UndoAction.cpp -o CMakeFiles/timew.dir/UndoAction.cpp.s
src/CMakeFiles/timew.dir/data.cpp.o: src/CMakeFiles/timew.dir/flags.make
src/CMakeFiles/timew.dir/data.cpp.o: src/data.cpp
src/CMakeFiles/timew.dir/data.cpp.o: src/CMakeFiles/timew.dir/compiler_depend.ts
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/CMakeFiles --progress-num=$(CMAKE_PROGRESS_31) "Building CXX object src/CMakeFiles/timew.dir/data.cpp.o"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT src/CMakeFiles/timew.dir/data.cpp.o -MF CMakeFiles/timew.dir/data.cpp.o.d -o CMakeFiles/timew.dir/data.cpp.o -c /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/data.cpp
src/CMakeFiles/timew.dir/data.cpp.i: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/timew.dir/data.cpp.i"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/data.cpp > CMakeFiles/timew.dir/data.cpp.i
src/CMakeFiles/timew.dir/data.cpp.s: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/timew.dir/data.cpp.s"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/data.cpp -o CMakeFiles/timew.dir/data.cpp.s
src/CMakeFiles/timew.dir/dom.cpp.o: src/CMakeFiles/timew.dir/flags.make
src/CMakeFiles/timew.dir/dom.cpp.o: src/dom.cpp
src/CMakeFiles/timew.dir/dom.cpp.o: src/CMakeFiles/timew.dir/compiler_depend.ts
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/CMakeFiles --progress-num=$(CMAKE_PROGRESS_32) "Building CXX object src/CMakeFiles/timew.dir/dom.cpp.o"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT src/CMakeFiles/timew.dir/dom.cpp.o -MF CMakeFiles/timew.dir/dom.cpp.o.d -o CMakeFiles/timew.dir/dom.cpp.o -c /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/dom.cpp
src/CMakeFiles/timew.dir/dom.cpp.i: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/timew.dir/dom.cpp.i"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/dom.cpp > CMakeFiles/timew.dir/dom.cpp.i
src/CMakeFiles/timew.dir/dom.cpp.s: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/timew.dir/dom.cpp.s"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/dom.cpp -o CMakeFiles/timew.dir/dom.cpp.s
src/CMakeFiles/timew.dir/init.cpp.o: src/CMakeFiles/timew.dir/flags.make
src/CMakeFiles/timew.dir/init.cpp.o: src/init.cpp
src/CMakeFiles/timew.dir/init.cpp.o: src/CMakeFiles/timew.dir/compiler_depend.ts
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/CMakeFiles --progress-num=$(CMAKE_PROGRESS_33) "Building CXX object src/CMakeFiles/timew.dir/init.cpp.o"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT src/CMakeFiles/timew.dir/init.cpp.o -MF CMakeFiles/timew.dir/init.cpp.o.d -o CMakeFiles/timew.dir/init.cpp.o -c /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/init.cpp
src/CMakeFiles/timew.dir/init.cpp.i: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/timew.dir/init.cpp.i"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/init.cpp > CMakeFiles/timew.dir/init.cpp.i
src/CMakeFiles/timew.dir/init.cpp.s: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/timew.dir/init.cpp.s"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/init.cpp -o CMakeFiles/timew.dir/init.cpp.s
src/CMakeFiles/timew.dir/helper.cpp.o: src/CMakeFiles/timew.dir/flags.make
src/CMakeFiles/timew.dir/helper.cpp.o: src/helper.cpp
src/CMakeFiles/timew.dir/helper.cpp.o: src/CMakeFiles/timew.dir/compiler_depend.ts
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/CMakeFiles --progress-num=$(CMAKE_PROGRESS_34) "Building CXX object src/CMakeFiles/timew.dir/helper.cpp.o"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT src/CMakeFiles/timew.dir/helper.cpp.o -MF CMakeFiles/timew.dir/helper.cpp.o.d -o CMakeFiles/timew.dir/helper.cpp.o -c /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/helper.cpp
src/CMakeFiles/timew.dir/helper.cpp.i: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/timew.dir/helper.cpp.i"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/helper.cpp > CMakeFiles/timew.dir/helper.cpp.i
src/CMakeFiles/timew.dir/helper.cpp.s: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/timew.dir/helper.cpp.s"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/helper.cpp -o CMakeFiles/timew.dir/helper.cpp.s
src/CMakeFiles/timew.dir/paths.cpp.o: src/CMakeFiles/timew.dir/flags.make
src/CMakeFiles/timew.dir/paths.cpp.o: src/paths.cpp
src/CMakeFiles/timew.dir/paths.cpp.o: src/CMakeFiles/timew.dir/compiler_depend.ts
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/CMakeFiles --progress-num=$(CMAKE_PROGRESS_35) "Building CXX object src/CMakeFiles/timew.dir/paths.cpp.o"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT src/CMakeFiles/timew.dir/paths.cpp.o -MF CMakeFiles/timew.dir/paths.cpp.o.d -o CMakeFiles/timew.dir/paths.cpp.o -c /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/paths.cpp
src/CMakeFiles/timew.dir/paths.cpp.i: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/timew.dir/paths.cpp.i"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/paths.cpp > CMakeFiles/timew.dir/paths.cpp.i
src/CMakeFiles/timew.dir/paths.cpp.s: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/timew.dir/paths.cpp.s"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/paths.cpp -o CMakeFiles/timew.dir/paths.cpp.s
src/CMakeFiles/timew.dir/log.cpp.o: src/CMakeFiles/timew.dir/flags.make
src/CMakeFiles/timew.dir/log.cpp.o: src/log.cpp
src/CMakeFiles/timew.dir/log.cpp.o: src/CMakeFiles/timew.dir/compiler_depend.ts
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/CMakeFiles --progress-num=$(CMAKE_PROGRESS_36) "Building CXX object src/CMakeFiles/timew.dir/log.cpp.o"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT src/CMakeFiles/timew.dir/log.cpp.o -MF CMakeFiles/timew.dir/log.cpp.o.d -o CMakeFiles/timew.dir/log.cpp.o -c /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/log.cpp
src/CMakeFiles/timew.dir/log.cpp.i: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/timew.dir/log.cpp.i"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/log.cpp > CMakeFiles/timew.dir/log.cpp.i
src/CMakeFiles/timew.dir/log.cpp.s: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/timew.dir/log.cpp.s"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/log.cpp -o CMakeFiles/timew.dir/log.cpp.s
src/CMakeFiles/timew.dir/util.cpp.o: src/CMakeFiles/timew.dir/flags.make
src/CMakeFiles/timew.dir/util.cpp.o: src/util.cpp
src/CMakeFiles/timew.dir/util.cpp.o: src/CMakeFiles/timew.dir/compiler_depend.ts
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/CMakeFiles --progress-num=$(CMAKE_PROGRESS_37) "Building CXX object src/CMakeFiles/timew.dir/util.cpp.o"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT src/CMakeFiles/timew.dir/util.cpp.o -MF CMakeFiles/timew.dir/util.cpp.o.d -o CMakeFiles/timew.dir/util.cpp.o -c /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/util.cpp
src/CMakeFiles/timew.dir/util.cpp.i: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/timew.dir/util.cpp.i"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/util.cpp > CMakeFiles/timew.dir/util.cpp.i
src/CMakeFiles/timew.dir/util.cpp.s: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/timew.dir/util.cpp.s"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/util.cpp -o CMakeFiles/timew.dir/util.cpp.s
src/CMakeFiles/timew.dir/validate.cpp.o: src/CMakeFiles/timew.dir/flags.make
src/CMakeFiles/timew.dir/validate.cpp.o: src/validate.cpp
src/CMakeFiles/timew.dir/validate.cpp.o: src/CMakeFiles/timew.dir/compiler_depend.ts
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/CMakeFiles --progress-num=$(CMAKE_PROGRESS_38) "Building CXX object src/CMakeFiles/timew.dir/validate.cpp.o"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT src/CMakeFiles/timew.dir/validate.cpp.o -MF CMakeFiles/timew.dir/validate.cpp.o.d -o CMakeFiles/timew.dir/validate.cpp.o -c /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/validate.cpp
src/CMakeFiles/timew.dir/validate.cpp.i: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/timew.dir/validate.cpp.i"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/validate.cpp > CMakeFiles/timew.dir/validate.cpp.i
src/CMakeFiles/timew.dir/validate.cpp.s: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/timew.dir/validate.cpp.s"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/validate.cpp -o CMakeFiles/timew.dir/validate.cpp.s
# Object files for target timew
timew_OBJECTS = \
"CMakeFiles/timew.dir/AtomicFile.cpp.o" \
"CMakeFiles/timew.dir/CLI.cpp.o" \
"CMakeFiles/timew.dir/Chart.cpp.o" \
"CMakeFiles/timew.dir/Database.cpp.o" \
"CMakeFiles/timew.dir/Datafile.cpp.o" \
"CMakeFiles/timew.dir/DatetimeParser.cpp.o" \
"CMakeFiles/timew.dir/Exclusion.cpp.o" \
"CMakeFiles/timew.dir/Extensions.cpp.o" \
"CMakeFiles/timew.dir/ExtensionsTable.cpp.o" \
"CMakeFiles/timew.dir/GapsTable.cpp.o" \
"CMakeFiles/timew.dir/Interval.cpp.o" \
"CMakeFiles/timew.dir/IntervalFactory.cpp.o" \
"CMakeFiles/timew.dir/IntervalFilter.cpp.o" \
"CMakeFiles/timew.dir/IntervalFilterAndGroup.cpp.o" \
"CMakeFiles/timew.dir/IntervalFilterAllInRange.cpp.o" \
"CMakeFiles/timew.dir/IntervalFilterAllWithIds.cpp.o" \
"CMakeFiles/timew.dir/IntervalFilterAllWithTags.cpp.o" \
"CMakeFiles/timew.dir/IntervalFilterTagsDisjoint.cpp.o" \
"CMakeFiles/timew.dir/IntervalFilterFirstOf.cpp.o" \
"CMakeFiles/timew.dir/Journal.cpp.o" \
"CMakeFiles/timew.dir/Range.cpp.o" \
"CMakeFiles/timew.dir/Rules.cpp.o" \
"CMakeFiles/timew.dir/SummaryTable.cpp.o" \
"CMakeFiles/timew.dir/TagDescription.cpp.o" \
"CMakeFiles/timew.dir/TagInfo.cpp.o" \
"CMakeFiles/timew.dir/TagInfoDatabase.cpp.o" \
"CMakeFiles/timew.dir/TagsTable.cpp.o" \
"CMakeFiles/timew.dir/Transaction.cpp.o" \
"CMakeFiles/timew.dir/TransactionsFactory.cpp.o" \
"CMakeFiles/timew.dir/UndoAction.cpp.o" \
"CMakeFiles/timew.dir/data.cpp.o" \
"CMakeFiles/timew.dir/dom.cpp.o" \
"CMakeFiles/timew.dir/init.cpp.o" \
"CMakeFiles/timew.dir/helper.cpp.o" \
"CMakeFiles/timew.dir/paths.cpp.o" \
"CMakeFiles/timew.dir/log.cpp.o" \
"CMakeFiles/timew.dir/util.cpp.o" \
"CMakeFiles/timew.dir/validate.cpp.o"
# External object files for target timew
timew_EXTERNAL_OBJECTS =
src/libtimew.a: src/CMakeFiles/timew.dir/AtomicFile.cpp.o
src/libtimew.a: src/CMakeFiles/timew.dir/CLI.cpp.o
src/libtimew.a: src/CMakeFiles/timew.dir/Chart.cpp.o
src/libtimew.a: src/CMakeFiles/timew.dir/Database.cpp.o
src/libtimew.a: src/CMakeFiles/timew.dir/Datafile.cpp.o
src/libtimew.a: src/CMakeFiles/timew.dir/DatetimeParser.cpp.o
src/libtimew.a: src/CMakeFiles/timew.dir/Exclusion.cpp.o
src/libtimew.a: src/CMakeFiles/timew.dir/Extensions.cpp.o
src/libtimew.a: src/CMakeFiles/timew.dir/ExtensionsTable.cpp.o
src/libtimew.a: src/CMakeFiles/timew.dir/GapsTable.cpp.o
src/libtimew.a: src/CMakeFiles/timew.dir/Interval.cpp.o
src/libtimew.a: src/CMakeFiles/timew.dir/IntervalFactory.cpp.o
src/libtimew.a: src/CMakeFiles/timew.dir/IntervalFilter.cpp.o
src/libtimew.a: src/CMakeFiles/timew.dir/IntervalFilterAndGroup.cpp.o
src/libtimew.a: src/CMakeFiles/timew.dir/IntervalFilterAllInRange.cpp.o
src/libtimew.a: src/CMakeFiles/timew.dir/IntervalFilterAllWithIds.cpp.o
src/libtimew.a: src/CMakeFiles/timew.dir/IntervalFilterAllWithTags.cpp.o
src/libtimew.a: src/CMakeFiles/timew.dir/IntervalFilterTagsDisjoint.cpp.o
src/libtimew.a: src/CMakeFiles/timew.dir/IntervalFilterFirstOf.cpp.o
src/libtimew.a: src/CMakeFiles/timew.dir/Journal.cpp.o
src/libtimew.a: src/CMakeFiles/timew.dir/Range.cpp.o
src/libtimew.a: src/CMakeFiles/timew.dir/Rules.cpp.o
src/libtimew.a: src/CMakeFiles/timew.dir/SummaryTable.cpp.o
src/libtimew.a: src/CMakeFiles/timew.dir/TagDescription.cpp.o
src/libtimew.a: src/CMakeFiles/timew.dir/TagInfo.cpp.o
src/libtimew.a: src/CMakeFiles/timew.dir/TagInfoDatabase.cpp.o
src/libtimew.a: src/CMakeFiles/timew.dir/TagsTable.cpp.o
src/libtimew.a: src/CMakeFiles/timew.dir/Transaction.cpp.o
src/libtimew.a: src/CMakeFiles/timew.dir/TransactionsFactory.cpp.o
src/libtimew.a: src/CMakeFiles/timew.dir/UndoAction.cpp.o
src/libtimew.a: src/CMakeFiles/timew.dir/data.cpp.o
src/libtimew.a: src/CMakeFiles/timew.dir/dom.cpp.o
src/libtimew.a: src/CMakeFiles/timew.dir/init.cpp.o
src/libtimew.a: src/CMakeFiles/timew.dir/helper.cpp.o
src/libtimew.a: src/CMakeFiles/timew.dir/paths.cpp.o
src/libtimew.a: src/CMakeFiles/timew.dir/log.cpp.o
src/libtimew.a: src/CMakeFiles/timew.dir/util.cpp.o
src/libtimew.a: src/CMakeFiles/timew.dir/validate.cpp.o
src/libtimew.a: src/CMakeFiles/timew.dir/build.make
src/libtimew.a: src/CMakeFiles/timew.dir/link.txt
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --bold --progress-dir=/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/CMakeFiles --progress-num=$(CMAKE_PROGRESS_39) "Linking CXX static library libtimew.a"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && $(CMAKE_COMMAND) -P CMakeFiles/timew.dir/cmake_clean_target.cmake
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/timew.dir/link.txt --verbose=$(VERBOSE)
# Rule to build all files generated by this target.
src/CMakeFiles/timew.dir/build: src/libtimew.a
.PHONY : src/CMakeFiles/timew.dir/build
src/CMakeFiles/timew.dir/clean:
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && $(CMAKE_COMMAND) -P CMakeFiles/timew.dir/cmake_clean.cmake
.PHONY : src/CMakeFiles/timew.dir/clean
src/CMakeFiles/timew.dir/depend:
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1 && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/jdaugherty/work/pkgs/taskw/timew-1.7.1 /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src /home/jdaugherty/work/pkgs/taskw/timew-1.7.1 /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/CMakeFiles/timew.dir/DependInfo.cmake --color=$(COLOR)
.PHONY : src/CMakeFiles/timew.dir/depend

View File

@ -0,0 +1,85 @@
file(REMOVE_RECURSE
"CMakeFiles/timew.dir/AtomicFile.cpp.o"
"CMakeFiles/timew.dir/AtomicFile.cpp.o.d"
"CMakeFiles/timew.dir/CLI.cpp.o"
"CMakeFiles/timew.dir/CLI.cpp.o.d"
"CMakeFiles/timew.dir/Chart.cpp.o"
"CMakeFiles/timew.dir/Chart.cpp.o.d"
"CMakeFiles/timew.dir/Database.cpp.o"
"CMakeFiles/timew.dir/Database.cpp.o.d"
"CMakeFiles/timew.dir/Datafile.cpp.o"
"CMakeFiles/timew.dir/Datafile.cpp.o.d"
"CMakeFiles/timew.dir/DatetimeParser.cpp.o"
"CMakeFiles/timew.dir/DatetimeParser.cpp.o.d"
"CMakeFiles/timew.dir/Exclusion.cpp.o"
"CMakeFiles/timew.dir/Exclusion.cpp.o.d"
"CMakeFiles/timew.dir/Extensions.cpp.o"
"CMakeFiles/timew.dir/Extensions.cpp.o.d"
"CMakeFiles/timew.dir/ExtensionsTable.cpp.o"
"CMakeFiles/timew.dir/ExtensionsTable.cpp.o.d"
"CMakeFiles/timew.dir/GapsTable.cpp.o"
"CMakeFiles/timew.dir/GapsTable.cpp.o.d"
"CMakeFiles/timew.dir/Interval.cpp.o"
"CMakeFiles/timew.dir/Interval.cpp.o.d"
"CMakeFiles/timew.dir/IntervalFactory.cpp.o"
"CMakeFiles/timew.dir/IntervalFactory.cpp.o.d"
"CMakeFiles/timew.dir/IntervalFilter.cpp.o"
"CMakeFiles/timew.dir/IntervalFilter.cpp.o.d"
"CMakeFiles/timew.dir/IntervalFilterAllInRange.cpp.o"
"CMakeFiles/timew.dir/IntervalFilterAllInRange.cpp.o.d"
"CMakeFiles/timew.dir/IntervalFilterAllWithIds.cpp.o"
"CMakeFiles/timew.dir/IntervalFilterAllWithIds.cpp.o.d"
"CMakeFiles/timew.dir/IntervalFilterAllWithTags.cpp.o"
"CMakeFiles/timew.dir/IntervalFilterAllWithTags.cpp.o.d"
"CMakeFiles/timew.dir/IntervalFilterAndGroup.cpp.o"
"CMakeFiles/timew.dir/IntervalFilterAndGroup.cpp.o.d"
"CMakeFiles/timew.dir/IntervalFilterFirstOf.cpp.o"
"CMakeFiles/timew.dir/IntervalFilterFirstOf.cpp.o.d"
"CMakeFiles/timew.dir/IntervalFilterTagsDisjoint.cpp.o"
"CMakeFiles/timew.dir/IntervalFilterTagsDisjoint.cpp.o.d"
"CMakeFiles/timew.dir/Journal.cpp.o"
"CMakeFiles/timew.dir/Journal.cpp.o.d"
"CMakeFiles/timew.dir/Range.cpp.o"
"CMakeFiles/timew.dir/Range.cpp.o.d"
"CMakeFiles/timew.dir/Rules.cpp.o"
"CMakeFiles/timew.dir/Rules.cpp.o.d"
"CMakeFiles/timew.dir/SummaryTable.cpp.o"
"CMakeFiles/timew.dir/SummaryTable.cpp.o.d"
"CMakeFiles/timew.dir/TagDescription.cpp.o"
"CMakeFiles/timew.dir/TagDescription.cpp.o.d"
"CMakeFiles/timew.dir/TagInfo.cpp.o"
"CMakeFiles/timew.dir/TagInfo.cpp.o.d"
"CMakeFiles/timew.dir/TagInfoDatabase.cpp.o"
"CMakeFiles/timew.dir/TagInfoDatabase.cpp.o.d"
"CMakeFiles/timew.dir/TagsTable.cpp.o"
"CMakeFiles/timew.dir/TagsTable.cpp.o.d"
"CMakeFiles/timew.dir/Transaction.cpp.o"
"CMakeFiles/timew.dir/Transaction.cpp.o.d"
"CMakeFiles/timew.dir/TransactionsFactory.cpp.o"
"CMakeFiles/timew.dir/TransactionsFactory.cpp.o.d"
"CMakeFiles/timew.dir/UndoAction.cpp.o"
"CMakeFiles/timew.dir/UndoAction.cpp.o.d"
"CMakeFiles/timew.dir/data.cpp.o"
"CMakeFiles/timew.dir/data.cpp.o.d"
"CMakeFiles/timew.dir/dom.cpp.o"
"CMakeFiles/timew.dir/dom.cpp.o.d"
"CMakeFiles/timew.dir/helper.cpp.o"
"CMakeFiles/timew.dir/helper.cpp.o.d"
"CMakeFiles/timew.dir/init.cpp.o"
"CMakeFiles/timew.dir/init.cpp.o.d"
"CMakeFiles/timew.dir/log.cpp.o"
"CMakeFiles/timew.dir/log.cpp.o.d"
"CMakeFiles/timew.dir/paths.cpp.o"
"CMakeFiles/timew.dir/paths.cpp.o.d"
"CMakeFiles/timew.dir/util.cpp.o"
"CMakeFiles/timew.dir/util.cpp.o.d"
"CMakeFiles/timew.dir/validate.cpp.o"
"CMakeFiles/timew.dir/validate.cpp.o.d"
"libtimew.a"
"libtimew.pdb"
)
# Per-language clean rules from dependency scanning.
foreach(lang CXX)
include(CMakeFiles/timew.dir/cmake_clean_${lang}.cmake OPTIONAL)
endforeach()

View File

@ -0,0 +1,3 @@
file(REMOVE_RECURSE
"libtimew.a"
)

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,2 @@
# CMAKE generated file: DO NOT EDIT!
# Timestamp file for compiler generated dependencies management for timew.

View File

@ -0,0 +1,2 @@
# Empty dependencies file for timew.
# This may be replaced when dependencies are built.

View File

@ -0,0 +1,10 @@
# CMAKE generated file: DO NOT EDIT!
# Generated by "Unix Makefiles" Generator, CMake Version 3.23
# compile CXX with /usr/bin/c++
CXX_DEFINES =
CXX_INCLUDES = -I/home/jdaugherty/work/pkgs/taskw/timew-1.7.1 -I/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src -I/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/commands -I/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src
CXX_FLAGS = -Wall -Wextra -Wsign-compare -Wreturn-type -g -std=gnu++17

View File

@ -0,0 +1,2 @@
/usr/bin/ar qc libtimew.a CMakeFiles/timew.dir/AtomicFile.cpp.o CMakeFiles/timew.dir/CLI.cpp.o CMakeFiles/timew.dir/Chart.cpp.o CMakeFiles/timew.dir/Database.cpp.o CMakeFiles/timew.dir/Datafile.cpp.o CMakeFiles/timew.dir/DatetimeParser.cpp.o CMakeFiles/timew.dir/Exclusion.cpp.o CMakeFiles/timew.dir/Extensions.cpp.o CMakeFiles/timew.dir/ExtensionsTable.cpp.o CMakeFiles/timew.dir/GapsTable.cpp.o CMakeFiles/timew.dir/Interval.cpp.o CMakeFiles/timew.dir/IntervalFactory.cpp.o CMakeFiles/timew.dir/IntervalFilter.cpp.o CMakeFiles/timew.dir/IntervalFilterAndGroup.cpp.o CMakeFiles/timew.dir/IntervalFilterAllInRange.cpp.o CMakeFiles/timew.dir/IntervalFilterAllWithIds.cpp.o CMakeFiles/timew.dir/IntervalFilterAllWithTags.cpp.o CMakeFiles/timew.dir/IntervalFilterTagsDisjoint.cpp.o CMakeFiles/timew.dir/IntervalFilterFirstOf.cpp.o CMakeFiles/timew.dir/Journal.cpp.o CMakeFiles/timew.dir/Range.cpp.o CMakeFiles/timew.dir/Rules.cpp.o CMakeFiles/timew.dir/SummaryTable.cpp.o CMakeFiles/timew.dir/TagDescription.cpp.o CMakeFiles/timew.dir/TagInfo.cpp.o CMakeFiles/timew.dir/TagInfoDatabase.cpp.o CMakeFiles/timew.dir/TagsTable.cpp.o CMakeFiles/timew.dir/Transaction.cpp.o CMakeFiles/timew.dir/TransactionsFactory.cpp.o CMakeFiles/timew.dir/UndoAction.cpp.o CMakeFiles/timew.dir/data.cpp.o CMakeFiles/timew.dir/dom.cpp.o CMakeFiles/timew.dir/init.cpp.o CMakeFiles/timew.dir/helper.cpp.o CMakeFiles/timew.dir/paths.cpp.o CMakeFiles/timew.dir/log.cpp.o CMakeFiles/timew.dir/util.cpp.o CMakeFiles/timew.dir/validate.cpp.o
/usr/bin/ranlib libtimew.a

View File

@ -0,0 +1,40 @@
CMAKE_PROGRESS_1 = 74
CMAKE_PROGRESS_2 = 75
CMAKE_PROGRESS_3 =
CMAKE_PROGRESS_4 = 76
CMAKE_PROGRESS_5 =
CMAKE_PROGRESS_6 = 77
CMAKE_PROGRESS_7 = 78
CMAKE_PROGRESS_8 =
CMAKE_PROGRESS_9 = 79
CMAKE_PROGRESS_10 =
CMAKE_PROGRESS_11 = 80
CMAKE_PROGRESS_12 = 81
CMAKE_PROGRESS_13 =
CMAKE_PROGRESS_14 = 82
CMAKE_PROGRESS_15 =
CMAKE_PROGRESS_16 = 83
CMAKE_PROGRESS_17 = 84
CMAKE_PROGRESS_18 =
CMAKE_PROGRESS_19 = 85
CMAKE_PROGRESS_20 =
CMAKE_PROGRESS_21 = 86
CMAKE_PROGRESS_22 =
CMAKE_PROGRESS_23 = 87
CMAKE_PROGRESS_24 = 88
CMAKE_PROGRESS_25 =
CMAKE_PROGRESS_26 = 89
CMAKE_PROGRESS_27 =
CMAKE_PROGRESS_28 = 90
CMAKE_PROGRESS_29 = 91
CMAKE_PROGRESS_30 =
CMAKE_PROGRESS_31 = 92
CMAKE_PROGRESS_32 =
CMAKE_PROGRESS_33 = 93
CMAKE_PROGRESS_34 = 94
CMAKE_PROGRESS_35 =
CMAKE_PROGRESS_36 = 95
CMAKE_PROGRESS_37 =
CMAKE_PROGRESS_38 = 96
CMAKE_PROGRESS_39 = 97

View File

@ -0,0 +1,22 @@
# Consider dependencies only in project.
set(CMAKE_DEPENDS_IN_PROJECT_ONLY OFF)
# The set of languages for which implicit dependencies are needed:
set(CMAKE_DEPENDS_LANGUAGES
)
# The set of dependency files which are needed:
set(CMAKE_DEPENDS_DEPENDENCY_FILES
"/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/timew.cpp" "src/CMakeFiles/timew_executable.dir/timew.cpp.o" "gcc" "src/CMakeFiles/timew_executable.dir/timew.cpp.o.d"
)
# Targets to which this target links.
set(CMAKE_TARGET_LINKED_INFO_FILES
"/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/CMakeFiles/timew.dir/DependInfo.cmake"
"/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/commands/CMakeFiles/commands.dir/DependInfo.cmake"
"/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/CMakeFiles/libshared.dir/DependInfo.cmake"
)
# Fortran module output directory.
set(CMAKE_Fortran_TARGET_MODULE_DIR "")

View File

@ -0,0 +1,114 @@
# CMAKE generated file: DO NOT EDIT!
# Generated by "Unix Makefiles" Generator, CMake Version 3.23
# Delete rule output on recipe failure.
.DELETE_ON_ERROR:
#=============================================================================
# Special targets provided by cmake.
# Disable implicit rules so canonical targets will work.
.SUFFIXES:
# Disable VCS-based implicit rules.
% : %,v
# Disable VCS-based implicit rules.
% : RCS/%
# Disable VCS-based implicit rules.
% : RCS/%,v
# Disable VCS-based implicit rules.
% : SCCS/s.%
# Disable VCS-based implicit rules.
% : s.%
.SUFFIXES: .hpux_make_needs_suffix_list
# Command-line flag to silence nested $(MAKE).
$(VERBOSE)MAKESILENT = -s
#Suppress display of executed commands.
$(VERBOSE).SILENT:
# A target that is always out of date.
cmake_force:
.PHONY : cmake_force
#=============================================================================
# Set environment variables for the build.
# The shell in which to execute make rules.
SHELL = /bin/sh
# The CMake executable.
CMAKE_COMMAND = /usr/local/bin/cmake
# The command to remove a file.
RM = /usr/local/bin/cmake -E rm -f
# Escaping for special characters.
EQUALS = =
# The top-level source directory on which CMake was run.
CMAKE_SOURCE_DIR = /home/jdaugherty/work/pkgs/taskw/timew-1.7.1
# The top-level build directory on which CMake was run.
CMAKE_BINARY_DIR = /home/jdaugherty/work/pkgs/taskw/timew-1.7.1
# Include any dependencies generated for this target.
include src/CMakeFiles/timew_executable.dir/depend.make
# Include any dependencies generated by the compiler for this target.
include src/CMakeFiles/timew_executable.dir/compiler_depend.make
# Include the progress variables for this target.
include src/CMakeFiles/timew_executable.dir/progress.make
# Include the compile flags for this target's objects.
include src/CMakeFiles/timew_executable.dir/flags.make
src/CMakeFiles/timew_executable.dir/timew.cpp.o: src/CMakeFiles/timew_executable.dir/flags.make
src/CMakeFiles/timew_executable.dir/timew.cpp.o: src/timew.cpp
src/CMakeFiles/timew_executable.dir/timew.cpp.o: src/CMakeFiles/timew_executable.dir/compiler_depend.ts
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Building CXX object src/CMakeFiles/timew_executable.dir/timew.cpp.o"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -MD -MT src/CMakeFiles/timew_executable.dir/timew.cpp.o -MF CMakeFiles/timew_executable.dir/timew.cpp.o.d -o CMakeFiles/timew_executable.dir/timew.cpp.o -c /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/timew.cpp
src/CMakeFiles/timew_executable.dir/timew.cpp.i: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/timew_executable.dir/timew.cpp.i"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/timew.cpp > CMakeFiles/timew_executable.dir/timew.cpp.i
src/CMakeFiles/timew_executable.dir/timew.cpp.s: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/timew_executable.dir/timew.cpp.s"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/timew.cpp -o CMakeFiles/timew_executable.dir/timew.cpp.s
# Object files for target timew_executable
timew_executable_OBJECTS = \
"CMakeFiles/timew_executable.dir/timew.cpp.o"
# External object files for target timew_executable
timew_executable_EXTERNAL_OBJECTS =
src/timew: src/CMakeFiles/timew_executable.dir/timew.cpp.o
src/timew: src/CMakeFiles/timew_executable.dir/build.make
src/timew: src/libtimew.a
src/timew: src/commands/libcommands.a
src/timew: src/libtimew.a
src/timew: src/liblibshared.a
src/timew: src/CMakeFiles/timew_executable.dir/link.txt
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --bold --progress-dir=/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/CMakeFiles --progress-num=$(CMAKE_PROGRESS_2) "Linking CXX executable timew"
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/timew_executable.dir/link.txt --verbose=$(VERBOSE)
# Rule to build all files generated by this target.
src/CMakeFiles/timew_executable.dir/build: src/timew
.PHONY : src/CMakeFiles/timew_executable.dir/build
src/CMakeFiles/timew_executable.dir/clean:
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src && $(CMAKE_COMMAND) -P CMakeFiles/timew_executable.dir/cmake_clean.cmake
.PHONY : src/CMakeFiles/timew_executable.dir/clean
src/CMakeFiles/timew_executable.dir/depend:
cd /home/jdaugherty/work/pkgs/taskw/timew-1.7.1 && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/jdaugherty/work/pkgs/taskw/timew-1.7.1 /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src /home/jdaugherty/work/pkgs/taskw/timew-1.7.1 /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src /home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/CMakeFiles/timew_executable.dir/DependInfo.cmake --color=$(COLOR)
.PHONY : src/CMakeFiles/timew_executable.dir/depend

View File

@ -0,0 +1,11 @@
file(REMOVE_RECURSE
"CMakeFiles/timew_executable.dir/timew.cpp.o"
"CMakeFiles/timew_executable.dir/timew.cpp.o.d"
"timew"
"timew.pdb"
)
# Per-language clean rules from dependency scanning.
foreach(lang CXX)
include(CMakeFiles/timew_executable.dir/cmake_clean_${lang}.cmake OPTIONAL)
endforeach()

View File

@ -0,0 +1,258 @@
# CMAKE generated file: DO NOT EDIT!
# Generated by "Unix Makefiles" Generator, CMake Version 3.23
src/CMakeFiles/timew_executable.dir/timew.cpp.o
/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/timew.cpp
/usr/include/stdc-predef.h
/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/AtomicFile.h
/usr/include/c++/8/memory
/usr/include/c++/8/bits/stl_algobase.h
/usr/include/x86_64-linux-gnu/c++/8/bits/c++config.h
/usr/include/x86_64-linux-gnu/c++/8/bits/os_defines.h
/usr/include/features.h
/usr/include/x86_64-linux-gnu/sys/cdefs.h
/usr/include/x86_64-linux-gnu/bits/wordsize.h
/usr/include/x86_64-linux-gnu/bits/long-double.h
/usr/include/x86_64-linux-gnu/gnu/stubs.h
/usr/include/x86_64-linux-gnu/gnu/stubs-64.h
/usr/include/x86_64-linux-gnu/c++/8/bits/cpu_defines.h
/usr/include/c++/8/bits/functexcept.h
/usr/include/c++/8/bits/exception_defines.h
/usr/include/c++/8/bits/cpp_type_traits.h
/usr/include/c++/8/ext/type_traits.h
/usr/include/c++/8/ext/numeric_traits.h
/usr/include/c++/8/bits/stl_pair.h
/usr/include/c++/8/bits/move.h
/usr/include/c++/8/bits/concept_check.h
/usr/include/c++/8/type_traits
/usr/include/c++/8/bits/stl_iterator_base_types.h
/usr/include/c++/8/bits/stl_iterator_base_funcs.h
/usr/include/c++/8/debug/assertions.h
/usr/include/c++/8/bits/stl_iterator.h
/usr/include/c++/8/bits/ptr_traits.h
/usr/include/c++/8/debug/debug.h
/usr/include/c++/8/bits/predefined_ops.h
/usr/include/c++/8/bits/allocator.h
/usr/include/x86_64-linux-gnu/c++/8/bits/c++allocator.h
/usr/include/c++/8/ext/new_allocator.h
/usr/include/c++/8/new
/usr/include/c++/8/exception
/usr/include/c++/8/bits/exception.h
/usr/include/c++/8/bits/exception_ptr.h
/usr/include/c++/8/bits/cxxabi_init_exception.h
/usr/lib/gcc/x86_64-linux-gnu/8/include/stddef.h
/usr/include/c++/8/typeinfo
/usr/include/c++/8/bits/hash_bytes.h
/usr/include/c++/8/bits/nested_exception.h
/usr/include/c++/8/bits/memoryfwd.h
/usr/include/c++/8/bits/stl_construct.h
/usr/include/c++/8/ext/alloc_traits.h
/usr/include/c++/8/bits/alloc_traits.h
/usr/include/c++/8/bits/stl_uninitialized.h
/usr/include/c++/8/utility
/usr/include/c++/8/bits/stl_relops.h
/usr/include/c++/8/initializer_list
/usr/include/c++/8/bits/stl_tempbuf.h
/usr/include/c++/8/bits/stl_raw_storage_iter.h
/usr/include/c++/8/iosfwd
/usr/include/c++/8/bits/stringfwd.h
/usr/include/c++/8/bits/postypes.h
/usr/include/c++/8/cwchar
/usr/include/wchar.h
/usr/include/x86_64-linux-gnu/bits/libc-header-start.h
/usr/include/x86_64-linux-gnu/bits/floatn.h
/usr/include/x86_64-linux-gnu/bits/floatn-common.h
/usr/lib/gcc/x86_64-linux-gnu/8/include/stdarg.h
/usr/include/x86_64-linux-gnu/bits/wchar.h
/usr/include/x86_64-linux-gnu/bits/types/wint_t.h
/usr/include/x86_64-linux-gnu/bits/types/mbstate_t.h
/usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h
/usr/include/x86_64-linux-gnu/bits/types/__FILE.h
/usr/include/x86_64-linux-gnu/bits/types/FILE.h
/usr/include/x86_64-linux-gnu/bits/types/locale_t.h
/usr/include/x86_64-linux-gnu/bits/types/__locale_t.h
/usr/include/c++/8/ext/atomicity.h
/usr/include/x86_64-linux-gnu/c++/8/bits/gthr.h
/usr/include/x86_64-linux-gnu/c++/8/bits/gthr-default.h
/usr/include/pthread.h
/usr/include/endian.h
/usr/include/x86_64-linux-gnu/bits/endian.h
/usr/include/x86_64-linux-gnu/bits/byteswap.h
/usr/include/x86_64-linux-gnu/bits/types.h
/usr/include/x86_64-linux-gnu/bits/typesizes.h
/usr/include/x86_64-linux-gnu/bits/byteswap-16.h
/usr/include/x86_64-linux-gnu/bits/uintn-identity.h
/usr/include/sched.h
/usr/include/x86_64-linux-gnu/bits/types/time_t.h
/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h
/usr/include/x86_64-linux-gnu/bits/sched.h
/usr/include/x86_64-linux-gnu/bits/cpu-set.h
/usr/include/time.h
/usr/include/x86_64-linux-gnu/bits/time.h
/usr/include/x86_64-linux-gnu/bits/timex.h
/usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h
/usr/include/x86_64-linux-gnu/bits/types/clock_t.h
/usr/include/x86_64-linux-gnu/bits/types/struct_tm.h
/usr/include/x86_64-linux-gnu/bits/types/clockid_t.h
/usr/include/x86_64-linux-gnu/bits/types/timer_t.h
/usr/include/x86_64-linux-gnu/bits/types/struct_itimerspec.h
/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h
/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h
/usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h
/usr/include/x86_64-linux-gnu/bits/setjmp.h
/usr/include/x86_64-linux-gnu/c++/8/bits/atomic_word.h
/usr/include/c++/8/ext/concurrence.h
/usr/include/c++/8/bits/stl_function.h
/usr/include/c++/8/backward/binders.h
/usr/include/c++/8/bits/uses_allocator.h
/usr/include/c++/8/bits/unique_ptr.h
/usr/include/c++/8/tuple
/usr/include/c++/8/array
/usr/include/c++/8/stdexcept
/usr/include/c++/8/string
/usr/include/c++/8/bits/char_traits.h
/usr/include/c++/8/cstdint
/usr/lib/gcc/x86_64-linux-gnu/8/include/stdint.h
/usr/include/stdint.h
/usr/include/x86_64-linux-gnu/bits/stdint-intn.h
/usr/include/x86_64-linux-gnu/bits/stdint-uintn.h
/usr/include/c++/8/bits/localefwd.h
/usr/include/x86_64-linux-gnu/c++/8/bits/c++locale.h
/usr/include/c++/8/clocale
/usr/include/locale.h
/usr/include/x86_64-linux-gnu/bits/locale.h
/usr/include/c++/8/cctype
/usr/include/ctype.h
/usr/include/c++/8/bits/ostream_insert.h
/usr/include/c++/8/bits/cxxabi_forced.h
/usr/include/c++/8/bits/range_access.h
/usr/include/c++/8/bits/basic_string.h
/usr/include/c++/8/string_view
/usr/include/c++/8/limits
/usr/include/c++/8/bits/functional_hash.h
/usr/include/c++/8/bits/string_view.tcc
/usr/include/c++/8/ext/string_conversions.h
/usr/include/c++/8/cstdlib
/usr/include/stdlib.h
/usr/include/x86_64-linux-gnu/bits/waitflags.h
/usr/include/x86_64-linux-gnu/bits/waitstatus.h
/usr/include/x86_64-linux-gnu/sys/types.h
/usr/include/x86_64-linux-gnu/sys/select.h
/usr/include/x86_64-linux-gnu/bits/select.h
/usr/include/x86_64-linux-gnu/bits/types/sigset_t.h
/usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h
/usr/include/x86_64-linux-gnu/sys/sysmacros.h
/usr/include/x86_64-linux-gnu/bits/sysmacros.h
/usr/include/alloca.h
/usr/include/x86_64-linux-gnu/bits/stdlib-float.h
/usr/include/c++/8/bits/std_abs.h
/usr/include/c++/8/cstdio
/usr/include/stdio.h
/usr/include/x86_64-linux-gnu/bits/libio.h
/usr/include/x86_64-linux-gnu/bits/_G_config.h
/usr/include/x86_64-linux-gnu/bits/stdio_lim.h
/usr/include/x86_64-linux-gnu/bits/sys_errlist.h
/usr/include/c++/8/cerrno
/usr/include/errno.h
/usr/include/x86_64-linux-gnu/bits/errno.h
/usr/include/linux/errno.h
/usr/include/x86_64-linux-gnu/asm/errno.h
/usr/include/asm-generic/errno.h
/usr/include/asm-generic/errno-base.h
/usr/include/c++/8/bits/basic_string.tcc
/usr/include/c++/8/bits/invoke.h
/usr/include/c++/8/bits/shared_ptr.h
/usr/include/c++/8/bits/shared_ptr_base.h
/usr/include/c++/8/bits/allocated_ptr.h
/usr/include/c++/8/bits/refwrap.h
/usr/include/c++/8/ext/aligned_buffer.h
/usr/include/c++/8/bits/shared_ptr_atomic.h
/usr/include/c++/8/bits/atomic_base.h
/usr/include/c++/8/bits/atomic_lockfree_defines.h
/usr/include/c++/8/backward/auto_ptr.h
/usr/include/c++/8/vector
/usr/include/c++/8/bits/stl_vector.h
/usr/include/c++/8/bits/stl_bvector.h
/usr/include/c++/8/bits/vector.tcc
/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/CLI.h
/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src/Duration.h
/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src/Pig.h
/usr/include/c++/8/ctime
/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/Interval.h
/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/Range.h
/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src/Datetime.h
/usr/include/c++/8/set
/usr/include/c++/8/bits/stl_tree.h
/usr/include/c++/8/bits/node_handle.h
/usr/include/c++/8/optional
/usr/include/c++/8/bits/enable_special_members.h
/usr/include/c++/8/bits/stl_set.h
/usr/include/c++/8/bits/stl_multiset.h
/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src/Lexer.h
/usr/include/c++/8/cstddef
/usr/include/c++/8/map
/usr/include/c++/8/bits/stl_map.h
/usr/include/c++/8/bits/stl_multimap.h
/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/Database.h
/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/Datafile.h
/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src/FS.h
/usr/include/x86_64-linux-gnu/sys/stat.h
/usr/include/x86_64-linux-gnu/bits/stat.h
/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/Journal.h
/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/Transaction.h
/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/UndoAction.h
/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/TagInfoDatabase.h
/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/TagInfo.h
/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/Extensions.h
/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/Rules.h
/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src/Timer.h
/usr/include/c++/8/chrono
/usr/include/c++/8/ratio
/usr/include/c++/8/bits/parse_numbers.h
/usr/include/c++/8/iomanip
/usr/include/c++/8/bits/ios_base.h
/usr/include/c++/8/bits/locale_classes.h
/usr/include/c++/8/bits/locale_classes.tcc
/usr/include/c++/8/system_error
/usr/include/x86_64-linux-gnu/c++/8/bits/error_constants.h
/usr/include/c++/8/locale
/usr/include/c++/8/bits/locale_facets.h
/usr/include/c++/8/cwctype
/usr/include/wctype.h
/usr/include/x86_64-linux-gnu/bits/wctype-wchar.h
/usr/include/x86_64-linux-gnu/c++/8/bits/ctype_base.h
/usr/include/c++/8/streambuf
/usr/include/c++/8/bits/streambuf.tcc
/usr/include/c++/8/bits/streambuf_iterator.h
/usr/include/x86_64-linux-gnu/c++/8/bits/ctype_inline.h
/usr/include/c++/8/bits/locale_facets.tcc
/usr/include/c++/8/bits/locale_facets_nonio.h
/usr/include/x86_64-linux-gnu/c++/8/bits/time_members.h
/usr/include/x86_64-linux-gnu/c++/8/bits/messages_members.h
/usr/include/libintl.h
/usr/include/c++/8/bits/codecvt.h
/usr/include/c++/8/bits/locale_facets_nonio.tcc
/usr/include/c++/8/bits/locale_conv.h
/usr/include/c++/8/bits/quoted_string.h
/usr/include/c++/8/sstream
/usr/include/c++/8/istream
/usr/include/c++/8/ios
/usr/include/c++/8/bits/basic_ios.h
/usr/include/c++/8/bits/basic_ios.tcc
/usr/include/c++/8/ostream
/usr/include/c++/8/bits/ostream.tcc
/usr/include/c++/8/bits/istream.tcc
/usr/include/c++/8/bits/sstream.tcc
/usr/include/c++/8/iostream
/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src/shared.h
/usr/include/c++/8/algorithm
/usr/include/c++/8/bits/stl_algo.h
/usr/include/c++/8/bits/algorithmfwd.h
/usr/include/c++/8/bits/stl_heap.h
/usr/include/c++/8/bits/uniform_int_dist.h
/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/timew.h
/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src/Color.h
/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/Exclusion.h
/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/IntervalFilter.h
/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src/Palette.h

View File

@ -0,0 +1,763 @@
# CMAKE generated file: DO NOT EDIT!
# Generated by "Unix Makefiles" Generator, CMake Version 3.23
src/CMakeFiles/timew_executable.dir/timew.cpp.o: src/timew.cpp \
/usr/include/stdc-predef.h \
src/AtomicFile.h \
/usr/include/c++/8/memory \
/usr/include/c++/8/bits/stl_algobase.h \
/usr/include/x86_64-linux-gnu/c++/8/bits/c++config.h \
/usr/include/x86_64-linux-gnu/c++/8/bits/os_defines.h \
/usr/include/features.h \
/usr/include/x86_64-linux-gnu/sys/cdefs.h \
/usr/include/x86_64-linux-gnu/bits/wordsize.h \
/usr/include/x86_64-linux-gnu/bits/long-double.h \
/usr/include/x86_64-linux-gnu/gnu/stubs.h \
/usr/include/x86_64-linux-gnu/gnu/stubs-64.h \
/usr/include/x86_64-linux-gnu/c++/8/bits/cpu_defines.h \
/usr/include/c++/8/bits/functexcept.h \
/usr/include/c++/8/bits/exception_defines.h \
/usr/include/c++/8/bits/cpp_type_traits.h \
/usr/include/c++/8/ext/type_traits.h \
/usr/include/c++/8/ext/numeric_traits.h \
/usr/include/c++/8/bits/stl_pair.h \
/usr/include/c++/8/bits/move.h \
/usr/include/c++/8/bits/concept_check.h \
/usr/include/c++/8/type_traits \
/usr/include/c++/8/bits/stl_iterator_base_types.h \
/usr/include/c++/8/bits/stl_iterator_base_funcs.h \
/usr/include/c++/8/debug/assertions.h \
/usr/include/c++/8/bits/stl_iterator.h \
/usr/include/c++/8/bits/ptr_traits.h \
/usr/include/c++/8/debug/debug.h \
/usr/include/c++/8/bits/predefined_ops.h \
/usr/include/c++/8/bits/allocator.h \
/usr/include/x86_64-linux-gnu/c++/8/bits/c++allocator.h \
/usr/include/c++/8/ext/new_allocator.h \
/usr/include/c++/8/new \
/usr/include/c++/8/exception \
/usr/include/c++/8/bits/exception.h \
/usr/include/c++/8/bits/exception_ptr.h \
/usr/include/c++/8/bits/cxxabi_init_exception.h \
/usr/lib/gcc/x86_64-linux-gnu/8/include/stddef.h \
/usr/include/c++/8/typeinfo \
/usr/include/c++/8/bits/hash_bytes.h \
/usr/include/c++/8/bits/nested_exception.h \
/usr/include/c++/8/bits/memoryfwd.h \
/usr/include/c++/8/bits/stl_construct.h \
/usr/include/c++/8/ext/alloc_traits.h \
/usr/include/c++/8/bits/alloc_traits.h \
/usr/include/c++/8/bits/stl_uninitialized.h \
/usr/include/c++/8/utility \
/usr/include/c++/8/bits/stl_relops.h \
/usr/include/c++/8/initializer_list \
/usr/include/c++/8/bits/stl_tempbuf.h \
/usr/include/c++/8/bits/stl_raw_storage_iter.h \
/usr/include/c++/8/iosfwd \
/usr/include/c++/8/bits/stringfwd.h \
/usr/include/c++/8/bits/postypes.h \
/usr/include/c++/8/cwchar \
/usr/include/wchar.h \
/usr/include/x86_64-linux-gnu/bits/libc-header-start.h \
/usr/include/x86_64-linux-gnu/bits/floatn.h \
/usr/include/x86_64-linux-gnu/bits/floatn-common.h \
/usr/lib/gcc/x86_64-linux-gnu/8/include/stdarg.h \
/usr/include/x86_64-linux-gnu/bits/wchar.h \
/usr/include/x86_64-linux-gnu/bits/types/wint_t.h \
/usr/include/x86_64-linux-gnu/bits/types/mbstate_t.h \
/usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h \
/usr/include/x86_64-linux-gnu/bits/types/__FILE.h \
/usr/include/x86_64-linux-gnu/bits/types/FILE.h \
/usr/include/x86_64-linux-gnu/bits/types/locale_t.h \
/usr/include/x86_64-linux-gnu/bits/types/__locale_t.h \
/usr/include/c++/8/ext/atomicity.h \
/usr/include/x86_64-linux-gnu/c++/8/bits/gthr.h \
/usr/include/x86_64-linux-gnu/c++/8/bits/gthr-default.h \
/usr/include/pthread.h \
/usr/include/endian.h \
/usr/include/x86_64-linux-gnu/bits/endian.h \
/usr/include/x86_64-linux-gnu/bits/byteswap.h \
/usr/include/x86_64-linux-gnu/bits/types.h \
/usr/include/x86_64-linux-gnu/bits/typesizes.h \
/usr/include/x86_64-linux-gnu/bits/byteswap-16.h \
/usr/include/x86_64-linux-gnu/bits/uintn-identity.h \
/usr/include/sched.h \
/usr/include/x86_64-linux-gnu/bits/types/time_t.h \
/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h \
/usr/include/x86_64-linux-gnu/bits/sched.h \
/usr/include/x86_64-linux-gnu/bits/cpu-set.h \
/usr/include/time.h \
/usr/include/x86_64-linux-gnu/bits/time.h \
/usr/include/x86_64-linux-gnu/bits/timex.h \
/usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h \
/usr/include/x86_64-linux-gnu/bits/types/clock_t.h \
/usr/include/x86_64-linux-gnu/bits/types/struct_tm.h \
/usr/include/x86_64-linux-gnu/bits/types/clockid_t.h \
/usr/include/x86_64-linux-gnu/bits/types/timer_t.h \
/usr/include/x86_64-linux-gnu/bits/types/struct_itimerspec.h \
/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h \
/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h \
/usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h \
/usr/include/x86_64-linux-gnu/bits/setjmp.h \
/usr/include/x86_64-linux-gnu/c++/8/bits/atomic_word.h \
/usr/include/c++/8/ext/concurrence.h \
/usr/include/c++/8/bits/stl_function.h \
/usr/include/c++/8/backward/binders.h \
/usr/include/c++/8/bits/uses_allocator.h \
/usr/include/c++/8/bits/unique_ptr.h \
/usr/include/c++/8/tuple \
/usr/include/c++/8/array \
/usr/include/c++/8/stdexcept \
/usr/include/c++/8/string \
/usr/include/c++/8/bits/char_traits.h \
/usr/include/c++/8/cstdint \
/usr/lib/gcc/x86_64-linux-gnu/8/include/stdint.h \
/usr/include/stdint.h \
/usr/include/x86_64-linux-gnu/bits/stdint-intn.h \
/usr/include/x86_64-linux-gnu/bits/stdint-uintn.h \
/usr/include/c++/8/bits/localefwd.h \
/usr/include/x86_64-linux-gnu/c++/8/bits/c++locale.h \
/usr/include/c++/8/clocale \
/usr/include/locale.h \
/usr/include/x86_64-linux-gnu/bits/locale.h \
/usr/include/c++/8/cctype \
/usr/include/ctype.h \
/usr/include/c++/8/bits/ostream_insert.h \
/usr/include/c++/8/bits/cxxabi_forced.h \
/usr/include/c++/8/bits/range_access.h \
/usr/include/c++/8/bits/basic_string.h \
/usr/include/c++/8/string_view \
/usr/include/c++/8/limits \
/usr/include/c++/8/bits/functional_hash.h \
/usr/include/c++/8/bits/string_view.tcc \
/usr/include/c++/8/ext/string_conversions.h \
/usr/include/c++/8/cstdlib \
/usr/include/stdlib.h \
/usr/include/x86_64-linux-gnu/bits/waitflags.h \
/usr/include/x86_64-linux-gnu/bits/waitstatus.h \
/usr/include/x86_64-linux-gnu/sys/types.h \
/usr/include/x86_64-linux-gnu/sys/select.h \
/usr/include/x86_64-linux-gnu/bits/select.h \
/usr/include/x86_64-linux-gnu/bits/types/sigset_t.h \
/usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h \
/usr/include/x86_64-linux-gnu/sys/sysmacros.h \
/usr/include/x86_64-linux-gnu/bits/sysmacros.h \
/usr/include/alloca.h \
/usr/include/x86_64-linux-gnu/bits/stdlib-float.h \
/usr/include/c++/8/bits/std_abs.h \
/usr/include/c++/8/cstdio \
/usr/include/stdio.h \
/usr/include/x86_64-linux-gnu/bits/libio.h \
/usr/include/x86_64-linux-gnu/bits/_G_config.h \
/usr/include/x86_64-linux-gnu/bits/stdio_lim.h \
/usr/include/x86_64-linux-gnu/bits/sys_errlist.h \
/usr/include/c++/8/cerrno \
/usr/include/errno.h \
/usr/include/x86_64-linux-gnu/bits/errno.h \
/usr/include/linux/errno.h \
/usr/include/x86_64-linux-gnu/asm/errno.h \
/usr/include/asm-generic/errno.h \
/usr/include/asm-generic/errno-base.h \
/usr/include/c++/8/bits/basic_string.tcc \
/usr/include/c++/8/bits/invoke.h \
/usr/include/c++/8/bits/shared_ptr.h \
/usr/include/c++/8/bits/shared_ptr_base.h \
/usr/include/c++/8/bits/allocated_ptr.h \
/usr/include/c++/8/bits/refwrap.h \
/usr/include/c++/8/ext/aligned_buffer.h \
/usr/include/c++/8/bits/shared_ptr_atomic.h \
/usr/include/c++/8/bits/atomic_base.h \
/usr/include/c++/8/bits/atomic_lockfree_defines.h \
/usr/include/c++/8/backward/auto_ptr.h \
/usr/include/c++/8/vector \
/usr/include/c++/8/bits/stl_vector.h \
/usr/include/c++/8/bits/stl_bvector.h \
/usr/include/c++/8/bits/vector.tcc \
src/CLI.h \
src/libshared/src/Duration.h \
src/libshared/src/Pig.h \
/usr/include/c++/8/ctime \
src/Interval.h \
src/Range.h \
src/libshared/src/Datetime.h \
/usr/include/c++/8/set \
/usr/include/c++/8/bits/stl_tree.h \
/usr/include/c++/8/bits/node_handle.h \
/usr/include/c++/8/optional \
/usr/include/c++/8/bits/enable_special_members.h \
/usr/include/c++/8/bits/stl_set.h \
/usr/include/c++/8/bits/stl_multiset.h \
src/libshared/src/Lexer.h \
/usr/include/c++/8/cstddef \
/usr/include/c++/8/map \
/usr/include/c++/8/bits/stl_map.h \
/usr/include/c++/8/bits/stl_multimap.h \
src/Database.h \
src/Datafile.h \
src/libshared/src/FS.h \
/usr/include/x86_64-linux-gnu/sys/stat.h \
/usr/include/x86_64-linux-gnu/bits/stat.h \
src/Journal.h \
src/Transaction.h \
src/UndoAction.h \
src/TagInfoDatabase.h \
src/TagInfo.h \
src/Extensions.h \
src/Rules.h \
src/libshared/src/Timer.h \
/usr/include/c++/8/chrono \
/usr/include/c++/8/ratio \
/usr/include/c++/8/bits/parse_numbers.h \
/usr/include/c++/8/iomanip \
/usr/include/c++/8/bits/ios_base.h \
/usr/include/c++/8/bits/locale_classes.h \
/usr/include/c++/8/bits/locale_classes.tcc \
/usr/include/c++/8/system_error \
/usr/include/x86_64-linux-gnu/c++/8/bits/error_constants.h \
/usr/include/c++/8/locale \
/usr/include/c++/8/bits/locale_facets.h \
/usr/include/c++/8/cwctype \
/usr/include/wctype.h \
/usr/include/x86_64-linux-gnu/bits/wctype-wchar.h \
/usr/include/x86_64-linux-gnu/c++/8/bits/ctype_base.h \
/usr/include/c++/8/streambuf \
/usr/include/c++/8/bits/streambuf.tcc \
/usr/include/c++/8/bits/streambuf_iterator.h \
/usr/include/x86_64-linux-gnu/c++/8/bits/ctype_inline.h \
/usr/include/c++/8/bits/locale_facets.tcc \
/usr/include/c++/8/bits/locale_facets_nonio.h \
/usr/include/x86_64-linux-gnu/c++/8/bits/time_members.h \
/usr/include/x86_64-linux-gnu/c++/8/bits/messages_members.h \
/usr/include/libintl.h \
/usr/include/c++/8/bits/codecvt.h \
/usr/include/c++/8/bits/locale_facets_nonio.tcc \
/usr/include/c++/8/bits/locale_conv.h \
/usr/include/c++/8/bits/quoted_string.h \
/usr/include/c++/8/sstream \
/usr/include/c++/8/istream \
/usr/include/c++/8/ios \
/usr/include/c++/8/bits/basic_ios.h \
/usr/include/c++/8/bits/basic_ios.tcc \
/usr/include/c++/8/ostream \
/usr/include/c++/8/bits/ostream.tcc \
/usr/include/c++/8/bits/istream.tcc \
/usr/include/c++/8/bits/sstream.tcc \
/usr/include/c++/8/iostream \
src/libshared/src/shared.h \
/usr/include/c++/8/algorithm \
/usr/include/c++/8/bits/stl_algo.h \
/usr/include/c++/8/bits/algorithmfwd.h \
/usr/include/c++/8/bits/stl_heap.h \
/usr/include/c++/8/bits/uniform_int_dist.h \
src/timew.h \
src/libshared/src/Color.h \
src/Exclusion.h \
src/IntervalFilter.h \
src/libshared/src/Palette.h
src/libshared/src/Palette.h:
src/IntervalFilter.h:
src/Exclusion.h:
src/libshared/src/Color.h:
src/timew.h:
/usr/include/c++/8/bits/algorithmfwd.h:
src/libshared/src/shared.h:
/usr/include/c++/8/iostream:
/usr/include/c++/8/bits/stl_heap.h:
/usr/include/c++/8/bits/stl_algo.h:
/usr/include/c++/8/bits/sstream.tcc:
/usr/include/c++/8/bits/ostream.tcc:
/usr/include/c++/8/ostream:
/usr/include/c++/8/bits/basic_ios.tcc:
/usr/include/c++/8/bits/basic_ios.h:
/usr/include/c++/8/ios:
/usr/include/c++/8/bits/quoted_string.h:
/usr/include/c++/8/bits/locale_facets_nonio.tcc:
/usr/include/libintl.h:
/usr/include/x86_64-linux-gnu/c++/8/bits/time_members.h:
/usr/include/c++/8/bits/locale_facets_nonio.h:
/usr/include/c++/8/bits/streambuf_iterator.h:
/usr/include/x86_64-linux-gnu/bits/wctype-wchar.h:
/usr/include/wctype.h:
/usr/include/c++/8/cwctype:
/usr/include/c++/8/bits/locale_facets.h:
/usr/include/c++/8/system_error:
/usr/include/c++/8/bits/locale_classes.tcc:
/usr/include/c++/8/bits/parse_numbers.h:
src/libshared/src/Timer.h:
src/TagInfoDatabase.h:
src/UndoAction.h:
/usr/include/x86_64-linux-gnu/sys/stat.h:
src/Datafile.h:
src/Database.h:
/usr/include/c++/8/bits/stl_multimap.h:
/usr/include/c++/8/map:
/usr/include/c++/8/cstddef:
src/libshared/src/Lexer.h:
/usr/include/c++/8/bits/enable_special_members.h:
/usr/include/c++/8/optional:
/usr/include/c++/8/bits/node_handle.h:
/usr/include/c++/8/bits/stl_tree.h:
src/libshared/src/Datetime.h:
src/Range.h:
src/Interval.h:
/usr/include/c++/8/istream:
/usr/include/c++/8/iomanip:
src/libshared/src/Pig.h:
src/Extensions.h:
src/libshared/src/Duration.h:
src/CLI.h:
/usr/include/c++/8/bits/vector.tcc:
/usr/include/c++/8/bits/locale_conv.h:
/usr/include/c++/8/bits/stl_bvector.h:
/usr/include/c++/8/vector:
/usr/include/x86_64-linux-gnu/bits/stat.h:
/usr/include/x86_64-linux-gnu/bits/types.h:
/usr/include/wchar.h:
/usr/include/endian.h:
/usr/include/x86_64-linux-gnu/c++/8/bits/gthr-default.h:
/usr/include/x86_64-linux-gnu/c++/8/bits/gthr.h:
/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h:
/usr/include/x86_64-linux-gnu/bits/byteswap.h:
/usr/include/c++/8/bits/ptr_traits.h:
/usr/include/x86_64-linux-gnu/bits/types/struct_itimerspec.h:
src/Transaction.h:
/usr/include/c++/8/array:
/usr/include/c++/8/streambuf:
/usr/include/x86_64-linux-gnu/bits/types/mbstate_t.h:
/usr/include/c++/8/ctime:
/usr/include/x86_64-linux-gnu/bits/setjmp.h:
/usr/include/c++/8/bits/stl_multiset.h:
/usr/include/x86_64-linux-gnu/bits/wchar.h:
/usr/include/c++/8/bits/exception_ptr.h:
/usr/lib/gcc/x86_64-linux-gnu/8/include/stdarg.h:
/usr/include/c++/8/bits/predefined_ops.h:
/usr/include/c++/8/bits/stl_uninitialized.h:
/usr/include/c++/8/ext/new_allocator.h:
/usr/include/x86_64-linux-gnu/bits/floatn.h:
/usr/include/x86_64-linux-gnu/bits/types/locale_t.h:
/usr/include/x86_64-linux-gnu/bits/libc-header-start.h:
/usr/include/x86_64-linux-gnu/bits/types/struct_tm.h:
/usr/include/c++/8/sstream:
/usr/include/c++/8/iosfwd:
src/timew.cpp:
/usr/include/c++/8/bits/stl_set.h:
/usr/include/c++/8/bits/stl_tempbuf.h:
/usr/include/c++/8/bits/stl_relops.h:
/usr/include/x86_64-linux-gnu/sys/sysmacros.h:
/usr/include/c++/8/bits/range_access.h:
/usr/include/c++/8/bits/alloc_traits.h:
/usr/include/c++/8/bits/stl_raw_storage_iter.h:
/usr/include/c++/8/ext/alloc_traits.h:
/usr/include/c++/8/new:
/usr/include/x86_64-linux-gnu/bits/types/wint_t.h:
/usr/lib/gcc/x86_64-linux-gnu/8/include/stddef.h:
/usr/include/x86_64-linux-gnu/bits/waitflags.h:
/usr/include/c++/8/bits/cxxabi_init_exception.h:
/usr/include/c++/8/algorithm:
/usr/include/x86_64-linux-gnu/bits/wordsize.h:
/usr/include/c++/8/ext/string_conversions.h:
/usr/include/x86_64-linux-gnu/gnu/stubs.h:
/usr/include/c++/8/bits/istream.tcc:
/usr/include/c++/8/debug/assertions.h:
/usr/include/x86_64-linux-gnu/bits/libio.h:
/usr/include/x86_64-linux-gnu/sys/cdefs.h:
/usr/include/c++/8/bits/allocator.h:
/usr/include/c++/8/bits/functexcept.h:
/usr/include/c++/8/bits/ios_base.h:
/usr/include/x86_64-linux-gnu/bits/endian.h:
/usr/include/x86_64-linux-gnu/c++/8/bits/os_defines.h:
/usr/include/c++/8/bits/shared_ptr_base.h:
/usr/include/stdc-predef.h:
/usr/include/c++/8/limits:
src/libshared/src/FS.h:
/usr/include/c++/8/bits/basic_string.tcc:
src/Rules.h:
/usr/include/c++/8/bits/atomic_lockfree_defines.h:
src/AtomicFile.h:
/usr/include/c++/8/chrono:
/usr/include/c++/8/bits/stl_algobase.h:
/usr/include/x86_64-linux-gnu/c++/8/bits/c++config.h:
/usr/include/x86_64-linux-gnu/bits/types/FILE.h:
/usr/include/x86_64-linux-gnu/bits/types/struct_timeval.h:
/usr/include/x86_64-linux-gnu/bits/select.h:
/usr/include/c++/8/bits/stl_iterator_base_types.h:
/usr/include/c++/8/bits/postypes.h:
/usr/include/c++/8/cwchar:
/usr/include/ctype.h:
/usr/include/x86_64-linux-gnu/bits/errno.h:
/usr/include/c++/8/bits/cpp_type_traits.h:
/usr/include/x86_64-linux-gnu/c++/8/bits/ctype_inline.h:
/usr/include/c++/8/locale:
/usr/include/c++/8/ext/type_traits.h:
/usr/include/x86_64-linux-gnu/gnu/stubs-64.h:
/usr/include/c++/8/clocale:
/usr/include/pthread.h:
/usr/include/errno.h:
/usr/include/c++/8/backward/auto_ptr.h:
/usr/include/c++/8/bits/stringfwd.h:
/usr/include/c++/8/bits/char_traits.h:
/usr/include/x86_64-linux-gnu/bits/types/__locale_t.h:
/usr/include/c++/8/bits/stl_iterator_base_funcs.h:
/usr/include/c++/8/ext/atomicity.h:
/usr/include/linux/errno.h:
/usr/include/c++/8/bits/move.h:
/usr/include/c++/8/initializer_list:
/usr/include/c++/8/bits/nested_exception.h:
/usr/include/c++/8/bits/stl_pair.h:
/usr/include/c++/8/bits/concept_check.h:
/usr/include/c++/8/bits/locale_classes.h:
/usr/include/c++/8/type_traits:
/usr/include/c++/8/bits/stl_iterator.h:
/usr/include/c++/8/memory:
/usr/include/x86_64-linux-gnu/c++/8/bits/cpu_defines.h:
/usr/include/c++/8/debug/debug.h:
/usr/include/x86_64-linux-gnu/bits/types/__FILE.h:
/usr/include/c++/8/bits/invoke.h:
/usr/include/x86_64-linux-gnu/c++/8/bits/c++allocator.h:
/usr/include/c++/8/bits/stl_construct.h:
/usr/include/asm-generic/errno-base.h:
/usr/include/c++/8/backward/binders.h:
/usr/include/c++/8/exception:
/usr/include/stdint.h:
/usr/include/x86_64-linux-gnu/bits/byteswap-16.h:
/usr/include/c++/8/bits/streambuf.tcc:
/usr/include/x86_64-linux-gnu/bits/cpu-set.h:
/usr/include/c++/8/bits/hash_bytes.h:
/usr/include/x86_64-linux-gnu/bits/uintn-identity.h:
/usr/include/x86_64-linux-gnu/c++/8/bits/c++locale.h:
/usr/include/x86_64-linux-gnu/c++/8/bits/ctype_base.h:
/usr/include/c++/8/ratio:
/usr/include/sched.h:
/usr/include/c++/8/typeinfo:
/usr/include/c++/8/bits/string_view.tcc:
/usr/include/x86_64-linux-gnu/bits/types/timer_t.h:
/usr/include/stdlib.h:
/usr/include/c++/8/ext/aligned_buffer.h:
/usr/include/time.h:
/usr/include/x86_64-linux-gnu/bits/time.h:
/usr/include/alloca.h:
/usr/include/x86_64-linux-gnu/bits/timex.h:
/usr/include/x86_64-linux-gnu/bits/types/clock_t.h:
/usr/include/x86_64-linux-gnu/bits/types/clockid_t.h:
/usr/include/x86_64-linux-gnu/bits/thread-shared-types.h:
/usr/include/c++/8/ext/concurrence.h:
/usr/include/c++/8/bits/stl_map.h:
/usr/include/c++/8/bits/stl_function.h:
/usr/include/x86_64-linux-gnu/c++/8/bits/messages_members.h:
/usr/include/c++/8/bits/uses_allocator.h:
/usr/include/x86_64-linux-gnu/c++/8/bits/error_constants.h:
/usr/include/c++/8/bits/unique_ptr.h:
/usr/include/x86_64-linux-gnu/c++/8/bits/atomic_word.h:
/usr/include/c++/8/tuple:
/usr/include/c++/8/stdexcept:
/usr/include/x86_64-linux-gnu/bits/floatn-common.h:
/usr/include/x86_64-linux-gnu/bits/locale.h:
/usr/include/c++/8/bits/ostream_insert.h:
/usr/include/c++/8/string:
/usr/include/c++/8/cstdint:
/usr/include/c++/8/bits/uniform_int_dist.h:
src/Journal.h:
/usr/lib/gcc/x86_64-linux-gnu/8/include/stdint.h:
/usr/include/x86_64-linux-gnu/bits/stdint-intn.h:
/usr/include/x86_64-linux-gnu/bits/stdint-uintn.h:
/usr/include/c++/8/bits/refwrap.h:
/usr/include/c++/8/cctype:
/usr/include/locale.h:
/usr/include/c++/8/bits/cxxabi_forced.h:
/usr/include/c++/8/bits/locale_facets.tcc:
src/TagInfo.h:
/usr/include/c++/8/bits/basic_string.h:
/usr/include/x86_64-linux-gnu/bits/long-double.h:
/usr/include/c++/8/string_view:
/usr/include/c++/8/bits/functional_hash.h:
/usr/include/c++/8/cstdlib:
/usr/include/c++/8/set:
/usr/include/x86_64-linux-gnu/bits/types/struct_timespec.h:
/usr/include/x86_64-linux-gnu/bits/waitstatus.h:
/usr/include/c++/8/bits/exception_defines.h:
/usr/include/c++/8/ext/numeric_traits.h:
/usr/include/c++/8/bits/std_abs.h:
/usr/include/x86_64-linux-gnu/sys/types.h:
/usr/include/x86_64-linux-gnu/sys/select.h:
/usr/include/x86_64-linux-gnu/bits/types/sigset_t.h:
/usr/include/stdio.h:
/usr/include/features.h:
/usr/include/x86_64-linux-gnu/bits/types/__sigset_t.h:
/usr/include/x86_64-linux-gnu/bits/sysmacros.h:
/usr/include/x86_64-linux-gnu/bits/stdlib-float.h:
/usr/include/c++/8/bits/stl_vector.h:
/usr/include/c++/8/bits/memoryfwd.h:
/usr/include/c++/8/cstdio:
/usr/include/c++/8/bits/codecvt.h:
/usr/include/c++/8/utility:
/usr/include/c++/8/bits/shared_ptr.h:
/usr/include/x86_64-linux-gnu/bits/_G_config.h:
/usr/include/x86_64-linux-gnu/bits/stdio_lim.h:
/usr/include/x86_64-linux-gnu/bits/pthreadtypes-arch.h:
/usr/include/x86_64-linux-gnu/bits/sched.h:
/usr/include/x86_64-linux-gnu/bits/sys_errlist.h:
/usr/include/c++/8/cerrno:
/usr/include/x86_64-linux-gnu/asm/errno.h:
/usr/include/asm-generic/errno.h:
/usr/include/c++/8/bits/allocated_ptr.h:
/usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h:
/usr/include/x86_64-linux-gnu/bits/typesizes.h:
/usr/include/c++/8/bits/localefwd.h:
/usr/include/c++/8/bits/exception.h:
/usr/include/c++/8/bits/shared_ptr_atomic.h:
/usr/include/x86_64-linux-gnu/bits/types/time_t.h:
/usr/include/c++/8/bits/atomic_base.h:

View File

@ -0,0 +1,2 @@
# CMAKE generated file: DO NOT EDIT!
# Timestamp file for compiler generated dependencies management for timew_executable.

View File

@ -0,0 +1,2 @@
# Empty dependencies file for timew_executable.
# This may be replaced when dependencies are built.

View File

@ -0,0 +1,10 @@
# CMAKE generated file: DO NOT EDIT!
# Generated by "Unix Makefiles" Generator, CMake Version 3.23
# compile CXX with /usr/bin/c++
CXX_DEFINES =
CXX_INCLUDES = -I/home/jdaugherty/work/pkgs/taskw/timew-1.7.1 -I/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src -I/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/commands -I/home/jdaugherty/work/pkgs/taskw/timew-1.7.1/src/libshared/src
CXX_FLAGS = -Wall -Wextra -Wsign-compare -Wreturn-type -g -std=gnu++17

View File

@ -0,0 +1 @@
/usr/bin/c++ -Wall -Wextra -Wsign-compare -Wreturn-type -g CMakeFiles/timew_executable.dir/timew.cpp.o -o timew libtimew.a commands/libcommands.a libtimew.a liblibshared.a

View File

@ -0,0 +1,3 @@
CMAKE_PROGRESS_1 =
CMAKE_PROGRESS_2 = 98

80
src/CMakeLists.txt Normal file
View File

@ -0,0 +1,80 @@
cmake_minimum_required (VERSION 3.8)
include_directories (${CMAKE_SOURCE_DIR}
${CMAKE_SOURCE_DIR}/src
${CMAKE_SOURCE_DIR}/src/commands
${CMAKE_SOURCE_DIR}/src/libshared/src
${TIMEW_INCLUDE_DIRS})
set (timew_SRCS AtomicFile.cpp AtomicFile.h
CLI.cpp CLI.h
Chart.cpp Chart.h
ChartConfig.h
Database.cpp Database.h
Datafile.cpp Datafile.h
DatetimeParser.cpp DatetimeParser.h
Exclusion.cpp Exclusion.h
Extensions.cpp Extensions.h
ExtensionsTable.cpp ExtensionsTable.h
GapsTable.cpp GapsTable.h
Interval.cpp Interval.h
IntervalFactory.cpp IntervalFactory.h
IntervalFilter.cpp IntervalFilter.h
IntervalFilterAndGroup.cpp IntervalFilterAndGroup.h
IntervalFilterAllInRange.cpp IntervalFilterAllInRange.h
IntervalFilterAllWithIds.cpp IntervalFilterAllWithIds.h
IntervalFilterAllWithTags.cpp IntervalFilterAllWithTags.h
IntervalFilterTagsDisjoint.cpp IntervalFilterTagsDisjoint.h
IntervalFilterFirstOf.cpp IntervalFilterFirstOf.h
Journal.cpp Journal.h
Range.cpp Range.h
Rules.cpp Rules.h
SummaryTable.cpp SummaryTable.h
TagDescription.cpp TagDescription.h
TagInfo.cpp TagInfo.h
TagInfoDatabase.cpp TagInfoDatabase.h
TagsTable.cpp TagsTable.h
Transaction.cpp Transaction.h
TransactionsFactory.cpp TransactionsFactory.h
UndoAction.cpp UndoAction.h
data.cpp
dom.cpp
init.cpp
helper.cpp
paths.cpp paths.h
log.cpp
util.cpp
validate.cpp)
set (libshared_SRCS libshared/src/Args.cpp libshared/src/Args.h
libshared/src/Color.cpp libshared/src/Color.h
libshared/src/Composite.cpp libshared/src/Composite.h
libshared/src/Configuration.cpp libshared/src/Configuration.h
libshared/src/Datetime.cpp libshared/src/Datetime.h
libshared/src/Duration.cpp libshared/src/Duration.h
libshared/src/FS.cpp libshared/src/FS.h
libshared/src/JSON.cpp libshared/src/JSON.h
libshared/src/Lexer.cpp libshared/src/Lexer.h
libshared/src/Msg.cpp libshared/src/Msg.h
libshared/src/Palette.cpp libshared/src/Palette.h
libshared/src/Pig.cpp libshared/src/Pig.h
libshared/src/RX.cpp libshared/src/RX.h
libshared/src/Table.cpp libshared/src/Table.h
libshared/src/Timer.cpp libshared/src/Timer.h
libshared/src/format.cpp libshared/src/format.h
libshared/src/shared.cpp libshared/src/shared.h
libshared/src/unicode.cpp libshared/src/unicode.h
libshared/src/utf8.cpp libshared/src/utf8.h
libshared/src/wcwidth.h)
add_library (timew STATIC ${timew_SRCS})
add_library (libshared STATIC ${libshared_SRCS})
add_executable (timew_executable timew.cpp)
add_executable (lex_executable lex.cpp)
target_link_libraries (timew_executable timew commands timew libshared ${TIMEW_LIBRARIES})
target_link_libraries (lex_executable timew libshared ${TIMEW_LIBRARIES})
set_property (TARGET timew_executable PROPERTY OUTPUT_NAME "timew")
set_property (TARGET lex_executable PROPERTY OUTPUT_NAME "lex")
install (TARGETS timew_executable DESTINATION ${TIMEW_BINDIR})

608
src/Chart.cpp Normal file
View File

@ -0,0 +1,608 @@
////////////////////////////////////////////////////////////////////////////////
//
// Copyright 2019 - 2023, Thomas Lauf, Paul Beckingham, Federico Hernandez.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
// https://www.opensource.org/licenses/mit-license.php
//
////////////////////////////////////////////////////////////////////////////////
#include <Chart.h>
#include <Composite.h>
#include <Duration.h>
#include <cassert>
#include <format.h>
#include <iomanip>
#include <shared.h>
#include <timew.h>
#include <utf8.h>
////////////////////////////////////////////////////////////////////////////////
Chart::Chart (const ChartConfig& configuration) :
reference_datetime (configuration.reference_datetime),
with_label_month (configuration.with_label_month),
with_label_week (configuration.with_label_week),
with_label_months (configuration.with_label_months),
with_label_weeks (configuration.with_label_weeks),
with_label_weekday (configuration.with_label_weekday),
with_label_day (configuration.with_label_day),
with_ids (configuration.with_ids),
with_summary (configuration.with_summary),
with_holidays (configuration.with_holidays),
with_totals (configuration.with_totals),
with_internal_axis (configuration.with_internal_axis),
show_intervals (configuration.show_intervals),
determine_hour_range (configuration.determine_hour_range),
minutes_per_char (configuration.minutes_per_char),
spacing (configuration.spacing),
num_lines (configuration.num_lines),
color_today (configuration.color_today),
color_holiday (configuration.color_holiday),
color_label (configuration.color_label),
color_exclusion (configuration.color_exclusion),
tag_colors (configuration.tag_colors),
cell_width (60 / minutes_per_char + spacing),
reference_hour (reference_datetime.hour ())
{ }
std::string Chart::render (
const Range& range,
const std::vector <Interval>& tracked,
const std::vector <Range>& exclusions,
const std::map <Datetime, std::string>& holidays)
{
// Determine hours shown.
auto hour_range = determine_hour_range
? determineHourRange (range, tracked)
: std::make_pair (0, 23);
int first_hour = hour_range.first;
int last_hour = hour_range.second;
debug (format ("Day range is from {1}:00 - {2}:00", first_hour, last_hour));
const auto indent_size = getIndentSize ();
const auto total_width = (last_hour - first_hour + 1) * (cell_width);
const auto padding_size = indent_size + total_width + 1;
const auto indent = std::string (indent_size, ' ');
std::stringstream out;
out << '\n';
// Render the axis.
if (! with_internal_axis)
{
out << indent << renderAxis (first_hour, last_hour);
}
// For rendering labels on edge detection.
Datetime previous {0};
// Each day is rendered separately.
time_t total_work = 0;
for (Datetime day = range.start; day < range.end; day++)
{
// Render the exclusion blocks.
// Add an empty string with no color, to reserve width, so this function
// can simply concatenate to lines[i].str ().
std::vector <Composite> lines (num_lines);
for (int i = 0; i < num_lines; ++i)
{
lines[i].add (std::string (total_width, ' '), 0, Color ());
}
renderExclusionBlocks (lines, day, first_hour, last_hour, exclusions);
time_t work = 0;
if (! show_intervals)
{
for (auto& track : tracked)
{
time_t interval_work = 0;
renderInterval (lines, day, track, first_hour, interval_work);
work += interval_work;
}
}
auto color_day = getDayColor (day, holidays);
auto labelMonth = with_label_month ? renderMonth (previous, day) : "";
auto labelWeek = ( with_label_week || with_label_weeks )
? renderWeek (previous, day) : "";
auto labelWeekday = with_label_weekday ? renderWeekday (day, color_day) : "";
auto labelDay = with_label_day ? renderDay (day, color_day) : "";
out << labelMonth
<< labelWeek
<< labelWeekday
<< labelDay
<< lines[0].str ();
if (lines.size () > 1)
{
for (unsigned int i = 1; i < lines.size (); ++i)
{
out << "\n"
<< indent
<< lines[i].str ();
}
}
out << (with_totals ? renderTotal (work) : "")
<< '\n';
previous = day;
total_work += work;
}
out << (with_totals ? renderSubTotal (total_work, std::string (padding_size, ' ')) : "")
<< (with_holidays ? renderHolidays (holidays) : "")
<< (with_summary ? renderSummary (indent, range, exclusions, tracked) : "");
return out.str ();
}
////////////////////////////////////////////////////////////////////////////////
unsigned long Chart::getIndentSize ()
{
return (with_label_month ? 4 : 0) +
(with_label_week ? 4 : 0) +
(with_label_day ? 3 : 0) +
(with_label_weekday ? 4 : 0);
}
////////////////////////////////////////////////////////////////////////////////
// Scan all tracked intervals, looking for the earliest and latest hour into
// which an interval extends.
std::pair <int, int> Chart::determineHourRange (
const Range& range,
const std::vector <Interval>& tracked)
{
// If there is no data, show the whole day.
if (tracked.empty ())
{
return std::make_pair (0, 23);
}
// Get the extreme time range for the filtered data.
auto first_hour = 23;
auto last_hour = 0;
for (Datetime day = range.start; day < range.end; day++)
{
auto day_range = getFullDay (day);
for (auto& track : tracked)
{
Interval test {track};
if (test.is_open ())
{
test.end = reference_datetime;
}
if (day_range.overlaps (test))
{
Interval clipped = clip (test, day_range);
if (clipped.start.hour () < first_hour)
{
first_hour = clipped.start.hour ();
}
if (! clipped.is_open () && clipped.end.hour () > last_hour)
{
last_hour = clipped.end.hour ();
}
}
}
}
if (first_hour == 23 && last_hour == 0)
{
first_hour = reference_hour;
last_hour = std::min (first_hour + 1, 23);
}
else
{
first_hour = std::max (first_hour - 1, 0);
last_hour = std::min (last_hour, 23);
}
return std::make_pair (first_hour, last_hour);
}
////////////////////////////////////////////////////////////////////////////////
std::string Chart::renderAxis (const int first_hour, const int last_hour)
{
std::stringstream out;
for (int hour = first_hour; hour <= last_hour; hour++)
{
auto color = getHourColor (hour);
out << color.colorize (leftJustify (hour, cell_width));
}
if (with_totals)
{
out << " " << color_label.colorize ("Total");
}
out << '\n';
return out.str ();
}
////////////////////////////////////////////////////////////////////////////////
std::string Chart::renderMonth (const Datetime& previous, const Datetime& day)
{
const auto show_month = previous.month () != day.month ();
std::stringstream out;
out << (show_month ? Datetime::monthNameShort (day.month ()) : " ")
<< ' ';
return out.str ();
}
////////////////////////////////////////////////////////////////////////////////
std::string Chart::renderWeek (const Datetime& previous, const Datetime& day)
{
const auto show_week = previous.week () != day.week ();
std::stringstream out;
out << (show_week ? leftJustify (format ("W{1}", day.week ()), 3) : " ")
<< ' ';
return out.str ();
}
////////////////////////////////////////////////////////////////////////////////
std::string Chart::renderWeekday (Datetime& day, const Color& color)
{
std::stringstream out;
out << color.colorize (Datetime::dayNameShort (day.dayOfWeek ()))
<< ' ';
return out.str ();
}
////////////////////////////////////////////////////////////////////////////////
std::string Chart::renderDay (Datetime& day, const Color& color)
{
std::stringstream out;
out << color.colorize (rightJustify (day.day (), 2))
<< ' ';
return out.str ();
}
////////////////////////////////////////////////////////////////////////////////
Color Chart::getDayColor (
const Datetime& day,
const std::map <Datetime, std::string>& holidays)
{
if (day.sameDay (reference_datetime))
{
return color_today;
}
for (auto& entry : holidays)
{
if (day.sameDay (entry.first))
{
return color_holiday;
}
}
return Color {};
}
////////////////////////////////////////////////////////////////////////////////
Color Chart::getHourColor (int hour) const
{
return hour == reference_hour ? color_today : color_label;
}
////////////////////////////////////////////////////////////////////////////////
std::string Chart::renderTotal (time_t work)
{
std::stringstream out;
if (work)
{
int hours = work / 3600;
int minutes = (work % 3600) / 60;
out << " "
<< std::setw (3) << std::setfill (' ') << hours
<< ':'
<< std::setw (2) << std::setfill ('0') << minutes;
}
return out.str ();
}
////////////////////////////////////////////////////////////////////////////////
std::string Chart::renderSubTotal (
time_t total_work,
const std::string& padding)
{
std::stringstream out;
int hours = total_work / 3600;
int minutes = (total_work % 3600) / 60;
out << padding
<< Color ("underline").colorize (" ")
<< '\n'
<< padding
<< std::setw (3) << std::setfill (' ') << hours
<< ':'
<< std::setw (2) << std::setfill ('0') << minutes
<< '\n';
return out.str ();
}
void Chart::renderExclusionBlocks (
std::vector <Composite>& lines,
const Datetime& day,
int first_hour,
int last_hour,
const std::vector <Range>& exclusions)
{
// Render the exclusion blocks.
for (int hour = first_hour; hour <= last_hour; hour++)
{
// Construct a range representing a single 'hour', of 'day'.
Range hour_range (Datetime (day.year (), day.month (), day.day (), hour, 0, 0),
Datetime (day.year (), day.month (), day.day (), hour + 1, 0, 0));
if (with_internal_axis)
{
auto label = format ("{1}", hour);
int offset = (hour - first_hour) * cell_width;
lines[0].add (label, offset, color_label);
}
for (auto& exclusion : exclusions)
{
if (exclusion.overlaps (hour_range))
{
// Determine which of the character blocks included.
auto sub_hour = exclusion.intersect (hour_range);
auto start_block = quantizeToNMinutes (sub_hour.start.minute (), minutes_per_char) / minutes_per_char;
auto end_block = quantizeToNMinutes (sub_hour.end.minute () == 0 ? 60 : sub_hour.end.minute (), minutes_per_char) / minutes_per_char;
int offset = (hour - first_hour) * cell_width + start_block;
int width = end_block - start_block;
std::string block (width, ' ');
for (auto& line : lines)
{
line.add (block, offset, color_exclusion);
}
if (with_internal_axis)
{
auto label = format ("{1}", hour);
if (start_block == 0 &&
width >= static_cast <int> (label.length ()))
{
lines[0].add (label, offset, color_exclusion);
}
}
}
}
}
}
////////////////////////////////////////////////////////////////////////////////
void Chart::renderInterval (
std::vector <Composite>& lines,
const Datetime& day,
const Interval& track,
const int first_hour,
time_t& work)
{
// Ignore any track that doesn't overlap with day.
auto day_range = getFullDay (day);
if (! day_range.overlaps (track) || (track.is_open () && day > reference_datetime))
{
return;
}
// If the track is open and day is today, then closed the track now, otherwise
// it will be rendered until midnight.
Interval clipped = clip (track, day_range);
if (track.is_open ())
{
if (day_range.start.sameDay (reference_datetime))
{
clipped.end = reference_datetime;
}
else
{
clipped.end = day_range.end;
}
}
auto start_mins = (clipped.start.hour () - first_hour) * 60 + clipped.start.minute ();
auto end_mins = (clipped.end.hour () - first_hour) * 60 + clipped.end.minute ();
if (clipped.end.hour () == 0)
{
end_mins += (clipped.end.day () + (clipped.end.month () - clipped.start.month () - 1) * clipped.start.day ()) * 24 * 60;
}
work = clipped.total ();
auto start_block = quantizeToNMinutes (start_mins, minutes_per_char) / minutes_per_char;
auto end_block = quantizeToNMinutes (end_mins == start_mins ? start_mins + 60 : end_mins, minutes_per_char) / minutes_per_char;
int start_offset = start_block + (spacing * (start_mins / 60));
int end_offset = end_block + (spacing * (end_mins / 60));
if (end_offset > start_offset)
{
// Determine color of interval.
Color colorTrack = chartIntervalColor (track.tags (), tag_colors);
// Properly format the tags within the space.
std::string label;
if (with_ids)
{
label = format ("@{1}", track.id);
}
for (auto& tag : track.tags ())
{
if (! label.empty ())
{
label += ' ';
}
label += tag;
}
auto width = end_offset - start_offset;
if (width)
{
std::vector <std::string> text_lines;
// --
// The hang/memory consumption in #309 is due to a bug in libshared's wrapText
// It would be best to make wrapText/extractText width be the count of characters on the screen (and not a byte width).
// This fix will only show the tag if the utf8 character width is within the width (and it won't try to wrap),
// but otherwise functions normally for text where the utf-8 width matches the byte length of the label.
//
size_t utf8_characters = utf8_text_width (label);
if (static_cast <size_t> (width) >= utf8_characters)
{
text_lines.push_back (label);
}
else if (utf8_characters == label.size ())
{
wrapText (text_lines, label, width, false);
}
// --
for (unsigned int i = 0; i < lines.size (); ++i)
{
if (i < text_lines.size ())
{
lines[i].add (leftJustify (text_lines[i], width), start_offset, colorTrack);
}
else
{
lines[i].add (std::string (width, ' '), start_offset, colorTrack);
}
}
// An open interval gets a "+" in the bottom right corner
if (track.is_open ())
{
lines.back ().add ("+", start_offset + width - 1, colorTrack);
}
}
}
}
////////////////////////////////////////////////////////////////////////////////
std::string Chart::renderHolidays (const std::map <Datetime, std::string>& holidays)
{
std::stringstream out;
for (auto& entry : holidays)
{
out << entry.first.toString ("Y-M-D")
<< " "
<< entry.second
<< '\n';
}
return out.str ();
}
////////////////////////////////////////////////////////////////////////////////
std::string Chart::renderSummary (
const std::string& indent,
const Range& range,
const std::vector <Range>& exclusions,
const std::vector <Interval>& tracked)
{
std::stringstream out;
time_t total_unavailable = 0;
for (auto& exclusion : exclusions)
{
if (range.overlaps (exclusion))
{
total_unavailable += range.intersect (exclusion).total ();
}
}
time_t total_worked = 0;
if (! show_intervals)
{
for (auto& interval : tracked)
{
if (range.overlaps (interval))
{
Interval clipped = clip (interval, range);
if (interval.is_open ())
{
clipped.end = reference_datetime;
}
total_worked += clipped.total ();
}
}
}
auto total_available = range.total () - total_unavailable;
assert (total_available >= 0);
auto total_remaining = total_available - total_worked;
out << '\n'
<< indent << "Tracked "
<< std::setw (13) << std::setfill (' ') << Duration (total_worked).formatHours () << '\n';
if (total_remaining >= 0)
{
out << indent << "Available "
<< std::setw (13) << std::setfill (' ') << Duration (total_remaining).formatHours () << '\n';
}
out << indent << "Total "
<< std::setw (13) << std::setfill (' ') << Duration (total_available).formatHours () << '\n'
<< '\n';
return out.str ();
}

90
src/Chart.h Normal file
View File

@ -0,0 +1,90 @@
////////////////////////////////////////////////////////////////////////////////
//
// Copyright 2019, 2022 - 2023, Thomas Lauf, Paul Beckingham, Federico Hernandez.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
// https://www.opensource.org/licenses/mit-license.php
//
////////////////////////////////////////////////////////////////////////////////
#ifndef INCLUDED_CHART
#define INCLUDED_CHART
#include <ChartConfig.h>
#include <Composite.h>
#include <Interval.h>
#include <map>
class Chart
{
public:
explicit Chart (const ChartConfig& configuration);
std::string render (const Range&, const std::vector <Interval>&, const std::vector <Range>&, const std::map <Datetime, std::string>&);
private:
std::string renderAxis (int, int);
std::string renderDay (Datetime&, const Color&);
std::string renderHolidays (const std::map <Datetime, std::string>&);
std::string renderMonth (const Datetime&, const Datetime&);
std::string renderSubTotal (time_t, const std::string&);
std::string renderSummary (const std::string&, const Range&, const std::vector <Range>&, const std::vector <Interval>&);
std::string renderTotal (time_t);
std::string renderWeek (const Datetime&, const Datetime&);
std::string renderWeekday (Datetime&, const Color&);
void renderExclusionBlocks (std::vector <Composite>&, const Datetime&, int, int, const std::vector <Range>&);
void renderInterval (std::vector <Composite>&, const Datetime&, const Interval&, int, time_t&);
unsigned long getIndentSize ();
std::pair <int, int> determineHourRange (const Range&, const std::vector <Interval>&);
Color getDayColor (const Datetime&, const std::map <Datetime, std::string>&);
Color getHourColor (int) const;
const Datetime reference_datetime;
const bool with_label_month;
const bool with_label_week;
const bool with_label_months;
const bool with_label_weeks;
const bool with_label_weekday;
const bool with_label_day;
const bool with_ids;
const bool with_summary;
const bool with_holidays;
const bool with_totals;
const bool with_internal_axis;
const bool show_intervals;
const bool determine_hour_range;
const int minutes_per_char;
const int spacing;
const int num_lines;
const Color color_today;
const Color color_holiday;
const Color color_label;
const Color color_exclusion;
const std::map <std::string, Color> tag_colors;
const int cell_width;
const int reference_hour;
};
#endif

61
src/ChartConfig.h Normal file
View File

@ -0,0 +1,61 @@
////////////////////////////////////////////////////////////////////////////////
//
// Copyright 2019, 2022 - 2023, Thomas Lauf, Paul Beckingham, Federico Hernandez.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
// https://www.opensource.org/licenses/mit-license.php
//
////////////////////////////////////////////////////////////////////////////////
#ifndef INCLUDED_CHARTCONFIG
#define INCLUDED_CHARTCONFIG
#include <Color.h>
#include <Datetime.h>
#include <map>
class ChartConfig
{
public:
Datetime reference_datetime;
bool with_label_month;
bool with_label_week;
bool with_label_months;
bool with_label_weeks;
bool with_label_weekday;
bool with_label_day;
bool with_ids;
bool with_summary;
bool with_holidays;
bool with_totals;
bool with_internal_axis;
bool show_intervals;
bool determine_hour_range;
int minutes_per_char;
int spacing;
int num_lines;
Color color_today;
Color color_holiday;
Color color_label;
Color color_exclusion;
std::map <std::string, Color> tag_colors;
};
#endif

558
src/Database.cpp Normal file
View File

@ -0,0 +1,558 @@
////////////////////////////////////////////////////////////////////////////////
//
// Copyright 2016, 2018 - 2023, Thomas Lauf, Paul Beckingham, Federico Hernandez.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
// https://www.opensource.org/licenses/mit-license.php
//
////////////////////////////////////////////////////////////////////////////////
#include <AtomicFile.h>
#include <Database.h>
#include <IntervalFactory.h>
#include <JSON.h>
#include <cassert>
#include <format.h>
#include <iomanip>
#include <iostream>
#include <timew.h>
////////////////////////////////////////////////////////////////////////////////
Database::iterator::iterator (files_iterator fbegin, files_iterator fend) :
files_it (fbegin),
files_end (fend)
{
if (files_end != files_it)
{
auto& lines = files_it->allLines ();
lines_it = lines.rbegin ();
lines_end = lines.rend ();
while ((lines_it == lines_end) && (files_it != files_end))
{
++files_it;
if (files_it != files_end)
{
auto& lines = files_it->allLines ();
lines_it = lines.rbegin ();
lines_end = lines.rend ();
}
}
}
}
////////////////////////////////////////////////////////////////////////////////
Database::iterator& Database::iterator::operator++ ()
{
if (files_it != files_end)
{
if (lines_it != lines_end)
{
++lines_it;
// If we are at the end of the current file, we will need to advance to
// the next file here. A file may be empty, which is why we need to wait
// until we are pointing at a valid line.
while ((lines_it == lines_end) && (files_it != files_end))
{
++files_it;
if (files_it != files_end)
{
auto& lines = files_it->allLines ();
lines_it = lines.rbegin ();
lines_end = lines.rend ();
}
}
}
}
return *this;
}
////////////////////////////////////////////////////////////////////////////////
bool Database::iterator::operator== (const iterator& other) const
{
return (other.files_it == other.files_end) ?
files_it == files_end :
((files_it == other.files_it) &&
(files_end == other.files_end) &&
(lines_it == other.lines_it) &&
(lines_end == other.lines_end));
}
////////////////////////////////////////////////////////////////////////////////
bool Database::iterator::operator!= (const iterator& other) const
{
return ! (*this == other);
}
////////////////////////////////////////////////////////////////////////////////
const std::string& Database::iterator::operator* () const
{
assert (lines_it != lines_end);
return *lines_it;
}
////////////////////////////////////////////////////////////////////////////////
const std::string* Database::iterator::operator-> () const
{
assert (lines_it != lines_end);
return &(*lines_it);
}
////////////////////////////////////////////////////////////////////////////////
Database::reverse_iterator::reverse_iterator (files_iterator fbegin,
files_iterator fend) :
files_it (fbegin),
files_end (fend)
{
if (files_end != files_it)
{
lines_it = files_it->allLines ().begin ();
lines_end = files_it->allLines ().end ();
while ((lines_it == lines_end) && (files_it != files_end))
{
++files_it;
if (files_it != files_end)
{
auto& lines = files_it->allLines ();
lines_it = lines.begin ();
lines_end = lines.end ();
}
}
}
}
////////////////////////////////////////////////////////////////////////////////
Database::reverse_iterator& Database::reverse_iterator::operator++ ()
{
if (files_it != files_end)
{
if (lines_it != lines_end)
{
++lines_it;
// If we are at the end of the current file, we will need to advance to
// the next file here. A file may be empty, which is why we need to wait
// until we are pointing at a valid line.
while ((lines_it == lines_end) && (files_it != files_end))
{
++files_it;
if (files_it != files_end)
{
lines_it = files_it->allLines ().begin ();
lines_end = files_it->allLines ().end ();
}
}
}
}
return *this;
}
////////////////////////////////////////////////////////////////////////////////
bool
Database::reverse_iterator::operator== (const reverse_iterator& other) const
{
return (other.files_it == other.files_end) ?
files_it == files_end :
((files_it == other.files_it) &&
(files_end == other.files_end) &&
(lines_it == other.lines_it) &&
(lines_end == other.lines_end));
}
////////////////////////////////////////////////////////////////////////////////
bool
Database::reverse_iterator::operator!= (const reverse_iterator& other) const
{
return ! (*this == other);
}
////////////////////////////////////////////////////////////////////////////////
const std::string& Database::reverse_iterator::operator* () const
{
assert (lines_it != lines_end);
return *lines_it;
}
////////////////////////////////////////////////////////////////////////////////
const std::string* Database::reverse_iterator::operator-> () const
{
return &operator* ();
}
////////////////////////////////////////////////////////////////////////////////
Database::iterator Database::begin ()
{
if (_files.empty ())
{
initializeDatafiles ();
}
return iterator (_files.rbegin (), _files.rend ());
}
////////////////////////////////////////////////////////////////////////////////
Database::iterator Database::end ()
{
if (_files.empty ())
{
initializeDatafiles ();
}
return iterator (_files.rend (), _files.rend ());
}
////////////////////////////////////////////////////////////////////////////////
Database::reverse_iterator Database::rbegin ()
{
if (_files.empty ())
{
initializeDatafiles ();
}
return {_files.begin (), _files.end ()};
}
////////////////////////////////////////////////////////////////////////////////
Database::reverse_iterator Database::rend ()
{
if (_files.empty ())
{
initializeDatafiles ();
}
return reverse_iterator (_files.end (), _files.end ());
}
////////////////////////////////////////////////////////////////////////////////
void Database::initialize (const std::string& location, Journal& journal)
{
_location = location;
_journal = &journal;
initializeTagDatabase ();
}
////////////////////////////////////////////////////////////////////////////////
void Database::commit ()
{
for (auto& file : _files)
{
file.commit ();
}
if (_tagInfoDatabase.is_modified ())
{
AtomicFile::write (_location + "/tags.data", _tagInfoDatabase.toJson ());
}
}
////////////////////////////////////////////////////////////////////////////////
std::vector <std::string> Database::files () const
{
std::vector <std::string> all;
for (auto& file : _files)
{
all.push_back (file.name ());
}
return all;
}
////////////////////////////////////////////////////////////////////////////////
std::set <std::string> Database::tags () const
{
return _tagInfoDatabase.tags ();
}
////////////////////////////////////////////////////////////////////////////////
// Return most recent line from database
std::string Database::getLatestEntry ()
{
for (auto& line : *this)
{
if (! line.empty ())
{
return line;
}
}
return "";
}
////////////////////////////////////////////////////////////////////////////////
void Database::addInterval (const Interval& interval, bool verbose)
{
assert ((interval.end == 0) || (interval.start <= interval.end));
auto tags = interval.tags ();
for (auto& tag : tags)
{
if (_tagInfoDatabase.incrementTag (tag) == -1 && verbose)
{
std::cout << "Note: '" << quoteIfNeeded (tag) << "' is a new tag." << std::endl;
}
}
// Get the index into _files for the appropriate Datafile, which may be
// created on demand.
auto df = getDatafile (interval.start.year (), interval.start.month ());
_files[df].addInterval (interval);
_journal->recordIntervalAction ("", interval.json ());
}
////////////////////////////////////////////////////////////////////////////////
void Database::deleteInterval (const Interval& interval)
{
auto tags = interval.tags ();
for (auto& tag : tags)
{
_tagInfoDatabase.decrementTag (tag);
}
// Get the index into _files for the appropriate Datafile, which may be
// created on demand.
auto df = getDatafile (interval.start.year (), interval.start.month ());
_files[df].deleteInterval (interval);
_journal->recordIntervalAction (interval.json (), "");
}
////////////////////////////////////////////////////////////////////////////////
// The algorithm to modify an interval is first to find and remove it from the
// Datafile, then add it back to the right Datafile. This is because
// modification may involve changing the start date, which could mean the
// Interval belongs in a different file.
void Database::modifyInterval (const Interval& from, const Interval& to, bool verbose)
{
if (! from.empty ())
{
deleteInterval (from);
}
if (! to.empty ())
{
addInterval (to, verbose);
}
}
////////////////////////////////////////////////////////////////////////////////
std::string Database::dump () const
{
std::stringstream out;
out << "Database\n";
for (auto& df : _files)
{
out << df.dump ();
}
return out.str ();
}
////////////////////////////////////////////////////////////////////////////////
unsigned int Database::getDatafile (int year, int month)
{
std::stringstream file;
file << _location
<< '/'
<< std::setw (4) << std::setfill ('0') << year
<< '-'
<< std::setw (2) << std::setfill ('0') << month
<< ".data";
auto name = file.str ();
auto basename = Path (name).name ();
// If the datafile is already initialized, return.
for (unsigned int i = 0; i < _files.size (); ++i)
{
if (_files[i].name () == basename)
{
return i;
}
}
// Create the Datafile.
Datafile df;
df.initialize (name);
// Insert Datafile into _files. The position is not important.
_files.push_back (df);
return _files.size () - 1;
}
////////////////////////////////////////////////////////////////////////////////
// The input Daterange has a start and end, for example:
//
// 2016-02-20 to 2016-04-15
//
// Given the monthly storage scheme, split the Daterange into a vector of
// segmented Dateranges:
//
// 2016-02-01 to 2016-03-01
// 2016-03-01 to 2016-04-01
// 2016-04-01 to 2016-05-01
//
std::vector <Range> Database::segmentRange (const Range& range)
{
std::vector <Range> segments;
auto start_y = range.start.year ();
auto start_m = range.start.month ();
auto end = range.end;
if (end.toEpoch () == 0)
{
end = Datetime ();
}
auto end_y = end.year ();
auto end_m = end.month ();
while (start_y < end_y ||
(start_y == end_y && start_m <= end_m))
{
// Capture date before incrementing month.
Datetime segmentStart (start_y, start_m, 1);
// Next month.
start_m += 1;
if (start_m > 12)
{
start_y += 1;
start_m = 1;
}
// Capture date after incrementing month.
Datetime segmentEnd (start_y, start_m, 1);
auto segment = Range (segmentStart, segmentEnd);
if (range.intersects (segment))
{
segments.push_back (segment);
}
}
return segments;
}
bool Database::empty ()
{
return Database::begin () == Database::end ();
}
////////////////////////////////////////////////////////////////////////////////
void Database::initializeTagDatabase ()
{
_tagInfoDatabase = TagInfoDatabase ();
Path tags_path (_location + "/tags.data");
std::string content;
const bool exists = tags_path.exists ();
if (exists && File::read (tags_path, content))
{
try
{
std::unique_ptr <json::object> json (dynamic_cast <json::object*> (json::parse (content)));
if (content.empty () || (json == nullptr))
{
throw std::string ("Contents invalid.");
}
for (auto& pair : json->_data)
{
auto key = json::decode (pair.first);
auto *value = (json::object *) pair.second;
auto iter = value->_data.find ("count");
if (iter == value->_data.end ())
{
throw format ("Failed to find \"count\" member for tag \"{1}\" in tags database.", key);
}
auto number = dynamic_cast <json::number*> (iter->second);
_tagInfoDatabase.add (key, TagInfo{(unsigned int) number->_dvalue});
}
// Since we just loaded the database from the file, there we can clear the
// modified state so that we will not write it back out unless there is a
// new change.
_tagInfoDatabase.clear_modified ();
return;
}
catch (const std::string& error)
{
std::cerr << "Error parsing tags database: " << error << '\n';
}
}
// We always want the tag database file to exist.
_tagInfoDatabase = TagInfoDatabase ();
AtomicFile::write (_location + "/tags.data", _tagInfoDatabase.toJson ());
auto it = Database::begin ();
auto end = Database::end ();
if (it == end)
{
return;
}
if (! exists)
{
std::cout << "Tags database does not exist. ";
}
std::cout << "Recreating from interval data..." << std::endl;
for (; it != end; ++it)
{
Interval interval = IntervalFactory::fromSerialization (*it);
for (auto& tag : interval.tags ())
{
_tagInfoDatabase.incrementTag (tag);
}
}
}
////////////////////////////////////////////////////////////////////////////////
void Database::initializeDatafiles ()
{
// Because the data files have names YYYY-MM.data, sorting them by name also
// sorts by the intervals within.
Directory d (_location);
auto files = d.list ();
std::sort (files.begin (), files.end ());
for (auto& file : files)
{
// If it looks like a data file: *-??.data
if (file[file.length () - 8] == '-' &&
file.find (".data") == file.length () - 5)
{
auto basename = Path (file).name ();
auto year = strtol (basename.substr (0, 4).c_str (), nullptr, 10);
auto month = strtol (basename.substr (5, 2).c_str (), nullptr, 10);
getDatafile (year, month);
}
}
}
////////////////////////////////////////////////////////////////////////////////

129
src/Database.h Normal file
View File

@ -0,0 +1,129 @@
////////////////////////////////////////////////////////////////////////////////
//
// Copyright 2016, 2018 - 2023, Thomas Lauf, Paul Beckingham, Federico Hernandez.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
// https://www.opensource.org/licenses/mit-license.php
//
////////////////////////////////////////////////////////////////////////////////
#ifndef INCLUDED_DATABASE
#define INCLUDED_DATABASE
#include <Datafile.h>
#include <Interval.h>
#include <Journal.h>
#include <Range.h>
#include <TagInfoDatabase.h>
#include <Transaction.h>
#include <string>
#include <vector>
class Database
{
public:
class iterator
{
private:
friend class Database;
typedef std::vector <Datafile>::reverse_iterator files_iterator;
typedef std::vector <std::string>::const_reverse_iterator lines_iterator;
typedef std::string value_type;
files_iterator files_it;
files_iterator files_end;
lines_iterator lines_it;
lines_iterator lines_end;
iterator (files_iterator fbegin, files_iterator fend);
public:
iterator& operator++ ();
iterator& operator++ (int);
iterator& operator-- ();
bool operator== (const iterator & other) const;
bool operator!= (const iterator & other) const;
const value_type& operator* () const;
const value_type* operator-> () const;
};
class reverse_iterator
{
private:
friend class Database;
typedef std::vector <Datafile>::iterator files_iterator;
typedef std::vector <std::string>::const_iterator lines_iterator;
typedef std::string value_type;
files_iterator files_it;
files_iterator files_end;
lines_iterator lines_it;
lines_iterator lines_end;
reverse_iterator(files_iterator fbegin, files_iterator fend);
public:
reverse_iterator& operator++ ();
reverse_iterator& operator++ (int);
reverse_iterator& operator-- ();
bool operator== (const reverse_iterator & other) const;
bool operator!= (const reverse_iterator & other) const;
const value_type& operator* () const;
const value_type* operator-> () const;
};
public:
Database () = default;
void initialize (const std::string&, Journal& journal);
void commit ();
std::vector <std::string> files () const;
std::set <std::string> tags () const;
std::string getLatestEntry ();
void addInterval (const Interval&, bool verbose);
void deleteInterval (const Interval&);
void modifyInterval (const Interval&, const Interval&, bool verbose);
std::string dump () const;
bool empty ();
iterator begin ();
iterator end ();
reverse_iterator rbegin ();
reverse_iterator rend ();
private:
unsigned int getDatafile (int, int);
std::vector <Range> segmentRange (const Range&);
void initializeDatafiles ();
void initializeTagDatabase ();
private:
std::string _location {};
std::vector <Datafile> _files {};
TagInfoDatabase _tagInfoDatabase {};
Journal* _journal {};
};
#endif

217
src/Datafile.cpp Normal file
View File

@ -0,0 +1,217 @@
////////////////////////////////////////////////////////////////////////////////
//
// Copyright 2016, 2018 - 2023, Thomas Lauf, Paul Beckingham, Federico Hernandez.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
// https://www.opensource.org/licenses/mit-license.php
//
////////////////////////////////////////////////////////////////////////////////
#include <AtomicFile.h>
#include <Datafile.h>
#include <IntervalFactory.h>
#include <algorithm>
#include <cassert>
#include <cstdlib>
#include <format.h>
#include <sstream>
#include <timew.h>
////////////////////////////////////////////////////////////////////////////////
void Datafile::initialize (const std::string& name)
{
_file = Path (name);
// From the name, which is of the form YYYY-MM.data, extract the YYYY and MM.
auto basename = _file.name ();
auto year = strtol (basename.substr (0, 4).c_str (), nullptr, 10);
auto month = strtol (basename.substr (5, 2).c_str (), nullptr, 10);
// The range is a month: [start, end).
Datetime start (year, month, 1, 0, 0, 0);
month++;
if (month > 12)
{
year++;
month = 1;
}
Datetime end (year, month, 1, 0, 0, 0);
_range = Range (start, end);
}
////////////////////////////////////////////////////////////////////////////////
std::string Datafile::name () const
{
return _file.name ();
}
////////////////////////////////////////////////////////////////////////////////
// Identifies the last incluѕion (^i) lines
std::string Datafile::lastLine ()
{
if (! _lines_loaded)
load_lines ();
std::vector <std::string>::reverse_iterator ri;
for (ri = _lines.rbegin (); ri != _lines.rend (); ri++)
if (ri->operator[] (0) == 'i')
return *ri;
return "";
}
////////////////////////////////////////////////////////////////////////////////
const std::vector <std::string>& Datafile::allLines ()
{
if (! _lines_loaded)
load_lines ();
return _lines;
}
////////////////////////////////////////////////////////////////////////////////
// Accepted intervals; day1 <= interval.start < dayN
void Datafile::addInterval (const Interval& interval)
{
// Note: end date might be zero.
assert (interval.startsWithin (_range));
if (! _lines_loaded)
load_lines ();
const std::string serialization = interval.serialize ();
// Ensure that the IntervalFactory can properly parse the serialization before
// adding it to the database.
try
{
Interval test = IntervalFactory::fromSerialization (serialization);
test.id = interval.id;
if (interval != test)
{
throw (format ("Encode / decode check failed:\n {1}\nis not equal to:\n {2}",
interval.dump (), test.dump ()));
}
_lines.push_back (serialization);
debug (format ("{1}: Added {2}", _file.name (), _lines.back ()));
_dirty = true;
}
catch (const std::string& error)
{
debug (format ("Datafile::addInterval() failed.\n{1}", error));
throw std::string ("Internal error. Failed encode / decode check.");
}
}
////////////////////////////////////////////////////////////////////////////////
void Datafile::deleteInterval (const Interval& interval)
{
// Note: end date might be zero.
assert (interval.startsWithin (_range));
if (! _lines_loaded)
{
load_lines ();
}
auto serialized = interval.serialize ();
auto i = std::find (_lines.begin (), _lines.end (), serialized);
if (i == _lines.end ())
{
throw format ("Datafile::deleteInterval failed to find '{1}'", serialized);
}
_lines.erase (i);
_dirty = true;
debug (format ("{1}: Deleted {2}", _file.name (), serialized));
}
////////////////////////////////////////////////////////////////////////////////
void Datafile::commit ()
{
// The _dirty flag indicates that the file needs to be written.
if (_dirty)
{
AtomicFile file (_file);
if (! _lines.empty ())
{
if (file.open ())
{
// Sort the intervals by ascending start time.
std::sort (_lines.begin (), _lines.end ());
// Write out all the lines.
file.truncate ();
for (auto& line : _lines)
{
file.write_raw (line + '\n');
}
_dirty = false;
}
else
{
throw format ("Could not write to data file {1}", _file._data);
}
}
else
{
file.remove ();
}
}
}
////////////////////////////////////////////////////////////////////////////////
std::string Datafile::dump () const
{
std::stringstream out;
out << "Datafile\n"
<< " Name: " << _file.name () << (_file.exists () ? "" : " (does not exist)") << '\n'
<< " dirty: " << (_dirty ? "true" : "false") << '\n'
<< " lines: " << _lines.size () << '\n'
<< " loaded " << (_lines_loaded ? "true" : "false") << '\n'
<< " range: " << _range.start.toISO () << " - "
<< _range.end.toISO () << '\n';
return out.str ();
}
////////////////////////////////////////////////////////////////////////////////
void Datafile::load_lines ()
{
AtomicFile file (_file);
if (file.open ())
{
// Load the data.
std::vector <std::string> read_lines;
file.read (read_lines);
file.close ();
// Append the lines that were read.
for (auto& line : read_lines)
_lines.push_back (line);
_lines_loaded = true;
debug (format ("{1}: {2} intervals", file.name (), read_lines.size ()));
}
}
////////////////////////////////////////////////////////////////////////////////

63
src/Datafile.h Normal file
View File

@ -0,0 +1,63 @@
////////////////////////////////////////////////////////////////////////////////
//
// Copyright 2016, 2018 - 2022, Thomas Lauf, Paul Beckingham, Federico Hernandez.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
// https://www.opensource.org/licenses/mit-license.php
//
////////////////////////////////////////////////////////////////////////////////
#ifndef INCLUDED_DATAFILE
#define INCLUDED_DATAFILE
#include <FS.h>
#include <Interval.h>
#include <Range.h>
#include <string>
#include <vector>
class Datafile
{
public:
Datafile () = default;
void initialize (const std::string&);
std::string name () const;
std::string lastLine ();
const std::vector <std::string>& allLines ();
void addInterval (const Interval&);
void deleteInterval (const Interval&);
void commit ();
std::string dump () const;
private:
void load_lines ();
private:
Path _file {};
bool _dirty {false};
std::vector <std::string> _lines {};
bool _lines_loaded {false};
Range _range {};
};
#endif

2918
src/DatetimeParser.cpp Normal file

File diff suppressed because it is too large Load Diff

148
src/DatetimeParser.h Normal file
View File

@ -0,0 +1,148 @@
////////////////////////////////////////////////////////////////////////////////
//
// Copyright 2020, 2022, Thomas Lauf, Paul Beckingham, Federico Hernandez.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
// http://www.opensource.org/licenses/mit-license.php
//
////////////////////////////////////////////////////////////////////////////////
#ifndef INCLUDED_DATETIMEPARSER
#define INCLUDED_DATETIMEPARSER
#include <Pig.h>
#include <Range.h>
#include <ctime>
#include <string>
class DatetimeParser
{
public:
DatetimeParser () = default;
Range parse_range(const std::string&);
private:
void clear ();
bool parse_named (Pig&);
bool parse_named_day (Pig&);
bool parse_named_month (Pig&);
bool parse_epoch (Pig&);
bool parse_date_time_ext (Pig&);
bool parse_date_ext (Pig&);
bool parse_off_ext (Pig&);
bool parse_time_ext (Pig&, bool terminated = true);
bool parse_time_utc_ext (Pig&);
bool parse_time_off_ext (Pig&);
bool parse_date_time (Pig&);
bool parse_date (Pig&);
bool parse_time_utc (Pig&);
bool parse_time_off (Pig&);
bool parse_time (Pig&, bool terminated = true);
bool parse_informal_time (Pig&);
bool parse_off (Pig&);
bool parse_year (Pig&, int&);
bool parse_month (Pig&, int&);
bool parse_week (Pig&, int&);
bool parse_julian (Pig&, int&);
bool parse_day (Pig&, int&);
bool parse_weekday (Pig&, int&);
bool parse_hour (Pig&, int&);
bool parse_minute (Pig&, int&);
bool parse_second (Pig&, int&);
bool parse_off_hour (Pig&, int&);
bool parse_off_minute (Pig&, int&);
bool initializeNow (Pig&);
bool initializeYesterday (Pig&);
bool initializeToday (Pig&);
bool initializeTomorrow (Pig&);
bool initializeOrdinal (Pig&);
bool initializeDayName (Pig&);
bool initializeMonthName (Pig&);
bool initializeLater (Pig&);
bool initializeSopd (Pig&);
bool initializeSod (Pig&);
bool initializeSond (Pig&);
bool initializeEopd (Pig&);
bool initializeEod (Pig&);
bool initializeEond (Pig&);
bool initializeSopw (Pig&);
bool initializeSow (Pig&);
bool initializeSonw (Pig&);
bool initializeEopw (Pig&);
bool initializeEow (Pig&);
bool initializeEonw (Pig&);
bool initializeSopww (Pig&);
bool initializeSonww (Pig&);
bool initializeSoww (Pig&);
bool initializeEopww (Pig&);
bool initializeEonww (Pig&);
bool initializeEoww (Pig&);
bool initializeSopm (Pig&);
bool initializeSom (Pig&);
bool initializeSonm (Pig&);
bool initializeEopm (Pig&);
bool initializeEom (Pig&);
bool initializeEonm (Pig&);
bool initializeSopq (Pig&);
bool initializeSoq (Pig&);
bool initializeSonq (Pig&);
bool initializeEopq (Pig&);
bool initializeEoq (Pig&);
bool initializeEonq (Pig&);
bool initializeSopy (Pig&);
bool initializeSoy (Pig&);
bool initializeSony (Pig&);
bool initializeEopy (Pig&);
bool initializeEoy (Pig&);
bool initializeEony (Pig&);
bool initializeEaster (Pig&);
bool initializeMidsommar (Pig&);
bool initializeMidsommarafton (Pig&);
bool initializeInformalTime (Pig&);
void easter (struct tm*) const;
void midsommar (struct tm*) const;
void midsommarafton (struct tm*) const;
bool initializeNthDayInMonth (const std::vector <std::string>&);
bool isOrdinal (const std::string&, int&);
bool validate ();
void resolve ();
public:
int _year {0};
int _month {0};
int _week {0};
int _weekday {0};
int _julian {0};
int _day {0};
int _seconds {0};
int _offset {0};
bool _utc {false};
time_t _date {0};
};
#endif

203
src/Exclusion.cpp Normal file
View File

@ -0,0 +1,203 @@
////////////////////////////////////////////////////////////////////////////////
//
// Copyright 2016 - 2019, 2022 - 2023, Thomas Lauf, Paul Beckingham, Federico Hernandez.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
// https://www.opensource.org/licenses/mit-license.php
//
////////////////////////////////////////////////////////////////////////////////
#include <Datetime.h>
#include <Exclusion.h>
#include <Pig.h>
#include <algorithm>
#include <format.h>
#include <shared.h>
////////////////////////////////////////////////////////////////////////////////
// An exclusion represents untrackable time such as holidays, weekends, evenings
// and lunch. There are none by default, but they may be configured. Once there
// are exclusions defined, the :fill functionality is enabled.
//
// Exclusions are instantiated from configuration, and are passed here as name/
// value strings.
//
// Name Value
// -------------------------- ------------------------
// exclusions.days.2016_01_01 on
// exclusions.days.2016_01_02 off
// exclusions.friday <8:00 12:00-12:45 >17:30
// exclusions.monday <8:00 12:00-12:45 >17:30
// exclusions.thursday <8:00 12:00-12:45 >17:30
// exclusions.tuesday <8:00 12:00-12:45 >18:30
// exclusions.wednesday <8:00 12:00-13:30 >17:30
//
Exclusion::Exclusion (const std::string& name, const std::string& value)
//void Exclusion::initialize (const std::string& line)
{
_tokens = split (name, '.');
for (auto& token : split (value))
_tokens.push_back (token);
// Validate syntax only. Do nothing with the data.
if (_tokens.size () >= 2 &&
_tokens[0] == "exclusions")
{
if (_tokens.size () == 4 &&
_tokens[1] == "days" &&
_tokens[3] == "on") {
_additive = true;
return;
}
if (_tokens.size () == 4 &&
_tokens[1] == "days" &&
_tokens[3] == "off")
{
_additive = false;
return;
}
else if (Datetime::dayOfWeek (_tokens[1]) != -1)
{
_additive = false;
return;
}
}
throw format ("Unrecognized exclusion syntax: '{1}' '{2}'.", name, value);
}
////////////////////////////////////////////////////////////////////////////////
std::vector <std::string> Exclusion::tokens () const
{
return _tokens;
}
////////////////////////////////////////////////////////////////////////////////
// Within range, yield a collection of recurring ranges as defined by _tokens.
//
// exc monday <block> [<block> ...] --> yields a day range for every monday,
// and every block within
// exc day on <date> --> yields single day range
// exc day off <date> --> yields single day range
//
std::vector <Range> Exclusion::ranges (const Range& range) const
{
std::vector <Range> results;
int dayOfWeek;
if (_tokens[1] == "days" &&
(_tokens[3] == "on" ||
_tokens[3] == "off"))
{
auto day = _tokens[2];
std::replace (day.begin (), day.end (), '_', '-');
Datetime start (day);
Datetime end (start);
++end;
Range all_day (start, end);
if (range.overlaps (all_day))
results.push_back (all_day);
}
else if ((dayOfWeek = Datetime::dayOfWeek (_tokens[1])) != -1)
{
Datetime start (range.start.year (), range.start.month (), range.start.day (), 0, 0, 0);
Range myRange = {range};
if (myRange.is_open ())
{
myRange.end = Datetime ();
}
while (start <= myRange.end)
{
if (start.dayOfWeek () == dayOfWeek)
{
Datetime end = start;
++end;
// Now that 'start' and 'end' represent the correct day, compose a set
// of Range objects for each time block.
for (unsigned int block = 2; block < _tokens.size (); ++block)
{
auto r = rangeFromTimeBlock (_tokens[block], start, end);
if (myRange.overlaps (r))
results.push_back (r);
}
}
++start;
}
}
return results;
}
////////////////////////////////////////////////////////////////////////////////
bool Exclusion::additive () const
{
return _additive;
}
////////////////////////////////////////////////////////////////////////////////
std::string Exclusion::dump () const
{
return join (" ", _tokens);
}
////////////////////////////////////////////////////////////////////////////////
Range Exclusion::rangeFromTimeBlock (
const std::string& block,
const Datetime& start,
const Datetime& end) const
{
Pig pig (block);
if (pig.skip ('<'))
{
int hh, mm, ss;
if (pig.getHMS (hh, mm, ss))
return Range (Datetime (start.year (), start.month (), start.day (), 0, 0, 0),
Datetime (start.year (), start.month (), start.day (), hh, mm, ss));
}
else if (pig.skip ('>'))
{
int hh, mm, ss;
if (pig.getHMS (hh, mm, ss))
return Range (Datetime (start.year (), start.month (), start.day (), hh, mm, ss),
Datetime (end.year (), end.month (), end.day (), 0, 0, 0));
}
else
{
int hh1, mm1, ss1;
int hh2, mm2, ss2;
if (pig.getHMS (hh1, mm1, ss1) &&
pig.skip ('-') &&
pig.getHMS (hh2, mm2, ss2))
return Range (
Datetime (start.year (), start.month (), start.day (), hh1, mm1, ss1),
Datetime (start.year (), start.month (), start.day (), hh2, mm2, ss2));
}
throw format ("Malformed time block '{1}'.", block);
}
////////////////////////////////////////////////////////////////////////////////

52
src/Exclusion.h Normal file
View File

@ -0,0 +1,52 @@
////////////////////////////////////////////////////////////////////////////////
//
// Copyright 2016, 2018, 2022, Thomas Lauf, Paul Beckingham, Federico Hernandez.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
// https://www.opensource.org/licenses/mit-license.php
//
////////////////////////////////////////////////////////////////////////////////
#ifndef INCLUDED_EXCLUSION
#define INCLUDED_EXCLUSION
#include <Interval.h>
#include <Range.h>
#include <string>
#include <vector>
class Exclusion
{
public:
Exclusion (const std::string&, const std::string&);
std::vector <std::string> tokens () const;
std::vector <Range> ranges (const Range&) const;
bool additive () const;
std::string dump () const;
private:
Range rangeFromTimeBlock (const std::string&, const Datetime&, const Datetime&) const;
private:
std::vector <std::string> _tokens {};
bool _additive {false};
};
#endif

125
src/Extensions.cpp Normal file
View File

@ -0,0 +1,125 @@
////////////////////////////////////////////////////////////////////////////////
//
// Copyright 2016 - 2018, 2022, Thomas Lauf, Paul Beckingham, Federico Hernandez.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
// https://www.opensource.org/licenses/mit-license.php
//
////////////////////////////////////////////////////////////////////////////////
#include <Extensions.h>
#include <FS.h>
#include <Timer.h>
#include <algorithm>
#include <iomanip>
#include <iostream>
#include <shared.h>
#include <timew.h>
////////////////////////////////////////////////////////////////////////////////
void Extensions::initialize (const std::string& location)
{
// Scan extension directory.
Directory d (location);
if (d.is_directory () &&
d.readable ())
{
_scripts = d.list ();
std::sort (_scripts.begin (), _scripts.end ());
}
else
throw std::string ("Extension directory not readable: ") + d._data;
}
////////////////////////////////////////////////////////////////////////////////
void Extensions::debug ()
{
_debug = true;
}
////////////////////////////////////////////////////////////////////////////////
std::vector <std::string> Extensions::all () const
{
return _scripts;
}
////////////////////////////////////////////////////////////////////////////////
int Extensions::callExtension (
const std::string& script,
const std::vector <std::string>& input,
std::vector <std::string>& output) const
{
if (_debug)
{
std::cout << "Extension: Calling " << script << '\n'
<< "Extension: input";
for (auto& i : input)
std::cout << " " << i << '\n';
}
auto inputStr = join ("\n", input);
// Measure time for each hook if running in debug
int status = 0;
std::string outputStr;
if (_debug)
{
Timer t;
status = execute (script, {}, inputStr, outputStr);
t.stop ();
std::stringstream s;
s << "Timer Extension: execute ("
<< script
<< ") "
<< std::setprecision (6)
<< std::fixed
<< t.total_us () / 1000000.0
<< " sec\n";
::debug (s.str ());
}
else
{
status = execute (script, {}, inputStr, outputStr);
}
output = split (outputStr, '\n');
if (_debug)
std::cout << "Extension: Completed with status " << status << '\n';
return status;
}
////////////////////////////////////////////////////////////////////////////////
std::string Extensions::dump () const
{
std::stringstream out;
out << "Extensions\n";
for (auto& script : _scripts)
out << " " << script << '\n';
return out.str ();
}
////////////////////////////////////////////////////////////////////////////////

48
src/Extensions.h Normal file
View File

@ -0,0 +1,48 @@
////////////////////////////////////////////////////////////////////////////////
//
// Copyright 2016, 2018, 2022, Thomas Lauf, Paul Beckingham, Federico Hernandez.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
// https://www.opensource.org/licenses/mit-license.php
//
////////////////////////////////////////////////////////////////////////////////
#ifndef INCLUDED_EXTENSIONS
#define INCLUDED_EXTENSIONS
#include <string>
#include <vector>
class Extensions
{
public:
Extensions () = default;
void initialize (const std::string&);
void debug ();
std::vector <std::string> all () const;
int callExtension (const std::string&, const std::vector <std::string>&, std::vector <std::string>&) const;
std::string dump () const;
private:
std::vector <std::string> _scripts {};
bool _debug {false};
};
#endif

89
src/ExtensionsTable.cpp Normal file
View File

@ -0,0 +1,89 @@
//////////////////////////////////////////////////////////////////////////////
//
// Copyright 2023, Gothenburg Bit Factory.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
// https://www.opensource.org/licenses/mit-license.php
//
//////////////////////////////////////////////////////////////////////////////
#include <Extensions.h>
#include <ExtensionsTable.h>
#include <FS.h>
#include <timew.h>
///////////////////////////////////////////////////////////////////////////////
ExtensionsTable::Builder ExtensionsTable::builder ()
{
return {};
}
///////////////////////////////////////////////////////////////////////////////
ExtensionsTable::Builder& ExtensionsTable::Builder::withExtensions (const Extensions& extensions)
{
_extensions = extensions;
return *this;
}
///////////////////////////////////////////////////////////////////////////////
Table ExtensionsTable::Builder::build ()
{
int terminalWidth = getTerminalWidth ();
Table table;
table.width (terminalWidth);
table.colorHeader (Color ("underline"));
table.add ("Extension", true);
table.add ("Status", true);
for (auto& ext: _extensions.all ())
{
File program (ext);
// Show program name.
auto row = table.addRow ();
table.set (row, 0, program.name ());
// Show extension status.
std::string status;
if (! program.readable ())
{
status = "Not readable";
}
else if (! program.executable ())
{
status = "No executable";
}
else
{
status = "Active";
}
if (program.is_link ())
{
status += " (link)";
}
table.set (row, 1, status);
}
return table;
}

50
src/ExtensionsTable.h Normal file
View File

@ -0,0 +1,50 @@
//////////////////////////////////////////////////////////////////////////////
//
// Copyright 2023, Gothenburg Bit Factory.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
// https://www.opensource.org/licenses/mit-license.php
//
//////////////////////////////////////////////////////////////////////////////
#ifndef INCLUDED_EXTENSIONSTABLE
#define INCLUDED_EXTENSIONSTABLE
#include <Extensions.h>
#include <Table.h>
class ExtensionsTable
{
class Builder
{
public:
Builder& withExtensions (const Extensions&);
Table build ();
private:
Extensions _extensions;
};
public:
static Builder builder ();
};
#endif //INCLUDED_EXTENSIONSTABLE

118
src/GapsTable.cpp Normal file
View File

@ -0,0 +1,118 @@
//////////////////////////////////////////////////////////////////////////////
//
// Copyright 2023, Gothenburg Bit Factory.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
// https://www.opensource.org/licenses/mit-license.php
//
//////////////////////////////////////////////////////////////////////////////
#include <Duration.h>
#include <GapsTable.h>
#include <format.h>
#include <timew.h>
///////////////////////////////////////////////////////////////////////////////
GapsTable::Builder GapsTable::builder ()
{
return {};
}
///////////////////////////////////////////////////////////////////////////////
GapsTable::Builder& GapsTable::Builder::withRange (const Range& range)
{
_range = range;
return *this;
}
///////////////////////////////////////////////////////////////////////////////
GapsTable::Builder& GapsTable::Builder::withIntervals (const std::vector <Range>& intervals)
{
_intervals = intervals;
return *this;
}
///////////////////////////////////////////////////////////////////////////////
Table GapsTable::Builder::build ()
{
int terminalWidth = getTerminalWidth ();
Table table;
table.width (terminalWidth);
table.colorHeader (Color ("underline"));
table.add ("Wk");
table.add ("Date");
table.add ("Day");
table.add ("Start", false);
table.add ("End", false);
table.add ("Time", false);
table.add ("Total", false);
// Each day is rendered separately.
time_t grand_total = 0;
Datetime previous;
for (Datetime day = _range.start; day < _range.end; day++)
{
auto day_range = getFullDay (day);
time_t daily_total = 0;
int row = -1;
for (auto& gap: subset (day_range, _intervals))
{
row = table.addRow ();
if (day != previous)
{
table.set (row, 0, format ("W{1}", day.week ()));
table.set (row, 1, day.toString ("Y-M-D"));
table.set (row, 2, Datetime::dayNameShort (day.dayOfWeek ()));
previous = day;
}
// Intersect track with day.
auto today = day_range.intersect (gap);
if (gap.is_open ())
{
today.end = Datetime ();
}
table.set (row, 3, today.start.toString ("h:N:S"));
table.set (row, 4, (gap.is_open () ? "-" : today.end.toString ("h:N:S")));
table.set (row, 5, Duration (today.total ()).formatHours ());
daily_total += today.total ();
}
if (row != -1)
{
table.set (row, 6, Duration (daily_total).formatHours ());
}
grand_total += daily_total;
}
// Add the total.
table.set (table.addRow (), 6, " ", Color ("underline"));
table.set (table.addRow (), 6, Duration (grand_total).formatHours ());
return table;
}

54
src/GapsTable.h Normal file
View File

@ -0,0 +1,54 @@
//////////////////////////////////////////////////////////////////////////////
//
// Copyright 2023, Gothenburg Bit Factory.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
// https://www.opensource.org/licenses/mit-license.php
//
//////////////////////////////////////////////////////////////////////////////
#ifndef INCLUDED_GAPSTABLE
#define INCLUDED_GAPSTABLE
#include <Interval.h>
#include <Range.h>
#include <Table.h>
#include <vector>
class GapsTable
{
class Builder
{
public:
Builder& withRange (const Range&);
Builder& withIntervals (const std::vector <Range>&);
Table build ();
private:
std::vector <Range> _intervals;
Range _range;
};
public:
static Builder builder ();
};
#endif //INCLUDED_GAPSTABLE

239
src/Interval.cpp Normal file
View File

@ -0,0 +1,239 @@
////////////////////////////////////////////////////////////////////////////////
//
// Copyright 2016 - 2023, Thomas Lauf, Paul Beckingham, Federico Hernandez.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
// https://www.opensource.org/licenses/mit-license.php
//
////////////////////////////////////////////////////////////////////////////////
#include <Interval.h>
#include <JSON.h>
#include <Lexer.h>
#include <algorithm>
#include <sstream>
#include <timew.h>
////////////////////////////////////////////////////////////////////////////////
bool Interval::operator== (const Interval& other) const
{
if ((annotation == other.annotation) &&
(_tags == other._tags) &&
(synthetic == other.synthetic) &&
(id == other.id))
{
return Range::operator== (other);
}
return false;
}
////////////////////////////////////////////////////////////////////////////////
bool Interval::operator!= (const Interval& other) const
{
return ! operator== (other);
}
////////////////////////////////////////////////////////////////////////////////
bool Interval::empty () const
{
return start.toEpoch () == 0 &&
end.toEpoch () == 0 &&
_tags.empty () &&
annotation.empty ();
}
////////////////////////////////////////////////////////////////////////////////
bool Interval::hasTag (const std::string& tag) const
{
return std::find (_tags.begin (), _tags.end (), tag) != _tags.end ();
}
////////////////////////////////////////////////////////////////////////////////
const std::set <std::string>& Interval::tags () const
{
return _tags;
}
////////////////////////////////////////////////////////////////////////////////
void Interval::tag (const std::string& tag)
{
_tags.insert (tag);
}
////////////////////////////////////////////////////////////////////////////////
void Interval::tag (const std::set <std::string>& tags)
{
_tags.insert (tags.begin (), tags.end ());
}
////////////////////////////////////////////////////////////////////////////////
void Interval::untag (const std::string& tag)
{
_tags.erase (tag);
}
////////////////////////////////////////////////////////////////////////////////
void Interval::untag (const std::set <std::string>& tags)
{
std::set <std::string> updated;
std::set_difference (
_tags.begin (), _tags.end (),
tags.begin (), tags.end (),
std::inserter (updated, updated.end ())
);
_tags = updated;
}
////////////////////////////////////////////////////////////////////////////////
void Interval::clearTags ()
{
_tags.clear ();
}
////////////////////////////////////////////////////////////////////////////////
std::string Interval::serialize () const
{
std::stringstream out;
out << "inc";
if (start.toEpoch ())
out << " " << start.toISO ();
if (end.toEpoch ())
out << " - " << end.toISO ();
if (! _tags.empty ())
{
out << " #";
for (auto& tag : _tags)
out << ' ' << quoteIfNeeded (tag);
}
if (! annotation.empty ())
{
out << (_tags.empty () ? " #" : "")
<< " # \"" << escape (annotation, '"') << "\"";
}
return out.str ();
}
////////////////////////////////////////////////////////////////////////////////
std::string Interval::json () const
{
std::stringstream out;
out << "{";
if (! empty ())
{
out << "\"id\":" << id;
if (is_started ())
{
out << ",\"start\":\"" << start.toISO () << "\"";
}
if (is_ended ())
{
out << ",\"end\":\"" << end.toISO () << "\"";
}
if (! _tags.empty ())
{
std::string tags;
for (auto& tag : _tags)
{
if (tags[0])
tags += ',';
tags += "\"" + json::encode (tag) + "\"";
}
out << ",\"tags\":["
<< tags
<< ']';
}
if (! annotation.empty ())
{
out << ",\"annotation\":\"" << json::encode (annotation) << "\"";
}
}
out << "}";
return out.str ();
}
////////////////////////////////////////////////////////////////////////////////
std::string Interval::dump () const
{
std::stringstream out;
out << "interval";
if (id)
out << " @" << id;
if (start.toEpoch ())
out << " " << start.toISOLocalExtended ();
if (end.toEpoch ())
out << " - " << end.toISOLocalExtended ();
if (! _tags.empty ())
{
out << " #";
for (auto& tag : _tags)
out << ' ' << quoteIfNeeded (tag);
}
if (synthetic)
out << " synthetic";
return out.str ();
}
void Interval::setRange (const Range& range)
{
setRange (range.start, range.end);
}
void Interval::setRange (const Datetime& start, const Datetime& end)
{
this->start = start;
this->end = end;
}
////////////////////////////////////////////////////////////////////////////////
void Interval::setAnnotation (const std::string& annotation)
{
this->annotation = annotation;
}
////////////////////////////////////////////////////////////////////////////////
std::string Interval::getAnnotation () const
{
return annotation;
}
////////////////////////////////////////////////////////////////////////////////

73
src/Interval.h Normal file
View File

@ -0,0 +1,73 @@
////////////////////////////////////////////////////////////////////////////////
//
// Copyright 2016 - 2023, Thomas Lauf, Paul Beckingham, Federico Hernandez.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
// https://www.opensource.org/licenses/mit-license.php
//
////////////////////////////////////////////////////////////////////////////////
#ifndef INCLUDED_INTERVAL
#define INCLUDED_INTERVAL
#include <Range.h>
#include <set>
#include <string>
#include <utility>
class Interval : public Range
{
public:
Interval () = default;
Interval (const Datetime& start, const Datetime& end) : Range (start, end) {}
Interval (const Range& range, std::set <std::string> tags) : Range (range), _tags(std::move(tags)) {}
bool operator== (const Interval&) const;
bool operator!= (const Interval&) const;
bool empty () const;
bool hasTag (const std::string&) const;
const std::set <std::string>& tags () const;
void tag (const std::string&);
void tag (const std::set <std::string>&);
void untag (const std::string&);
void untag (const std::set <std::string>&);
void clearTags ();
void setRange (const Range& range);
void setRange (const Datetime& start, const Datetime& end);
void setAnnotation(const std::string& annotation);
std::string getAnnotation() const;
std::string serialize () const;
std::string json () const;
std::string dump () const;
public:
int id {0};
bool synthetic {false};
std::string annotation {};
private:
std::set <std::string> _tags {};
};
#endif

158
src/IntervalFactory.cpp Normal file
View File

@ -0,0 +1,158 @@
////////////////////////////////////////////////////////////////////////////////
//
// Copyright 2018 - 2023, Thomas Lauf, Paul Beckingham, Federico Hernandez.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
// https://www.opensource.org/licenses/mit-license.php
//
////////////////////////////////////////////////////////////////////////////////
#include <IntervalFactory.h>
#include <JSON.h>
#include <Lexer.h>
#include <format.h>
static std::vector <std::string> tokenizeSerialization (const std::string& line)
{
std::vector <std::string> tokens;
Lexer lexer (line);
std::string token;
Lexer::Type type;
// When parsing the serialization, we only need the lexer to look for strings
// and words since we're not using the provided type information
lexer.noDate ();
lexer.noDuration ();
lexer.noUUID ();
lexer.noHexNumber ();
lexer.noURL ();
lexer.noPath ();
lexer.noPattern ();
lexer.noOperator ();
while (lexer.token (token, type))
{
tokens.push_back (Lexer::dequote (token));
}
return tokens;
}
////////////////////////////////////////////////////////////////////////////////
// Syntax:
// 'inc' [ <iso> [ '-' <iso> ]] [ '#' <tag> [ <tag> ... ]]
Interval IntervalFactory::fromSerialization (const std::string& line)
{
std::vector <std::string> tokens = tokenizeSerialization (line);
// Minimal requirement 'inc'.
if (! tokens.empty () && tokens[0] == "inc")
{
Interval interval = Interval ();
unsigned int offset = 0;
// Optional <iso>
if (tokens.size () > 1 &&
tokens[1].length () == 16)
{
interval.start = Datetime (tokens[1]);
offset = 1;
// Optional '-' <iso>
if (tokens.size () > 3 &&
tokens[2] == "-" &&
tokens[3].length () == 16)
{
interval.end = Datetime (tokens[3]);
offset = 3;
}
}
// Optional '#' <tag>
if (tokens.size () > 2 + offset && tokens[1 + offset] == "#")
{
// Optional <tag> ...
auto index = 2 + offset;
while (index < tokens.size () && tokens[index] != "#")
{
interval.tag (tokens[index]);
index++;
}
// Optional '#' <annotation>
if (index < tokens.size () && tokens[index] == "#")
{
std::string annotation;
// Optional <annotation> ...
for (unsigned int i = index + 1; i < tokens.size (); ++i)
{
annotation += (i > index +1 ? " " : "") + tokens[i];
}
interval.setAnnotation (annotation);
}
}
return interval;
}
throw format ("Unrecognizable line '{1}'.", line);
}
////////////////////////////////////////////////////////////////////////////////
Interval IntervalFactory::fromJson (const std::string& jsonString)
{
Interval interval = Interval ();
if (! jsonString.empty ())
{
std::unique_ptr <json::object> json (dynamic_cast <json::object*> (json::parse (jsonString)));
json::array* tags = (json::array*) json->_data["tags"];
if (tags != nullptr)
{
for (auto& tag : tags->_data)
{
auto* value = (json::string*) tag;
interval.tag (json::decode (value->_data));
}
}
json::string* annotation = (json::string*) json->_data["annotation"];
interval.annotation = (annotation != nullptr) ? json::decode (annotation->_data) : "";
json::string* start = (json::string*) json->_data["start"];
interval.start = (start != nullptr) ? Datetime (start->_data) : 0;
json::string* end = (json::string*) json->_data["end"];
interval.end = (end != nullptr) ? Datetime(end->_data) : 0;
json::number* id = (json::number*) json->_data["id"];
interval.id = (id != nullptr) ? id->_dvalue : 0;
}
return interval;
}
////////////////////////////////////////////////////////////////////////////////

40
src/IntervalFactory.h Normal file
View File

@ -0,0 +1,40 @@
////////////////////////////////////////////////////////////////////////////////
//
// Copyright 2018 - 2019, Thomas Lauf, Paul Beckingham, Federico Hernandez.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
// https://www.opensource.org/licenses/mit-license.php
//
////////////////////////////////////////////////////////////////////////////////
#ifndef INCLUDED_INTERVALFACTORY
#define INCLUDED_INTERVALFACTORY
#include <Interval.h>
#include <string>
class IntervalFactory
{
public:
static Interval fromSerialization (const std::string& line);
static Interval fromJson (const std::string& jsonString);
};
#endif

43
src/IntervalFilter.cpp Normal file
View File

@ -0,0 +1,43 @@
// ///////////////////////////////////////////////////////////////////////////
//
// Copyright 2021, Thomas Lauf, Paul Beckingham, Federico Hernandez.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
// https://www.opensource.org/licenses/mit-license.php
//
// ///////////////////////////////////////////////////////////////////////////
//
#include <IntervalFilter.h>
bool IntervalFilter::is_done () const
{
return _done;
}
void IntervalFilter::set_done (bool done)
{
_done = done;
}
void IntervalFilter::reset ()
{
set_done (false);
}

48
src/IntervalFilter.h Normal file
View File

@ -0,0 +1,48 @@
////////////////////////////////////////////////////////////////////////////////
//
// Copyright 2021, Thomas Lauf, Paul Beckingham, Federico Hernandez.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
// https://www.opensource.org/licenses/mit-license.php
//
////////////////////////////////////////////////////////////////////////////////
#ifndef INCLUDED_INTERVALFILTER
#define INCLUDED_INTERVALFILTER
#include <Interval.h>
class IntervalFilter
{
public:
virtual bool accepts (const Interval&) = 0;
virtual void reset ();
virtual ~IntervalFilter() = default;
bool is_done () const;
protected:
void set_done (bool);
private:
bool _done = false;
};
#endif //INCLUDED_INTERVALFILTER

View File

@ -0,0 +1,50 @@
////////////////////////////////////////////////////////////////////////////////
//
// Copyright 2021, 2023, Thomas Lauf, Paul Beckingham, Federico Hernandez.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
// https://www.opensource.org/licenses/mit-license.php
//
////////////////////////////////////////////////////////////////////////////////
#include <IntervalFilterAllInRange.h>
IntervalFilterAllInRange::IntervalFilterAllInRange (Range range): _range (std::move(range))
{}
bool IntervalFilterAllInRange::accepts (const Interval& interval)
{
if (is_done())
{
return false;
}
if ((! _range.is_started() && ! _range.is_ended()) || interval.intersects (_range))
{
return true;
}
// Since we are moving backwards in time, and the intervals are in sorted order,
// if the filter is after the interval and does not intersect,
// we know there will be no more matches
set_done (interval.start < _range.start);
return false;
}

View File

@ -0,0 +1,44 @@
////////////////////////////////////////////////////////////////////////////////
//
// Copyright 2021, Thomas Lauf, Paul Beckingham, Federico Hernandez.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
// https://www.opensource.org/licenses/mit-license.php
//
////////////////////////////////////////////////////////////////////////////////
#ifndef INCLUDED_INTERVALFILTEALLINRRANGE
#define INCLUDED_INTERVALFILTEALLINRRANGE
#include <IntervalFilter.h>
#include <Range.h>
class IntervalFilterAllInRange : public IntervalFilter
{
public:
explicit IntervalFilterAllInRange (Range);
bool accepts (const Interval&) final;
private:
const Range _range;
};
#endif //INCLUDED_INTERVALFILTERRANGE

View File

@ -0,0 +1,58 @@
// ///////////////////////////////////////////////////////////////////////////
//
// Copyright 2021, 2023, Thomas Lauf, Paul Beckingham, Federico Hernandez.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
// https://www.opensource.org/licenses/mit-license.php
//
// ///////////////////////////////////////////////////////////////////////////
//
#include <IntervalFilterAllWithIds.h>
IntervalFilterAllWithIds::IntervalFilterAllWithIds (std::set <int> ids) : _ids (std::move (ids))
{
_id_it = _ids.begin ();
_id_end = _ids.end ();
}
bool IntervalFilterAllWithIds::accepts (const Interval& interval)
{
if (is_done ())
{
return false;
}
if (interval.id == *_id_it)
{
++_id_it;
return true;
}
set_done (_id_it == _id_end);
return false;
}
void IntervalFilterAllWithIds::reset ()
{
set_done (false);
_id_it = _ids.begin ();
}

View File

@ -0,0 +1,49 @@
////////////////////////////////////////////////////////////////////////////////
//
// Copyright 2021 - 2023, Thomas Lauf, Paul Beckingham, Federico Hernandez.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
// https://www.opensource.org/licenses/mit-license.php
//
////////////////////////////////////////////////////////////////////////////////
#ifndef INCLUDED_INTERVALFILTERALLWITHIDS
#define INCLUDED_INTERVALFILTERALLWITHIDS
#include <Interval.h>
#include <IntervalFilter.h>
#include <set>
#include <string>
class IntervalFilterAllWithIds : public IntervalFilter
{
public:
explicit IntervalFilterAllWithIds(std::set <int>);
bool accepts (const Interval&) final;
void reset () override;
private:
const std::set <int> _ids {};
std::set <int>::iterator _id_it;
std::set <int>::iterator _id_end;
};
#endif //INCLUDE_INTERVALFILTERALLWITHIDS

View File

@ -0,0 +1,44 @@
////////////////////////////////////////////////////////////////////////////////
//
// Copyright 2021 - 2023, Thomas Lauf, Paul Beckingham, Federico Hernandez.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
// https://www.opensource.org/licenses/mit-license.php
//
////////////////////////////////////////////////////////////////////////////////
#include <Interval.h>
#include <IntervalFilterAllWithTags.h>
IntervalFilterAllWithTags::IntervalFilterAllWithTags (std::set <std::string> tags): _tags (std::move (tags))
{}
bool IntervalFilterAllWithTags::accepts (const Interval& interval)
{
for (auto& tag : _tags)
{
if (! interval.hasTag (tag))
{
return false;
}
}
return true;
}

View File

@ -0,0 +1,46 @@
////////////////////////////////////////////////////////////////////////////////
//
// Copyright 2021, Thomas Lauf, Paul Beckingham, Federico Hernandez.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
// https://www.opensource.org/licenses/mit-license.php
//
////////////////////////////////////////////////////////////////////////////////
#ifndef INCLUDED_INTERVALFILTERALLWITHTAGSET
#define INCLUDED_INTERVALFILTERALLWITHTAGSET
#include <Interval.h>
#include <IntervalFilter.h>
#include <set>
#include <string>
class IntervalFilterAllWithTags : public IntervalFilter
{
public:
explicit IntervalFilterAllWithTags(std::set <std::string>);
bool accepts (const Interval&) final;
private:
const std::set <std::string> _tags {};
};
#endif //INCLUDED_INTERVALFILTERTAGSET

View File

@ -0,0 +1,63 @@
////////////////////////////////////////////////////////////////////////////////
//
// Copyright 2021, 2023, Thomas Lauf, Paul Beckingham, Federico Hernandez.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
// https://www.opensource.org/licenses/mit-license.php
//
////////////////////////////////////////////////////////////////////////////////
#include <IntervalFilterAndGroup.h>
IntervalFilterAndGroup::IntervalFilterAndGroup (std::vector <std::shared_ptr <IntervalFilter>> filters) : _filters (std::move (filters))
{}
bool IntervalFilterAndGroup::accepts (const Interval& interval)
{
if (is_done ())
{
return false;
}
for (auto& filter: _filters)
{
if (filter->accepts (interval))
{
continue;
}
if (filter->is_done ())
{
set_done (true);
}
return false;
}
return true;
}
void IntervalFilterAndGroup::reset ()
{
for (auto& filter: _filters)
{
filter->reset ();
}
}

View File

@ -0,0 +1,45 @@
////////////////////////////////////////////////////////////////////////////////
//
// Copyright 2021 - 2023, Thomas Lauf, Paul Beckingham, Federico Hernandez.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
// https://www.opensource.org/licenses/mit-license.php
//
////////////////////////////////////////////////////////////////////////////////
#ifndef INCLUDED_INTERVALFILTERANDGROUP
#define INCLUDED_INTERVALFILTERANDGROUP
#include <IntervalFilter.h>
#include <memory>
class IntervalFilterAndGroup : public IntervalFilter
{
public:
explicit IntervalFilterAndGroup (std::vector <std::shared_ptr <IntervalFilter>> filters);
bool accepts (const Interval&) final;
void reset () override;
private:
const std::vector <std::shared_ptr <IntervalFilter>> _filters = {};
};
#endif //INCLUDED_INTERVALFILTERANDGROUP

View File

@ -0,0 +1,49 @@
////////////////////////////////////////////////////////////////////////////////
//
// Copyright 2021, 2023, Thomas Lauf, Paul Beckingham, Federico Hernandez.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
// https://www.opensource.org/licenses/mit-license.php
//
////////////////////////////////////////////////////////////////////////////////
#include <IntervalFilterFirstOf.h>
IntervalFilterFirstOf::IntervalFilterFirstOf (std::shared_ptr <IntervalFilter> filter) : _filter (filter)
{}
bool IntervalFilterFirstOf::accepts (const Interval& interval)
{
if (is_done ())
{
return false;
}
auto accepted = _filter->accepts (interval);
set_done (accepted);
return accepted;
}
void IntervalFilterFirstOf::reset ()
{
set_done (false);
_filter->reset ();
}

View File

@ -0,0 +1,45 @@
////////////////////////////////////////////////////////////////////////////////
//
// Copyright 2021, Thomas Lauf, Paul Beckingham, Federico Hernandez.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
// https://www.opensource.org/licenses/mit-license.php
//
////////////////////////////////////////////////////////////////////////////////
#ifndef INCLUDED_INTERVALFILTERFIRSTOF
#define INCLUDED_INTERVALFILTERFIRSTOF
#include <IntervalFilter.h>
#include <memory>
class IntervalFilterFirstOf : public IntervalFilter
{
public:
explicit IntervalFilterFirstOf(std::shared_ptr <IntervalFilter> filter);
bool accepts (const Interval&) final;
void reset ();
private:
std::shared_ptr <IntervalFilter> _filter;
};
#endif //INCLUDED_INTERVALFILTERFIRSTOF

View File

@ -0,0 +1,44 @@
////////////////////////////////////////////////////////////////////////////////
//
// Copyright 2021 - 2023, Thomas Lauf, Paul Beckingham, Federico Hernandez.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
// https://www.opensource.org/licenses/mit-license.php
//
////////////////////////////////////////////////////////////////////////////////
#include <Interval.h>
#include <IntervalFilterTagsDisjoint.h>
IntervalFilterTagsDisjoint::IntervalFilterTagsDisjoint (std::set <std::string> tags): _tags (std::move (tags))
{}
bool IntervalFilterTagsDisjoint::accepts (const Interval& interval)
{
for (auto& tag : _tags)
{
if ( interval.hasTag (tag))
{
return true;
}
}
return false;
}

View File

@ -0,0 +1,47 @@
////////////////////////////////////////////////////////////////////////////////
//
// Copyright 2021, Thomas Lauf, Paul Beckingham, Federico Hernandez.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
// https://www.opensource.org/licenses/mit-license.php
//
////////////////////////////////////////////////////////////////////////////////
#ifndef INCLUDED_INTERVALFILTERTAGSDISJOINT
#define INCLUDED_INTERVALFILTERTAGSDISJOINT
#include <Interval.h>
#include <IntervalFilter.h>
#include <set>
#include <string>
class IntervalFilterTagsDisjoint : public IntervalFilter
{
public:
explicit IntervalFilterTagsDisjoint(std::set <std::string>);
bool accepts (const Interval&) final;
private:
const std::set <std::string> _tags {};
};
#endif //INCLUDED_INTERVALFILTERTAGSET

200
src/Journal.cpp Normal file
View File

@ -0,0 +1,200 @@
////////////////////////////////////////////////////////////////////////////////
//
// Copyright 2018 - 2023, Thomas Lauf, Paul Beckingham, Federico Hernandez.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
// https://www.opensource.org/licenses/mit-license.php
//
////////////////////////////////////////////////////////////////////////////////
#include <AtomicFile.h>
#include <Journal.h>
#include <TransactionsFactory.h>
#include <cassert>
#include <timew.h>
////////////////////////////////////////////////////////////////////////////////
bool Journal::enabled () const
{
return _size != 0;
}
////////////////////////////////////////////////////////////////////////////////
std::vector <Transaction> loadJournal (AtomicFile& undo)
{
std::vector <std::string> read_lines;
undo.read (read_lines);
undo.close ();
TransactionsFactory transactionsFactory;
for (auto& line: read_lines)
{
transactionsFactory.parseLine (line);
}
return transactionsFactory.get ();
}
////////////////////////////////////////////////////////////////////////////////
void Journal::initialize (const std::string& location, int size)
{
_location = location;
_size = size;
if (! enabled ())
{
AtomicFile undo (_location);
if (undo.exists () && undo.size () > 0)
{
undo.remove ();
}
}
}
////////////////////////////////////////////////////////////////////////////////
void Journal::startTransaction ()
{
if (enabled ())
{
if (_currentTransaction != nullptr)
{
throw "Subsequent call to start transaction";
}
_currentTransaction = std::make_shared <Transaction> ();
}
}
////////////////////////////////////////////////////////////////////////////////
void Journal::endTransaction ()
{
if (! enabled ())
{
assert (_currentTransaction == nullptr);
return;
}
if (_currentTransaction == nullptr)
{
throw "Call to end non-existent transaction";
}
AtomicFile undo (_location);
if (_size > 1)
{
std::vector <Transaction> transactions = loadJournal (undo);
unsigned int toCopy = _size - 1;
auto it = transactions.cbegin ();
auto end = transactions.cend ();
if (transactions.size () > toCopy)
{
it += transactions.size () - toCopy;
}
undo.truncate ();
for (; it != end; ++it)
{
undo.append (it->toString ());
}
}
else if (_size == 1)
{
undo.truncate ();
}
undo.append (_currentTransaction->toString ());
_currentTransaction.reset ();
}
////////////////////////////////////////////////////////////////////////////////
void Journal::recordConfigAction (const std::string& before, const std::string& after)
{
recordUndoAction ("config", before, after);
}
////////////////////////////////////////////////////////////////////////////////
void Journal::recordIntervalAction (const std::string& before, const std::string& after)
{
recordUndoAction ("interval", before, after);
}
////////////////////////////////////////////////////////////////////////////////
// Record undoable actions. There are several types:
// interval changes to stored intervals
// config changes to configuration
//
// Actions are only recorded if a transaction is open
//
void Journal::recordUndoAction (
const std::string& type,
const std::string& before,
const std::string& after)
{
if (enabled () && _currentTransaction != nullptr)
{
_currentTransaction->addUndoAction (type, before, after);
}
}
////////////////////////////////////////////////////////////////////////////////
Transaction Journal::popLastTransaction ()
{
if (! enabled ())
{
return Transaction {};
}
AtomicFile undo (_location);
std::vector <Transaction> transactions = loadJournal (undo);
if (transactions.empty ())
{
return Transaction {};
}
Transaction last = transactions.back ();
transactions.pop_back ();
if (transactions.empty ())
{
undo.close ();
undo.remove ();
}
else
{
undo.open ();
undo.truncate ();
for (auto& transaction : transactions)
{
undo.append (transaction.toString ());
}
undo.close ();
}
return last;
}

61
src/Journal.h Normal file
View File

@ -0,0 +1,61 @@
////////////////////////////////////////////////////////////////////////////////
//
// Copyright 2018 - 2023, Thomas Lauf, Paul Beckingham, Federico Hernandez.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
// https://www.opensource.org/licenses/mit-license.php
//
////////////////////////////////////////////////////////////////////////////////
#ifndef INCLUDED_JOURNAL
#define INCLUDED_JOURNAL
#include <Transaction.h>
#include <memory>
#include <string>
#include <vector>
class Journal
{
public:
Journal() = default;
Journal(const Journal&) = delete;
Journal& operator= (const Journal&) = delete;
void initialize(const std::string&, int);
void startTransaction ();
void endTransaction ();
void recordConfigAction(const std::string&, const std::string&);
void recordIntervalAction(const std::string&, const std::string&);
bool enabled () const;
Transaction popLastTransaction();
private:
void recordUndoAction (const std::string&, const std::string&, const std::string&);
std::string _location {};
std::shared_ptr <Transaction> _currentTransaction = nullptr;
int _size {0};
};
#endif

1864
src/Makefile Normal file

File diff suppressed because it is too large Load Diff

378
src/Range.cpp Normal file
View File

@ -0,0 +1,378 @@
////////////////////////////////////////////////////////////////////////////////
//
// Copyright 2016 - 2019, 2022 - 2023, Thomas Lauf, Paul Beckingham, Federico Hernandez.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
// https://www.opensource.org/licenses/mit-license.php
//
////////////////////////////////////////////////////////////////////////////////
#include <Range.h>
#include <cassert>
#include <sstream>
////////////////////////////////////////////////////////////////////////////////
// A Range consists of a start time and optional end time. A missing end
// time makes the Range 'started' but not 'ended'.
//
// [start, end)
//
Range::Range (const Datetime& start_value, const Datetime& end_value)
{
start = start_value;
end = end_value;
}
////////////////////////////////////////////////////////////////////////////////
bool Range::operator== (const Range& other) const
{
return start == other.start &&
end == other.end;
}
////////////////////////////////////////////////////////////////////////////////
bool Range::operator!= (const Range& other) const
{
return start != other.start ||
end != other.end;
}
////////////////////////////////////////////////////////////////////////////////
void Range::open ()
{
start = Datetime ();
end = Datetime (0);
}
////////////////////////////////////////////////////////////////////////////////
void Range::open (const Datetime& value)
{
start = value;
end = Datetime (0);
}
////////////////////////////////////////////////////////////////////////////////
void Range::close ()
{
end = Datetime ();
}
////////////////////////////////////////////////////////////////////////////////
bool Range::is_open () const
{
return is_started () && ! is_ended ();
}
////////////////////////////////////////////////////////////////////////////////
bool Range::is_started () const
{
return start.toEpoch () > 0;
}
////////////////////////////////////////////////////////////////////////////////
bool Range::is_ended () const
{
return end.toEpoch () > 0;
}
////////////////////////////////////////////////////////////////////////////////
bool Range::is_empty () const
{
return start == end;
}
////////////////////////////////////////////////////////////////////////////////
bool Range::contains (const Datetime& datetime) const
{
return (! is_started () || start < datetime) &&
(! is_ended () || datetime < end);
}
////////////////////////////////////////////////////////////////////////////////
// Detect the following overlap cases:
//
// this [--------)
// A [--------)
// B [--------)
// C [----)
// D [--------)
// E [--------)
// F [-------------)
// G [...
// H [...
// I [...
//
// this [...
// A [--------)
// B [--------)
// C [----)
// D [--------)
// E [--------)
// F [-------------)
// G [...
// H [...
// I [...
//
bool Range::overlaps (const Range& other) const
{
if (! is_started () || ! other.is_started ())
return false;
// Other range ends before this range starts.
if (other.is_ended () && other.end <= start)
return false;
// Other range starts after this range ends.
if (is_ended () && other.start >= end)
return false;
return true;
}
////////////////////////////////////////////////////////////////////////////////
bool Range::encloses (const Range& other) const
{
return other.startsWithin (*this) && other.endsWithin (*this);
}
////////////////////////////////////////////////////////////////////////////////
bool Range::startsWithin (const Range& other) const
{
if (other.is_empty ())
{
return false;
}
return other.start == start || other.contains (start);
}
////////////////////////////////////////////////////////////////////////////////
bool Range::endsWithin (const Range& other) const
{
if (other.is_empty ())
{
return false;
}
return other.end == end || other.contains (end);
}
////////////////////////////////////////////////////////////////////////////////
// Calculate the following intersection cases:
//
// this [--------)
// A [--------)
// B [--------)
// C [----)
// D [--------)
// E [--------)
// F [-------------)
// G [...
// H [...
// I [...
//
// this [...
// A [--------)
// B [--------)
// C [----)
// D [--------)
// E [--------)
// F [-------------)
// G [...
// H [...
// I [...
//
Range Range::intersect (const Range& other) const
{
if (overlaps (other))
{
// Intersection is choosing the later one of the two starts, and the earlier one of
// the two ends, provided the two ranges overlap.
Range result;
result.start = start > other.start ? start : other.start;
if (is_ended ())
{
if (other.is_ended ())
result.end = end < other.end ? end : other.end;
else
result.end = end;
}
else
{
if (other.is_ended ())
result.end = other.end;
}
return result;
}
// If there is an intersection but no overlap, we have a zero-width
// interval [p, p) and another interval [p, q), where q >= p.
if (intersects (other)) {
return Range {start, start};
}
return Range {};
}
////////////////////////////////////////////////////////////////////////////////
bool Range::intersects (const Range& other) const
{
if (overlaps (other)) {
return true;
}
// A half-closed zero-width interval [p, p) may have the same
// starting point as another interval without overlapping it.
// We consider p to be an element of a range [p, p).
return (is_started () && other.is_started () && start == other.start);
}
////////////////////////////////////////////////////////////////////////////////
// If the ranges do not overlap, the result is *this.
//
// this [----)
// other [----)
// result [-------)
//
// this [...
// other [----)
// result [...
//
// this [----)
// other [...
// result [...
//
// this [...
// other [...
// result [...
//
Range Range::combine (const Range& other) const
{
Range result {*this};
if (is_started () && other.is_started ())
{
// Start is hte earlier of the two.
result.start = std::min (result.start, other.start);
if (is_open () || other.is_open ())
result.end = {0};
else
result.end = std::max (result.end, other.end);
}
return result;
}
////////////////////////////////////////////////////////////////////////////////
// Consider the following overlap cases:
//
// this [--------)
// A [--------)
// B [--------)
// C [----)
// D [--------)
// E [--------)
// F [-------------)
// G [...
// H [...
// I [...
//
// this [...
// A [--------)
// B [--------)
// C [----)
// D [--------)
// E [--------)
// F [-------------)
// G [...
// H [...
// I [...
//
std::vector <Range> Range::subtract (const Range& other) const
{
std::vector <Range> results;
if (overlaps (other))
{
if (start < other.start)
{
results.emplace_back (start, other.start);
if (other.is_ended () &&
(! is_ended () || end > other.end))
{
results.emplace_back (other.end, end);
}
}
else
{
if (other.is_ended ())
{
if (is_ended ())
{
if (end > other.end)
results.emplace_back (other.end, end);
}
else
{
results.emplace_back (other.end, end);
}
}
}
}
// Non-overlapping subtraction is a nop.
else
{
results.push_back (*this);
}
return results;
}
////////////////////////////////////////////////////////////////////////////////
// Returns the number of seconds between start and end.
// If the range is open, use 'now' as the end.
time_t Range::total () const
{
assert (is_open () || end >= start);
if (is_open ())
return Datetime () - Datetime (start);
return Datetime (end) - Datetime (start);
}
////////////////////////////////////////////////////////////////////////////////
std::string Range::dump () const
{
std::stringstream out;
out << "Range "
<< (start.toEpoch () ? start.toISOLocalExtended () : "n/a")
<< " - "
<< (end.toEpoch () ? end.toISOLocalExtended () : "n/a");
return out.str ();
}
////////////////////////////////////////////////////////////////////////////////

71
src/Range.h Normal file
View File

@ -0,0 +1,71 @@
////////////////////////////////////////////////////////////////////////////////
//
// Copyright 2016 - 2019, 2023, Thomas Lauf, Paul Beckingham, Federico Hernandez.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
// https://www.opensource.org/licenses/mit-license.php
//
////////////////////////////////////////////////////////////////////////////////
#ifndef INCLUDED_RANGE
#define INCLUDED_RANGE
#include <Datetime.h>
#include <vector>
class Range
{
public:
Range () = default;
virtual ~Range() = default;
Range (const Datetime&, const Datetime&);
bool operator== (const Range&) const;
bool operator!= (const Range&) const;
void open ();
void open (const Datetime&);
void close ();
bool is_open () const;
bool is_started () const;
bool is_ended () const;
bool is_empty () const;
bool contains (const Datetime&) const;
bool overlaps (const Range&) const;
bool encloses (const Range&) const;
bool startsWithin (const Range&) const;
bool endsWithin (const Range&) const;
Range intersect (const Range&) const;
bool intersects (const Range&) const;
Range combine (const Range&) const;
std::vector <Range> subtract (const Range&) const;
time_t total () const;
virtual std::string dump () const;
public:
Datetime start {0};
Datetime end {0};
};
#endif

758
src/Rules.cpp Normal file
View File

@ -0,0 +1,758 @@
////////////////////////////////////////////////////////////////////////////////
//
// Copyright 2015 - 2023, Thomas Lauf, Paul Beckingham, Federico Hernandez.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
// https://www.opensource.org/licenses/mit-license.php
//
////////////////////////////////////////////////////////////////////////////////
#include <AtomicFile.h>
#include <FS.h>
#include <JSON.h>
#include <Rules.h>
#include <cassert>
#include <cerrno>
#include <cinttypes>
#include <format.h>
#include <shared.h>
#include <sstream>
#include <tuple>
////////////////////////////////////////////////////////////////////////////////
Rules::Rules ()
{
// Load the default values.
_settings =
{
{"confirmation", "on"},
{"debug", "off"},
{"verbose", "on"},
// 'day' report.
{"reports.day.hours", "all"},
{"reports.day.axis", "internal"},
{"reports.day.lines", "2"},
{"reports.day.spacing", "1"},
{"reports.day.month", "no"},
{"reports.day.week", "no"},
{"reports.day.day", "yes"},
{"reports.day.weekday", "yes"},
{"reports.day.totals", "no"},
{"reports.day.summary", "yes"},
{"reports.day.holidays", "no"},
{"reports.day.cell", "15"},
// 'week' report.
{"reports.week.hours", "all"},
{"reports.week.lines", "1"},
{"reports.week.spacing", "1"},
{"reports.week.month", "no"},
{"reports.week.week", "yes"},
{"reports.week.day", "yes"},
{"reports.week.weekday", "yes"},
{"reports.week.totals", "yes"},
{"reports.week.summary", "yes"},
{"reports.week.holidays", "yes"},
{"reports.week.cell", "15"},
// 'month' report.
{"reports.month.hours", "all"},
{"reports.month.lines", "1"},
{"reports.month.spacing", "1"},
{"reports.month.month", "yes"},
{"reports.month.week", "yes"},
{"reports.month.day", "yes"},
{"reports.month.weekday", "yes"},
{"reports.month.totals", "yes"},
{"reports.month.summary", "yes"},
{"reports.month.holidays", "yes"},
{"reports.month.cell", "15"},
// 'weeks' report.
{"reports.weeks.hours", "all"},
{"reports.weeks.lines", "1"},
{"reports.weeks.spacing", "1"},
{"reports.weeks.month", "no"},
{"reports.weeks.week", "yes"},
{"reports.weeks.day", "yes"},
{"reports.weeks.weekday", "yes"},
{"reports.weeks.totals", "yes"},
{"reports.weeks.summary", "yes"},
{"reports.weeks.holidays", "yes"},
{"reports.weeks.cell", "15"},
// 'months' report.
{"reports.months.hours", "all"},
{"reports.months.lines", "1"},
{"reports.months.spacing", "1"},
{"reports.months.month", "yes"},
{"reports.months.week", "yes"},
{"reports.months.day", "yes"},
{"reports.months.weekday", "yes"},
{"reports.months.totals", "yes"},
{"reports.months.summary", "yes"},
{"reports.months.holidays", "yes"},
{"reports.months.cell", "15"},
// 'summary' report.
{"reports.summary.holidays", "yes"},
// Enough of a theme to make the charts work.
{"theme.description", "Built-in default"},
{"theme.colors.exclusion", "gray8 on gray4"},
{"theme.colors.today", "white"},
{"theme.colors.holiday", "gray4"},
{"theme.colors.label", "gray4"},
// Options for the journal / undo file.
{"journal.size", "-1"},
};
}
////////////////////////////////////////////////////////////////////////////////
// Nested files are supported, with the following construct:
// import /absolute/path/to/file
void Rules::load (const std::string& file, int nest /* = 1 */)
{
if (nest > 10)
throw std::string ("Rules files may only be nested to 10 levels.");
if (nest == 1)
{
Path originalFile (file);
_original_file = originalFile._data;
if (! originalFile.exists ())
throw std::string ("ERROR: Configuration file not found.");
if (! originalFile.readable ())
throw std::string ("ERROR: Configuration file cannot be read (insufficient privileges).");
}
// Read the file, then parse the contents.
std::string contents;
try
{
AtomicFile::read (file, contents);
if (contents.length ())
{
parse (contents, nest);
}
}
catch (...)
{
}
}
////////////////////////////////////////////////////////////////////////////////
std::string Rules::file () const
{
return _original_file;
}
////////////////////////////////////////////////////////////////////////////////
bool Rules::has (const std::string& key) const
{
return _settings.find (key) != _settings.end ();
}
////////////////////////////////////////////////////////////////////////////////
// Return the configuration value given the specified key.
std::string Rules::get (const std::string& key, const std::string& defaultValue) const
{
auto found = _settings.find (key);
if (found != _settings.end ())
{
return found->second;
}
return defaultValue;
}
////////////////////////////////////////////////////////////////////////////////
int Rules::getInteger (const std::string& key, int defaultValue) const
{
auto found = _settings.find (key);
if (found != _settings.end ())
{
int value = strtoimax (found->second.c_str (), nullptr, 10);
// Invalid values are handled. ERANGE errors are simply capped by
// strtoimax, which is desired behavior.
// Note that not all platforms behave alike, and the EINVAL is not
// necessarily returned.
if (value == 0 && (errno == EINVAL || found->second != "0"))
throw format ("Invalid integer value for '{1}': '{2}'", key, found->second);
return value;
}
return defaultValue;
}
////////////////////////////////////////////////////////////////////////////////
double Rules::getReal (const std::string& key) const
{
auto found = _settings.find (key);
if (found != _settings.end ())
return strtod (found->second.c_str (), nullptr);
return 0.0;
}
////////////////////////////////////////////////////////////////////////////////
bool Rules::getBoolean (const std::string& key, bool defaultValue) const
{
auto found = _settings.find (key);
if (found != _settings.end ())
{
auto value = lowerCase (found->second);
if (value == "true" ||
value == "1" ||
value == "y" ||
value == "yes" ||
value == "on")
{
return true;
}
return false;
}
return defaultValue;
}
////////////////////////////////////////////////////////////////////////////////
void Rules::set (const std::string& key, const int value)
{
_settings[key] = format (value);
}
////////////////////////////////////////////////////////////////////////////////
void Rules::set (const std::string& key, const double value)
{
_settings[key] = format (value, 1, 8);
}
////////////////////////////////////////////////////////////////////////////////
void Rules::set (const std::string& key, const std::string& value)
{
_settings[key] = value;
}
////////////////////////////////////////////////////////////////////////////////
// Provide a vector of all configuration keys. If a stem is provided, only
// return matching keys.
std::vector <std::string> Rules::all (const std::string& stem) const
{
std::vector <std::string> items;
for (const auto& it : _settings)
if (stem.empty () || it.first.find (stem) == 0)
items.push_back (it.first);
return items;
}
////////////////////////////////////////////////////////////////////////////////
bool Rules::isRuleType (const std::string& type) const
{
if (std::find (_rule_types.begin (), _rule_types.end (), type) != _rule_types.end ())
return true;
return false;
}
////////////////////////////////////////////////////////////////////////////////
std::string Rules::dump () const
{
std::stringstream out;
out << "Rules\n"
<< " _original_file " << _original_file
<< '\n';
out << " Settings\n";
for (const auto& item : _settings)
out << " " << item.first << "=" << item.second << '\n';
return out.str ();
}
////////////////////////////////////////////////////////////////////////////////
void Rules::parse (const std::string& input, int nest /* = 1 */)
{
bool inRule = false;
std::string ruleDef;
// Remove comments from input.
for (auto& line : split (input, '\n'))
{
auto comment = line.find ("#");
if (comment != std::string::npos)
{
line.resize (comment);
line = rtrim (line);
}
// Tokenize the line for convenience, but capture the indentation level.
// tokens.
auto indent = line.find_first_not_of (' ');
auto tokens = Lexer::tokenize (line);
if (! tokens.empty ())
{
if (inRule)
{
if (indent == 0)
{
inRule = false;
parseRule (ruleDef);
ruleDef = "";
}
else
{
ruleDef += line + '\n';
}
}
// Note: this should NOT be an 'else' to the above 'if (inRule)', because
// there are lines where both blocks need to run.
if (! inRule)
{
auto firstWord = std::get <0> (tokens[0]);
// Top-level rule definition:
// 'define'
// ...
//
if (firstWord == "define")
{
if (! ruleDef.empty ())
{
parseRule (ruleDef);
ruleDef = "";
}
inRule = true;
ruleDef = line + '\n';
}
// Top-level import:
// 'import' <file>
else if (firstWord == "import" &&
tokens.size () == 2 &&
std::get <1> (tokens[1]) == Lexer::Type::path)
{
File imported (std::get <0> (tokens[1]));
if (! imported.is_absolute ())
throw format ("Can only import files with absolute paths, not '{1}'.", imported._data);
if (! imported.readable ())
throw format ("Could not read imported file '{1}'.", imported._data);
load (imported._data, nest + 1);
}
// Top-level settings:
// <name> '=' <value>
else if (tokens.size () >= 3 &&
std::get <0> (tokens[1]) == "=")
{
// If this line is an assignment, then tokenizing it is a mistake, so
// use the raw data from 'line'.
auto equals = line.find ('=');
assert (equals != std::string::npos);
set (trim (line.substr (indent, equals - indent)),
trim (line.substr (equals + 1)));
}
// Top-level settings, with no value:
// <name> '='
else if (tokens.size () == 2 &&
std::get <0> (tokens[1]) == "=")
{
set (firstWord, "");
}
// Admit defeat.
else
throw format ("Unrecognized construct: {1}", line);
}
}
}
if (! ruleDef.empty ())
parseRule (ruleDef);
}
////////////////////////////////////////////////////////////////////////////////
void Rules::parseRule (const std::string& input)
{
// Break the rule def into lines.
auto lines = split (input, '\n');
// Tokenize the first line.
std::vector <std::string> tokens;
std::string token;
Lexer::Type type;
Lexer lexer (lines[0]);
while (lexer.token (token, type))
tokens.push_back (token);
// Based on the tokens of the first line, determine which rule type needs to
// be parsed.
if (tokens.size () >= 2 &&
tokens[0] == "define")
{
if (tokens.size () >= 2 &&
isRuleType (tokens[1].substr (0, tokens[1].length () - 1)))
parseRuleSettings (lines);
// Error.
else
throw format ("Unrecognized rule type '{1}'", join (" ", tokens));
}
}
////////////////////////////////////////////////////////////////////////////////
void Rules::parseRuleSettings (
const std::vector <std::string>& lines)
{
std::vector <std::string> hierarchy;
std::vector <unsigned int> indents;
indents.push_back (0);
for (const auto& line : lines)
{
auto indent = getIndentation (line);
auto tokens = tokenizeLine (line);
auto group = parseGroup (tokens);
// Capture increased indentation.
if (indent > indents.back ())
indents.push_back (indent);
// If indent decreased.
else if (indent < indents.back ())
{
while (! indents.empty () && indent != indents.back ())
{
indents.pop_back ();
hierarchy.pop_back ();
}
// Spot raggedy-ass indentation.
if (indent != indents.back ())
throw std::string ("Syntax error in rule: mismatched indent.");
}
// Descend.
if (! group.empty ())
hierarchy.push_back (group);
// Settings.
if (tokens.size () >= 3 && tokens[1] == "=")
{
auto name = join (".", hierarchy) + "." + tokens[0];
auto equals = line.find ('=');
if (equals == std::string::npos)
throw format ("Syntax error in rule: missing '=' in line '{1}'.", line);
auto value = Lexer::dequote (trim (line.substr (equals + 1)));
set (name, value);
}
}
// Should arrive here with indents and hierarchy in their original state.
if (indents.size () != 1 ||
indents[0] != 0)
throw std::string ("Syntax error - indentation is not right.");
}
////////////////////////////////////////////////////////////////////////////////
unsigned int Rules::getIndentation (const std::string& line)
{
auto indent = line.find_first_not_of (' ');
if (indent == std::string::npos)
indent = 0;
return indent;
}
////////////////////////////////////////////////////////////////////////////////
// Tokenize the line. This loses whitespace information and token types.
std::vector <std::string> Rules::tokenizeLine (const std::string& line)
{
std::vector <std::string> tokens;
std::string token;
Lexer::Type type;
Lexer lexer (line);
while (lexer.token (token, type))
tokens.push_back (token);
return tokens;
}
////////////////////////////////////////////////////////////////////////////////
// {"one","two:"} --> "two"
// {"one two", ":"} --> "one two"
// {"one"} --> ""
std::string Rules::parseGroup (const std::vector <std::string>& tokens)
{
auto count = tokens.size ();
if (count)
{
auto last = tokens.back ();
if (count >= 2 && last == ":")
return tokens[count - 2];
else if (count >= 1 && last[last.length () - 1] == ':')
return last.substr (0, last.length () - 1);
}
return "";
}
////////////////////////////////////////////////////////////////////////////////
// Note that because this function does not recurse with includes, it therefore
// only sees the top-level settings. This has the desirable effect of adding as
// an override any setting which resides in an imported file.
bool Rules::setConfigVariable (
Journal& journal,
const Rules& rules,
std::string name,
std::string value,
bool confirmation /* = false */)
{
// Read config file as lines of text.
std::vector <std::string> lines;
File::read (rules.file (), lines);
bool change = false;
if (rules.has (name))
{
// No change.
if (rules.get (name) == value)
return false;
// If there is a non-comment line containing the entry in flattened form:
// a.b.c = value
bool found = false;
for (auto& line : lines)
{
auto comment = line.find ('#');
auto pos = line.find (name);
if (pos != std::string::npos &&
(comment == std::string::npos || comment > pos))
{
found = true;
// Modify value
if (! confirmation ||
confirm (format ("Are you sure you want to change the value of '{1}' from '{2}' to '{3}'?",
name,
rules.get (name),
value)))
{
auto before = line;
line = line.substr (0, pos) + name + " = " + value;
journal.recordConfigAction (before, line);
change = true;
}
}
}
// If it was not found, then retry in hierarchical form∴
// a:
// b:
// c = value
if (! found)
{
auto leaf = split (name, '.').back () + ":";
for (auto& line : lines)
{
auto comment = line.find ('#');
auto pos = line.find (leaf);
if (pos != std::string::npos &&
(comment == std::string::npos || comment > pos))
{
found = true;
// Remove name
if (! confirmation ||
confirm (format ("Are you sure you want to change the value of '{1}' from '{2}' to '{3}'?",
name,
rules.get (name),
value)))
{
auto before = line;
line = line.substr (0, pos) + leaf + " " + value;
journal.recordConfigAction (before, line);
change = true;
}
}
}
}
if (! found)
{
// Remove name
if (! confirmation ||
confirm (format ("Are you sure you want to change the value of '{1}' from '{2}' to '{3}'?",
name,
rules.get (name),
value)))
{
// Add blank line required by rules.
if (lines.empty () || lines.back ().empty ())
lines.emplace_back ("");
// Add new line.
lines.push_back (name + " = " + json::encode (value));
journal.recordConfigAction ("", lines.back ());
change = true;
}
}
}
else
{
if (! confirmation ||
confirm (format ("Are you sure you want to add '{1}' with a value of '{2}'?", name, value)))
{
// TODO Ideally, this would locate an existing hierarchy and insert the
// new leaf/value properly. But that's non-trivial.
// Add blank line required by rules.
if (lines.empty () || lines.back ().empty ())
lines.emplace_back ("");
// Add new line.
lines.push_back (name + " = " + json::encode (value));
journal.recordConfigAction ("", lines.back ());
change = true;
}
}
if (change)
{
AtomicFile::write (rules.file (), lines);
}
return change;
}
////////////////////////////////////////////////////////////////////////////////
// Removes lines from configuration but leaves comments intact.
//
// Return codes:
// 0 - found and removed
// 1 - found and not removed
// 2 - not found
int Rules::unsetConfigVariable (
Journal& journal,
const Rules& rules,
std::string name,
bool confirmation /* = false */)
{
// Setting not found.
if (! rules.has (name))
return 2;
// Read config file as lines of text.
std::vector <std::string> lines;
AtomicFile::read (rules.file (), lines);
// If there is a non-comment line containing the entry in flattened form:
// a.b.c = value
bool found = false;
bool change = false;
for (auto& line : lines)
{
auto comment = line.find ('#');
auto pos = line.find (name);
if (pos != std::string::npos &&
(comment == std::string::npos || comment > pos))
{
found = true;
// Remove name
if (! confirmation ||
confirm (format ("Are you sure you want to remove '{1}'?", name)))
{
journal.recordConfigAction (line, "");
line = "";
change = true;
}
}
}
// If it was not found, then retry in hierarchical form∴
// a:
// b:
// c = value
if (! found)
{
auto leaf = split (name, '.').back () + ":";
for (auto& line : lines)
{
auto comment = line.find ('#');
auto pos = line.find (leaf);
if (pos != std::string::npos &&
(comment == std::string::npos || comment > pos))
{
found = true;
// Remove name
if (! confirmation ||
confirm (format ("Are you sure you want to remove '{1}'?", name)))
{
line = "";
change = true;
}
}
}
}
if (change)
{
AtomicFile::write (rules.file (), lines);
}
if (change && found)
return 0;
else if (found)
return 1;
return 2;
}

78
src/Rules.h Normal file
View File

@ -0,0 +1,78 @@
////////////////////////////////////////////////////////////////////////////////
//
// Copyright 2015 - 2016, 2018 - 2019, 2022 - 2023, Thomas Lauf, Paul Beckingham, Federico Hernandez.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
// https://www.opensource.org/licenses/mit-license.php
//
////////////////////////////////////////////////////////////////////////////////
#ifndef INCLUDED_RULES
#define INCLUDED_RULES
#include <Database.h>
#include <Journal.h>
#include <Lexer.h>
#include <map>
#include <string>
#include <vector>
class Rules
{
public:
Rules ();
void load (const std::string&, int next = 1);
std::string file () const;
bool has (const std::string&) const;
std::string get (const std::string&, const std::string& = "") const;
int getInteger (const std::string&, int = 0) const;
double getReal (const std::string&) const;
bool getBoolean (const std::string&, bool = false) const;
void set (const std::string&, int);
void set (const std::string&, double);
void set (const std::string&, const std::string&);
std::vector <std::string> all (const std::string& = "") const;
bool isRuleType (const std::string&) const;
std::string dump () const;
static bool setConfigVariable (Journal&, const Rules&, std::string, std::string, bool confirmation);
static int unsetConfigVariable (Journal&, const Rules&, std::string, bool confirmation);
private:
void parse (const std::string&, int = 1);
void parseRule (const std::string&);
void parseRuleSettings (const std::vector <std::string>&);
unsigned int getIndentation (const std::string&);
std::vector <std::string> tokenizeLine (const std::string&);
std::string parseGroup (const std::vector <std::string>&);
private:
std::string _original_file {};
std::map <std::string, std::string> _settings {};
std::vector <std::string> _rule_types {"tags", "reports", "theme", "holidays", "exclusions"};
};
#endif

271
src/SummaryTable.cpp Normal file
View File

@ -0,0 +1,271 @@
////////////////////////////////////////////////////////////////////////////////
//
// Copyright 2018, 2023, Gothenburg Bit Factory.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
// https://www.opensource.org/licenses/mit-license.php
//
////////////////////////////////////////////////////////////////////////////////
#include <Datetime.h>
#include <SummaryTable.h>
#include <Table.h>
#include <format.h>
#include <timew.h>
#include <utf8.h>
#include <utility>
////////////////////////////////////////////////////////////////////////////////
SummaryTable::Builder SummaryTable::builder ()
{
return {};
}
////////////////////////////////////////////////////////////////////////////////
SummaryTable::Builder& SummaryTable::Builder::withWeekFormat (const std::string& format)
{
_week_fmt = format;
return *this;
}
////////////////////////////////////////////////////////////////////////////////
SummaryTable::Builder& SummaryTable::Builder::withDateFormat (const std::string& format)
{
_date_fmt = format;
return *this;
}
////////////////////////////////////////////////////////////////////////////////
SummaryTable::Builder& SummaryTable::Builder::withTimeFormat (const std::string& format)
{
_time_fmt = format;
return *this;
}
////////////////////////////////////////////////////////////////////////////////
SummaryTable::Builder& SummaryTable::Builder::withAnnotations (const bool show)
{
_show_annotations = show;
return *this;
}
////////////////////////////////////////////////////////////////////////////////
SummaryTable::Builder& SummaryTable::Builder::withIds (bool show, Color color)
{
_show_ids = show;
_color_id = color;
return *this;
}
////////////////////////////////////////////////////////////////////////////////
SummaryTable::Builder & SummaryTable::Builder::withTags (bool show, std::map <std::string, Color>& colors)
{
_show_tags = show;
_color_tags = std::move (colors);
return *this;
}
////////////////////////////////////////////////////////////////////////////////
SummaryTable::Builder& SummaryTable::Builder::withWeekdays (const bool show)
{
_show_weekdays = show;
return *this;
}
////////////////////////////////////////////////////////////////////////////////
SummaryTable::Builder& SummaryTable::Builder::withWeeks (const bool show)
{
_show_weeks = show;
return *this;
}
////////////////////////////////////////////////////////////////////////////////
SummaryTable::Builder& SummaryTable::Builder::withRange (const Range& range)
{
_range = range;
return *this;
}
////////////////////////////////////////////////////////////////////////////////
SummaryTable::Builder & SummaryTable::Builder::withIntervals (const std::vector <Interval>& tracked)
{
_tracked = tracked;
return *this;
}
////////////////////////////////////////////////////////////////////////////////
Table SummaryTable::Builder::build ()
{
const auto dates_col_offset = _show_weeks ? 1 : 0;
const auto weekdays_col_offset = dates_col_offset;
const auto ids_col_offset = weekdays_col_offset + (_show_weekdays ? 1: 0);
const auto tags_col_offset = ids_col_offset + (_show_ids ? 1 : 0);
const auto annotation_col_offset = tags_col_offset + (_show_tags ? 1 : 0);
const auto start_col_offset = annotation_col_offset + (_show_annotations ? 1 : 0);
const auto weeks_col_index = 0;
const auto dates_col_index = 0 + dates_col_offset;
const auto weekdays_col_index = 1 + weekdays_col_offset;
const auto ids_col_index = 1 + ids_col_offset;
const auto tags_col_index = 1 + tags_col_offset;
const auto annotation_col_index = 1 + annotation_col_offset;
const auto start_col_index = 1 + start_col_offset;
const auto end_col_index = 2 + start_col_offset;
const auto duration_col_index = 3 + start_col_offset;
const auto total_col_index = 4 + start_col_offset;
int terminalWidth = getTerminalWidth ();
Table table;
table.width (terminalWidth);
table.colorHeader (Color ("underline"));
if (_show_weeks)
{
table.add ("Wk");
}
table.add ("Date");
if (_show_weekdays)
{
table.add ("Day");
}
if (_show_ids)
{
table.add ("ID");
}
if (_show_tags)
{
table.add ("Tags");
}
if (_show_annotations)
{
table.add ("Annotation");
}
table.add ("Start", false);
table.add ("End", false);
table.add ("Time", false);
table.add ("Total", false);
// Each day is rendered separately.
time_t grand_total = 0;
Datetime previous;
auto days_start = _range.is_started () ? _range.start : _tracked.front ().start;
auto days_end = _range.is_ended () ? _range.end : _tracked.back ().end;
const auto now = Datetime ();
if (days_end == 0)
{
days_end = now;
}
for (Datetime day = days_start.startOfDay (); day < days_end; ++day)
{
auto day_range = getFullDay (day);
time_t daily_total = 0;
int row = -1;
for (auto& track : subset (day_range, _tracked))
{
// Make sure the track only represents one day.
if ((track.is_open () && day > now))
{
continue;
}
row = table.addRow ();
if (day != previous)
{
if (_show_weeks)
{
table.set (row, weeks_col_index, format (_week_fmt, day.week ()));
}
table.set (row, dates_col_index, day.toString (_date_fmt));
if (_show_weekdays)
{
table.set (row, weekdays_col_index, Datetime::dayNameShort (day.dayOfWeek ()));
}
previous = day;
}
// Intersect track with day.
auto today = day_range.intersect (track);
if (track.is_open () && track.start > now)
{
today.end = track.start;
}
else if (track.is_open () && day <= now && today.end > now)
{
today.end = now;
}
if (_show_ids)
{
table.set (row, ids_col_index, format ("@{1}", track.id), _color_id);
}
if (_show_tags)
{
auto tags_string = join (", ", track.tags ());
table.set (row, tags_col_index, tags_string, summaryIntervalColor (_color_tags, track.tags ()));
}
if (_show_annotations)
{
table.set (row, annotation_col_index, track.getAnnotation ());
}
const auto total = today.total ();
table.set (row, start_col_index, today.start.toString (_time_fmt));
table.set (row, end_col_index, (track.is_open () ? "-" : today.end.toString (_time_fmt)));
table.set (row, duration_col_index, Duration (total).formatHours ());
daily_total += total;
}
if (row != -1)
{
table.set (row, total_col_index, Duration (daily_total).formatHours ());
}
grand_total += daily_total;
}
// Add the total.
table.set (table.addRow (), total_col_index, " ", Color ("underline"));
table.set (table.addRow (), total_col_index, Duration (grand_total).formatHours ());
return table;
}
////////////////////////////////////////////////////////////////////////////////

77
src/SummaryTable.h Normal file
View File

@ -0,0 +1,77 @@
//////////////////////////////////////////////////////////////////////////////
//
// Copyright 2018, 2023, Gothenburg Bit Factory.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
// https://www.opensource.org/licenses/mit-license.php
//
//////////////////////////////////////////////////////////////////////////////
#ifndef INCLUDED_SUMMARYTABLE
#define INCLUDED_SUMMARYTABLE
#include <Color.h>
#include <Interval.h>
#include <Range.h>
#include <Table.h>
#include <map>
class SummaryTable
{
class Builder
{
public:
Builder& withWeekFormat (const std::string&);
Builder& withDateFormat (const std::string&);
Builder& withTimeFormat (const std::string&);
Builder& withAnnotations (bool);
Builder& withIds (bool, Color);
Builder& withTags (bool, std::map <std::string, Color>&);
Builder& withWeeks (bool);
Builder& withWeekdays (bool);
Builder& withRange (const Range&);
Builder& withIntervals (const std::vector <Interval>&);
Table build ();
private:
std::string _week_fmt;
std::string _date_fmt;
std::string _time_fmt;
bool _show_annotations;
bool _show_ids;
bool _show_tags;
bool _show_weekdays;
bool _show_weeks;
Range _range;
std::vector <Interval> _tracked;
Color _color_id;
std::map <std::string, Color> _color_tags;
};
public:
static Builder builder ();
};
#endif // INCLUDED_SUMMARYTABLE

35
src/TagDescription.cpp Normal file
View File

@ -0,0 +1,35 @@
//////////////////////////////////////////////////////////////////////////////
//
// Copyright 2023, Gothenburg Bit Factory.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
// https://www.opensource.org/licenses/mit-license.php
//
//////////////////////////////////////////////////////////////////////////////
#include <Color.h>
#include <TagDescription.h>
#include <utility>
TagDescription::TagDescription (std::string name, Color color, std::string description) :
name (std::move (name)),
color (color),
description (std::move (description))
{}

42
src/TagDescription.h Normal file
View File

@ -0,0 +1,42 @@
//////////////////////////////////////////////////////////////////////////////
//
// Copyright 2023, Gothenburg Bit Factory.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
// https://www.opensource.org/licenses/mit-license.php
//
//////////////////////////////////////////////////////////////////////////////
#ifndef INCLUDED_TAGDESCRIPTION
#define INCLUDED_TAGDESCRIPTION
#include <string>
class TagDescription
{
public:
TagDescription (std::string , Color, std::string);
std::string name;
Color color;
std::string description;
};
#endif //INCLUDED_TAGDESCRIPTION

61
src/TagInfo.cpp Normal file
View File

@ -0,0 +1,61 @@
////////////////////////////////////////////////////////////////////////////////
//
// Copyright 2018 - 2019, Thomas Lauf, Paul Beckingham, Federico Hernandez.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
// https://www.opensource.org/licenses/mit-license.php
//
////////////////////////////////////////////////////////////////////////////////
#include <TagInfo.h>
#include <sstream>
////////////////////////////////////////////////////////////////////////////////
TagInfo::TagInfo (unsigned int count)
{
_count = count;
}
////////////////////////////////////////////////////////////////////////////////
unsigned int TagInfo::increment ()
{
return _count++;
}
////////////////////////////////////////////////////////////////////////////////
unsigned int TagInfo::decrement ()
{
return --_count;
}
////////////////////////////////////////////////////////////////////////////////
bool TagInfo::hasCount ()
{
return _count > 0;
}
////////////////////////////////////////////////////////////////////////////////
std::string TagInfo::toJson ()
{
std::stringstream output;
output << "{\"count\":" << _count << "}";
return output.str ();
}

48
src/TagInfo.h Normal file
View File

@ -0,0 +1,48 @@
////////////////////////////////////////////////////////////////////////////////
//
// Copyright 2018 - 2019, Thomas Lauf, Paul Beckingham, Federico Hernandez.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
// https://www.opensource.org/licenses/mit-license.php
//
////////////////////////////////////////////////////////////////////////////////
#ifndef INCLUDED_TAGINFO
#define INCLUDED_TAGINFO
#include <string>
class TagInfo
{
public:
explicit TagInfo (unsigned int);
unsigned int increment ();
unsigned int decrement ();
bool hasCount ();
std::string toJson ();
private:
unsigned int _count = 0;
};
#endif

131
src/TagInfoDatabase.cpp Normal file
View File

@ -0,0 +1,131 @@
////////////////////////////////////////////////////////////////////////////////
//
// Copyright 2018 - 2023, Thomas Lauf, Paul Beckingham, Federico Hernandez.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
// https://www.opensource.org/licenses/mit-license.php
//
////////////////////////////////////////////////////////////////////////////////
#include <JSON.h>
#include <TagInfo.h>
#include <TagInfoDatabase.h>
#include <format.h>
#include <timew.h>
///////////////////////////////////////////////////////////////////////////////
// Increment tag count
// If it does not exist, a new entry is created
//
// Returns the previous tag count, -1 if it did not exist
//
int TagInfoDatabase::incrementTag (const std::string& tag)
{
auto search = _tagInformation.find (tag);
if (search == _tagInformation.end ())
{
add (tag, TagInfo {1});
return -1;
}
_is_modified = true;
return search->second.increment ();
}
///////////////////////////////////////////////////////////////////////////////
// Decrement tag count
//
// Returns the new tag count
//
int TagInfoDatabase::decrementTag (const std::string& tag)
{
auto search = _tagInformation.find (tag);
if (search == _tagInformation.end ())
{
throw format ("Trying to decrement non-existent tag '{1}'", tag);
}
_is_modified = true;
return search->second.decrement ();
}
///////////////////////////////////////////////////////////////////////////////
// Add tag to database
//
void TagInfoDatabase::add (const std::string& tag, const TagInfo& tagInfo)
{
_is_modified = true;
_tagInformation.emplace (tag, tagInfo);
}
///////////////////////////////////////////////////////////////////////////////
// Return the current set of tag names
//
std::set <std::string> TagInfoDatabase::tags () const
{
std::set <std::string> tags;
for (auto& item : _tagInformation)
{
tags.insert (item.first);
}
return tags;
}
bool TagInfoDatabase::is_modified () const
{
return _is_modified;
}
void TagInfoDatabase::clear_modified ()
{
_is_modified = false;
}
///////////////////////////////////////////////////////////////////////////////
std::string TagInfoDatabase::toJson ()
{
std::stringstream json;
bool first = true;
json << "{";
for (auto& pair : _tagInformation)
{
auto tagInfo = pair.second;
if (tagInfo.hasCount ())
{
json << (first ? "" : ",")
<< "\n \"" << json::encode (pair.first) << "\":"
<< tagInfo.toJson ();
first = (first ? false : first);
}
}
json << "\n}";
return json.str ();
}

55
src/TagInfoDatabase.h Normal file
View File

@ -0,0 +1,55 @@
////////////////////////////////////////////////////////////////////////////////
//
// Copyright 2018 - 2022, Thomas Lauf, Paul Beckingham, Federico Hernandez.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
//
// https://www.opensource.org/licenses/mit-license.php
//
////////////////////////////////////////////////////////////////////////////////
#ifndef INCLUDED_TAGINFODATABASE
#define INCLUDED_TAGINFODATABASE
#include <TagInfo.h>
#include <map>
#include <set>
#include <string>
class TagInfoDatabase
{
public:
int incrementTag (const std::string&);
int decrementTag (const std::string&);
void add (const std::string&, const TagInfo&);
std::set <std::string> tags () const;
std::string toJson ();
bool is_modified () const;
void clear_modified ();
private:
std::map <std::string, TagInfo> _tagInformation {};
bool _is_modified {false};
};
#endif

Some files were not shown because too many files have changed in this diff Show More