963 Commits

Author SHA1 Message Date
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
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
Lukas Fleischer
1a849cfb8e Fix notify_check_repeated()
Remove the "current_time" check from the first if condition. As "greater
than" relations (">") have higher precedence than assignments ("=") in
C, this caused "real_app_time" to always be one or zero which definitely
isn't what we want here. Reading further down, it turns out that we
don't even need this comparison here, so we should be fine removing it.

Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
2011-07-29 20:38:59 +02:00
Lukas Fleischer
1da88589b2 Fix recurrent appointment notification
We probably broke this in 9fab24818a119aef08b9726f6c1cd31d5434ce34.

Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
2011-07-29 20:38:59 +02:00
Lukas Fleischer
0126cbd1b3 Update the notification item in *_paste_item()
Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
2011-07-29 20:38:59 +02:00
Lukas Fleischer
cce0acbe00 Update the notification item in day_edit_item()
Ensure the start time as well as the description of the notification
appointment are synced after editing it.

We use notify_check_next_app()'s force parameter to ensure that the
notification item is updated even if only the description was modified.

Reported-by: Andraž 'ruskie' Levstik <ruskie@codemages.net>
Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
2011-07-29 20:38:43 +02:00
Lukas Fleischer
5a5c6d2604 Add "force" parameter to notify_check_next_app()
This allows to force notify_check_next_app() to update the notification
appointment, even if start times are equal (e.g. if the item description
was changed).

Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
2011-07-29 20:28:30 +02:00
Lukas Fleischer
53b041facf src/calcurse.h: Whitespace cleanup
Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
2011-07-28 14:46:00 +02:00
Lukas Fleischer
f2ddce23d4 src/args.c: Mark various constant strings const
Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
2011-07-28 13:42:44 +02:00
Lukas Fleischer
7b0d017b5d Remove superfluous buffer variable from version_arg()
Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
2011-07-28 13:42:44 +02:00
Lukas Fleischer
5637e973bf Remove superfluous buffer variable from help_arg()
Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
2011-07-28 13:42:44 +02:00
Lukas Fleischer
5b75566ce9 TODO: Remove reference to the bugs mailing list
Feature requests should go to the misc mailing list, no need to mention
the bugs mailing list here.

Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
2011-07-28 13:42:44 +02:00
Lukas Fleischer
54813eef19 Merge branch 'maint' 2011-07-28 13:38:12 +02:00
Lukas Fleischer
8681af3c6d io.c: Accept resource parameters in iCal import
Remove colons from the "SUMMARY:" and "DURATION:" search patterns in
ical_read_event() to allow for additional parameters (such as language
parameters, cf. RFC 5545).

Reported-by: Andraž 'ruskie' Levstik <ruskie@codemages.net>
Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
2011-07-28 13:37:16 +02:00
Lukas Fleischer
0c4e9d3f00 Invoke vars_init() before importing data with "-i"
We forgot to call vars_init() when importing an item using the "-i"
command line argument, which led to the pager configuration variable
being unset and hence the pager invocation (triggered to show the log in
case there are any errors during import) failing.

Fix this by calling vars_init() before io_import_data().

Reported-by: Andraž 'ruskie' Levstik <ruskie@codemages.net>
Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
2011-07-28 13:36:30 +02:00
Lukas Fleischer
a232c9af33 Use gettext plural features
Make use of the plural features of gettext to handle plural forms
correctly instead of using the plural form even if the singular form
should be used.

Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
2011-07-24 21:13:14 +02:00
Lukas Fleischer
e121ded3a5 Split stats messages in io_import_data()
Use separate format strings for separate values. This is useful in case
we want to output similar stats somewhere else and is a preparation for
supporting plural forms.

Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
2011-07-24 21:00:59 +02:00
Lukas Fleischer
87664095cd Refactor out note functions
* Add new note_edit() and note_view() helper functions. Use these
  instead of copy-pasted code in *_note_edit().

* Move all note-related functions (note_edit(), note_view(),
  note_erase()) to a new source file "note.c".

Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
2011-07-21 18:13:40 +02:00
Lukas Fleischer
40772daaf4 Add hint to error messages in custom_load_conf()
Include the name of the configuration variable that issued the error in
error messages that are thrown while parsing the configuration file.
This makes it a lot easier to locate syntactic and semantic errors.

Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
2011-07-21 17:58:19 +02:00
Lukas Fleischer
6377582841 Use map for configuration variable names
Use a map instead of dozens of hardcoded conditionals. This makes
configuration variable parsing more dynamic and extensible.

Also, reintroduce formatting error messages that we dropped earlier.

Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
2011-07-21 17:58:04 +02:00
Lukas Fleischer
32f22fdcc5 Return error status in custom_set_conf()
Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
2011-07-21 17:57:59 +02:00
Lukas Fleischer
8e4238c242 Rename custom_load_color() to conf_parse_color()
Also, temporarily remove all error messages and return an error status
instead.

Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
2011-07-21 17:57:50 +02:00
Lukas Fleischer
1355bad264 Declare foreground and background variables global
Removes the need to pass the terminal's default background color round.

Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
2011-07-21 17:56:39 +02:00
Lukas Fleischer
e5dee68dcf Refactor out integer variable parsing
Introduce conf_parse_unsigned() and conf_parse_int() similar to
conf_parse_bool().

Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
2011-07-21 17:56:25 +02:00
Lukas Fleischer
7e4f995692 Refactor conf_parse_bool()
* Increase size argument for strncmp() comparisons by one to include the
  terminating null-character (otherwise "yesfoo" would be parsed as
  "yes", "nobar" as "no").

* Pass destination address as an additional argument and return
  success/failure status to allow for better error handling.

* Temporarily remove error handling (will be fixed later).

Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
2011-07-21 17:55:55 +02:00
Lukas Fleischer
c875ab4195 Rename fill_config_var() to conf_parse_bool()
This is a much better name as it implicitly describes that this function
parses boolean configuration values only.

Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
2011-07-21 17:54:59 +02:00