Quizzer
view release on metacpan or search on metacpan
exercises/compile-tcsh/tcsh-6.10.00/sh.dir.c view on Meta::CPAN
if (cp == NULL) {
dstart("/");
if (chdir("/") == -1)
/* I am not even try to print an error message! */
xexit(1);
cp = SAVE("/");
}
}
else {
#ifdef S_IFLNK
struct stat swd, shp;
/*
* See if $HOME is the working directory we got and use that
*/
if (hp && *hp &&
stat(tcp, &swd) != -1 && stat(short2str(hp), &shp) != -1 &&
DEV_DEV_COMPARE(swd.st_dev, shp.st_dev) &&
swd.st_ino == shp.st_ino)
cp = Strsave(hp);
else {
char *cwd;
/*
* use PWD if we have it (for subshells)
*/
if ((cwd = getenv("PWD")) != NULL) {
if (stat(cwd, &shp) != -1 &&
DEV_DEV_COMPARE(swd.st_dev, shp.st_dev) &&
swd.st_ino == shp.st_ino)
tcp = cwd;
}
cp = dcanon(SAVE(tcp), STRNULL);
}
#else /* S_IFLNK */
cp = dcanon(SAVE(tcp), STRNULL);
#endif /* S_IFLNK */
}
dp = (struct directory *) xcalloc(sizeof(struct directory), 1);
dp->di_name = cp;
dp->di_count = 0;
dhead.di_next = dhead.di_prev = dp;
dp->di_next = dp->di_prev = &dhead;
printd = 0;
dnewcwd(dp, 0);
set(STRdirstack, Strsave(dp->di_name), VAR_READWRITE|VAR_NOGLOB);
}
static void
dset(dp)
Char *dp;
{
/*
* Don't call set() directly cause if the directory contains ` or
* other junk characters glob will fail.
*/
set(STRowd, Strsave(varval(STRcwd)), VAR_READWRITE|VAR_NOGLOB);
set(STRcwd, Strsave(dp), VAR_READWRITE|VAR_NOGLOB);
tsetenv(STRPWD, dp);
}
#define DIR_PRINT 0x01 /* -p */
#define DIR_LONG 0x02 /* -l */
#define DIR_VERT 0x04 /* -v */
#define DIR_LINE 0x08 /* -n */
#define DIR_SAVE 0x10 /* -S */
#define DIR_LOAD 0x20 /* -L */
#define DIR_CLEAR 0x40 /* -c */
#define DIR_OLD 0x80 /* - */
static int
skipargs(v, dstr, str)
Char ***v;
char *dstr;
char *str;
{
Char **n = *v, *s;
int dflag = 0, loop = 1;
for (n++; loop && *n != NULL && (*n)[0] == '-'; n++)
if (*(s = &((*n)[1])) == '\0') /* test for bare "-" argument */
dflag |= DIR_OLD;
else {
char *p;
while (loop && *s != '\0') /* examine flags */
{
if ((p = strchr(dstr, *s++)) != NULL)
dflag |= (1 << (p - dstr));
else {
stderror(ERR_DIRUS, short2str(**v), dstr, str);
loop = 0; /* break from both loops */
break;
}
}
}
if (*n && (dflag & DIR_OLD))
stderror(ERR_DIRUS, short2str(**v), dstr, str);
*v = n;
/* make -l, -v, and -n imply -p */
if (dflag & (DIR_LONG|DIR_VERT|DIR_LINE))
dflag |= DIR_PRINT;
return dflag;
}
/*
* dodirs - list all directories in directory loop
*/
/*ARGSUSED*/
void
dodirs(v, c)
Char **v;
struct command *c;
{
static char flags[] = "plvnSLc";
int dflag = skipargs(&v, flags, "");
USE(c);
if ((dflag & DIR_CLEAR) != 0) {
struct directory *dp, *fdp;
( run in 0.607 second using v1.01-cache-2.11-cpan-140bd7fdf52 )