summaryrefslogtreecommitdiffstats
path: root/save-xml.c
diff options
context:
space:
mode:
authorGravatar Linus Torvalds <torvalds@linux-foundation.org>2014-03-10 10:18:13 -0700
committerGravatar Dirk Hohndel <dirk@hohndel.org>2014-03-10 11:36:17 -0700
commiteb47b2a8d8764778697ac2fdb342c976cd487ca3 (patch)
tree99d51da8bb2a1cfc4ef9325258f22394630c28db /save-xml.c
parente8ee701d3573c860b09c2634647e9d00a0bb111c (diff)
downloadsubsurface-eb47b2a8d8764778697ac2fdb342c976cd487ca3.tar.gz
Get rid of crazy empty tag_list element at the start
So this is totally unrelated to the git repository format, except for the fact that I noticed it while writing the git saving code. The subsurface divetag list handling is being stupid, and has a initial dummy entry at the head of the list for no good reason. I say "no good reason", because there *is* a reason for it: it allows code to avoid the special case of empty list and adding entries to before the first entry etc etc. But that reason is a really *bad* reason, because it's valid only because people don't understand basic list manipulation and pointers to pointers. So get rid of the dummy element, and do things right instead - by passing a *pointer* to the list, instead of the list. And then when traversing the list and looking for a place to insert things, don't go to the next entry - just update the "pointer to pointer" to point to the address of the next entry. Each entry in a C linked list is no different than the list itself, so you can use the pointer to the pointer to the next entry as a pointer to the list. This is a pet peeve of mine. The real beauty of pointers can never be understood unless you understand the indirection they allow. People who grew up with Pascal and were corrupted by that mindset are mentally stunted. Niklaus Wirth has a lot to answer for! But never fear. You too can overcome that mental limitation, it just needs some brain exercise. Reading this patch may help. In particular, contemplate the new "taglist_add_divetag()". Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
Diffstat (limited to 'save-xml.c')
-rw-r--r--save-xml.c32
1 files changed, 11 insertions, 21 deletions
diff --git a/save-xml.c b/save-xml.c
index 7801080e9..f5d17c49c 100644
--- a/save-xml.c
+++ b/save-xml.c
@@ -332,27 +332,18 @@ static void save_events(struct membuffer *b, struct event *ev)
}
}
-static void save_tags(struct membuffer *b, struct tag_entry *tag_list)
+static void save_tags(struct membuffer *b, struct tag_entry *entry)
{
- int more = 0;
- struct tag_entry *tmp = tag_list->next;
-
- /* Only write tag attribute if the list contains at least one item */
- if (tmp != NULL) {
- put_format(b, " tags='");
-
- while (tmp != NULL) {
- if (more)
- put_format(b, ", ");
+ if (entry) {
+ const char *sep = " tags='";
+ do {
+ struct divetag *tag = entry->tag;
+ put_string(b, sep);
/* If the tag has been translated, write the source to the xml file */
- if (tmp->tag->source != NULL)
- quote(b, tmp->tag->source, 0);
- else
- quote(b, tmp->tag->name, 0);
- tmp = tmp->next;
- more = 1;
- }
- put_format(b, "'");
+ quote(b, tag->source ?: tag->name, 0);
+ sep = ", ";
+ } while ((entry = entry->next) != NULL);
+ put_string(b, "'");
}
}
@@ -416,8 +407,7 @@ void save_one_dive(struct membuffer *b, struct dive *dive)
put_format(b, " rating='%d'", dive->rating);
if (dive->visibility)
put_format(b, " visibility='%d'", dive->visibility);
- if (dive->tag_list != NULL)
- save_tags(b, dive->tag_list);
+ save_tags(b, dive->tag_list);
show_date(b, dive->when);
put_format(b, " duration='%u:%02u min'>\n",