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

📄 copy.c

📁 unix v7是最后一个广泛发布的研究型UNIX版本
💻 C
字号:
#include "stdio.h"#include "signal.h"#include "lrnref"char last[100];char logf[100];char subdir[100];extern char * ctime();copy(prompt, fin)FILE *fin;{	FILE *fout, *f;	char s[100], t[100], s1[100], *r, *tod;	char nm[30];	int *p, tv[2];	extern int intrpt(), *action();	extern char *wordb();	int nmatch = 0;	if (subdir[0]==0)		sprintf(subdir, "../../%s", sname);	for (;;) {		if (pgets(s, prompt, fin) == 0)			if (fin == stdin) {				/* fprintf(stderr, "Don't type control-D\n"); */				/* this didn't work out very well */				continue;			} else				break;		trim(s);		/* change the sequence %s to lesson directory */		/* if needed */		for (r = s; *r; r++)			if (*r == '%') {				sprintf(s1, s, subdir, subdir, subdir);				strcpy(s, s1);				break;			}		r = wordb(s, t);		p = action(t);		if (*p == ONCE) {	/* some actions done only once per script */			if (wrong) {	/* we are on 2nd time */				scopy(fin, NULL);				continue;			}			strcpy(s, r);			r = wordb(s, t);			p = action(t);		}		if (p == 0) {			if (comfile >= 0) {				write(comfile, s, strlen(s));				write(comfile, "\n", 1);			}			else {				signal(SIGINT, SIG_IGN);				status = mysys(s);				signal(SIGINT, intrpt);			}			if (incopy) {				fprintf(incopy, "%s\n", s);				strcpy(last, s);			}			continue;		}		switch (*p) {		case READY:			if (incopy && r) {				fprintf(incopy, "%s\n", r);				strcpy(last, r);			}			return;		case PRINT:			if (wrong)				scopy(fin, NULL);	/* don't repeat message */			else if (r)				list(r);			else				scopy(fin, stdout);			break;		case NOP:			break;		case MATCH:			if (nmatch > 0)	/* we have already passed */				scopy(fin, NULL);			else if ((status = strcmp(r, last)) == 0) {	/* did we pass this time? */				nmatch++;				scopy(fin, stdout);			} else				scopy(fin, NULL);			break;		case BAD:			if (strcmp(r, last) == 0) {				scopy(fin, stdout);			} else				scopy(fin, NULL);			break;		case SUCCEED:			scopy(fin, (status == 0) ? stdout : NULL);			break;		case FAIL:			scopy(fin, (status != 0) ? stdout : NULL);			break;		case CREATE:			fout = fopen(r, "w");			scopy(fin, fout);			fclose(fout);			break;		case CMP:			status = cmp(r);	/* contains two file names */			break;		case MV:			sprintf(nm, "%s/L%s.%s", subdir, todo, r);			fcopy(r, nm);			break;		case USER:		case NEXT:			more = 1;			return;		case COPYIN:			incopy = fopen(".copy", "w");			break;		case UNCOPIN:			fclose(incopy);			incopy = NULL;			break;		case COPYOUT:			maktee();			break;		case UNCOPOUT:			untee();			break;		case PIPE:			comfile = makpipe();			break;		case UNPIPE:			close(comfile);			wait(0);			comfile = -1;			break;		case YES:		case NO:			if (incopy) {				fprintf(incopy, "%s\n", s);				strcpy(last, s);			}			return;		case WHERE:			printf("You are in lesson %s\n", todo);			fflush(stdout);			break;		case BYE:			more=0;			return;		case CHDIR:			printf("cd not allowed\n");			fflush(stdout);			break;		case LEARN:			printf("You are already in learn.\n");			fflush(stdout);			break;		case LOG:			if (!logging)				break;			if (logf[0] == 0)				sprintf(logf, "%s/log/%s", direct, sname);			f = fopen( (r? r : logf), "a");			if (f == NULL)				break;			time(tv);			tod = ctime(tv);			tod[24] = 0;			fprintf(f, "%s L%-6s %s %2d %s\n", tod,				todo, status? "fail" : "pass", speed, pwline);			fclose(f);			break;		}	}	return;}pgets(s, prompt, f)FILE *f;{	if (prompt) {		if (comfile < 0)			printf("$ ");		fflush(stdout);	}	if (fgets(s, 100,f))		return(1);	else		return(0);}trim(s)char *s;{	while (*s)		s++;	if (*--s == '\n')		*s=0;}scopy(fi, fo)	/* copy fi to fo until a line with # */FILE *fi, *fo;{	int c;	while ((c = getc(fi)) != '#' && c != EOF) {		do {			if (fo != NULL)				putc(c, fo);			if (c == '\n')				break;		} while ((c = getc(fi)) != EOF);	}	if (c == '#')		ungetc(c, fi);	fflush(fo);}cmp(r)	/* compare two files for status */char *r;{	char *s;	FILE *f1, *f2;	int c1, c2, stat;	for (s = r; *s != ' ' && *s != '\0'; s++)		;	*s++ = 0;	/* r contains file 1 */	while (*s == ' ')		s++;	f1 = fopen(r, "r");	f2 = fopen(s, "r");	if (f1 == NULL || f2 == NULL)		return(1);	/* failure */	stat = 0;	for (;;) {		c1 = getc(f1);		c2 = getc(f2);		if (c1 != c2) {			stat = 1;			break;		}		if (c1 == EOF || c2 == EOF)			break;	}	fclose(f1);	fclose(f2);	return(stat);}char *wordb(s, t)	/* in s, t is prefix; return tail */char *s, *t;{	int c;	while (c = *s++) {		if (c == ' ' || c == '\t')			break;		*t++ = c;	}	*t = 0;	while (*s == ' ' || *s == '\t')		s++;	return(c ? s : NULL);}

⌨️ 快捷键说明

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