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);
+}
+