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

📄 pg.c

📁 Util-linux 软件包包含许多工具。其中比较重要的是加载、卸载、格式化、分区和管理硬盘驱动器
💻 C
📖 第 1 页 / 共 3 页
字号:
			} else {				p = endline(ttycols, b);				sz = p - b;				makeprint(b, sz);				canjump = 1;				write(1, b, sz);				canjump = 0;			}		}		if (dline >= pagelen || eof) {			/*			 * Time for prompting!			 */			if (eof && seekeof) {				eof = seekeof = 0;				if (line >= pagelen)					line -= pagelen;				else					line = 0;				dline = -1;				continue;			}newcmd:			if (eof) {				if (fline == 0 || eflag)					break;				mesg(_("(EOF)"));			}			prompt((line - 1) / pagelen + 1);			switch (cmd.key) {			case '/':				/*				 * Search forward.				 */				search = FORWARD;				oldline = line;				searchcount = cmd.count;				p = makepat();				if (p != NULL && *p) {					if (remembered == 1)						regfree(&re);					rerror = regcomp(&re, p,						REG_NOSUB | REG_NEWLINE);					if (rerror != 0) {						mesg(_("RE error: "));						sz = regerror(rerror, &re,								b, READBUF);						mesg(b);						goto newcmd;					}					remembered = 1;				} else if (remembered == 0) {					mesg(_("No remembered search string"));					goto newcmd;				}				continue;			case '?':			case '^':				/*				 * Search backward.				 */				search = BACKWARD;				oldline = line;				searchcount = cmd.count;				p = makepat();				if (p != NULL && *p) {					if (remembered == 1)						regfree(&re);					rerror = regcomp(&re, p,						REG_NOSUB | REG_NEWLINE);					if (rerror != 0) {						mesg("RE error: ");						regerror(rerror, &re,								b, READBUF);						mesg(b);						goto newcmd;					}					remembered = 1;				} else if (remembered == 0) {					mesg("No remembered search string");					goto newcmd;				}				line -= pagelen;				if (line <= 0)					goto notfound_bw;				while (line) {					my_fseeko(find, --line * sizeof pos,							SEEK_SET);					if(fread(&pos, sizeof pos, 1,find)==0)						tmperr(find, "index");					my_fseeko(find, (off_t)0, SEEK_END);					my_fseeko(fbuf, pos, SEEK_SET);					if (fgets(b, READBUF, fbuf) == NULL)						tmperr(fbuf, "buffer");					colb(b);					if (regexec(&re, b, 0, NULL, 0) == 0)						searchcount--;					if (searchcount == 0)						goto found_bw;				}notfound_bw:				line = oldline;				search = searchcount = 0;				mesg(_("Pattern not found"));				goto newcmd;found_bw:				eof = search = dline = 0;				skip(-1);				switch (searchdisplay) {				case TOP:					/* line -= 1; */					break;				case MIDDLE:					line -= pagelen / 2;					break;				case BOTTOM:					if (line != 0)						dline = -1;					line -= pagelen;					break;				}				if (line < 0)					line = 0;				continue;			case 's':				/*				 * Save to file.				 */				p = cmd.cmdline;				while (*++p == ' ');				if (*p == '\0')					goto newcmd;				save = fopen(p, "wb");				if (save == NULL) {					cmd.count = errno;					mesg(_("Cannot open "));					mesg(p);					mesg(": ");					mesg(strerror(cmd.count));					goto newcmd;				}				/*				 * Advance to EOF.				 */				my_fseeko(find, (off_t)0, SEEK_END);				for (;;) {					if (!nobuf)						my_fseeko(fbuf,(off_t)0,SEEK_END);					pos = my_ftello(fbuf);					if (fgets(b, READBUF, f) == NULL) {						eofline = fline;						break;					}					if (!nobuf)						fputs(b, fbuf);					fwrite(&pos, sizeof pos, 1, find);					if (!fflag) {						oldpos = pos;						p = b;						while (*(p = endline(ttycols,									p))								!= '\0') {							pos = oldpos + (p - b);							fwrite(&pos,								sizeof pos,								1, find);							fline++;							bline++;						}					}					fline++;					bline++;				}				my_fseeko(fbuf, (off_t)0, SEEK_SET);				while ((sz = fread(b, sizeof *b, READBUF,							fbuf)) != 0) {					/*					 * No error check for compat.					 */					fwrite(b, sizeof *b, sz, save);				}				fclose(save);				my_fseeko(fbuf, (off_t)0, SEEK_END);				mesg(_("saved"));				goto newcmd;			case 'l':				/*				 * Next line.				 */				if (*cmd.cmdline != 'l')					eof = 0;				if (cmd.count == 0)					cmd.count = 1; /* compat */				if (isdigit(cuc(*cmd.cmdline))) {					line = cmd.count - 2;					dline = 0;				} else {					if (cmd.count != 1) {						line += cmd.count - 1							- pagelen;						dline = -1;						skip(cmd.count);					}					/*					 * Nothing to do if count==1.					 */				}				break;			case 'd':				/*				 * Half screen forward.				 */			case '\004':	/* ^D */				if (*cmd.cmdline != cmd.key)					eof = 0;				if (cmd.count == 0)					cmd.count = 1; /* compat */				line += (cmd.count * pagelen / 2)					- pagelen - 1;				dline = -1;				skip(cmd.count);				break;			case 'f':				/*				 * Skip forward.				 */				if (cmd.count <= 0)					cmd.count = 1; /* compat */				line += cmd.count * pagelen - 2;				if (eof)					line += 2;				if (*cmd.cmdline != 'f')					eof = 0;				else if (eof)					break;				if (eofline && line >= eofline)					line -= pagelen;				dline = -1;				skip(cmd.count);				break;			case '\0':				/*				 * Just a number, or '-', or <newline>.				 */				if (cmd.count == 0)					cmd.count = 1; /* compat */				if (isdigit(cuc(*cmd.cmdline)))					line = (cmd.count - 1) * pagelen - 2;				else					line += (cmd.count - 1)						* (pagelen - 1) - 2;				if (*cmd.cmdline != '\0')					eof = 0;				if (cmd.count != 1) {					skip(cmd.count);					dline = -1;				} else {					dline = 1;					line += 2;				}				break;			case '$':				/*				 * Advance to EOF.				 */				if (!eof)					skip(1);				eof = 0;				line = LONG_MAX;				seekeof = 1;				dline = -1;				break;			case '.':			case '\014': /* ^L */				/*				 * Repaint screen.				 */				eof = 0;				if (line >= pagelen)					line -= pagelen;				else					line = 0;				dline = 0;				break;			case '!':				/*				 * Shell escape.				 */				if (rflag) {					mesg(progname);					mesg(_(": !command not allowed in "					       "rflag mode.\n"));				} else {					pid_t cpid;					write(1, cmd.cmdline,					      strlen(cmd.cmdline));					write(1, "\n", 1);					my_sigset(SIGINT, SIG_IGN);					my_sigset(SIGQUIT, SIG_IGN);					switch (cpid = fork()) {					case 0:						p = getenv("SHELL");						if (p == NULL) p = "/bin/sh";						if (!nobuf)							fclose(fbuf);						fclose(find);						if (isatty(0) == 0) {							close(0);							open(tty, O_RDONLY);						} else {							fclose(f);						}						my_sigset(SIGINT, oldint);						my_sigset(SIGQUIT, oldquit);						my_sigset(SIGTERM, oldterm);						execl(p, p, "-c",							cmd.cmdline + 1, NULL);						pgerror(errno, p);						_exit(0177);						/*NOTREACHED*/					case -1:						mesg(_("fork() failed, "						       "try again later\n"));						break;					default:						while (wait(NULL) != cpid);					}					my_sigset(SIGINT, sighandler);					my_sigset(SIGQUIT, sighandler);					mesg("!\n");				}				goto newcmd;			case 'h':				/*				 * Help!				 */				write(1, copyright + 4, strlen(copyright + 4));				write(1, helpscreen, strlen(helpscreen));				goto newcmd;			case 'n':				/*				 * Next file.				 */				if (cmd.count == 0)					cmd.count = 1;				nextfile = cmd.count;				if (checkf()) {					nextfile = 1;					goto newcmd;				}				eof = 1;				break;			case 'p':				/*				 * Previous file.				 */				if (cmd.count == 0)					cmd.count = 1;				nextfile = 0 - cmd.count;				if (checkf()) {					nextfile = 1;					goto newcmd;				}				eof = 1;				break;			case 'q':			case 'Q':				/*				 * Exit pg.				 */				quit(exitstatus);				/*NOTREACHED*/			case 'w':			case 'z':				/*				 * Set window size.				 */				if (cmd.count < 0)					cmd.count = 0;				if (*cmd.cmdline != cmd.key)					pagelen = ++cmd.count;				dline = 1;				break;			}			if (line <= 0) {				line = 0;				dline = 0;			}			if (cflag && dline == 1) {				dline = 0;				line--;			}		}		if (eof)			break;	}	fclose(find);	if (!nobuf)		fclose(fbuf);}intmain(int argc, char **argv){	int arg, i;	char *p;	FILE *input;	progname = basename(argv[0]);	setlocale(LC_MESSAGES, "");	bindtextdomain(PACKAGE, LOCALEDIR);	textdomain(PACKAGE);	if (tcgetattr(1, &otio) == 0) {		ontty = 1;		oldint = my_sigset(SIGINT, sighandler);		oldquit = my_sigset(SIGQUIT, sighandler);		oldterm = my_sigset(SIGTERM, sighandler);		setlocale(LC_CTYPE, "");		setlocale(LC_COLLATE, "");		tty = ttyname(1);		setupterm(NULL, 1, &tinfostat);		getwinsize();		helpscreen = _(helpscreen);	}	for (arg = 1; argv[arg]; arg++) {		if (*argv[arg] == '+')			continue;		if (*argv[arg] != '-' || argv[arg][1] == '\0')			break;		argc--;		for (i = 1; argv[arg][i]; i++) {			switch (argv[arg][i]) {			case '-':				if (i != 1 || argv[arg][i + 1])					invopt(&argv[arg][i]);				goto endargs;			case '1': case '2': case '3': case '4': case '5':			case '6': case '7': case '8': case '9': case '0':				pagelen = atoi(argv[arg] + i);				havepagelen = 1;				goto nextarg;			case 'c':				cflag = 1;				break;			case 'e':				eflag = 1;				break;			case 'f':				fflag = 1;				break;			case 'n':				nflag = 1;				break;			case 'p':				if (argv[arg][i + 1]) {					pstring = &argv[arg][i + 1];				} else if (argv[++arg]) {					--argc;					pstring = argv[arg];				} else					needarg("-p");				goto nextarg;			case 'r':				rflag = 1;				break;			case 's':				sflag = 1;				break;			default:				invopt(&argv[arg][i]);			}		}nextarg:		;	}endargs:	for (arg = 1; argv[arg]; arg++) {		if (*argv[arg] == '-') {			if (argv[arg][1] == '-') {				arg++;				break;			}			if (argv[arg][1] == '\0')				break;			if (argv[arg][1] == 'p' && argv[arg][2] == '\0')				arg++;			continue;		}		if (*argv[arg] != '+')			break;		argc--;		switch (*(argv[arg] + 1)) {		case '\0':			needarg("+");			/*NOTREACHED*/		case '1': case '2': case '3': case '4': case '5':		case '6': case '7': case '8': case '9': case '0':			startline = atoi(argv[arg] + 1);			break;		case '/':			searchfor = argv[arg] + 2;			if (*searchfor == '\0')				needarg("+/");			p = searchfor + strlen(searchfor) - 1;			if (*p == '/') *p = '\0';			if (*searchfor == '\0')				needarg("+/");			break;		default:			invopt(argv[arg]);		}	}	if (argc == 1) {		pgfile(stdin, "stdin");	} else {		files.first = arg;		files.last = arg + argc - 1;		for ( ; argv[arg]; arg += nextfile) {			nextfile = 1;			files.current = arg;			if (argc > 2) {				static int firsttime;				firsttime++;				if (firsttime > 1) {					mesg(_("(Next file: "));					mesg(argv[arg]);					mesg(")");newfile:					if (ontty) {					prompt(-1);					switch(cmd.key) {					case 'n':						/*					 	* Next file.					 	*/						if (cmd.count == 0)							cmd.count = 1;						nextfile = cmd.count;						if (checkf()) {							nextfile = 1;							mesg(":");							goto newfile;						}						continue;					case 'p':						/*					 	* Previous file.					 	*/						if (cmd.count == 0)							cmd.count = 1;						nextfile = 0 - cmd.count;						if (checkf()) {							nextfile = 1;							mesg(":");							goto newfile;						}						continue;					case 'q':					case 'Q':						quit(exitstatus);				}				} else mesg("\n");				}			}			if (strcmp(argv[arg], "-") == 0)				input = stdin;			else {				input = fopen(argv[arg], "r");				if (input == NULL) {					pgerror(errno, argv[arg]);					exitstatus++;					continue;				}			}			if (ontty == 0 && argc > 2) {				/*				 * Use the prefix as specified by SUSv2.				 */				write(1, "::::::::::::::\n", 15);				write(1, argv[arg], strlen(argv[arg]));				write(1, "\n::::::::::::::\n", 16);			}			pgfile(input, argv[arg]);			if (input != stdin)				fclose(input);		}	}	quit(exitstatus);	/*NOTREACHED*/	return 0;}

⌨️ 快捷键说明

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