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

📄 lpc.c

📁 <B>Digital的Unix操作系统VAX 4.2源码</B>
💻 C
字号:
#ifndef lintstatic char *sccsid = "@(#)lpc.c	4.1      ULTRIX 7/2/90";#endif/* * lpc -- line printer control program *//************************************************************************ *									* *			Copyright (c) 1988 by				* *		Digital Equipment Corporation, Maynard, MA		* *			All rights reserved.				* *									* *   This software is furnished under a license and may be used and	* *   copied  only  in accordance with the terms of such license and	* *   with the  inclusion  of  the  above  copyright  notice.   This	* *   software  or  any  other copies thereof may not be provided or	* *   otherwise made available to any other person.  No title to and	* *   ownership of the software is hereby transferred.			* *									* *   This software is  derived  from  software  received  from  the	* *   University    of   California,   Berkeley,   and   from   Bell	* *   Laboratories.  Use, duplication, or disclosure is  subject  to	* *   restrictions  under  license  agreements  with  University  of	* *   California and with AT&T.						* *									* *   The information in this software is subject to change  without	* *   notice  and should not be construed as a commitment by Digital	* *   Equipment Corporation.						* *									* *   Digital assumes no responsibility for the use  or  reliability	* *   of its software on equipment which is not supplied by Digital.	* *									* ************************************************************************//* SCCS history beginning * *************************************************************** *                -- Revision History -- * *************************************************************** *  * 1.1  01/11/83 -- sccs * date and time created 83/11/01 20:57:23 by sccs *  * *************************************************************** * * 1.2 18/07/88 -- thoms * Added copyright notice and modification history * * 1.3  03/05/88 -- thoms * Fixed indirection through null pointer bug in help() * * SCCS history end */#include <stdio.h>#include <signal.h>#include <ctype.h>#include <setjmp.h>#include "lpc.h"int	fromatty;char	cmdline[200];int	margc;char	*margv[20];int	top;int	intr();struct	cmd *getcmd();jmp_buf	toplevel;main(argc, argv)	char *argv[];{	register struct cmd *c;	extern char *name;	name = argv[0];	if (--argc > 0) {		c = getcmd(*++argv);		if (c == (struct cmd *)-1) {			printf("?Ambiguous command\n");			exit(1);		}		if (c == 0) {			printf("?Invalid command\n");			exit(1);		}		if (c->c_priv && getuid()) {			printf("?Privileged command\n");			exit(1);		}		(*c->c_handler)(argc, argv);		exit(0);	}	fromatty = isatty(fileno(stdin));	top = setjmp(toplevel) == 0;	if (top)		signal(SIGINT, intr);	for (;;) {		cmdscanner(top);		top = 1;	}}intr(){	if (!fromatty)		exit(0);	longjmp(toplevel, 1);}/* * Command parser. */cmdscanner(top)	int top;{	register struct cmd *c;	extern struct cmd cmdtab[];	extern int help();	if (!top)		putchar('\n');	for (;;) {		if (fromatty) {			printf("lpc> ");			fflush(stdout);		}		if (gets(cmdline) == 0)			quit();		if (cmdline[0] == 0)			break;		makeargv();		c = getcmd(margv[0]);		if (c == (struct cmd *)-1) {			printf("?Ambiguous command\n");			continue;		}		if (c == 0) {			printf("?Invalid command\n");			continue;		}		if (c->c_priv && getuid()) {			printf("?Privileged command\n");			continue;		}		(*c->c_handler)(margc, margv);	}	longjmp(toplevel, 0);}struct cmd *getcmd(name)	register char *name;{	register char *p, *q;	register struct cmd *c, *found;	register int nmatches, longest;	longest = 0;	nmatches = 0;	found = 0;	for (c = cmdtab; p = c->c_name; c++) {		for (q = name; *q == *p++; q++)			if (*q == 0)		/* exact match? */				return(c);		if (!*q) {			/* the name was a prefix */			if (q - name > longest) {				longest = q - name;				nmatches = 1;				found = c;			} else if (q - name == longest)				nmatches++;		}	}	if (nmatches > 1)		return((struct cmd *)-1);	return(found);}/* * Slice a string up into argc/argv. */makeargv(){	register char *cp;	register char **argp = margv;	margc = 0;	for (cp = cmdline; *cp;) {		while (isspace(*cp))			cp++;		if (*cp == '\0')			break;		*argp++ = cp;		margc += 1;		while (*cp != '\0' && !isspace(*cp))			cp++;		if (*cp == '\0')			break;		*cp++ = '\0';	}	*argp++ = 0;}#define HELPINDENT (sizeof ("directory"))/* * Help command. */help(argc, argv)	int argc;	char *argv[];{	register struct cmd *c;	if (argc == 1) {		register int i, j, w;		int columns, width = 0, lines;		int ncmds;		printf("Commands may be abbreviated.  Commands are:\n\n");		for (c = cmdtab; c->c_name; c++) {			int len = strlen(c->c_name);			if (len > width)				width = len;		}		/* We don't use the ncmds in cmdtab.c because its wrong */		ncmds = c - cmdtab;		width = (width + 8) &~ 7;		columns = 80 / width;		if (columns == 0)			columns = 1;		lines = (ncmds + columns - 1) / columns;		for (i = 0; i < lines; i++) {			for (j = 0; j < columns; j++) {				c = cmdtab + j * lines + i;				printf("%s", c->c_name);				if (c + lines >= &cmdtab[ncmds]) {					printf("\n");					break;				}				w = strlen(c->c_name);				while (w < width) {					w = (w + 8) &~ 7;					putchar('\t');				}			}		}		return;	}	while (--argc > 0) {		register char *arg;		arg = *++argv;		c = getcmd(arg);		if (c == (struct cmd *)-1)			printf("?Ambiguous help command %s\n", arg);		else if (c == (struct cmd *)0)			printf("?Invalid help command %s\n", arg);		else			printf("%-*s\t%s\n", HELPINDENT,				c->c_name, c->c_help);	}}

⌨️ 快捷键说明

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