1087 Commits

Author SHA1 Message Date
Lukas Fleischer
3e84074ae5 Make events start on 00:00 (12:00 a.m.)
There is absolutely no reason to make events start on noon, 12:00.
Switching to 00:00 seems totally reasonable here, and makes event
handling a bit easier, also.

Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
2011-10-21 08:58:53 +02:00
Lukas Fleischer
50ad339a22 src/event.c: Fix event_inday()
Nasty off-by-one error here. An event should be associated with a day if
it starts at 12:00 a.m. and shouldn't be associated if it enters the
next day.

Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
2011-10-21 08:58:52 +02:00
Lukas Fleischer
a2ec9bbf0d TODO: Remove the duration format improvement suggestion
This has been implemented in the last couple of patches.

Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
2011-10-21 08:58:47 +02:00
Lukas Fleischer
9fa0507ef2 src/help.c: Update messages referring to durations
Fix help texts to vaguely match the new duration string formats.

Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
2011-10-06 12:37:07 +02:00
Lukas Fleischer
6e5ae6562d src/apoint.c: Resize duration input field
Now that we support more powerful duration strings, we should also
resize the input field for duration strings. Twelve characters is enough
space for "+999d23h59m".

Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
2011-10-06 12:37:07 +02:00
Lukas Fleischer
4ff3bb9d4f src/utils.c: Support more powerful duration strings
Add support for "1d23h42m"-like duration strings to parse_duration().

Also, switch to using a deterministic finite automaton to parse duration
strings, as things tend to get unclear.

Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
2011-10-06 12:37:07 +02:00
Lukas Fleischer
a7489b916e src/utils.c: Remove check_time()
Now that parse_time() and parse_duration() do all the validation work,
this isn't used (nor needed) any longer.

Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
2011-10-06 12:37:07 +02:00
Lukas Fleischer
39dd3c251d Use parse_{time,duration}() where appropriate
Make use of these new helpers at various places. Note that this patch
implies a few behavioural changes:

* Short forms such as "23:" and ":45" are allowed when entering times.

* Durations always need to be prefixed with a plus sign ("+"), with the
  nice side effect that you can now use "+3:30" to declare an
  appointment that lasts three hours and thirty minutes (that's much
  more convenient than "+210").

Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
2011-10-06 12:37:06 +02:00
Lukas Fleischer
0acbc06c43 src/utils.c: Introduce parse_{time,duration}()
These helpers can be used in a fashion similar to parse_date(). In
addition to check_time(), parse_time() and parse_duration() support
short forms such as "23:" (instead of "23:00") and ":45" (instead of
"00:45").

Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
2011-10-06 12:37:06 +02:00
Lukas Fleischer
d874f7ff97 src/calcurse.h: Rework date manipulation constants
Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
2011-10-06 12:37:06 +02:00
Lukas Fleischer
162c6aebdd src/utils.c: Mark input string of parse_date() const
We don't mess about with the date string here, so it should be declared
const.

Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
2011-10-06 12:37:06 +02:00
Lukas Fleischer
59e006e56d src/calcurse.c: Support count prefixes for motions
Add a global count buffer to our main loop and pass it to keys_getch()
as well as to all motion commands.

This enables some fancy shortcuts:

* Type "2l" to jump to the day after tomorrow.
* Type "4k" (or "28l") to move forward four weeks.
* Type "2$" to go to the end of next week.

Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
2011-10-06 12:37:06 +02:00
Lukas Fleischer
98651a549f Add count buffer to keys_getch()
Key commands can be prefixed with a natural number - keys_getch() will
store this number in the buffer pointed to by the second parameter. Set
this parameter to NULL to disable count prefixes.

Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
2011-10-06 12:37:06 +02:00
Lukas Fleischer
ba2aa5167b Add count parameter to *_{in,de}crease()
This allows for moving more than one item up/down.

This currently isn't used anywhere but will be bound to a key with one
of the following patches.

Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
2011-10-06 12:37:06 +02:00
Lukas Fleischer
2d5ce0d95c src/calendar.c: Add a count parameter to calendar_move()
Allows for moving more than one step forward/backward.

This is not used anywhere yet but a key binding will likely be added in
one of the following patches.

Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
2011-10-06 12:37:06 +02:00
Lukas Fleischer
6bdc36b15a Avoid unnecessary window updates
Add a window bitmask to wins_update() and only update windows that might
actually require an update in our main loop. This improves response
times of the user interface a bit.

Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
2011-10-06 12:37:05 +02:00
Lukas Fleischer
5d3ed17bc8 Refactor out storage updates
Instead of using a hacky flag, simply move the storage update code to a
separate function and call it when needed.

Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
2011-10-06 12:37:05 +02:00
Lukas Fleischer
70a488a64e Remove temporary highlight pointers
Add an additional check to apoint_update_panel() and todo_update_panel()
and only highlight currently selected items if the corresponding panel
is active. This allows us to remove all the highlight pointer juggling
that we used whenever the panel selection changed.

Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
2011-10-06 12:37:05 +02:00
Lukas Fleischer
146877a7da Use LLIST_{,TS}_FIND_FOREACH_CONT where appropriate
Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
2011-10-06 12:34:59 +02:00
Lukas Fleischer
9c1cbbdb22 src/llist.h: Add LLIST_{,TS}_FIND_FOREACH_CONT
In contrast to LLIST_{,TS}_FIND_FOREACH, these convenience macros search
for the first match and return successors until there is an item that
isn't matched by the filter callback. Any items beyond the first cut-off
are discarded.

