|
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; }