base_cleanname.c.svn-base

来自「SumatraPDF是一款小型开源的pdf阅读工具。虽然玲珑小巧(只有800多K」· SVN-BASE 代码 · 共 53 行

SVN-BASE
53
字号
/* * In place, rewrite name to compress multiple /, eliminate ., and process .. */#define SEP(x)	((x)=='/' || (x) == 0)char *cleanname(char *name){	char *p, *q, *dotdot;	int rooted;	rooted = name[0] == '/';	/*	 * invariants:	 *	p points at beginning of path element we're considering.	 *	q points just past the last path element we wrote (no slash).	 *	dotdot points just past the point where .. cannot backtrack	 *		any further (no slash).	 */	p = q = dotdot = name+rooted;	while(*p) {		if(p[0] == '/')	/* null element */			p++;		else if(p[0] == '.' && SEP(p[1]))			p += 1;	/* don't count the separator in case it is nul */		else if(p[0] == '.' && p[1] == '.' && SEP(p[2])) {			p += 2;			if(q > dotdot) {	/* can backtrack */				while(--q > dotdot && *q != '/')					;			} else if(!rooted) {	/* /.. is / but ./../ is .. */				if(q != name)					*q++ = '/';				*q++ = '.';				*q++ = '.';				dotdot = q;			}		} else {	/* real path element */			if(q != name+rooted)				*q++ = '/';			while((*q = *p) != '/' && *q != 0)				p++, q++;		}	}	if(q == name)	/* empty string is really ``.'' */		*q++ = '.';	*q = '\0';	return name;}

⌨️ 快捷键说明

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