Should be used when results are known to be continuous, such as
appointments and events belonging to a specific day etc.

Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
2011-10-05 12:25:48 +02:00
Lukas Fleischer
1fa9564916 src/llist.c: Add llist_next_filter()
This convenience function can be used to return the successor of a list
item if it is matched by a filter callback and return NULL otherwise.

We will use this for an improved version of the LLIST_FIND_FOREACH macro
that can be used whenever results are known to be continuous.

Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
2011-10-05 12:25:48 +02:00
Lukas Fleischer
a0afb7ded2 src/llist.c: Add a tail pointer
Adding a tail pointer to each list increases memory footprint by four
bytes, while reducing the runtime of llist_add() from O(n) to O(1). In
testing, the time required to append 100000 elements to a linked list
was reduced from 29.245s to 0.009s.

Our second main concern is to reduce the runtime of llist_add_sorted()
when inserting elements from a presorted list (this is reduced from O(n)
to O(1) as well), since the data files contain appointments in sorted
order and are always processed front to back.

Some local numbers show how this speeds up calcurse startup (test set
with 50000 appointments):

    0.22user 0.12system 0:00.35elapsed 99%CPU (0avgtext+0avgdata 5396maxresident)k
    0inputs+8outputs (0major+1398minor)pagefaults 0swaps

As opposed to the unpatched binary:

    21.97user 0.25system 0:22.23elapsed 99%CPU (0avgtext+0avgdata 5388maxresident)k
    0inputs+48outputs (0major+1396minor)pagefaults 0swaps

This is a ~10000% increase in speed. Timings for reading random input
files generated by a script stay the same (32.391s vs. 31.776s).

Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
2011-10-05 12:25:48 +02:00
Lukas Fleischer
718a6cfee4 Add command line argument to run the GC manually
Adds a "-g" option that allows for running the garbage collector for
note files manually. This is useful for users that do not use note files
at all or rarely edit/remove them.

Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
2011-10-05 12:25:48 +02:00
Lukas Fleischer
711d5dea20 Add configuration option to run the GC on exit
If "auto_gc" is enabled, the garbage collector for note files will be
run on every exit. As this is an experimental feature and may cause data
loss, this is disabled by default.

Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
2011-10-05 12:25:48 +02:00
Lukas Fleischer
8d71923d4f Add a garbage collector for note files
Now that we use hashes to identify notes, a garbage collector comes in
handy. We search for note files that aren't referenced anywhere. Such
files might come up if a note, that isn't connected with any other item,
is edited.

Huge parts of this code are very hackish due to our data structure
layout and the way our hash table implementation works.

Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
2011-10-05 12:25:47 +02:00
Lukas Fleischer
6c7edfbb86 Do not unlink() note files on note removal
Now that we use hash-based note file names, note files should never be
unlinked as a note file might be shared.

Also, remove the ERASE_FORCE_KEEP_NOTE flag that no longer makes any
sense.

Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
2011-10-05 12:25:47 +02:00
Lukas Fleischer
c77d1a573f Use hash-based file names in ical_read_note()
Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
2011-10-05 12:25:47 +02:00
Lukas Fleischer
5c6a00ee93 Use hash-bashed file names in edit_note()
Note file names are now generated based on their content. Items using
the same note will share a single note file.

Please note that this implies a few changes:

* Both random-style and hash-style note files need to be handled to
  ensure we do not break backwards compatibility.

* Note files may not be moved or deleted if a note is changed or removed
  since the original note file might be used by another item as well.

* A garbage collector to remove unreferenced note files needs to be
  implemented.

Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
2011-10-05 12:25:47 +02:00
Lukas Fleischer
2fe7a36aab Accept variable length note names
Read up to the first blank in note_read() instead of assuming a
fixed-width note file name. Accept everything up to 40 characters (which
is the length of a SHA1 hash in hexadecimal representation).

Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
2011-10-05 12:25:47 +02:00
Lukas Fleischer
bc97d60ef2 Refactor out note deserialization
Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
2011-10-05 12:25:47 +02:00
Lukas Fleischer
c7b56ca556 Add a copy file routine
Add io_file_cp() which can be used to copy an existing source file to
another location. We will need this for our new hash-based note file
names.

Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
2011-10-05 12:25:47 +02:00
Lukas Fleischer
9dcb377a64 Add a SHA1 implementation
Add an implementation of the SHA1 hash algorithm based on a public
domain project by Steve Reid <sreid@sea-to-sky.net>. You can get the
original sources from:

    ftp://ftp.funet.fi/pub/crypt/hash/sha/sha1.c

We will need this for several things. File names of note files will be
generated based on a hash their content instead of using a random name.
Items can be uniquely identified using a hash.

