|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T f
Length: 5042 (0x13b2)
Types: TextFile
Names: »file.c«
└─⟦3d0c2be1b⟧ Bits:30001254 ISODE-5.0 Tape
└─⟦eba4602b1⟧ »./isode-5.0.tar.Z«
└─⟦d3ac74d73⟧
└─⟦this⟧ »isode-5.0/others/max/file.c«
└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0
└─⟦35176feda⟧ »EurOpenD22/isode/isode-6.tar.Z«
└─⟦de7628f85⟧
└─⟦this⟧ »isode-6.0/others/max/file.c«
/* file.c - max -- files and directories */
#include <ctype.h>
#include <stdio.h>
#include "max.h"
/* \f
*/
static unsigned long dflags;
int alphasort (), msgsort (), dirselect ();
/* \f
*/
DI newDI (path, next, tail)
char *path;
char *next;
DI *tail;
{
int i,
j;
char ftype,
*cp;
struct direct **nl,
**np;
struct stat st;
DI di;
if (next && (cp = index (next, '/')))
*cp = NULL;
if (stat (path, &st) == NOTOK)
return NULLDI;
if ((di = (DI) calloc (1, sizeof *di)) == NULLDI)
return NULLDI;
(void) strcpy (di -> di_path, path);
di -> di_pp = di -> di_path + strlen (di -> di_path) - 1;
if (*di -> di_pp != '/')
*++di -> di_pp = '/';
*++di -> di_pp = NULL;
di -> di_mtime = st.st_mtime;
dflags = 0L;
if ((i = scandir (di -> di_path, &nl, dirselect, messagesw ? msgsort
: alphasort)) < 0) {
free ((char *) di);
return NULLDI;
}
di -> di_flags = dflags;
di -> di_parts.fi_forw = di -> di_parts.fi_back = &di -> di_parts;
for (np = nl, j = i; j > 0; np++, j--) {
register int k;
register char *fp;
register struct direct *dp = *np;
register struct direct *ep;
register FI fi;
if (messagesw && isdigit (dp -> d_name[0])) {
if (fp = index (dp -> d_name, '.'))
*fp = NULL;
k = strlen (dp -> d_name);
for (np++, j--; j > 0; np++, j--) {
ep = *np;
if (strncmp (ep -> d_name, dp -> d_name, k) != 0
|| ep -> d_name[k] != '.') {
np--, j++;
break;
}
}
if(fp)
*fp = '.';
}
(void) strcpy (di -> di_pp, dp -> d_name);
if (stat (di -> di_path, &st) == OK)
switch (st.st_mode & S_IFMT) {
case S_IFREG:
ftype = (st.st_mode & 0111) ? FI_EXECUTABLE : FI_REGULAR;
break;
case S_IFDIR:
ftype = FI_DIRECTORY;
break;
case S_IFLNK: /* actually, never get this with stat() */
ftype = FI_SYMLINK;
break;
case S_IFSOCK:
ftype = FI_SOCKET;
break;
default:
continue;
}
if ((fi = (FI) calloc (1, sizeof *fi)) == NULLFI) {
freeDI (di);
di = NULLDI;
break;
}
insque (fi, di -> di_parts.fi_back);
fi -> fi_direct = dp;
fi -> fi_up = di;
fi -> fi_type = ftype;
if (next && strcmp (di -> di_pp, next) == 0) {
fi -> fi_dir = newDI (di -> di_path, cp ? cp + 1 : NULLCP, tail);
if (fi -> fi_dir == NULL) {
freeDI (di);
di = NULLDI;
break;
}
fi -> fi_dir -> di_up = fi;
if (cp == NULL)
*tail = fi -> fi_dir;
}
}
if (next && cp)
*cp = '/';
free ((char *) nl);
if (di)
*di -> di_pp = NULL;
di -> di_index = -1;
return di;
}
/* \f
*/
/* Files:
logic
presentation
makefile
Makefile
*/
static int dirselect (dp)
struct direct *dp;
{
register char *cp;
if (!messagesw) {
if (*(cp = dp -> d_name) != '.')
return 1;
if (!dotfilesw)
return 0;
if (*++cp != '.')
return (*cp != NULL);
return (*++cp != NULL);
}
switch (*dp -> d_name) {
case '.':
return 0;
case 'l':
if (strcmp (dp -> d_name + 1, "ogic") == 0) {
dflags |= DI_LOGIC;
return 0;
}
break;
case 'p':
if (strcmp (dp -> d_name + 1, "resentation") == 0) {
dflags |= DI_PRESENTATION;
return 0;
}
break;
case 'M':
case 'm':
if (strcmp (dp -> d_name + 1, "akefile") == 0) {
dflags |= DI_MAKEFILE;
return 0;
}
break;
default:
break;
}
return 1;
}
/* \f
*/
static int msgsort (d1, d2)
struct direct **d1,
**d2;
{
int i1,
i2;
if (sscanf ((*d1) -> d_name, "%d", &i1) == 1
&& sscanf ((*d2) -> d_name, "%d", &i2) == 1
&& i1 != i2)
return (i1 - i2);
return (strcmp ((*d1) -> d_name, (*d2) -> d_name));
}
/* \f
*/
void freeDI (di)
DI di;
{
register FI fi;
if (di == NULLDI)
return;
if (di -> di_list) {
free ((char *) di -> di_list);
di -> di_list = NULL;
}
for (fi = di -> di_parts.fi_forw;
fi != &di -> di_parts;
fi = fi -> fi_forw) {
if (fi -> fi_direct) {
free ((char *) fi -> fi_direct);
fi -> fi_direct = NULL;
}
if (fi -> fi_label) {
free (fi -> fi_label);
fi -> fi_label = NULL;
}
if (fi -> fi_type == FI_DIRECTORY)
freeDI (fi -> fi_dir);
remque (fi);
free ((char *) fi);
}
free ((char *) di);
}
/* \f
*/
DI buildDI (path, tail)
char *path;
DI *tail;
{
register char *cp,
*pp;
DI di;
*tail = NULLDI;
if ((pp = rindex (path + 1, '/')) && *++pp == NULL)
*--pp = NULL;
else
pp = NULL;
if (*path == '/') {
#ifdef is68k
if (path[1] == '@') {
if (cp = index (path + 2, '/'))
*cp = NULL;
}
else {
#endif
if (path[1] == NULL)
cp = NULL;
else {
cp = path;
*cp = NULL;
path = "/";
}
#ifdef is68k
}
#endif
}
else
if (cp = index (path, '/'))
*cp = NULL;
di = newDI (path, cp ? cp + 1 : NULLCP, tail);
if (*tail == NULLDI && cp == NULL)
*tail = di;
if (cp)
*cp = '/';
if (pp)
*pp = '/';
return di;
}