annotate lib/llist.c @ 315:aaac01796688

Upgrade patch to detect hunks that start after a false start. Imagine a hunk that starts with a blank line, but the site to patch starts with two blank lines. Before we'd read the first blank line, think it was the start of the hunk and buffer it, read the second blank line, notice that it didn't match the second line of the hunk, and discard _both_ buffered lines of context (writing them to the output file) without checking that one of the later context lines might have been the real start of the hunk. Make it re-check the rest of the buffered context for matches each time it discards a line of buffered context.
author Rob Landley <rob@landley.net>
date Thu, 23 Oct 2008 16:44:30 -0500
parents 630b2e12db16
children f1e9da78c5dd
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
15
2a56fdc40035 Linked list functions, forgot to add this to the repository.
Rob Landley <rob@landley.net>
parents:
diff changeset
1 /* vi: set sw=4 ts=4 :
2a56fdc40035 Linked list functions, forgot to add this to the repository.
Rob Landley <rob@landley.net>
parents:
diff changeset
2 * llist.c - Linked list functions
2a56fdc40035 Linked list functions, forgot to add this to the repository.
Rob Landley <rob@landley.net>
parents:
diff changeset
3 *
2a56fdc40035 Linked list functions, forgot to add this to the repository.
Rob Landley <rob@landley.net>
parents:
diff changeset
4 * Linked list structures have a next pointer as their first element.
2a56fdc40035 Linked list functions, forgot to add this to the repository.
Rob Landley <rob@landley.net>
parents:
diff changeset
5 */
2a56fdc40035 Linked list functions, forgot to add this to the repository.
Rob Landley <rob@landley.net>
parents:
diff changeset
6
2a56fdc40035 Linked list functions, forgot to add this to the repository.
Rob Landley <rob@landley.net>
parents:
diff changeset
7 #include "toys.h"
2a56fdc40035 Linked list functions, forgot to add this to the repository.
Rob Landley <rob@landley.net>
parents:
diff changeset
8
2a56fdc40035 Linked list functions, forgot to add this to the repository.
Rob Landley <rob@landley.net>
parents:
diff changeset
9 // Free all the elements of a linked list
2a56fdc40035 Linked list functions, forgot to add this to the repository.
Rob Landley <rob@landley.net>
parents:
diff changeset
10 // if freeit!=NULL call freeit() on each element before freeing it.
2a56fdc40035 Linked list functions, forgot to add this to the repository.
Rob Landley <rob@landley.net>
parents:
diff changeset
11
2a56fdc40035 Linked list functions, forgot to add this to the repository.
Rob Landley <rob@landley.net>
parents:
diff changeset
12 void llist_free(void *list, void (*freeit)(void *data))
2a56fdc40035 Linked list functions, forgot to add this to the repository.
Rob Landley <rob@landley.net>
parents:
diff changeset
13 {
2a56fdc40035 Linked list functions, forgot to add this to the repository.
Rob Landley <rob@landley.net>
parents:
diff changeset
14 while (list) {
20
3981c96f9285 Implement which. Add hello world to menuconfig. Wrap the various applet main
Rob Landley <rob@landley.net>
parents: 15
diff changeset
15 void *pop = llist_pop(&list);
3981c96f9285 Implement which. Add hello world to menuconfig. Wrap the various applet main
Rob Landley <rob@landley.net>
parents: 15
diff changeset
16 if (freeit) freeit(pop);
315
aaac01796688 Upgrade patch to detect hunks that start after a false start.
Rob Landley <rob@landley.net>
parents: 238
diff changeset
17 else free(pop);
aaac01796688 Upgrade patch to detect hunks that start after a false start.
Rob Landley <rob@landley.net>
parents: 238
diff changeset
18
aaac01796688 Upgrade patch to detect hunks that start after a false start.
Rob Landley <rob@landley.net>
parents: 238
diff changeset
19 // End doubly linked list too.
aaac01796688 Upgrade patch to detect hunks that start after a false start.
Rob Landley <rob@landley.net>
parents: 238
diff changeset
20 if (list==pop) break;
15
2a56fdc40035 Linked list functions, forgot to add this to the repository.
Rob Landley <rob@landley.net>
parents:
diff changeset
21 }
2a56fdc40035 Linked list functions, forgot to add this to the repository.
Rob Landley <rob@landley.net>
parents:
diff changeset
22 }
20
3981c96f9285 Implement which. Add hello world to menuconfig. Wrap the various applet main
Rob Landley <rob@landley.net>
parents: 15
diff changeset
23
3981c96f9285 Implement which. Add hello world to menuconfig. Wrap the various applet main
Rob Landley <rob@landley.net>
parents: 15
diff changeset
24 // Return the first item from the list, advancing the list (which must be called
3981c96f9285 Implement which. Add hello world to menuconfig. Wrap the various applet main
Rob Landley <rob@landley.net>
parents: 15
diff changeset
25 // as &list)
3981c96f9285 Implement which. Add hello world to menuconfig. Wrap the various applet main
Rob Landley <rob@landley.net>
parents: 15
diff changeset
26 void *llist_pop(void *list)
3981c96f9285 Implement which. Add hello world to menuconfig. Wrap the various applet main
Rob Landley <rob@landley.net>
parents: 15
diff changeset
27 {
3981c96f9285 Implement which. Add hello world to menuconfig. Wrap the various applet main
Rob Landley <rob@landley.net>
parents: 15
diff changeset
28 // I'd use a void ** for the argument, and even accept the typecast in all
3981c96f9285 Implement which. Add hello world to menuconfig. Wrap the various applet main
Rob Landley <rob@landley.net>
parents: 15
diff changeset
29 // callers as documentation you need the &, except the stupid compiler
3981c96f9285 Implement which. Add hello world to menuconfig. Wrap the various applet main
Rob Landley <rob@landley.net>
parents: 15
diff changeset
30 // would then scream about type-punned pointers. Screw it.
3981c96f9285 Implement which. Add hello world to menuconfig. Wrap the various applet main
Rob Landley <rob@landley.net>
parents: 15
diff changeset
31 void **llist = (void **)list;
3981c96f9285 Implement which. Add hello world to menuconfig. Wrap the various applet main
Rob Landley <rob@landley.net>
parents: 15
diff changeset
32 void **next = (void **)*llist;
3981c96f9285 Implement which. Add hello world to menuconfig. Wrap the various applet main
Rob Landley <rob@landley.net>
parents: 15
diff changeset
33 *llist = *next;
3981c96f9285 Implement which. Add hello world to menuconfig. Wrap the various applet main
Rob Landley <rob@landley.net>
parents: 15
diff changeset
34
3981c96f9285 Implement which. Add hello world to menuconfig. Wrap the various applet main
Rob Landley <rob@landley.net>
parents: 15
diff changeset
35 return (void *)next;
3981c96f9285 Implement which. Add hello world to menuconfig. Wrap the various applet main
Rob Landley <rob@landley.net>
parents: 15
diff changeset
36 }
238
630b2e12db16 Move dlist_add() to lib/llist.c
Rob Landley <rob@landley.net>
parents: 20
diff changeset
37
630b2e12db16 Move dlist_add() to lib/llist.c
Rob Landley <rob@landley.net>
parents: 20
diff changeset
38 // Add an entry to the end off a doubly linked list
315
aaac01796688 Upgrade patch to detect hunks that start after a false start.
Rob Landley <rob@landley.net>
parents: 238
diff changeset
39 struct double_list *dlist_add(struct double_list **list, char *data)
238
630b2e12db16 Move dlist_add() to lib/llist.c
Rob Landley <rob@landley.net>
parents: 20
diff changeset
40 {
630b2e12db16 Move dlist_add() to lib/llist.c
Rob Landley <rob@landley.net>
parents: 20
diff changeset
41 struct double_list *line = xmalloc(sizeof(struct double_list));
630b2e12db16 Move dlist_add() to lib/llist.c
Rob Landley <rob@landley.net>
parents: 20
diff changeset
42
630b2e12db16 Move dlist_add() to lib/llist.c
Rob Landley <rob@landley.net>
parents: 20
diff changeset
43 line->data = data;
630b2e12db16 Move dlist_add() to lib/llist.c
Rob Landley <rob@landley.net>
parents: 20
diff changeset
44 if (*list) {
630b2e12db16 Move dlist_add() to lib/llist.c
Rob Landley <rob@landley.net>
parents: 20
diff changeset
45 line->next = *list;
630b2e12db16 Move dlist_add() to lib/llist.c
Rob Landley <rob@landley.net>
parents: 20
diff changeset
46 line->prev = (*list)->prev;
630b2e12db16 Move dlist_add() to lib/llist.c
Rob Landley <rob@landley.net>
parents: 20
diff changeset
47 (*list)->prev->next = line;
630b2e12db16 Move dlist_add() to lib/llist.c
Rob Landley <rob@landley.net>
parents: 20
diff changeset
48 (*list)->prev = line;
630b2e12db16 Move dlist_add() to lib/llist.c
Rob Landley <rob@landley.net>
parents: 20
diff changeset
49 } else *list = line->next = line->prev = line;
315
aaac01796688 Upgrade patch to detect hunks that start after a false start.
Rob Landley <rob@landley.net>
parents: 238
diff changeset
50
aaac01796688 Upgrade patch to detect hunks that start after a false start.
Rob Landley <rob@landley.net>
parents: 238
diff changeset
51 return line;
238
630b2e12db16 Move dlist_add() to lib/llist.c
Rob Landley <rob@landley.net>
parents: 20
diff changeset
52 }