In addition to the regular sha1_init(), sha1_update() and sha1_final()
operations, our implementation also contains wrappers for hashing a
string or a stream.

Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
2011-10-05 12:25:46 +02:00
Lukas Fleischer
51c6386a05 doc/: Add "submitting-patches.txt"
This short paper contains information on how to create and submit
patches to calcurse. This used to be on our website - "doc/" seems to be
a better place for this, though.

Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
2011-10-05 12:20:41 +02:00
Lukas Fleischer
3aefd00f6a Cleanup joinable threads on termination
Always invoke pthread_join() when we blow up a thread via
pthread_cancel() (avoid zombie threads).

Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
2011-10-04 12:26:42 +02:00
Lukas Fleischer
4cd62fb0fb src/io.c: Update todo item count on iCal import
Update the number of todo items when importing an iCal file to prevent
some items from being inaccessible.

Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
2011-10-04 11:07:33 +02:00
Lukas Fleischer
c41eda256d Do not hardcode paths to the default editor/pager
Use "vi" instead of "/usr/bin/vi" and "less" instead of "/usr/bin/less".
Hardcoding absolute paths is a bad idea:

    $ uname -rsv
    Linux 3.0-ARCH #1 SMP PREEMPT Tue Aug 30 07:32:23 UTC 2011
    $ which less
    /bin/less

The "$PATH" environment variable will almost always have a better idea
of where these binaries are located.

Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
2011-10-04 11:05:43 +02:00
Lukas Fleischer
78b663d073 Merge branch 'maint'
Conflicts:
	src/io.c
2011-09-06 14:56:17 +02:00
Lukas Fleischer
9f1fed3ed1 Release 2.9.2
Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
2011-09-06 14:55:30 +02:00
Lukas Fleischer
2d298dcd5f Update translations
Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
2011-09-06 14:37:56 +02:00
Lukas Fleischer
ac50b5a111 Add a configure setting to skip "doc/"
This should fix all remaining build issues with documentation
generation. Finally.

The new "--disable-docs" option should be used to skip documentation
completely, whereas "--without-asciidoc" can be used if both manual and
man page should not be rebuilt. As a consequence, "--without-asciidoc"
can only be combined with "--enable-docs" if ready-made documentation
already exists in "doc/". This is true for release tarballs (where we
include prebuilt documentation for the sake of portability and
simplicity), as well as for Git checkouts where the documentation has
already been built earlier.

Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
2011-09-03 02:19:32 +02:00
Lukas Fleischer
33450f9ba9 Merge branch 'maint' 2011-09-02 12:03:43 +02:00
Lukas Fleischer
b59070a49e Rework indentation code in print_notefile()
Do not use snprintf() here as printf() behaviour is undefined if the
destination pointer is used as a parameter.

Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
2011-08-26 12:14:03 +02:00
Lukas Fleischer
806a13ed8a src/io.c: iCal content line folding correctness
This is a rather invasive change that introduces correct line folding to
our iCal parser.

From now on, ical_readline() should be used instead of fgets() to read
lines from an iCal file as it unfolds lines automatically. We also need
to use shared buffers as each ical_readline() invocation eats up the
first part of the next line and stores it in the "lstore" buffer.
Subsequent ical_readline() invocations copy the contents of this buffer
and append continuation lines. We currently use a single buffer pair
that is allocated in io_import_data() and pass it to all subroutines.

ical_readline_init() needs to be called once for every buffer pair. It
reads the first part of the current line and writes to "lstore",
clearing the target buffer at the same time.

Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
2011-08-26 11:57:30 +02:00
Lukas Fleischer
45417bc6f0 Add configuration option to notify all appointments
If "notify-all" is enabled, all non-flagged appointments will be
notified (instead of flagged ones). This is useful for users that want
to be notified of everything.

Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
2011-07-31 03:23:32 +02:00
Lukas Fleischer
de85010edc Release 2.9.1
Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
2011-07-31 02:55:56 +02:00
Lukas Fleischer
2336066855 Update translations files
Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
2011-07-31 02:55:56 +02:00
Lukas Fleischer
0884d62b22 Merge branch 'maint' 2011-07-30 22:56:22 +02:00
Lukas Fleischer
13a41f8e0a Fix sort order in app_arg()
We used to iterate over the list of regular appointments and the list of
recurrent appointments in separate loops, thus leading to recurrent
appointments being printed first and regular appointments being printed
afterwards, regardless of their start and end times. Merge these loops
to coerce precedence of the start time.

There's still a fair bit of hackery in here - we will fix that later.

Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
2011-07-30 21:10:53 +02:00
Lukas Fleischer
6256183e1e Fix configuration file backward compatibility
We kinda broke this in 6377582841118688aee13aff98c9216403582e45.

All hail strsep()!

Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
2011-07-29 23:35:17 +02:00
Lukas Fleischer
709525cf8d Fix apoint_get() call in apoint_switch_notify()
We passed the function arguments the wrong way round. This regression
was introduced in commit 77ef3fe76e4ce4c9a990e8a5904ad2d83420ca02.

Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
2011-07-29 20:38:59 +02:00