Mercurial > gftp.yaz
diff lib/misc.c @ 16:ddb983d8574b
* Improved directory sorting algorithm
* More large file support
* Included config.sub, install-sh, missing, mkinstalldirs from automake 1.4
author | masneyb |
---|---|
date | Mon, 09 Sep 2002 13:29:19 +0000 |
parents | 83090328581e |
children | c8ec7877432e |
line wrap: on
line diff
--- a/lib/misc.c Wed Sep 04 13:02:15 2002 +0000 +++ b/lib/misc.c Mon Sep 09 13:29:19 2002 +0000 @@ -965,3 +965,245 @@ #endif + +static gint +gftp_file_sort_function_as (gconstpointer a, gconstpointer b) +{ + const gftp_file * f1, * f2; + + f1 = a; + f2 = b; + return (strcmp (f1->file, f2->file)); +} + + +static gint +gftp_file_sort_function_ds (gconstpointer a, gconstpointer b) +{ + const gftp_file * f1, * f2; + gint ret; + + f1 = a; + f2 = b; + ret = strcmp (f1->file, f2->file); + if (ret < 0) + ret = 1; + else if (ret > 0) + ret = -1; + return (ret); +} + + +static gint +gftp_user_sort_function_as (gconstpointer a, gconstpointer b) +{ + const gftp_file * f1, * f2; + + f1 = a; + f2 = b; + return (strcmp (f1->user, f2->user)); +} + + +static gint +gftp_user_sort_function_ds (gconstpointer a, gconstpointer b) +{ + const gftp_file * f1, * f2; + gint ret; + + f1 = a; + f2 = b; + ret = strcmp (f1->user, f2->user); + if (ret < 0) + ret = 1; + else if (ret > 0) + ret = -1; + return (ret); +} + + +static gint +gftp_group_sort_function_as (gconstpointer a, gconstpointer b) +{ + const gftp_file * f1, * f2; + + f1 = a; + f2 = b; + return (strcmp (f1->group, f2->group)); +} + + +static gint +gftp_group_sort_function_ds (gconstpointer a, gconstpointer b) +{ + const gftp_file * f1, * f2; + gint ret; + + f1 = a; + f2 = b; + ret = strcmp (f1->group, f2->group); + if (ret < 0) + ret = 1; + else if (ret > 0) + ret = -1; + return (ret); +} + + +static gint +gftp_attribs_sort_function_as (gconstpointer a, gconstpointer b) +{ + const gftp_file * f1, * f2; + + f1 = a; + f2 = b; + return (strcmp (f1->attribs, f2->attribs)); +} + + +static gint +gftp_attribs_sort_function_ds (gconstpointer a, gconstpointer b) +{ + const gftp_file * f1, * f2; + gint ret; + + f1 = a; + f2 = b; + ret = strcmp (f1->attribs, f2->attribs); + if (ret < 0) + ret = 1; + else if (ret > 0) + ret = -1; + return (ret); +} + + +static gint +gftp_size_sort_function_as (gconstpointer a, gconstpointer b) +{ + const gftp_file * f1, * f2; + + f1 = a; + f2 = b; + if (f1->size < f2->size) + return (-1); + else if (f1->size == f2->size) + return (0); + else + return (1); +} + + +static gint +gftp_size_sort_function_ds (gconstpointer a, gconstpointer b) +{ + const gftp_file * f1, * f2; + + f1 = a; + f2 = b; + if (f1->size < f2->size) + return (1); + else if (f1->size == f2->size) + return (0); + else + return (-1); +} + + +static gint +gftp_datetime_sort_function_as (gconstpointer a, gconstpointer b) +{ + const gftp_file * f1, * f2; + + f1 = a; + f2 = b; + if (f1->datetime < f2->datetime) + return (-1); + else if (f1->datetime == f2->datetime) + return (0); + else + return (1); +} + + +static gint +gftp_datetime_sort_function_ds (gconstpointer a, gconstpointer b) +{ + const gftp_file * f1, * f2; + + f1 = a; + f2 = b; + if (f1->datetime < f2->datetime) + return (1); + else if (f1->datetime == f2->datetime) + return (0); + else + return (-1); +} + + +GList * +gftp_sort_filelist (GList * filelist, int column, int asds) +{ + GList * files, * dirs, * dotdot, * tempitem, * insitem; + GCompareFunc sortfunc; + gftp_file * tempfle; + + files = dirs = dotdot = NULL; + + if (column == GFTP_SORT_COL_FILE) + sortfunc = asds ? gftp_file_sort_function_as : gftp_file_sort_function_ds; + else if (column == GFTP_SORT_COL_SIZE) + sortfunc = asds ? gftp_size_sort_function_as : gftp_size_sort_function_ds; + else if (column == GFTP_SORT_COL_USER) + sortfunc = asds ? gftp_user_sort_function_as : gftp_user_sort_function_ds; + else if (column == GFTP_SORT_COL_GROUP) + sortfunc = asds ? + gftp_group_sort_function_as : gftp_group_sort_function_ds; + else if (column == GFTP_SORT_COL_DATETIME) + sortfunc = asds ? + gftp_datetime_sort_function_as : gftp_datetime_sort_function_ds; else /* GFTP_SORT_COL_ATTRIBS */ + sortfunc = asds ? + gftp_attribs_sort_function_as : gftp_attribs_sort_function_ds; + + for (tempitem = filelist; tempitem != NULL; ) + { + tempfle = tempitem->data; + insitem = tempitem; + tempitem = tempitem->next; + insitem->next = NULL; + + if (dotdot == NULL && strcmp (tempfle->file, "..") == 0) + dotdot = insitem; + else if (sort_dirs_first && tempfle->isdir) + { + insitem->next = dirs; + dirs = insitem; + } + else + { + insitem->next = files; + files = insitem; + } + } + + if (dirs != NULL) + dirs = g_list_sort (dirs, sortfunc); + if (files != NULL) + files = g_list_sort (files, sortfunc); + + filelist = dotdot; + + if (filelist == NULL) + filelist = dirs; + else + filelist = g_list_concat (filelist, dirs); + + if (filelist == NULL) + filelist = files; + else + filelist = g_list_concat (filelist, files); + + return (filelist); +} +