181 lines
3.2 KiB
C
181 lines
3.2 KiB
C
|
#include <stdlib.h>
|
||
|
#include <stdio.h>
|
||
|
#include <unistd.h>
|
||
|
#include <dirent.h>
|
||
|
#include <limits.h>
|
||
|
|
||
|
#include "../src/support.h"
|
||
|
|
||
|
|
||
|
/* pars -- end with L is lowercase par, end with U is uppercase, non-alpha spelled out */
|
||
|
enum
|
||
|
{
|
||
|
AL,
|
||
|
AU,
|
||
|
CL,
|
||
|
CU,
|
||
|
DL,
|
||
|
FL,
|
||
|
FU,
|
||
|
GL,
|
||
|
IL,
|
||
|
KL,
|
||
|
LL,
|
||
|
ML,
|
||
|
NL,
|
||
|
OL,
|
||
|
PL,
|
||
|
QL,
|
||
|
RL,
|
||
|
RU,
|
||
|
SL,
|
||
|
SU,
|
||
|
TL,
|
||
|
UL,
|
||
|
XL,
|
||
|
ONE,
|
||
|
};
|
||
|
|
||
|
|
||
|
int main(int argc, char **argv)
|
||
|
{
|
||
|
char pars[23] = {0};
|
||
|
int i;
|
||
|
|
||
|
DIR *dp;
|
||
|
struct dirent *dirp;
|
||
|
|
||
|
i = 0;
|
||
|
|
||
|
dp = 0;
|
||
|
dirp = 0;
|
||
|
|
||
|
|
||
|
/* process our parameters */
|
||
|
for(; (i = getopt(argc, argv, "ikqrsglnoAaCmx1FpHLRdSftcu")) != -1; i = 0)
|
||
|
{
|
||
|
switch(i)
|
||
|
{
|
||
|
case 'a': pars[AL] = 1;
|
||
|
pars[AU] = 0;
|
||
|
break;
|
||
|
case 'A': pars[AU] = 1;
|
||
|
pars[AL] = 0;
|
||
|
break;
|
||
|
case 'c': pars[CL] = 1;
|
||
|
break;
|
||
|
case 'C':
|
||
|
if(pars[ML] || pars[XL] || pars[ONE] )
|
||
|
{
|
||
|
throw(NEEDARG_FAIL, " ls [-ikqrsglno] [-A|-a] [-C|-m|-x|-l]\n\t[-F|-p] [-H|-L] [-R|-d] [-S|-f|-t] [-c|-u] [path ...]");
|
||
|
}
|
||
|
pars[CU] = 1;
|
||
|
break;
|
||
|
case 'd': pars[DL] = 1;
|
||
|
pars[RU] = 0;
|
||
|
break;
|
||
|
case 'f': pars[FL] = 1;
|
||
|
pars[SU] = 0;
|
||
|
pars[TL] = 0;
|
||
|
break;
|
||
|
case 'F': pars[FU] = 1;
|
||
|
pars[PL] = 0;
|
||
|
break;
|
||
|
case 'g': pars[GL] = 1;
|
||
|
break;
|
||
|
case 'i': pars[IL] = 1;
|
||
|
break;
|
||
|
case 'k': pars[KL] = 1;
|
||
|
break;
|
||
|
case 'l': pars[LL] = 1;
|
||
|
break;
|
||
|
case 'm':
|
||
|
if(pars[CU] || pars[XL] || pars[ONE] )
|
||
|
{
|
||
|
throw(NEEDARG_FAIL, " ls [-ikqrsglno] [-A|-a] [-C|-m|-x|-l]\n\t[-F|-p] [-H|-L] [-R|-d] [-S|-f|-t] [-c|-u] [path ...]");
|
||
|
}
|
||
|
pars[ML] = 1;
|
||
|
pars[CU] = 0;
|
||
|
pars[XL] = 0;
|
||
|
pars[ONE] = 0;
|
||
|
break;
|
||
|
case 'n': pars[NL] = 1;
|
||
|
break;
|
||
|
case 'o': pars[OL] = 1;
|
||
|
break;
|
||
|
case 'p': pars[PL] = 1;
|
||
|
pars[FU] = 0;
|
||
|
break;
|
||
|
case 'q': pars[QL] = 1;
|
||
|
break;
|
||
|
case 'r': pars[RL] = 1;
|
||
|
break;
|
||
|
case 'R': pars[RU] = 1;
|
||
|
pars[DL] = 0;
|
||
|
break;
|
||
|
case 's': pars[SL] = 1;
|
||
|
break;
|
||
|
case 'S': pars[SU] = 1;
|
||
|
pars[FL] = 0;
|
||
|
pars[TL] = 0;
|
||
|
break;
|
||
|
case 't': pars[TL] = 1;
|
||
|
pars[SU] = 0;
|
||
|
pars[FL] = 0;
|
||
|
break;
|
||
|
case 'u': pars[UL] = 1;
|
||
|
pars[CL] = 0;
|
||
|
break;
|
||
|
case 'x':
|
||
|
if(pars[ML] || pars[CU] || pars[ONE] )
|
||
|
{
|
||
|
throw(NEEDARG_FAIL, " ls [-ikqrsglno] [-A|-a] [-C|-m|-x|-l]\n\t[-F|-p] [-H|-L] [-R|-d] [-S|-f|-t] [-c|-u] [path ...]");
|
||
|
}
|
||
|
pars[XL] = 1;
|
||
|
break;
|
||
|
case '1':
|
||
|
if(pars[ML] || pars[XL] || pars[CU] )
|
||
|
{
|
||
|
throw(NEEDARG_FAIL, " ls [-ikqrsglno] [-A|-a] [-C|-m|-x|-l]\n\t[-F|-p] [-H|-L] [-R|-d] [-S|-f|-t] [-c|-u] [path ...]");
|
||
|
}
|
||
|
pars[ONE] = 1;
|
||
|
break;
|
||
|
case ':':
|
||
|
case '?':
|
||
|
default: throw(NEEDARG_FAIL, mastrcat(argv[0], " ls [-ikqrsglno] [-A|-a] [-C|-m|-x|-l]\n\t[-F|-p] [-H|-L] [-R|-d] [-S|-f|-t] [-c|-u] [path ...]"));
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
i = optind;
|
||
|
|
||
|
|
||
|
do
|
||
|
{
|
||
|
if(!argv[i])
|
||
|
{
|
||
|
argv[i] = ".";
|
||
|
}
|
||
|
|
||
|
if( !(dp = opendir(argv[i])))
|
||
|
{
|
||
|
throw(MISC_FAIL, mastrcat(argv[0], mastrcat(": could not access named file or directory: ", argv[i])));
|
||
|
}
|
||
|
|
||
|
for(;(dirp = readdir(dp));)
|
||
|
{
|
||
|
if(dirp->d_name[0] == '.' && !pars[AL])
|
||
|
{
|
||
|
continue;
|
||
|
}
|
||
|
printf("%s\n", dirp->d_name);
|
||
|
}
|
||
|
|
||
|
|
||
|
i++;
|
||
|
}
|
||
|
while(i < argc);
|
||
|
|
||
|
|
||
|
exit(EXIT_SUCCESS);
|
||
|
}
|