There is no point in adding entry or merging lists if a FamilyWild entry would
end in front of any entry, or entry without display number would end in front
of entry with number.

This sorts all entries in order:
  * FamilyWild without display number
  * FamilyWild with display number
  * Other family without display number
  * Other family with display number

The order of the entries in each category is kept.
---
 process.c | 41 +++++++++++++++++++++++++++++++++++++++++
 1 file changed, 41 insertions(+)

diff --git a/process.c b/process.c
index d3ea435..f3d6ca4 100644
--- a/process.c
+++ b/process.c
@@ -1170,6 +1170,45 @@ merge_entries(AuthList **firstp, AuthList *second, int 
*nnewp, int *nreplp)
 
 }
 
+static void
+sort_entries(AuthList **firstp)
+{
+    /* Insert sort, in each pass it removes auth records of certain */
+    /* cathegory from the given list and inserts them into the sorted list. */
+
+    AuthList *sorted = NULL, *sorted_tail = NULL;
+    AuthList *prev, *iter, *next;
+
+    #define SORT_OUT(EXPRESSION) { \
+       prev = NULL; \
+       for (iter = *firstp; iter; iter = next) { \
+           next = iter->next; \
+           if (EXPRESSION) { \
+               if (prev) \
+                   prev->next = next; \
+               else \
+                   *firstp = next; \
+               if (sorted_tail == NULL) { \
+                   sorted = sorted_tail = iter; \
+               } else { \
+                   sorted_tail->next = iter; \
+                   sorted_tail = iter; \
+               } \
+               iter->next = NULL; \
+           } else { \
+               prev = iter; \
+           } \
+       } \
+    }
+
+    SORT_OUT(iter->auth->family != FamilyWild && iter->auth->number_length != 
0);
+    SORT_OUT(iter->auth->family != FamilyWild && iter->auth->number_length == 
0);
+    SORT_OUT(iter->auth->family == FamilyWild && iter->auth->number_length != 
0);
+    SORT_OUT(iter->auth->family == FamilyWild && iter->auth->number_length == 
0);
+
+    *firstp = sorted;
+}
+
 static Xauth *
 copyAuth(Xauth *auth)
 {
@@ -1508,6 +1547,7 @@ do_merge(const char *inputfilename, int lineno, int argc, 
const char **argv)
          printf ("%d entries read in:  %d new, %d replacement%s\n",
                  nentries, nnew, nrepl, nrepl != 1 ? "s" : "");
        if (nentries > 0) xauth_modified = True;
+       sort_entries(&xauth_head);
     }
 
     return 0;
@@ -1656,6 +1696,7 @@ do_add(const char *inputfilename, int lineno, int argc, 
const char **argv)
        fprintf (stderr, "unable to merge in added record\n");
        return 1;
     }
+    sort_entries(&xauth_head);
 
     xauth_modified = True;
     return 0;
-- 
2.13.6

_______________________________________________
xorg-devel@lists.x.org: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: https://lists.x.org/mailman/listinfo/xorg-devel

Reply via email to