raster pushed a commit to branch master.

http://git.enlightenment.org/apps/terminology.git/commit/?id=73a538433e44d966baf7db88dd25da5449d753c1

commit 73a538433e44d966baf7db88dd25da5449d753c1
Author: Carsten Haitzler (Rasterman) <ras...@rasterman.com>
Date:   Sun Dec 6 16:35:31 2020 +0000

    tyls - allow ls *.png or *.jpg and so on to work as you expect
---
 src/bin/tyls.c | 169 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 166 insertions(+), 3 deletions(-)

diff --git a/src/bin/tyls.c b/src/bin/tyls.c
index 8647296..7e8644c 100644
--- a/src/bin/tyls.c
+++ b/src/bin/tyls.c
@@ -725,6 +725,162 @@ list_dir(const char *dir, Tyls_Options *options)
    EINA_LIST_FREE(files, s) free(s);
 }
 
+static Eina_List *files_list = NULL;
+
+static void
+list_file(const char *dir, Tyls_Options *options EINA_UNUSED)
+{
+   char *file = strdup(dir);
+   files_list = eina_list_append(files_list, file);
+}
+
+static void
+flush_file(Tyls_Options *options)
+{
+   Eina_List *l;
+   char *s, **names, *s2;
+   int maxlen = 0, i, num, stuff;
+
+   if (!files_list) return;
+   names = calloc(eina_list_count(files_list) * 2, sizeof(char *));
+   if (!names) return;
+   i = 0;
+   EINA_LIST_FOREACH(files_list, l, s)
+     {
+        int len;
+
+        s2 = strrchr(s, '/');
+        if (!s2) continue;
+        s2++;
+        len = eina_unicode_utf8_get_len(s2);
+        if (len > maxlen) maxlen = len;
+        names[i] = s;
+        i++;
+     }
+   num = i;
+   stuff = 0;
+   if (options->mode == SMALL) stuff += 2;
+   else if (options->mode == MEDIUM) stuff += 4;
+   stuff += 5; // xxxx[ /K/M/G/T/P...]
+   stuff += 1; // spacer at start
+   // name
+   stuff += 1; // type [@/*/|/=...]
+   stuff += 1; // spacer
+   maxlen += stuff;
+   if (maxlen > 0)
+     {
+        int rows;
+        int cols = tw / maxlen;
+
+        if (cols < 1) cols = 1;
+        if (cols == 1)
+          {
+             maxlen--;
+             stuff--;
+          }
+        if (cols > num) cols = num;
+        if (cols == 0) cols = 1;
+        rows = ((num + (cols - 1)) / cols);
+        for (i = 0; i < rows; i++)
+          {
+             const char *icon;
+             int c, j, cw;
+
+             if (options->mode == SMALL)
+               {
+                  for (c = 0; c < cols; c++)
+                    {
+                       char sz[6], szch = ' ';
+                       long long size;
+
+                       s = names[(c * rows) + i];
+                       if (!s) continue;
+                       s2 = strrchr(s, '/');
+                       if (!s2) continue;
+                       s2++;
+                       int len = eina_unicode_utf8_get_len(s2);
+                       icon = fileicon(s);
+                       cw = tw / cols;
+                       size = ecore_file_size(s);
+                       size_print(sz, sizeof(sz), &szch, size);
+                       len += stuff;
+                       if (icon)
+                         printf("%c}it#%i;%i;%s\n%s%c", 0x1b, 2, 1, s, icon, 
0);
+                       else
+                         printf("%c}it#%i;%i;%s%c", 0x1b, 2, 1, s, 0);
+                       printf("%c}ib%c", 0x1b, 0);
+                       printf("##");
+                       printf("%c}ie%c", 0x1b, 0);
+                       sizeprint(sz, szch);
+                       printf(" ");
+                       fileprint(s, s2, EINA_TRUE);
+                       for (j = 0; j < (cw - len); j++) printf(" ");
+                    }
+                  printf("\n");
+               }
+             else if (options->mode == MEDIUM)
+               {
+                  for (c = 0; c < cols; c++)
+                    {
+                       s = names[(c * rows) + i];
+                       if (!s) continue;
+                       s2 = strrchr(s, '/');
+                       if (!s2) continue;
+                       s2++;
+                       int len = eina_unicode_utf8_get_len(s2);
+                       icon = fileicon(s);
+                       cw = tw / cols;
+                       len += 3;
+                       if (cols > 1) len += 1;
+                       if (icon)
+                         printf("%c}it%c%i;%i;%s\n%s%c", 0x1b, 33 + c, 4, 2, 
s, icon, 0);
+                       else
+                         printf("%c}it%c%i;%i;%s%c", 0x1b, 33 + c, 4, 2, s, 0);
+                       printf("%c}ib%c", 0x1b, 0);
+                       printf("%c%c%c%c", 33 + c, 33 + c, 33 + c, 33 + c);
+                       printf("%c}ie%c", 0x1b, 0);
+                       fileprint(s, s2, EINA_FALSE);
+                       if (c < (cols - 1))
+                         {
+                            for (j = 0; j < (cw - len); j++) printf(" ");
+                         }
+                    }
+                  printf("\n");
+                  for (c = 0; c < cols; c++)
+                    {
+                       char sz[6], szch = ' ';
+                       long long size;
+                       int len;
+
+                       s = names[(c * rows) + i];
+                       if (!s) continue;
+                       cw = tw / cols;
+                       s2 = strrchr(s, '/');
+                       if (!s2) continue;
+                       s2++;
+                       size = ecore_file_size(s);
+                       size_print(sz, sizeof(sz), &szch, size);
+                       len = eina_unicode_utf8_get_len(sz) + 2 + 4;
+                       if (cols > 1) len += 1;
+                       printf("%c}ib%c", 0x1b, 0);
+                       printf("%c%c%c%c", 33 + c, 33 + c, 33 + c, 33 + c);
+                       printf("%c}ie%c", 0x1b, 0);
+                       sizeprint(sz, szch);
+                       printf(" ");
+                       fileprint(s, NULL, EINA_TRUE);
+                       if (c < (cols - 1))
+                         {
+                            for (j = 0; j < (cw - len); j++) printf(" ");
+                         }
+                    }
+                  printf("\n");
+               }
+          }
+     }
+   free(names);
+   EINA_LIST_FREE(files_list, s) free(s);
+}
+
 static void
 print_usage(const char *argv0)
 {
@@ -810,13 +966,20 @@ main(int argc, char **argv)
           {
              char *rp;
 
-             if ((rp = ecore_file_realpath(path))
-                 && ecore_file_is_dir(rp))
+             rp = ecore_file_realpath(path);
+             if (rp)
                {
-                  list_dir(rp, &options);
+                  if (ecore_file_is_dir(rp))
+                    {
+                       flush_file(&options);
+                       list_dir(rp, &options);
+                    }
+                  else
+                    list_file(rp, &options);
                   free(rp);
                }
           }
+        flush_file(&options);
         fflush(stdout);
         ecore_evas_free(ee);
      }

-- 


Reply via email to