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