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

📄 cleanname.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
字号:
#include <u.h>#include <libc.h>/* * 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 + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -