DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download
Index: T f

⟦3394a59d7⟧ TextFile

    Length: 5042 (0x13b2)
    Types: TextFile
    Names: »file.c«

Derivation

└─⟦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« 

TextFile

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