| #include "common.h" | 
 | #include "send.h" | 
 |  | 
 | #undef isspace | 
 | #define isspace(c) ((c)==' ' || (c)=='\t' || (c)=='\n') | 
 |  | 
 | /* | 
 |  *  skip past all systems in equivlist | 
 |  */ | 
 | extern char* | 
 | skipequiv(char *base) | 
 | { | 
 | 	char *sp; | 
 | 	static Biobuf *fp; | 
 |  | 
 | 	while(*base){ | 
 | 		sp = strchr(base, '!'); | 
 | 		if(sp==0) | 
 | 			break; | 
 | 		*sp = '\0'; | 
 | 		if(lookup(base, "equivlist", &fp, 0, 0)==1){ | 
 | 			/* found or us, forget this system */ | 
 | 			*sp='!'; | 
 | 			base=sp+1; | 
 | 		} else { | 
 | 			/* no files or system is not found, and not us */ | 
 | 			*sp='!'; | 
 | 			break; | 
 | 		} | 
 | 	} | 
 | 	return base; | 
 | } | 
 |  | 
 | static int | 
 | okfile(char *cp, Biobuf *fp) | 
 | { | 
 | 	char *buf; | 
 | 	int len; | 
 | 	char *bp, *ep; | 
 | 	int c; | 
 |  | 
 | 	len = strlen(cp); | 
 | 	Bseek(fp, 0, 0); | 
 | 	 | 
 | 	/* one iteration per system name in the file */ | 
 | 	while(buf = Brdline(fp, '\n')) { | 
 | 		ep = &buf[Blinelen(fp)]; | 
 | 		for(bp=buf; bp < ep;){ | 
 | 			while(isspace(*bp) || *bp==',') | 
 | 				bp++; | 
 | 			if(strncmp(bp, cp, len) == 0) { | 
 | 				c = *(bp+len); | 
 | 				if(isspace(c) || c==',') | 
 | 					return 1; | 
 | 			} | 
 | 			while(bp < ep && (!isspace(*bp)) && *bp!=',') | 
 | 				bp++; | 
 | 		} | 
 | 	} | 
 |  | 
 | 	/* didn't find it, prohibit forwarding */ | 
 | 	return 0; | 
 | } | 
 |  | 
 | /* return 1 if name found in one of the files | 
 |  *	  0 if name not found in one of the files | 
 |  *	  -1 if neither file exists | 
 |  */ | 
 | extern int | 
 | lookup(char *cp, char *local, Biobuf **lfpp, char *global, Biobuf **gfpp) | 
 | { | 
 | 	static String *file = 0; | 
 |  | 
 | 	if (local) { | 
 | 		if (file == 0) | 
 | 			file = s_new(); | 
 | 		abspath(local, UPASLIB, s_restart(file)); | 
 | 		if (*lfpp != 0 || (*lfpp = sysopen(s_to_c(file), "r", 0)) != 0) { | 
 | 			if (okfile(cp, *lfpp)) | 
 | 				return 1; | 
 | 		} else | 
 | 			local = 0; | 
 | 	} | 
 | 	if (global) { | 
 | 		abspath(global, UPASLIB, s_restart(file)); | 
 | 		if (*gfpp != 0 || (*gfpp = sysopen(s_to_c(file), "r", 0)) != 0) { | 
 | 			if (okfile(cp, *gfpp)) | 
 | 				return 1; | 
 | 		} else | 
 | 			global = 0; | 
 | 	} | 
 | 	return (local || global)? 0 : -1; | 
 | } |