mp-utils/proto/ls.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);
}