int errs = 0;
int dflag;
int lflag;
int mflag;
int nflag;
int pflag;
int qflag;
int Qflag;
int rflag;
int sflag;
int tflag;
int Tflag;
int uflag;
int Fflag;
int ndirbuf;
int ndir;
NDir* dirbuf;
int ls(char*, int);
int compar(NDir*, NDir*);
char* asciitime(long);
char* darwx(long);
void rwx(long, char*);
void growto(long);
void dowidths(Dir*);
void format(Dir*, char*);
void output(void);
char* xcleanname(char*);
ulong clk;
int swidth; /* max width of -s size */
int qwidth; /* max width of -q version */
int vwidth; /* max width of dev */
int uwidth; /* max width of userid */
int mwidth; /* max width of muid */
int lwidth; /* max width of length */
int gwidth; /* max width of groupid */
Biobuf bin;
void
main(int argc, char *argv[])
{
int i;
Binit(&bin, 1, OWRITE);
ARGBEGIN{
case 'F': Fflag++; break;
case 'd': dflag++; break;
case 'l': lflag++; break;
case 'm': mflag++; break;
case 'n': nflag++; break;
case 'p': pflag++; break;
case 'q': qflag++; break;
case 'Q': Qflag++; break;
case 'r': rflag++; break;
case 's': sflag++; break;
case 't': tflag++; break;
case 'T': Tflag++; break;
case 'u': uflag++; break;
default: fprint(2, "usage: ls [-dlmnpqrstuFQT] [file ...]\n");
exits("usage");
}ARGEND
int
compar(NDir *a, NDir *b)
{
long i;
Dir *ad, *bd;
ad = a->d;
bd = b->d;
if(tflag){
if(uflag)
i = bd->atime-ad->atime;
else
i = bd->mtime-ad->mtime;
}else{
if(a->prefix && b->prefix){
i = strcmp(a->prefix, b->prefix);
if(i == 0)
i = strcmp(ad->name, bd->name);
}else if(a->prefix){
i = strcmp(a->prefix, bd->name);
if(i == 0)
i = 1; /* a is longer than b */
}else if(b->prefix){
i = strcmp(ad->name, b->prefix);
if(i == 0)
i = -1; /* b is longer than a */
}else
i = strcmp(ad->name, bd->name);
}
if(i == 0)
i = (a<b? -1 : 1);
if(rflag)
i = -i;
return i;
}
t = ctime(l);
/* 6 months in the past or a day in the future */
if(l<clk-180L*24*60*60 || clk+24L*60*60<l){
memmove(buf, t+4, 7); /* month and day */
memmove(buf+7, t+23, 5); /* year */
}else
memmove(buf, t+4, 12); /* skip day of week */
buf[12] = 0;
return buf;
}