Verbesserung Lesbarkeit

- Codeduplikat entfernt
- Sprechende Variablennamen
- Variablen erst bei Nutzung definieren
- Variablen nicht mehrfach verwenden
- Variablen richtig typisieren
- Kommentare ergänzt
- for durch foreach ersätzt
- Klammern ergänzt

Change-Id: I1cc00e6ea735ab1574a76ed9e5c0be5cf05ab522
diff --git a/std/shells/magier/fileview.c b/std/shells/magier/fileview.c
index 00a3b64..85167dd 100644
--- a/std/shells/magier/fileview.c
+++ b/std/shells/magier/fileview.c
@@ -125,36 +125,45 @@
 }
 
 
-private string _ls_output_short(mixed filedata,
-                                int maxlen,int counter,int maxcount)
+private string _ls_output_short(<int|string>* filedata, int maxlen,
+    int counter, int maxcount)
 {
-  string tmp;
-  tmp=filedata[BASENAME];
-  maxlen-=sizeof(tmp);
+  string filename = filedata[BASENAME];
+  maxlen -= sizeof(filename);
   switch(filedata[FILESIZE])
   {
-    case FSIZE_DIR: tmp=sprintf(lstemplates.templates[DIR],tmp);
-             maxlen-=lstemplates.templates[DIR,1]; break;
-    case FSIZE_NOFILE: tmp=sprintf(lstemplates.templates[VC],tmp);
-             maxlen-=lstemplates.templates[VC,1]; break;
-    default: if (find_object(filedata[FULLNAME]))
-             {
-               maxlen-=lstemplates.templates[OBJ,1];
-               tmp=sprintf(lstemplates.templates[OBJ],tmp); break;
-             }
+    case FSIZE_DIR:
+      filename = sprintf(lstemplates.templates[DIR], filename);
+      maxlen -= lstemplates.templates[DIR, 1];
+      break;
+    case FSIZE_NOFILE:
+      filename = sprintf(lstemplates.templates[VC], filename);
+      maxlen -= lstemplates.templates[VC, 1];
+      break;
+    default:
+      if(find_object(filedata[FULLNAME]))
+      {
+        maxlen -= lstemplates.templates[OBJ, 1];
+        filename = sprintf(lstemplates.templates[OBJ], filename);
+        break;
+      }
   }
-  if (!maxcount) return terminal_colour(tmp+"\n",lstemplates.colormap);
-  return terminal_colour(sprintf("%-*s%s",(maxlen+sizeof(tmp)),tmp,
-                 ((counter++)==maxcount?(counter=0,"\n"):"  ")),
-                 lstemplates.colormap);
+  if(!maxcount)
+    return terminal_colour(filename + "\n", lstemplates.colormap);
+  return terminal_colour(
+      sprintf(
+          "%-*s%s",
+          (maxlen + sizeof(filename)),
+          filename,
+          ((counter++) == maxcount ? (counter = 0, "\n") : "  ")),
+      lstemplates.colormap);
 }
 
-private int _ls_maxlen(mixed filedata,int flags,int maxlen)
+private int _ls_maxlen(<int|string>* filedata,int flags, int maxlen)
 {
-  string base;
-  base=filedata[BASENAME];
-  if (!(flags&LS_A)&&(base[0]=='.')) return 0;
-  maxlen=max(maxlen,sizeof(base));
+  string base = filedata[BASENAME];
+  if(!(flags & LS_A) && base[0] == '.') return 0;
+  maxlen = max(maxlen, sizeof(base));
   return 1;
 }
 
@@ -240,92 +249,115 @@
             lstemplates.colormap);
 }
 
