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

📄 diffdir.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
字号:
#include <u.h>#include <libc.h>#include <bio.h>#include "diff.h"static intitemcmp(void *v1, void *v2){	char **d1 = v1, **d2 = v2;	return strcmp(*d1, *d2);}static char **scandir(char *name){	char **cp;	Dir *db;	int nitems;	int fd, n;	if ((fd = open(name, OREAD)) < 0)		panic(2, "can't open %s\n", name);	cp = 0;	nitems = 0;	if((n = dirreadall(fd, &db)) > 0){		while (n--) {			cp = REALLOC(cp, char *, (nitems+1));			cp[nitems] = MALLOC(char, strlen((db+n)->name)+1);			strcpy(cp[nitems], (db+n)->name);			nitems++;		}		free(db);	}	cp = REALLOC(cp, char*, (nitems+1));	cp[nitems] = 0;	close(fd);	qsort((char *)cp, nitems, sizeof(char*), itemcmp);	return cp;}static intisdotordotdot(char *p){	if (*p == '.') {		if (!p[1])			return 1;		if (p[1] == '.' && !p[2])			return 1;	}	return 0;}voiddiffdir(char *f, char *t, int level){	char  **df, **dt, **dirf, **dirt;	char *from, *to;	int res;	char fb[MAXPATHLEN+1], tb[MAXPATHLEN+1];	df = scandir(f);	dt = scandir(t);	dirf = df;	dirt = dt;	while (*df || *dt) {		from = *df;		to = *dt;		if (from && isdotordotdot(from)) {			df++;			continue;		}		if (to && isdotordotdot(to)) {			dt++;			continue;		}		if (!from)			res = 1;		else if (!to)			res = -1;		else			res = strcmp(from, to);		if (res < 0) {			if (mode == 0 || mode == 'n')				Bprint(&stdout, "Only in %s: %s\n", f, from);			df++;			continue;		}		if (res > 0) {			if (mode == 0 || mode == 'n')				Bprint(&stdout, "Only in %s: %s\n", t, to);			dt++;			continue;		}		if (mkpathname(fb, f, from))			continue;		if (mkpathname(tb, t, to))			continue;		diff(fb, tb, level+1);		df++; dt++;	}	for (df = dirf; *df; df++)		FREE(*df);	for (dt = dirt; *dt; dt++)		FREE(*dt);	FREE(dirf);	FREE(dirt);}

⌨️ 快捷键说明

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