⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 path.c

📁 早期freebsd实现
💻 C
字号:
/* path.c - return a pathname */#ifndef	lintstatic char ident[] = "@(#)$Id: path.c,v 1.6 1992/12/15 00:20:22 jromine Exp $";#endif	/* lint */#include "../h/mh.h"#include <stdio.h>#define	CWD	"./"#define	NCWD	(sizeof CWD - 1)#define	DOT	"."#define	DOTDOT	".."#define	PWD	"../"#define	NPWD	(sizeof PWD - 1)static char *pwds;static char   *expath ();static	compath();char   *path (name, flag)register char   *name;register int     flag;{    register char  *cp,                   *ep;    if ((cp = expath (name, flag))	    && (ep = cp + strlen (cp) - 1) > cp	    && *ep == '/')	*ep = 0;    return cp;}/*  */static  char   *expath (name, flag)register char   *name;register int     flag;{    register char  *cp,                   *ep;    char    buffer[BUFSIZ];    if (flag == TSUBCWF) {	(void) sprintf (buffer, "%s/%s", m_getfolder (), name);	name = m_mailpath (buffer);	compath (name);	(void) sprintf (buffer, "%s/", m_maildir (""));	if (ssequal (buffer, name)) {	    cp = name;	    name = getcpy (name + strlen (buffer));	    free (cp);	}	flag = TFOLDER;    }    if (*name == '/'	    || (flag == TFOLDER		&& (strncmp (name, CWD, NCWD)		    && strcmp (name, DOT)		    && strcmp (name, DOTDOT)		    && strncmp (name, PWD, NPWD))))	return getcpy (name);    if (pwds == NULL)	pwds = pwd ();    if (strcmp (name, DOT) == 0 || strcmp (name, CWD) == 0)	return getcpy (pwds);    ep = pwds + strlen (pwds);    if ((cp = rindex (pwds, '/')) == NULL)	cp = ep;    else	if (cp == pwds)	    cp++;    if (strncmp (name, CWD, NCWD) == 0)	name += NCWD;    if (strcmp (name, DOTDOT) == 0 || strcmp (name, PWD) == 0) {	(void) sprintf (buffer, "%.*s", cp - pwds, pwds);	return getcpy (buffer);    }    if (strncmp (name, PWD, NPWD) == 0)	name += NPWD;    else	cp = ep;    (void) sprintf (buffer, "%.*s/%s", cp - pwds, pwds, name);    return getcpy (buffer);}/*  */static  compath (f)register char  *f;{    register char  *cp,                   *dp;    if (*f != '/')	return;    for (cp = f; *cp;)	if (*cp == '/') {	    switch (*++cp) {		case 0: 		    if (--cp > f)			*cp = 0;		    break;		case '/': 		    for (dp = cp; *dp == '/'; dp++)			continue;		    (void) strcpy (cp--, dp);		    continue;		case '.': 		    if (strcmp (cp, DOT) == 0) {			if (cp > f + 1)			    cp--;			*cp = 0;			break;		    }		    if (strcmp (cp, DOTDOT) == 0) {			for (cp -= 2; cp > f; cp--)			    if (*cp == '/')				break;			if (cp <= f)			    cp = f + 1;			*cp = 0;			break;		    }		    if (strncmp (cp, PWD, NPWD) == 0) {			for (dp = cp - 2; dp > f; dp--)			    if (*dp == '/')				break;			if (dp <= f)			    dp = f;			(void) strcpy (dp, cp + NPWD - 1);			cp = dp;			continue;		    }		    if (strncmp (cp, CWD, NCWD) == 0) {			(void) strcpy (cp - 1, cp + NCWD - 1);			cp--;			continue;		    }		    continue;		default: 		    cp++;		    continue;	    }	    break;	}	else	    cp++;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -