> Michal Srb <m...@suse.com> hat am 31. Mai 2018 um 15:12 geschrieben:
> 
> 
> 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;


MMh, so far i understand you do an add and then sort the whole thing.
perhaps it would be more easy to start with a sorted field and insert (add)
a key on the correct location ?

re,
 wh

> -- 
> 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
_______________________________________________
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