++/* Each exclude_list_struct describes a singly-linked list by keeping track
++ * of both the head and tail pointers. The list is slightly unusual in that
++ * a parent-dir's content can be appended to the end of the local list in a
++ * special way: the last item in the local list has its "next" pointer set
++ * to point to the parent's list, but the local list's tail pointer points
++ * at the end of the local list. Thus, if the local list is empty, the head
++ * will be pointing at the parent content but the tail will be NULL. To
++ * help you visualize this, here are the possible list arrangements:
++ *
++ * Completely Empty Local Content Only
++ * ================================== ====================================
++ * head -> NULL head -> Local1 -> Local2 -> NULL
++ * tail -> NULL tail -------------^
++ *
++ * Inherited Content Only Both Local and Inherited Content
++ * ================================== ====================================
++ * head -> Parent1 -> Parent2 -> NULL head -> L1 -> L2 -> P1 -> P2 -> NULL
++ * tail -> NULL tail ---------^
++ *
++ * This means that anyone wanting to traverse the whole list to USE it just
++ * needs to start at the head and use the "next" pointers until it goes
++ * NULL. To add new local content, we insert the item after the tail item
++ * and update the tail (obviously, if "tail" was NULL, we insert it at the
++ * head). To clear the local list, WE MUST NOT FREE THE INHERITED CONTENT
++ * because it is shared between the current list and all our parent list(s).
++ * The easiest way to avoid this is to simply truncate the list after the
++ * tail item and free the local list from the head. When inheriting the
++ * list for a new local dir, we just save off the exclude_list_struct values
++ * and set the tail to NULL.
++ */
++
++/** Build an exclude structure given an exclude pattern. */