Compare commits
39 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3a6de7d940 | ||
|
|
994f98b57a | ||
|
|
44ca388b52 | ||
|
|
06a85c24ad | ||
|
|
ceaba87ba3 | ||
|
|
61acf6239c | ||
|
|
8dc8cdeea7 | ||
|
|
10ef3013e3 | ||
|
|
3899f5352f | ||
|
|
64fbf88f48 | ||
|
|
2e0964aeb8 | ||
|
|
35d878de96 | ||
|
|
d771586080 | ||
|
|
6673e408a2 | ||
|
|
422ad576ea | ||
|
|
c1a1d13aab | ||
|
|
42189ce998 | ||
|
|
43287d7fc9 | ||
|
|
06f6aaaded | ||
|
|
0c17986303 | ||
|
|
feb9959907 | ||
|
|
7409e23ce0 | ||
|
|
4572c97c9d | ||
|
|
9bca303113 | ||
|
|
7fb3ab0c3d | ||
|
|
56037fe3bc | ||
|
|
a2f8ce41cf | ||
|
|
598bd3b4ef | ||
|
|
315a7d69fb | ||
|
|
64fff6c2ff | ||
|
|
969ecd7b5d | ||
|
|
cede865693 | ||
|
|
d68395bc51 | ||
|
|
7ec523d5ea | ||
|
|
08fc906d5f | ||
|
|
f3e995ef92 | ||
|
|
a4304c97af | ||
|
|
d1ef0d17d5 | ||
|
|
c54cb4d6c8 |
9
AUTHORS
9
AUTHORS
@@ -1,10 +1,15 @@
|
|||||||
Principal Author:
|
Principal Author:
|
||||||
Paul Beckingham, paul@beckingham.net
|
Paul Beckingham, paul@beckingham.net
|
||||||
|
|
||||||
|
Contributing Authors:
|
||||||
|
Damian Glenny
|
||||||
|
|
||||||
With thanks to:
|
With thanks to:
|
||||||
Eugene Kramer
|
Eugene Kramer
|
||||||
SK
|
Srijith K
|
||||||
Damian Glenny
|
|
||||||
Richard Querin
|
Richard Querin
|
||||||
Bruce Israel
|
Bruce Israel
|
||||||
|
Thomas Engel
|
||||||
|
Nishiishii
|
||||||
|
galvanizd
|
||||||
|
|
||||||
|
|||||||
37
ChangeLog
37
ChangeLog
@@ -1,16 +1,45 @@
|
|||||||
Version numbers are of the form:
|
Version numbers are of the form:
|
||||||
|
|
||||||
x.y.z
|
X.Y.Z
|
||||||
|
|
||||||
where the x represents a major version number, or architecture. The y
|
where the X represents a major version number, or architecture. The Y
|
||||||
represents a feature release, and the z represents a patch.
|
represents a feature release, and the Z represents a patch.
|
||||||
|
|
||||||
------ plans -------------------------------------
|
------ plans -------------------------------------
|
||||||
|
|
||||||
Configurable columns in reports
|
- Configurable columns in reports
|
||||||
|
- Dependencies
|
||||||
|
- Recurring tasks
|
||||||
|
|
||||||
|
|
||||||
|
1.3.1 (6/21/2008)
|
||||||
|
+ New configuration variable, "defaultwidth" that determines the width
|
||||||
|
of tables when ncurses support is not available
|
||||||
|
+ Bug: "showage" configuration variable should apply to all reports, not
|
||||||
|
just the ones based on "list"
|
||||||
|
+ Bug: Fixed segmentation faults on Ubuntu when the "dateformat"
|
||||||
|
configuration variables was missing. This was a code bug, and should
|
||||||
|
have affected more platforms
|
||||||
|
+ Bug: Task now will recreate a missing ~/.taskrc file, OR a missing
|
||||||
|
~/.task directory
|
||||||
|
|
||||||
------ reality -----------------------------------
|
------ reality -----------------------------------
|
||||||
|
|
||||||
|
1.3.0 (6/18/2008)
|
||||||
|
+ "task calendar" now displays multiple months per line, adjustable by the
|
||||||
|
"monthsperline" configuration variable. Feature added by Damian Glenny
|
||||||
|
+ "task export" can now filter tasks like the reports
|
||||||
|
+ Factored out code to filter tasks
|
||||||
|
+ Displays shorter message when a command is entered incorrectly, and the
|
||||||
|
full usage for "task help"
|
||||||
|
+ "task oldest" shows the oldest tasks
|
||||||
|
+ "task newest" shows the newest tasks
|
||||||
|
+ Bug: Segmentation fault when no "dateformat" configuration variable
|
||||||
|
specified
|
||||||
|
+ Bug: Fixed bug whereby if you have more than one task with a due date, 7
|
||||||
|
days gets added to the entry date of task 2..n
|
||||||
|
+ Bug: Fixed bug whereby "1 wks" was being improperly pluralized
|
||||||
|
|
||||||
1.2.0 (6/13/2008)
|
1.2.0 (6/13/2008)
|
||||||
+ Bug: "dateformat" configuration variable used to display dates, but
|
+ Bug: "dateformat" configuration variable used to display dates, but
|
||||||
not parse them
|
not parse them
|
||||||
|
|||||||
2
NEWS
2
NEWS
@@ -1,4 +1,4 @@
|
|||||||
Welcome to Task 1.2.0.
|
Welcome to Task 1.3.1.
|
||||||
|
|
||||||
Task has been built and tested on the following configurations:
|
Task has been built and tested on the following configurations:
|
||||||
|
|
||||||
|
|||||||
41
TUTORIAL
41
TUTORIAL
@@ -1,4 +1,4 @@
|
|||||||
Task program tutorial, for version 1.2.0
|
Task program tutorial, for version 1.3.1
|
||||||
----------------------------------------
|
----------------------------------------
|
||||||
|
|
||||||
This guide shows how to quickly set up the task program, and become proficient
|
This guide shows how to quickly set up the task program, and become proficient
|
||||||
@@ -21,10 +21,10 @@ Build the task program according to the directions in the INSTALL file. This
|
|||||||
transcript illustrates a typical installation:
|
transcript illustrates a typical installation:
|
||||||
|
|
||||||
% ls
|
% ls
|
||||||
task-1.2.0.tar.gz
|
task-1.3.1.tar.gz
|
||||||
% gunzip task-1.2.0.tar.gz
|
% gunzip task-1.3.1.tar.gz
|
||||||
% tar xf task-1.2.0.tar
|
% tar xf task-1.3.1.tar
|
||||||
% cd task-1.2.0
|
% cd task-1.3.1
|
||||||
% ./configure
|
% ./configure
|
||||||
...
|
...
|
||||||
% make
|
% make
|
||||||
@@ -379,6 +379,22 @@ with no arguments will generate a help message that lists all these commands.
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
% task oldest
|
||||||
|
-------------
|
||||||
|
|
||||||
|
Lists the oldest tasks. Shows 10 tasks by default, but can be set via the
|
||||||
|
"oldest" configuration variable.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
% task newest
|
||||||
|
-------------
|
||||||
|
|
||||||
|
Lists the newest tasks. Shows 10 tasks by default, but can be set via the
|
||||||
|
"newest" configuration variable.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
% task history
|
% task history
|
||||||
--------------
|
--------------
|
||||||
|
|
||||||
@@ -678,7 +694,8 @@ Configuring Task
|
|||||||
Y four-digit year 2008
|
Y four-digit year 2008
|
||||||
|
|
||||||
The string may also contain other characters to act as
|
The string may also contain other characters to act as
|
||||||
spacers, or formatting. Other values could include:
|
spacers, or formatting. Other values could include
|
||||||
|
(but are not limited to):
|
||||||
|
|
||||||
d/m/Y 7/6/2008
|
d/m/Y 7/6/2008
|
||||||
YMD 20080607
|
YMD 20080607
|
||||||
@@ -687,6 +704,18 @@ Configuring Task
|
|||||||
showage May be "yes" or "no". Determines whether the "Age"
|
showage May be "yes" or "no". Determines whether the "Age"
|
||||||
column appears on the "list" and "next" reports.
|
column appears on the "list" and "next" reports.
|
||||||
|
|
||||||
|
monthsperline Determines how many months the "task calendar" command
|
||||||
|
renders across the screen. Defaults to 1.
|
||||||
|
|
||||||
|
oldest Determines how many tasks are shown on the "oldest"
|
||||||
|
report. Defaults to 10.
|
||||||
|
|
||||||
|
newest Determines how many tasks are shown on the "newest"
|
||||||
|
report. Defaults to 10.
|
||||||
|
|
||||||
|
defaultwidth The width of tables used when ncurses support is not
|
||||||
|
available. Defaults to 80.
|
||||||
|
|
||||||
color May be "on" or "off". Determines whether task uses
|
color May be "on" or "off". Determines whether task uses
|
||||||
color.
|
color.
|
||||||
|
|
||||||
|
|||||||
12
adsense.html
12
adsense.html
@@ -1,12 +0,0 @@
|
|||||||
<script type="text/javascript"><!--
|
|
||||||
google_ad_client = "pub-9709799404235424";
|
|
||||||
/* Task Main */
|
|
||||||
google_ad_slot = "8660617875";
|
|
||||||
google_ad_width = 120;
|
|
||||||
google_ad_height = 600;
|
|
||||||
//-->
|
|
||||||
</script>
|
|
||||||
<script type="text/javascript"
|
|
||||||
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
|
|
||||||
</script>
|
|
||||||
|
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
# Process this file with autoconf to produce a configure script.
|
# Process this file with autoconf to produce a configure script.
|
||||||
|
|
||||||
AC_PREREQ(2.61)
|
AC_PREREQ(2.61)
|
||||||
AC_INIT(task, 1.2.0, bugs@beckingham.net)
|
AC_INIT(task, 1.3.1, bugs@beckingham.net)
|
||||||
AM_INIT_AUTOMAKE
|
AM_INIT_AUTOMAKE
|
||||||
AC_CONFIG_SRCDIR([src/task.cpp])
|
AC_CONFIG_SRCDIR([src/task.cpp])
|
||||||
AC_CONFIG_HEADER([auto.h])
|
AC_CONFIG_HEADER([auto.h])
|
||||||
|
|||||||
68
grammar.txt
Normal file
68
grammar.txt
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
|
||||||
|
This is a full BNF grammar for the task command line. It is intended that a
|
||||||
|
future release of task will incorporate a complete lexer/parser implementing
|
||||||
|
this grammar.
|
||||||
|
|
||||||
|
|
||||||
|
command:
|
||||||
|
VERSION
|
||||||
|
| HELP
|
||||||
|
| PROJECTS
|
||||||
|
| TAGS
|
||||||
|
| SUMMARY
|
||||||
|
| HISTORY
|
||||||
|
| NEXT
|
||||||
|
| CALENDAR
|
||||||
|
| ACTIVE
|
||||||
|
| OVERDUE
|
||||||
|
| STATS
|
||||||
|
| USAGE
|
||||||
|
| OLDEST
|
||||||
|
| NEWEST
|
||||||
|
| EXPORT <file>
|
||||||
|
| COLOR
|
||||||
|
| DELETE <id>
|
||||||
|
| INFO <id>
|
||||||
|
| START <id>
|
||||||
|
| DONE <id>
|
||||||
|
| ADD [<tags>] [<attrs>] [<desc>]
|
||||||
|
| LIST [<tags>] [<attrs>] [<desc>]
|
||||||
|
| LONG [<tags>] [<attrs>] [<desc>]
|
||||||
|
| LS [<tags>] [<attrs>] [<desc>]
|
||||||
|
| COMPLETED [<tags>] [<attrs>] [<desc>]
|
||||||
|
| <id> [<tags>] [<attrs>] [<desc>]
|
||||||
|
| <id> <substitution>
|
||||||
|
|
||||||
|
id:
|
||||||
|
\d+
|
||||||
|
| \d{8}-\d{4}-\d{4}-\d{12}
|
||||||
|
|
||||||
|
tags:
|
||||||
|
+<tag>
|
||||||
|
| -<tag>
|
||||||
|
|
||||||
|
tag:
|
||||||
|
\w+
|
||||||
|
|
||||||
|
attrs:
|
||||||
|
<attr>
|
||||||
|
| <attr> <attrs>
|
||||||
|
|
||||||
|
attr:
|
||||||
|
<name>:<value>
|
||||||
|
|
||||||
|
name:
|
||||||
|
\w+
|
||||||
|
|
||||||
|
value:
|
||||||
|
.+
|
||||||
|
|
||||||
|
substitution:
|
||||||
|
/ <pattern> / <pattern> /
|
||||||
|
|
||||||
|
pattern:
|
||||||
|
.+
|
||||||
|
|
||||||
|
file:
|
||||||
|
?
|
||||||
|
|
||||||
126
html/task.css
Normal file
126
html/task.css
Normal file
@@ -0,0 +1,126 @@
|
|||||||
|
body {
|
||||||
|
text-align: center;
|
||||||
|
margin: 0; padding: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
#container {
|
||||||
|
width: 740px;
|
||||||
|
text-align: left;
|
||||||
|
margin: 0 auto; padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#header {
|
||||||
|
height: 60px;
|
||||||
|
margin: 0 0 15px; padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#page {}
|
||||||
|
|
||||||
|
#content {
|
||||||
|
width: 500px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#header a:link,
|
||||||
|
#header a:visited {
|
||||||
|
color:#000;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
#header h1 {
|
||||||
|
font: bold 400% georgia, serif;
|
||||||
|
letter-spacing: -1px;
|
||||||
|
margin: 0;
|
||||||
|
float: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
#header h2 {
|
||||||
|
font: normal 12px verdana, arial, sans-serif;
|
||||||
|
margin: 2.5em 0 0 0.8em;
|
||||||
|
float: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
#content {}
|
||||||
|
|
||||||
|
#content h1,
|
||||||
|
#content h2,
|
||||||
|
#content h3,
|
||||||
|
#content h4,
|
||||||
|
#content h5 {
|
||||||
|
font-family: "lucidamac bold", "lucida grande", arial, sans-serif;
|
||||||
|
letter-spacing: -1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#content h1 {
|
||||||
|
font-size: 24px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#content h2 {
|
||||||
|
font-size: 22px;
|
||||||
|
border-bottom: 1px dotted #000;
|
||||||
|
}
|
||||||
|
|
||||||
|
#content h3 {
|
||||||
|
font-size: 20px;
|
||||||
|
border-bottom: 1px dotted #bbb;
|
||||||
|
}
|
||||||
|
|
||||||
|
#content h4 {
|
||||||
|
font-size: 18px;
|
||||||
|
border-bottom: 1px dotted #bbb;
|
||||||
|
}
|
||||||
|
|
||||||
|
#content h5 {
|
||||||
|
font-size: 18px;
|
||||||
|
background: #ffd;
|
||||||
|
border-bottom: 1px dotted #bbb;
|
||||||
|
}
|
||||||
|
|
||||||
|
#content p {
|
||||||
|
line-height: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#content ul,
|
||||||
|
#content ol {
|
||||||
|
}
|
||||||
|
|
||||||
|
#content code {
|
||||||
|
font: normal 12px "bitstream vera sans mono", monaco "lucida console", "courier new", courier, serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
#content pre {
|
||||||
|
color: #63FF00;
|
||||||
|
background: #000;
|
||||||
|
overflow: auto;
|
||||||
|
font: normal 12px "bitstream vera sans mono", monaco "lucida console", "courier new", courier, serif;
|
||||||
|
margin: 0.9em 0; padding: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
dt {
|
||||||
|
font: bold 14px "lucida grande", verdana, arial, helvetica, sans-serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
dd {
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
font: normal 12px "lucida grande", verdana, arial, helvetica, sans-serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
.small {
|
||||||
|
font: normal 10px verdana, arial, sans-serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
.table_h {
|
||||||
|
background-color: #e0e0e0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.table_d {
|
||||||
|
background-color: #f7f7f7;
|
||||||
|
}
|
||||||
|
input,
|
||||||
|
textarea { font: normal 12px "bitstream vera sans", verdana, sans-serif; }
|
||||||
|
|
||||||
|
abbr { border: none; }
|
||||||
|
cite { font-style: normal; }
|
||||||
|
a img { border: none; padding: 0; margin: 0; }
|
||||||
|
|
||||||
@@ -1,138 +1,9 @@
|
|||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
<head>
|
<head>
|
||||||
<title>Task 1.2.0</title>
|
<title>Task 1.3.1</title>
|
||||||
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
|
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
|
||||||
<style type="text/css">
|
<link rel="stylesheet" href="task.css" type="text/css" />
|
||||||
body {
|
|
||||||
text-align: center;
|
|
||||||
margin: 0; padding: 1em;
|
|
||||||
}
|
|
||||||
|
|
||||||
#container {
|
|
||||||
width: 740px;
|
|
||||||
text-align: left;
|
|
||||||
margin: 0 auto; padding: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#header {
|
|
||||||
height: 60px;
|
|
||||||
margin: 0 0 15px; padding: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#page {}
|
|
||||||
|
|
||||||
#content {
|
|
||||||
width: 500px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#header a:link,
|
|
||||||
#header a:visited {
|
|
||||||
color:#000;
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
#header h1 {
|
|
||||||
font: bold 400% georgia, serif;
|
|
||||||
letter-spacing: -1px;
|
|
||||||
margin: 0;
|
|
||||||
float: left;
|
|
||||||
}
|
|
||||||
|
|
||||||
#header h2 {
|
|
||||||
font: normal 12px verdana, arial, sans-serif;
|
|
||||||
margin: 2.5em 0 0 0.8em;
|
|
||||||
float: left;
|
|
||||||
}
|
|
||||||
|
|
||||||
#content {}
|
|
||||||
|
|
||||||
#content h1,
|
|
||||||
#content h2,
|
|
||||||
#content h3,
|
|
||||||
#content h4,
|
|
||||||
#content h5 {
|
|
||||||
font-family: "lucidamac bold", "lucida grande", arial, sans-serif;
|
|
||||||
letter-spacing: -1px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#content h1 {
|
|
||||||
font-size: 24px;
|
|
||||||
margin: 0 0 0.3em;
|
|
||||||
}
|
|
||||||
|
|
||||||
#content h2 {
|
|
||||||
font-size: 22px;
|
|
||||||
margin: 0 0 0.3em;
|
|
||||||
}
|
|
||||||
|
|
||||||
#content h3 {
|
|
||||||
font-size: 20px;
|
|
||||||
margin: 1.2em 0 0.3em;
|
|
||||||
}
|
|
||||||
|
|
||||||
#content h4 {
|
|
||||||
font-size: 18px;
|
|
||||||
margin: 1.2em 0 0.3em;
|
|
||||||
border-bottom: 1px dotted #bbb;
|
|
||||||
}
|
|
||||||
|
|
||||||
#content h5 {
|
|
||||||
font-size: 18px;
|
|
||||||
background: #ffd;
|
|
||||||
margin: 1.2em 0 0.3em;
|
|
||||||
border-bottom: 1px dotted #aaa;
|
|
||||||
}
|
|
||||||
|
|
||||||
#content p {
|
|
||||||
line-height: 15px;
|
|
||||||
margin: 0 0 1.2em;
|
|
||||||
}
|
|
||||||
|
|
||||||
#content ul,
|
|
||||||
#content ol {
|
|
||||||
margin: 1em;
|
|
||||||
padding:0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#content code {
|
|
||||||
font: normal 12px "bitstream vera sans mono", monaco "lucida console", "courier new", courier, serif;
|
|
||||||
}
|
|
||||||
|
|
||||||
#content pre {
|
|
||||||
color: #63FF00;
|
|
||||||
background: #000;
|
|
||||||
overflow: auto;
|
|
||||||
font: normal 12px "bitstream vera sans mono", monaco "lucida console", "courier new", courier, serif;
|
|
||||||
margin: 0.9em 0; padding: 8px;
|
|
||||||
}
|
|
||||||
|
|
||||||
dt {
|
|
||||||
font: bold 14px "lucida grande", verdana, arial, helvetica, sans-serif;
|
|
||||||
}
|
|
||||||
|
|
||||||
dd {
|
|
||||||
}
|
|
||||||
|
|
||||||
body {
|
|
||||||
font: normal 12px "lucida grande", verdana, arial, helvetica, sans-serif;
|
|
||||||
}
|
|
||||||
|
|
||||||
.table_h {
|
|
||||||
background-color: #e0e0e0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.table_d {
|
|
||||||
background-color: #f7f7f7;
|
|
||||||
}
|
|
||||||
input,
|
|
||||||
textarea { font: normal 12px "bitstream vera sans", verdana, sans-serif; }
|
|
||||||
|
|
||||||
abbr { border: none; }
|
|
||||||
cite { font-style: normal; }
|
|
||||||
a img { border: none; padding: 0; margin: 0; }
|
|
||||||
|
|
||||||
</style>
|
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
@@ -166,45 +37,36 @@ a img { border: none; padding: 0; margin: 0; }
|
|||||||
<h2 class="title">Get the Source Code</h2>
|
<h2 class="title">Get the Source Code</h2>
|
||||||
<div class="content">
|
<div class="content">
|
||||||
<p>
|
<p>
|
||||||
Download the latest task source code
|
Download the
|
||||||
<a href="http://www.beckingham.net/task-1.2.0.tar.gz">task-1.2.0.tar.gz</a>
|
<a href="http://www.beckingham.net/task-1.3.1.tar.gz">latest version</a>
|
||||||
(6/13/2008).
|
of the task source code (1.3.1, 6/21/2008).
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
<h4>New in version 1.2.0</h4>
|
<h4>New in version 1.3.1</h4>
|
||||||
source: <a href="http://www.beckingham.net/task-1.2.0.tar.gz">task-1.2.0.tar.gz</a>
|
Source: <a href="http://www.beckingham.net/task-1.3.1.tar.gz">task-1.3.1.tar.gz</a>
|
||||||
</p>
|
|
||||||
|
|
||||||
<ul>
|
|
||||||
<li>Subprojects supported - please see documentation below, or TUTORIAL
|
|
||||||
file
|
|
||||||
<li>"dateformat" configuration variable now properly used to parse as
|
|
||||||
well as render dates
|
|
||||||
<li>"task list x" now performs a caseless comparison between "x" and
|
|
||||||
the task description
|
|
||||||
<li>"showage" configuration variable determines whether the "Age" column
|
|
||||||
should appear on the "task list" and "task next" reports
|
|
||||||
<li>Improvements to the TUTORIAL file and this page
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
<h4>New in version 1.1.0</h4>
|
|
||||||
source: <a href="http://www.beckingham.net/task-1.1.0.tar.gz">task-1.1.0.tar.gz</a>
|
|
||||||
<br />
|
<br />
|
||||||
Debian package: <a href="http://www.beckingham.net/task_1.1.0-1_i386.deb">task_1.1.0-1_i386.deb</a>
|
Debian package: <a href="http://www.beckingham.net/task_1.3.1-1_i386.deb">task_1.3.1-1_i386.deb</a>
|
||||||
(Thanks to Richard Querin)
|
(Thanks to <a href="http://blog.rfquerin.org">Richard Querin</a>)
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>"blanklines" configuration variable to stop displaying unnecessary
|
<li>New configuration variable "defaultwidth" determines the width
|
||||||
white space and thus work better on small-screen devices
|
of windows in the absense of ncurses support
|
||||||
<li>"dateformat" configuration now determines how dates are formatted
|
<li>Fixed bug where "showage" configuration variable was not being
|
||||||
<li>Better formatting of "task tags" output
|
oberved by the "task long" report
|
||||||
<li>This home page set up, with TUTORIAL
|
<li>Fixed bug causing segmentation faults (mostly for Ubuntu users)
|
||||||
<li>Added tags to the "task long" report
|
when various commands are run
|
||||||
|
<li>Fixed bug so that task now will recreate a missing ~/.taskrc file,
|
||||||
|
OR a missing ~/.task directory
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
(Find out <a href="versions.html">what was new in prior versions</a>)
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<h4>Troubleshooting</h4>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
@@ -226,6 +88,12 @@ a img { border: none; padding: 0; margin: 0; }
|
|||||||
suggestion for improvement, or a feature request, please send mail to
|
suggestion for improvement, or a feature request, please send mail to
|
||||||
<a href="mailto:task@beckingham.net">task@beckingham.net</a>.
|
<a href="mailto:task@beckingham.net">task@beckingham.net</a>.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Take a look at the <a href="troubleshooting.html">troubleshooting guide</a>
|
||||||
|
for tips and workarounds to problems.
|
||||||
|
</p>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<br />
|
<br />
|
||||||
@@ -235,6 +103,12 @@ a img { border: none; padding: 0; margin: 0; }
|
|||||||
This guide shows how to quickly set up the task program, and become
|
This guide shows how to quickly set up the task program, and become
|
||||||
proficient with it.
|
proficient with it.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Alternatively, watch the
|
||||||
|
<a href="http://www.youtube.com/watch?v=D2Kn4DMOVSw">task movie</a>
|
||||||
|
which illustrates many of task's features.
|
||||||
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<br />
|
<br />
|
||||||
@@ -246,10 +120,10 @@ a img { border: none; padding: 0; margin: 0; }
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
<pre><code>% ls
|
<pre><code>% ls
|
||||||
task-1.2.0.tar.gz
|
task-1.3.0.tar.gz
|
||||||
% gunzip task-1.2.0.tar.gz
|
% gunzip task-1.3.0.tar.gz
|
||||||
% tar xf task-1.2.0.tar
|
% tar xf task-1.3.0.tar
|
||||||
% cd task-1.2.0
|
% cd task-1.3.0
|
||||||
% ./configure
|
% ./configure
|
||||||
...
|
...
|
||||||
% make
|
% make
|
||||||
@@ -739,6 +613,18 @@ ID Project Pri Description
|
|||||||
12 Errand L Remember to deposit bonus check
|
12 Errand L Remember to deposit bonus check
|
||||||
...</code></pre>
|
...</code></pre>
|
||||||
|
|
||||||
|
<strong>% task oldest</strong>
|
||||||
|
<p>
|
||||||
|
Lists the oldest tasks. Shows 10 tasks by default, but can be
|
||||||
|
set via the "oldest" configuration variable.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<strong>% task newest</strong>
|
||||||
|
<p>
|
||||||
|
Lists the newest tasks. Shows 10 tasks by default, but can be
|
||||||
|
set via the "newest" configuration variable.
|
||||||
|
</p>
|
||||||
|
|
||||||
<strong>% task /from/to/</strong>
|
<strong>% task /from/to/</strong>
|
||||||
<p>
|
<p>
|
||||||
If a task has been entered with a typo, it can be easily corrected
|
If a task has been entered with a typo, it can be easily corrected
|
||||||
@@ -1024,7 +910,7 @@ on_white on_bright_white</code></pre>
|
|||||||
|
|
||||||
<p>
|
<p>
|
||||||
The string may also contain other characters to act as spacers,
|
The string may also contain other characters to act as spacers,
|
||||||
or formatting. Other values could include:
|
or formatting. Other values could include (but are not limited to):
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
@@ -1055,6 +941,30 @@ on_white on_bright_white</code></pre>
|
|||||||
column appears on the "list" and "next" reports.
|
column appears on the "list" and "next" reports.
|
||||||
<dd>
|
<dd>
|
||||||
|
|
||||||
|
<dt>monthsperline</dt>
|
||||||
|
<dd>
|
||||||
|
Determines how many months the "task calendar" command
|
||||||
|
renders across the screen. Defaults to 1.
|
||||||
|
</dd>
|
||||||
|
|
||||||
|
<dt>oldest</dt>
|
||||||
|
<dd>
|
||||||
|
Determines how many tasks the "task oldest" command displays.
|
||||||
|
Defaults to 10.
|
||||||
|
</dd>
|
||||||
|
|
||||||
|
<dt>newest</dt>
|
||||||
|
<dd>
|
||||||
|
Determines how many tasks the "task newest" command displays.
|
||||||
|
Defaults to 10.
|
||||||
|
</dd>
|
||||||
|
|
||||||
|
<dt>defaultwidth</dt>
|
||||||
|
<dd>
|
||||||
|
The width of tables used when ncurses support is not available.
|
||||||
|
Defaults to 80.
|
||||||
|
</dd>
|
||||||
|
|
||||||
<dt>color</dt>
|
<dt>color</dt>
|
||||||
<dd>
|
<dd>
|
||||||
May be "on" or "off". Determines whether task uses color.
|
May be "on" or "off". Determines whether task uses color.
|
||||||
@@ -1152,6 +1062,8 @@ on_white on_bright_white</code></pre>
|
|||||||
task calendar
|
task calendar
|
||||||
task active
|
task active
|
||||||
task overdue
|
task overdue
|
||||||
|
task oldest
|
||||||
|
task newest
|
||||||
task stats
|
task stats
|
||||||
task usage
|
task usage
|
||||||
task export
|
task export
|
||||||
@@ -1222,6 +1134,17 @@ Many characters have special meaning to the shell, including:
|
|||||||
</table>
|
</table>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<script type="text/javascript">
|
||||||
|
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
|
||||||
|
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
|
||||||
|
</script>
|
||||||
|
<script type="text/javascript">
|
||||||
|
var pageTracker = _gat._getTracker("UA-4737637-1");
|
||||||
|
pageTracker._initData();
|
||||||
|
pageTracker._trackPageview();
|
||||||
|
</script>
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
||||||
149
html/troubleshooting.html
Normal file
149
html/troubleshooting.html
Normal file
@@ -0,0 +1,149 @@
|
|||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
|
<head>
|
||||||
|
<title>Task Troubleshooting Guide</title>
|
||||||
|
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
|
||||||
|
<link rel="stylesheet" href="task.css" type="text/css" />
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<div id="container">
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
|
||||||
|
<div id="content">
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
<h1 class="title">Task Troubleshooting Guide</h1>
|
||||||
|
<p>
|
||||||
|
Here you will find tips and suggestions for making task behave
|
||||||
|
properly, and bug workarounds.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<br />
|
||||||
|
<h2 class="title">Segmentation Fault for certain commands</h2>
|
||||||
|
<div class="content">
|
||||||
|
<p>
|
||||||
|
Upgrading task to version 1.1.0, 1.2.0 and 1.3.0 can cause
|
||||||
|
segmentation faults. This is mostly occurring for Ubuntu users,
|
||||||
|
although there is no reason for it to be limited to Ubuntu.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Task 1.3.1 fixes this bug, but there is a workaround for users
|
||||||
|
of earlier versions. Add the following line to your ~/.taskrc
|
||||||
|
file:
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<code><pre>dateformat=m/d/Y</pre></code>
|
||||||
|
|
||||||
|
<p class="small">
|
||||||
|
The "dateformat" setting is supported in task 1.1.0 and later.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<br />
|
||||||
|
<h2 class="title">How to get rid of the "Age" column</h2>
|
||||||
|
<div class="content">
|
||||||
|
<p>
|
||||||
|
The "Age" column that shows up on several reports is proving
|
||||||
|
to be unpopular. In task 1.2.0 and later, here is how to
|
||||||
|
remove it from the reports - make sure you have the line:
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<code><pre>showage=no</pre></code>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
in your ~/.taskrc file.
|
||||||
|
|
||||||
|
Note that the "task long" report does not obey this setting
|
||||||
|
in versions prior to 1.3.1.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p class="small">
|
||||||
|
The "showage" setting is supported in task 1.2.0 or later.
|
||||||
|
<br />
|
||||||
|
The "task long" report supports this setting in versions 1.3.1
|
||||||
|
or later.
|
||||||
|
</p>
|
||||||
|
<div>
|
||||||
|
|
||||||
|
<br />
|
||||||
|
<h2 class="title">How do I build task under Cygwin?</h2>
|
||||||
|
<div class="content">
|
||||||
|
<p>
|
||||||
|
Task is built the same way everywhere. But under Cygwin, you'll
|
||||||
|
need to make sure you have the following packages available
|
||||||
|
first:
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>gcc
|
||||||
|
<li>make
|
||||||
|
<li>libncurses-devel
|
||||||
|
<li>libncurses8
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
The gcc and make packages allow you to compile the code, and
|
||||||
|
are therefore required, but the ncurses packages are optional.
|
||||||
|
Ncurses will allow task to determine the width of the window, and
|
||||||
|
therefore use the whole width and wrap text accordingly, for a
|
||||||
|
more aesthetically pleasing display.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
<div class="content">
|
||||||
|
<p>
|
||||||
|
Copyright 2006-2008, P. Beckingham. All rights reserved.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
|
||||||
|
<td align="right" valign="top" width="200px">
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
|
||||||
|
<script type="text/javascript"><!--
|
||||||
|
google_ad_client = "pub-9709799404235424";
|
||||||
|
/* Task Main */
|
||||||
|
google_ad_slot = "8660617875";
|
||||||
|
google_ad_width = 120;
|
||||||
|
google_ad_height = 600;
|
||||||
|
//-->
|
||||||
|
</script>
|
||||||
|
<script type="text/javascript"
|
||||||
|
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
|
||||||
|
</script>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script type="text/javascript">
|
||||||
|
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
|
||||||
|
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
|
||||||
|
</script>
|
||||||
|
<script type="text/javascript">
|
||||||
|
var pageTracker = _gat._getTracker("UA-4737637-1");
|
||||||
|
pageTracker._initData();
|
||||||
|
pageTracker._trackPageview();
|
||||||
|
</script>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
|
||||||
157
html/versions.html
Normal file
157
html/versions.html
Normal file
@@ -0,0 +1,157 @@
|
|||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
|
<head>
|
||||||
|
<title>Task Prior Versions</title>
|
||||||
|
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
|
||||||
|
<link rel="stylesheet" href="task.css" type="text/css" />
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<div id="container">
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
|
||||||
|
<div id="content">
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
<h1 class="title">Task Prior Versions</h1>
|
||||||
|
<br />
|
||||||
|
|
||||||
|
<div class="content">
|
||||||
|
<p>
|
||||||
|
<h4>New in version 1.3.0</h4>
|
||||||
|
Source: <a href="http://www.beckingham.net/task-1.3.0.tar.gz">task-1.3.0.tar.gz</a>
|
||||||
|
<br />
|
||||||
|
Debian package: <a href="http://www.beckingham.net/task_1.3.0-0_i386.deb">task_1.3.0-0_i386.deb</a>
|
||||||
|
(Thanks to <a href="http://blog.rfquerin.org">Richard Querin</a>)
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>"task calendar" now displays multiple months per line, adjustable
|
||||||
|
by the "monthsperline" configuration variable. Feature added by
|
||||||
|
Damian Glenny
|
||||||
|
<li>Displays shorter message when a command is entered incorrectly,
|
||||||
|
and the full usage for "task help"
|
||||||
|
<li>"task export" can now filter tasks like the reports
|
||||||
|
<li>"task oldest" shows the oldest tasks
|
||||||
|
<li>"task newest" shows the newest tasks
|
||||||
|
<li>Fixed bug where task generates a segmentation fault for several
|
||||||
|
commands, when no "dateformat" configuration variable was present
|
||||||
|
<li>Fixed bug whereby if you have more than one task with a due date,
|
||||||
|
7 days gets added to the entry date of task 2..n
|
||||||
|
<li>Fixed bug whereby "1 wks" was being improperly pluralized
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<h4>New in version 1.2.0</h4>
|
||||||
|
Source: <a href="http://www.beckingham.net/task-1.2.0.tar.gz">task-1.2.0.tar.gz</a>
|
||||||
|
<br />
|
||||||
|
Debian package: <a href="http://www.beckingham.net/task_1.2.0-1_i386.deb">task_1.2.0-1_i386.deb</a>
|
||||||
|
(Thanks to <a href="http://blog.rfquerin.org">Richard Querin</a>)
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>Subprojects supported - please see documentation below, or TUTORIAL
|
||||||
|
file
|
||||||
|
<li>"dateformat" configuration variable now properly used to parse as
|
||||||
|
well as render dates
|
||||||
|
<li>"task list x" now performs a caseless comparison between "x" and
|
||||||
|
the task description
|
||||||
|
<li>"showage" configuration variable determines whether the "Age" column
|
||||||
|
should appear on the "task list" and "task next" reports
|
||||||
|
<li>Improvements to the TUTORIAL file and this page
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<h4>New in version 1.1.0</h4>
|
||||||
|
Source: <a href="http://www.beckingham.net/task-1.1.0.tar.gz">task-1.1.0.tar.gz</a>
|
||||||
|
<br />
|
||||||
|
Debian package: <a href="http://www.beckingham.net/task_1.1.0-1_i386.deb">task_1.1.0-1_i386.deb</a>
|
||||||
|
(Thanks to <a href="http://blog.rfquerin.org">Richard Querin</a>)
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>"blanklines" configuration variable to stop displaying unnecessary
|
||||||
|
white space and thus work better on small-screen devices
|
||||||
|
<li>"dateformat" configuration now determines how dates are formatted
|
||||||
|
<li>Better formatting of "task tags" output
|
||||||
|
<li>This home page set up, with TUTORIAL
|
||||||
|
<li>Added tags to the "task long" report
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<h4>New in version 1.0.1</h4>
|
||||||
|
Source: <a href="http://www.beckingham.net/task-1.0.1.tar.gz">task-1.0.1.tar.gz</a>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>Fixed bug where the UUID generator not properly terminating strings
|
||||||
|
<li>Fixed bug where srandom/srand not called prior to custom UUID generation
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<h4>Version 1.0.0</h4>
|
||||||
|
Source: <a href="http://www.beckingham.net/task-1.0.0.tar.gz">task-1.0.0.tar.gz</a>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Task 1.0.0 was the first publicly available version of task.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
<div class="content">
|
||||||
|
<p>
|
||||||
|
Copyright 2006-2008, P. Beckingham. All rights reserved.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
|
||||||
|
<td align="right" valign="top" width="200px">
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
|
||||||
|
<script type="text/javascript"><!--
|
||||||
|
google_ad_client = "pub-9709799404235424";
|
||||||
|
/* Task Main */
|
||||||
|
google_ad_slot = "8660617875";
|
||||||
|
google_ad_width = 120;
|
||||||
|
google_ad_height = 600;
|
||||||
|
//-->
|
||||||
|
</script>
|
||||||
|
<script type="text/javascript"
|
||||||
|
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
|
||||||
|
</script>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script type="text/javascript">
|
||||||
|
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
|
||||||
|
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
|
||||||
|
</script>
|
||||||
|
<script type="text/javascript">
|
||||||
|
var pageTracker = _gat._getTracker("UA-4737637-1");
|
||||||
|
pageTracker._initData();
|
||||||
|
pageTracker._trackPageview();
|
||||||
|
</script>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
|
||||||
17
ideas.txt
Normal file
17
ideas.txt
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
Real Parsing
|
||||||
|
define grammar for command line
|
||||||
|
implement flex/bison parser
|
||||||
|
|
||||||
|
User-Defined Reports
|
||||||
|
report.xxx=id,project(2+),priority(1-),description
|
||||||
|
change all list-based reports to user-defined
|
||||||
|
|
||||||
|
Generalized Report Writer
|
||||||
|
provide column list, sort order, filter
|
||||||
|
|
||||||
|
Test Suite
|
||||||
|
allow .taskrc override
|
||||||
|
debug=on to cause all cout to be csv
|
||||||
|
regression tests for every bug, command, feature
|
||||||
|
|
||||||
|
|
||||||
@@ -91,14 +91,15 @@ Config.o Config.o: Config.cpp /usr/include/c++/4.0.0/iostream \
|
|||||||
/usr/include/c++/4.0.0/bits/istream.tcc /usr/include/c++/4.0.0/fstream \
|
/usr/include/c++/4.0.0/bits/istream.tcc /usr/include/c++/4.0.0/fstream \
|
||||||
/usr/include/c++/4.0.0/i686-apple-darwin9/bits/basic_file.h \
|
/usr/include/c++/4.0.0/i686-apple-darwin9/bits/basic_file.h \
|
||||||
/usr/include/c++/4.0.0/bits/fstream.tcc /usr/include/c++/4.0.0/sstream \
|
/usr/include/c++/4.0.0/bits/fstream.tcc /usr/include/c++/4.0.0/sstream \
|
||||||
/usr/include/c++/4.0.0/bits/sstream.tcc /usr/include/sys/stat.h task.h \
|
/usr/include/c++/4.0.0/bits/sstream.tcc /usr/include/sys/types.h \
|
||||||
|
/usr/include/sys/stat.h /usr/include/pwd.h task.h \
|
||||||
/usr/include/c++/4.0.0/vector /usr/include/c++/4.0.0/bits/stl_vector.h \
|
/usr/include/c++/4.0.0/vector /usr/include/c++/4.0.0/bits/stl_vector.h \
|
||||||
/usr/include/c++/4.0.0/bits/stl_bvector.h \
|
/usr/include/c++/4.0.0/bits/stl_bvector.h \
|
||||||
/usr/include/c++/4.0.0/bits/vector.tcc /usr/include/c++/4.0.0/map \
|
/usr/include/c++/4.0.0/bits/vector.tcc /usr/include/c++/4.0.0/map \
|
||||||
/usr/include/c++/4.0.0/bits/stl_tree.h \
|
/usr/include/c++/4.0.0/bits/stl_tree.h \
|
||||||
/usr/include/c++/4.0.0/bits/stl_map.h \
|
/usr/include/c++/4.0.0/bits/stl_map.h \
|
||||||
/usr/include/c++/4.0.0/bits/stl_multimap.h /usr/include/sys/types.h \
|
/usr/include/c++/4.0.0/bits/stl_multimap.h Config.h Table.h color.h \
|
||||||
Config.h Table.h color.h Grid.h color.h TDB.h T.h ../auto.h
|
Grid.h color.h TDB.h T.h ../auto.h
|
||||||
|
|
||||||
/usr/include/c++/4.0.0/iostream:
|
/usr/include/c++/4.0.0/iostream:
|
||||||
|
|
||||||
@@ -366,8 +367,12 @@ Config.o Config.o: Config.cpp /usr/include/c++/4.0.0/iostream \
|
|||||||
|
|
||||||
/usr/include/c++/4.0.0/bits/sstream.tcc:
|
/usr/include/c++/4.0.0/bits/sstream.tcc:
|
||||||
|
|
||||||
|
/usr/include/sys/types.h:
|
||||||
|
|
||||||
/usr/include/sys/stat.h:
|
/usr/include/sys/stat.h:
|
||||||
|
|
||||||
|
/usr/include/pwd.h:
|
||||||
|
|
||||||
task.h:
|
task.h:
|
||||||
|
|
||||||
/usr/include/c++/4.0.0/vector:
|
/usr/include/c++/4.0.0/vector:
|
||||||
@@ -386,8 +391,6 @@ task.h:
|
|||||||
|
|
||||||
/usr/include/c++/4.0.0/bits/stl_multimap.h:
|
/usr/include/c++/4.0.0/bits/stl_multimap.h:
|
||||||
|
|
||||||
/usr/include/sys/types.h:
|
|
||||||
|
|
||||||
Config.h:
|
Config.h:
|
||||||
|
|
||||||
Table.h:
|
Table.h:
|
||||||
|
|||||||
@@ -27,8 +27,11 @@
|
|||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
#include <sys/types.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
|
#include <unistd.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <pwd.h>
|
||||||
#include "task.h"
|
#include "task.h"
|
||||||
#include "Config.h"
|
#include "Config.h"
|
||||||
|
|
||||||
@@ -84,38 +87,37 @@ bool Config::load (const std::string& file)
|
|||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
void Config::createDefault (const std::string& file)
|
void Config::createDefault (const std::string& home)
|
||||||
{
|
{
|
||||||
if (confirm (
|
// Strip trailing slash off home directory, if necessary.
|
||||||
"A configuration file could not be found in "
|
std::string terminatedHome = home;
|
||||||
+ file
|
if (home[home.length () - 1] == '/')
|
||||||
+ "\n\n"
|
terminatedHome = home.substr (0, home.length () - 1);
|
||||||
+ "Would you like a sample .taskrc created, so task can proceed?"))
|
|
||||||
{
|
|
||||||
// Determine a path to the task directory.
|
|
||||||
std::string taskDir = "";
|
|
||||||
for (int i = file.length () - 1; i >= 0; --i)
|
|
||||||
{
|
|
||||||
if (file[i] == '/')
|
|
||||||
{
|
|
||||||
taskDir = file.substr (0, i) + "/.task";
|
|
||||||
if (-1 == access (taskDir.c_str (), F_OK))
|
|
||||||
mkdir (taskDir.c_str (), S_IRWXU);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (taskDir != "")
|
// Determine default names of init file and task directory.
|
||||||
|
std::string rcFile = terminatedHome + "/.taskrc";
|
||||||
|
std::string dataDir = terminatedHome + "/.task";;
|
||||||
|
|
||||||
|
// If rcFile is not found, offer to create one.
|
||||||
|
if (-1 == access (rcFile.c_str (), F_OK))
|
||||||
|
{
|
||||||
|
if (confirm (
|
||||||
|
"A configuration file could not be found in "
|
||||||
|
+ rcFile
|
||||||
|
+ "\n\n"
|
||||||
|
+ "Would you like a sample .taskrc created, so task can proceed?"))
|
||||||
{
|
{
|
||||||
// Create a sample .taskrc file.
|
// Create a sample .taskrc file.
|
||||||
FILE* out;
|
FILE* out;
|
||||||
if ((out = fopen (file.c_str (), "w")))
|
if ((out = fopen (rcFile.c_str (), "w")))
|
||||||
{
|
{
|
||||||
fprintf (out, "data.location=%s\n", taskDir.c_str ());
|
fprintf (out, "data.location=%s\n", dataDir.c_str ());
|
||||||
fprintf (out, "command.logging=off\n");
|
fprintf (out, "command.logging=off\n");
|
||||||
fprintf (out, "confirmation=yes\n");
|
fprintf (out, "confirmation=yes\n");
|
||||||
fprintf (out, "#nag=Note: try to stick to high priority tasks. See \"task next\".\n");
|
|
||||||
fprintf (out, "next=2\n");
|
fprintf (out, "next=2\n");
|
||||||
|
fprintf (out, "dateformat=m/d/Y\n");
|
||||||
|
fprintf (out, "showage=yes\n");
|
||||||
|
fprintf (out, "monthsperline=1\n");
|
||||||
fprintf (out, "curses=on\n");
|
fprintf (out, "curses=on\n");
|
||||||
fprintf (out, "color=on\n");
|
fprintf (out, "color=on\n");
|
||||||
|
|
||||||
@@ -132,26 +134,20 @@ void Config::createDefault (const std::string& file)
|
|||||||
|
|
||||||
fclose (out);
|
fclose (out);
|
||||||
|
|
||||||
// Now set the live values.
|
|
||||||
set ("data.location", taskDir);
|
|
||||||
set ("command.logging", "off");
|
|
||||||
set ("confirmation", "yes");
|
|
||||||
set ("next", 1);
|
|
||||||
set ("curses", "on");
|
|
||||||
set ("color", "on");
|
|
||||||
set ("color.overdue", "red");
|
|
||||||
set ("color.active", "cyan");
|
|
||||||
set ("color.tagged", "yellow");
|
|
||||||
|
|
||||||
std::cout << "Done." << std::endl;
|
std::cout << "Done." << std::endl;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this->load (rcFile);
|
||||||
|
|
||||||
|
if (-1 == access (dataDir.c_str (), F_OK))
|
||||||
|
mkdir (dataDir.c_str (), S_IRWXU);
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
// Return the configuration value given the specified key.
|
// Return the configuration value given the specified key.
|
||||||
const std::string& Config::get (const char* key)
|
const std::string Config::get (const char* key)
|
||||||
{
|
{
|
||||||
return this->get (std::string (key));
|
return this->get (std::string (key));
|
||||||
}
|
}
|
||||||
@@ -159,7 +155,7 @@ const std::string& Config::get (const char* key)
|
|||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
// Return the configuration value given the specified key. If a default_value
|
// Return the configuration value given the specified key. If a default_value
|
||||||
// is present, it will be the returned value in the event of a missing key.
|
// is present, it will be the returned value in the event of a missing key.
|
||||||
const std::string& Config::get (
|
const std::string Config::get (
|
||||||
const char* key,
|
const char* key,
|
||||||
const char* default_value)
|
const char* default_value)
|
||||||
{
|
{
|
||||||
@@ -168,7 +164,7 @@ const std::string& Config::get (
|
|||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
// Return the configuration value given the specified key.
|
// Return the configuration value given the specified key.
|
||||||
const std::string& Config::get (const std::string& key)
|
const std::string Config::get (const std::string& key)
|
||||||
{
|
{
|
||||||
return (*this)[key];
|
return (*this)[key];
|
||||||
}
|
}
|
||||||
@@ -176,7 +172,7 @@ const std::string& Config::get (const std::string& key)
|
|||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
// Return the configuration value given the specified key. If a default_value
|
// Return the configuration value given the specified key. If a default_value
|
||||||
// is present, it will be the returned value in the event of a missing key.
|
// is present, it will be the returned value in the event of a missing key.
|
||||||
const std::string& Config::get (
|
const std::string Config::get (
|
||||||
const std::string& key,
|
const std::string& key,
|
||||||
const std::string& default_value)
|
const std::string& default_value)
|
||||||
{
|
{
|
||||||
@@ -246,29 +242,6 @@ void Config::set (const std::string& key, const std::string& value)
|
|||||||
(*this)[key] = value;
|
(*this)[key] = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
|
||||||
// The vector form of Config::get assumes the single value is comma-separated,
|
|
||||||
// and splits accordingly.
|
|
||||||
void Config::get (
|
|
||||||
const std::string& key,
|
|
||||||
std::vector <std::string>& values)
|
|
||||||
{
|
|
||||||
values.clear ();
|
|
||||||
split (values, (*this)[key], ',');
|
|
||||||
}
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
|
||||||
// The vector form of Config::set joins the values together with commas, and
|
|
||||||
// stores the single value.
|
|
||||||
void Config::set (
|
|
||||||
const std::string& key,
|
|
||||||
const std::vector <std::string>& values)
|
|
||||||
{
|
|
||||||
std::string conjoined;
|
|
||||||
join (conjoined, ",", values);
|
|
||||||
(*this)[key] = conjoined;
|
|
||||||
}
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
// Provide a vector of all configuration keys.
|
// Provide a vector of all configuration keys.
|
||||||
void Config::all (std::vector<std::string>& items)
|
void Config::all (std::vector<std::string>& items)
|
||||||
|
|||||||
10
src/Config.h
10
src/Config.h
@@ -40,18 +40,16 @@ public:
|
|||||||
bool load (const std::string&);
|
bool load (const std::string&);
|
||||||
void createDefault (const std::string&);
|
void createDefault (const std::string&);
|
||||||
|
|
||||||
const std::string& get (const char*);
|
const std::string get (const char*);
|
||||||
const std::string& get (const char*, const char*);
|
const std::string get (const char*, const char*);
|
||||||
const std::string& get (const std::string&);
|
const std::string get (const std::string&);
|
||||||
const std::string& get (const std::string&, const std::string&);
|
const std::string get (const std::string&, const std::string&);
|
||||||
bool get (const std::string&, bool);
|
bool get (const std::string&, bool);
|
||||||
int get (const std::string&, const int);
|
int get (const std::string&, const int);
|
||||||
double get (const std::string&, const double);
|
double get (const std::string&, const double);
|
||||||
void get (const std::string&, std::vector <std::string>&);
|
|
||||||
void set (const std::string&, const int);
|
void set (const std::string&, const int);
|
||||||
void set (const std::string&, const double);
|
void set (const std::string&, const double);
|
||||||
void set (const std::string&, const std::string&);
|
void set (const std::string&, const std::string&);
|
||||||
void set (const std::string&, const std::vector <std::string>&);
|
|
||||||
void all (std::vector <std::string>&);
|
void all (std::vector <std::string>&);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
74
src/Date.cpp
74
src/Date.cpp
@@ -57,7 +57,7 @@ Date::Date (const int m, const int d, const int y)
|
|||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
Date::Date (const std::string& mdy, const std::string format /* = "m/d/Y" */)
|
Date::Date (const std::string& mdy, const std::string& format /* = "m/d/Y" */)
|
||||||
{
|
{
|
||||||
int month = 0;
|
int month = 0;
|
||||||
int day = 0;
|
int day = 0;
|
||||||
@@ -221,65 +221,29 @@ void Date::toMDY (int& m, int& d, int& y)
|
|||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
std::string Date::toString (const std::string& format /*= "m/d/Y"*/)
|
const std::string Date::toString (const std::string& format /*= "m/d/Y" */) const
|
||||||
{
|
{
|
||||||
|
// Making this local copy seems to fix a bug. Remove the local copy and you'll
|
||||||
|
// see segmentation faults and all kinds of gibberish.
|
||||||
|
std::string localFormat = format;
|
||||||
|
|
||||||
|
char buffer[12];
|
||||||
std::string formatted;
|
std::string formatted;
|
||||||
for (unsigned int i = 0; i < format.length (); ++i)
|
for (unsigned int i = 0; i < localFormat.length (); ++i)
|
||||||
{
|
{
|
||||||
switch (format[i])
|
char c = localFormat[i];
|
||||||
|
switch (c)
|
||||||
{
|
{
|
||||||
case 'm':
|
case 'm': sprintf (buffer, "%d", this->month ()); break;
|
||||||
{
|
case 'M': sprintf (buffer, "%02d", this->month ()); break;
|
||||||
char m[3];
|
case 'd': sprintf (buffer, "%d", this->day ()); break;
|
||||||
sprintf (m, "%d", this->month ());
|
case 'D': sprintf (buffer, "%02d", this->day ()); break;
|
||||||
formatted += m;
|
case 'y': sprintf (buffer, "%02d", this->year () % 100); break;
|
||||||
}
|
case 'Y': sprintf (buffer, "%d", this->year ()); break;
|
||||||
break;
|
default: sprintf (buffer, "%c", c); break;
|
||||||
|
|
||||||
case 'M':
|
|
||||||
{
|
|
||||||
char m[3];
|
|
||||||
sprintf (m, "%02d", this->month ());
|
|
||||||
formatted += m;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'd':
|
|
||||||
{
|
|
||||||
char d[3];
|
|
||||||
sprintf (d, "%d", this->day ());
|
|
||||||
formatted += d;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'D':
|
|
||||||
{
|
|
||||||
char d[3];
|
|
||||||
sprintf (d, "%02d", this->day ());
|
|
||||||
formatted += d;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'y':
|
|
||||||
{
|
|
||||||
char y[3];
|
|
||||||
sprintf (y, "%02d", this->year () % 100);
|
|
||||||
formatted += y;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'Y':
|
|
||||||
{
|
|
||||||
char y[5];
|
|
||||||
sprintf (y, "%d", this->year ());
|
|
||||||
formatted += y;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
formatted += format[i];
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
formatted += buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
return formatted;
|
return formatted;
|
||||||
|
|||||||
@@ -37,14 +37,14 @@ public:
|
|||||||
Date ();
|
Date ();
|
||||||
Date (time_t);
|
Date (time_t);
|
||||||
Date (const int, const int, const int);
|
Date (const int, const int, const int);
|
||||||
Date (const std::string&, const std::string format = "m/d/Y");
|
Date (const std::string&, const std::string& format = "m/d/Y");
|
||||||
Date (const Date&);
|
Date (const Date&);
|
||||||
virtual ~Date ();
|
virtual ~Date ();
|
||||||
|
|
||||||
void toEpoch (time_t&);
|
void toEpoch (time_t&);
|
||||||
time_t toEpoch ();
|
time_t toEpoch ();
|
||||||
void toMDY (int&, int&, int&);
|
void toMDY (int&, int&, int&);
|
||||||
std::string toString (const std::string& format = "m/d/Y");
|
const std::string toString (const std::string& format = "m/d/Y") const;
|
||||||
static bool valid (const int, const int, const int);
|
static bool valid (const int, const int, const int);
|
||||||
|
|
||||||
static bool leapYear (int);
|
static bool leapYear (int);
|
||||||
|
|||||||
@@ -120,12 +120,15 @@ static const char* commands[] =
|
|||||||
"delete",
|
"delete",
|
||||||
"done",
|
"done",
|
||||||
"export",
|
"export",
|
||||||
|
"help",
|
||||||
"history",
|
"history",
|
||||||
"info",
|
"info",
|
||||||
"list",
|
"list",
|
||||||
"long",
|
"long",
|
||||||
"ls",
|
"ls",
|
||||||
|
"newest",
|
||||||
"next",
|
"next",
|
||||||
|
"oldest",
|
||||||
"overdue",
|
"overdue",
|
||||||
"projects",
|
"projects",
|
||||||
"start",
|
"start",
|
||||||
|
|||||||
1330
src/task.cpp
1330
src/task.cpp
File diff suppressed because it is too large
Load Diff
@@ -36,6 +36,10 @@
|
|||||||
#include "T.h"
|
#include "T.h"
|
||||||
#include "../auto.h"
|
#include "../auto.h"
|
||||||
|
|
||||||
|
#ifndef min
|
||||||
|
#define min(a,b) ((a) < (b) ? (a) : (b))
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef max
|
#ifndef max
|
||||||
#define max(a,b) ((a) > (b) ? (a) : (b))
|
#define max(a,b) ((a) > (b) ? (a) : (b))
|
||||||
#endif
|
#endif
|
||||||
@@ -69,6 +73,8 @@ void handleReportCalendar (const TDB&, T&, Config&);
|
|||||||
void handleReportActive (const TDB&, T&, Config&);
|
void handleReportActive (const TDB&, T&, Config&);
|
||||||
void handleReportOverdue (const TDB&, T&, Config&);
|
void handleReportOverdue (const TDB&, T&, Config&);
|
||||||
void handleReportStats (const TDB&, T&, Config&);
|
void handleReportStats (const TDB&, T&, Config&);
|
||||||
|
void handleReportOldest (const TDB&, T&, Config&);
|
||||||
|
void handleReportNewest (const TDB&, T&, Config&);
|
||||||
void handleVersion (Config&);
|
void handleVersion (Config&);
|
||||||
void handleExport (const TDB&, T&, Config&);
|
void handleExport (const TDB&, T&, Config&);
|
||||||
void handleDelete (const TDB&, T&, Config&);
|
void handleDelete (const TDB&, T&, Config&);
|
||||||
|
|||||||
24
src/util.cpp
24
src/util.cpp
@@ -80,19 +80,19 @@ void formatTimeDeltaDays (std::string& output, time_t delta)
|
|||||||
if (days > 365)
|
if (days > 365)
|
||||||
sprintf (formatted, "%.1f yrs", (days / 365.2422));
|
sprintf (formatted, "%.1f yrs", (days / 365.2422));
|
||||||
else if (days > 84)
|
else if (days > 84)
|
||||||
sprintf (formatted, "%1d mths", (int) (days / 30.6));
|
sprintf (formatted, "%1d mth%s", (int) (days / 30.6), ((int) (days / 30.6) == 1 ? "" : "s"));
|
||||||
else if (days > 13)
|
else if (days > 13)
|
||||||
sprintf (formatted, "%d wks", (int) (days / 7.0));
|
sprintf (formatted, "%d wk%s", (int) (days / 7.0), ((int) (days / 7.0) == 1 ? "" : "s"));
|
||||||
else if (days > 5.0)
|
else if (days > 5.0)
|
||||||
sprintf (formatted, "%d days", (int) days);
|
sprintf (formatted, "%d day%s", (int) days, ((int) days == 1 ? "" : "s"));
|
||||||
else if (days > 1.0)
|
else if (days > 1.0)
|
||||||
sprintf (formatted, "%.1f days", days);
|
sprintf (formatted, "%.1f days", days);
|
||||||
else if (days * 24 > 1.0)
|
else if (days * 24 > 1.0)
|
||||||
sprintf (formatted, "%d hrs", (int) (days * 24.0));
|
sprintf (formatted, "%d hr%s", (int) (days * 24.0), ((int) (days * 24.0) == 1 ? "" : "s"));
|
||||||
else if (days * 24 * 60 > 1)
|
else if (days * 24 * 60 > 1)
|
||||||
sprintf (formatted, "%d mins", (int) (days * 24 * 60));
|
sprintf (formatted, "%d min%s", (int) (days * 24 * 60), ((int) (days * 24 * 60) == 1 ? "" : "s"));
|
||||||
else if (days * 24 * 60 * 60 > 1)
|
else if (days * 24 * 60 * 60 > 1)
|
||||||
sprintf (formatted, "%d secs", (int) (days * 24 * 60 * 60));
|
sprintf (formatted, "%d sec%s", (int) (days * 24 * 60 * 60), ((int) (days * 24 * 60 * 60) == 1 ? "" : "s"));
|
||||||
else
|
else
|
||||||
strcpy (formatted, "-");
|
strcpy (formatted, "-");
|
||||||
|
|
||||||
@@ -108,19 +108,19 @@ std::string formatSeconds (time_t delta)
|
|||||||
if (days > 365)
|
if (days > 365)
|
||||||
sprintf (formatted, "%.1f yrs", (days / 365.2422));
|
sprintf (formatted, "%.1f yrs", (days / 365.2422));
|
||||||
else if (days > 84)
|
else if (days > 84)
|
||||||
sprintf (formatted, "%1d mths", (int) (days / 30.6));
|
sprintf (formatted, "%1d mth%s", (int) (days / 30.6), ((int) (days / 30.6) == 1 ? "" : "s"));
|
||||||
else if (days > 13)
|
else if (days > 13)
|
||||||
sprintf (formatted, "%d wks", (int) (days / 7.0));
|
sprintf (formatted, "%d wk%s", (int) (days / 7.0), ((int) (days / 7.0) == 1 ? "" : "s"));
|
||||||
else if (days > 5.0)
|
else if (days > 5.0)
|
||||||
sprintf (formatted, "%d days", (int) days);
|
sprintf (formatted, "%d day%s", (int) days, ((int) days == 1 ? "" : "s"));
|
||||||
else if (days > 1.0)
|
else if (days > 1.0)
|
||||||
sprintf (formatted, "%.1f days", days);
|
sprintf (formatted, "%.1f days", days);
|
||||||
else if (days * 24 > 1.0)
|
else if (days * 24 > 1.0)
|
||||||
sprintf (formatted, "%d hrs", (int) (days * 24.0));
|
sprintf (formatted, "%d hr%s", (int) (days * 24.0), ((int) (days * 24) == 1 ? "" : "s"));
|
||||||
else if (days * 24 * 60 > 1)
|
else if (days * 24 * 60 > 1)
|
||||||
sprintf (formatted, "%d mins", (int) (days * 24 * 60));
|
sprintf (formatted, "%d min%s", (int) (days * 24 * 60), ((int) (days * 24 * 60) == 1 ? "" : "s"));
|
||||||
else if (days * 24 * 60 * 60 > 1)
|
else if (days * 24 * 60 * 60 > 1)
|
||||||
sprintf (formatted, "%d secs", (int) (days * 24 * 60 * 60));
|
sprintf (formatted, "%d sec%s", (int) (days * 24 * 60 * 60), ((int) (days * 24 * 60 * 60) == 1 ? "" : "s"));
|
||||||
else
|
else
|
||||||
strcpy (formatted, "-");
|
strcpy (formatted, "-");
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user