+private string* _ls_list(< <int|string>* >* targets, int flags, closure v_read,
+    closure v_write, closure creator)
+{
+  string* entries;
+  if (flags&LS_L)
+  {
+    entries = map(targets, #'_ls_output_long, flags, v_read,
+                  v_write, creator) - ({0});
+  }
+  else
+  {
+    int counter, maxlen;
+    targets = filter(targets, #'_ls_maxlen, flags, &maxlen);
+    if (maxlen > 76) maxlen = 76;
+    // maxcount muss immer um 1 niedriger sein als die tatsaechliche Anzahl an
+    // moeglichen Spalten, weil gegen maxcount++ und nicht gegen ++maxcount
+    // geprueft wird.
+    int maxcount = (78 / (maxlen + 2)) - 1;
+    entries = map(targets, #'_ls_output_short, maxlen, &counter, maxcount);
+  }
+  return entries;
+}
+
 
 static int _ls(string cmdline)
 {
-  int flags,cmp,i,arg_size,size;
-  int maxlen,counter,maxcount;
-  mixed* args;
-  string output;
-  mixed *tmp;
-  closure v_read,v_write,creator,sort_fun;
+  int flags;
   
-  cmdline=_unparsed_args()||"";
-  args=parseargs(cmdline,&flags,LS_OPTS,1);
-  if (flags==-1)
+  string* args = parseargs(_unparsed_args() || "", &flags, LS_OPTS, 1);
+  if(flags == -1)
     return USAGE("ls [-" LS_OPTS "] [<Verzeichnis>] [<Verzeichnis2> ..]");
   SetColorstrings();
-  output="";
-  if (!sizeof(args)) args=({ QueryProp(P_CURRENTDIR) });
-  if (!sizeof(args=file_list(args,MODE_LSA,0,"/")))
-    return notify_fail("ls: Keine passenden Verzeichnisse gefunden.\n"), 0;
-// Files sortieren die erste
-  if (flags&LS_T) cmp=FILEDATE;
-  else if (flags&LS_S) cmp=FILESIZE;
-  else cmp=BASENAME; // =0 :-)
+  if(!sizeof(args))
+    args = ({ QueryProp(P_CURRENTDIR) });
+  < <int|string>* >* targets = file_list(args,MODE_LSA,0,"/");
+  if(!sizeof(targets))
+  {
+    notify_fail("ls: Keine passenden Verzeichnisse gefunden.\n");
+    return 0;
+  }
 
-  if ( !cmp && !(flags&LS_R) || cmp && (flags&LS_R) )
-    sort_fun = function int (mixed* a, mixed* b) {
+  // Files sortieren die erste
+  int cmp;
+  if(flags & LS_T)
+    cmp = FILEDATE;
+  else if(flags & LS_S)
+    cmp = FILESIZE;
+  else
+    cmp = BASENAME;
+
+  closure sort_fun;
+  // Dateinamen aufsteigend sortieren, Groesse und Aenderungsdatum absteigend.
+  if(cmp == BASENAME && !(flags & LS_R) || cmp != BASENAME && (flags & LS_R))
+  {
+    sort_fun = function int (<int|string>* a, <int|string>* b) {
                  return (a[cmp] > b[cmp]);
                };
+  }
   else
-    sort_fun = function int (mixed* a, mixed* b) {
+  {
+    sort_fun = function int (<int|string>* a, <int|string>* b) {
                  return (a[cmp] < b[cmp]);
                };
-  args=sort_array(args,sort_fun);
-// Ausgabeformat bestimmen
+  }
+  targets = sort_array(targets, sort_fun);
+
+  // Ausgabeformat bestimmen
+  closure v_read,v_write,creator;
   if (flags&LS_L)
   {
     v_read=VALID_READ_CL;
     v_write=VALID_WRITE_CL;
     creator=CREATOR_CL;
   }
-  arg_size=sizeof(args);
-  if (arg_size>1||(arg_size&&args[0][FILESIZE]>=0))
+  string output = "";
+  // Falls mehr als ein Ziel angegeben wurde, werden zuerst die Ziele
+  // aufgelistet. Anschließend wird in der Schleife der Inhalt von allen Zielen,
+  // die Verzeichnise sind aufgelistet.
+  // Wurde nur ein Ziel angegeben und dies ist eine Datei, wird diese angezeigt.
+  // In der Schleife wird nichts hinzugefügt, weil hier nur Verzeichnisse
+  // aufgelistet werden.
+  if(sizeof(targets) > 1 || targets[0][FILESIZE] >= 0)
   {
-    if (flags&LS_L)
-      tmp=map(args,#'_ls_output_long,flags,v_read,
-                    v_write,creator)-({0});
+    string* entries = _ls_list(targets, flags, v_read, v_write, creator);
+    output = sprintf(
+        "\n%d Dateien/Unterverzeichnisse:\n%s\n",
+        sizeof(entries),
+        implode(entries, ""));
+  }
+  foreach(<int|string>* target : targets)
+  {
+    if(target[FILESIZE] != FSIZE_DIR)
+      continue;
+
+    < <int|string>* >* sub_targets = file_list(({target[FULLNAME] + "/*"}),
+        MODE_LSB, 0, "/");
+    sub_targets = sort_array(sub_targets, sort_fun);
+    string* entries = _ls_list(sub_targets, flags, v_read, v_write, creator);
+    if(sizeof(entries))
+    {
+      output += sprintf(
+          "\n%s: Verzeichnis, %d Dateien/Unterverzeichnisse:\n%s\n",
+          target[FULLNAME],
+          sizeof(entries),
+          implode(entries, ""));
+    }
     else
     {
-      counter=0;maxlen=0;
-      tmp=filter(args,#'_ls_maxlen,flags,&maxlen);
-      if (maxlen>76) maxlen=76;
-      maxcount=(78/(maxlen+2))-1;
-      tmp=map(tmp,#'_ls_output_short,maxlen,&counter,maxcount);
-    }
-    output=sprintf("\n%d Dateien/Unterverzeichnisse:\n%s\n",
-                   sizeof(tmp),implode(tmp,""));
-  }
-  for(i=0;i<arg_size;i++)
-  {
-    tmp=({});
-    size=args[i][FILESIZE];
-    if (size==FSIZE_DIR)
-    {
-      tmp=file_list(({args[i][FULLNAME]+"/*"}),MODE_LSB,0,"/");
-      tmp=sort_array(tmp,sort_fun);
-      if (flags&LS_L)
-        tmp=map(tmp,#'_ls_output_long,flags,v_read,
-                      v_write,creator)-({0});
-      else
-      {
-        counter=0;maxlen=0;
-        tmp=filter(tmp,#'_ls_maxlen,flags,&maxlen);
-        maxcount=(78/(maxlen+2));
-        if (maxcount) maxcount--;
-        tmp=map(tmp,#'_ls_output_short,maxlen,&counter,maxcount);
-      }
-      if (sizeof(tmp))
-      {
-        output+=sprintf("\n%s: Verzeichnis, %d Dateien/Unterverzeichnisse:\n",
-                      args[i][FULLNAME],sizeof(tmp));
-        output+=(implode(tmp,"")+((string)(tmp[<1][<1..<1])=="\n"?"":"\n"));
-      }
-      else
-      {
-        output+=sprintf("\n%s: Leeres Verzeichnis.\n",args[i][FULLNAME]);
-      }
+      output += sprintf("\n%s: Leeres Verzeichnis.\n", target[FULLNAME]);
     }
   }
   More(output);