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

📄 help.c

📁 Calc Software Package for Number Calc
💻 C
字号:
/* * help - display help for calc * * Copyright (C) 1999  Landon Curt Noll * * Calc is open software; you can redistribute it and/or modify it under * the terms of the version 2.1 of the GNU Lesser General Public License * as published by the Free Software Foundation. * * Calc is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE.	 See the GNU Lesser General * Public License for more details. * * A copy of version 2.1 of the GNU Lesser General Public License is * distributed with calc under the filename COPYING-LGPL.  You should have * received a copy with calc; if not, write to Free Software Foundation, Inc. * 59 Temple Place, Suite 330, Boston, MA  02111-1307, USA. * * @(#) $Revision: 29.9 $ * @(#) $Id: help.c,v 29.9 2007/02/07 00:37:52 chongo Exp $ * @(#) $Source: /usr/local/src/cmd/calc/RCS/help.c,v $ * * Under source code control:	1997/09/14 10:58:30 * File existed as early as:	1997 * * chongo <was here> /\oo/\	http://www.isthe.com/chongo/ * Share and enjoy!  :-)	http://www.isthe.com/chongo/tech/comp/calc/ */#include <stdio.h>#include <ctype.h>#include <sys/types.h>#include <signal.h>#include "calc.h"#include "conf.h"#include "have_unistd.h"#if defined(HAVE_UNISTD_H)#include <unistd.h>#endif#if defined(_WIN32)# define popen _popen# define pclose _pclose#endif/* * some help topics are symbols, so we alias them to nice filenames */static struct help_alias {	char *topic;	char *filename;} halias[] = {	{"=", "address"},	{"->", "arrow"},	{"=", "assign"},	{"*", "dereference"},	{".", "oldvalue"},	{"%", "mod"},	{"//", "quo"},	{"#", "pound"},	{"calc", "help"},	{"copy", "blkcpy"},	{"copying", "COPYING"},	{"copying-lgpl", "COPYING-LGPL"},	{"copying_lgpl", "COPYING-LGPL"},	{"COPYING_LGPL", "COPYING-LGPL"},	{"Copyright", "copyright"},	{"COPYRIGHT", "copyright"},	{"Copyleft", "copyright"},	{"COPYLEFT", "copyright"},	{"define", "command"},	{"read", "command"},	{"write", "command"},	{"quit", "command"},	{"exit", "command"},	{"abort", "command"},	{"cd", "command"},	{"show", "command"},	{"stdlib", "resource"},	{NULL, NULL}};/* * external values */extern char *pager;		/* $PAGER or default *//* * page_file - output an open file thru a pager * * The popen() below is fairly safe.  The $PAGER environment variable * (supplied by the user) is the command we need to run without args. * True, the user could set $PAGER is a bogus prog ... but if -m is * 5 or 7 (read and exec allowed), then the calc is given ``permission'' * to open the help file for reading as well as to exec the pager! * * given: *	stream	open file stream of the file to send to the pager */static voidpage_file(FILE *stream){	FILE *cmd;		/* pager command */	char buf[BUFSIZ+1];	/* I/O buffer */	char *fgets_ret;	/* fgets() return value */	/*	 * flush any pending I/O	 */	fflush(stderr);	fflush(stdout);	fflush(stdin);	/*	 * form a write pipe to a pager	 */	if (pager == NULL || pager[0] == '\0') {	    cmd = stdout;	} else {	    cmd = popen(pager, "w");	}	if (cmd == NULL) {		fprintf(stderr, "unable form pipe to pager: %s", pager);		return;	}	/*	 * read the help file and send non-## lines to the pager	 * until EOF or error	 */	buf[BUFSIZ] = '\0';	do {		/*		 * read the next line that does not begin with ##		 */		buf[0] = '\0';		while ((fgets_ret = fgets(buf, BUFSIZ, stream)) != NULL &&		       buf[0] == '#' && buf[1] == '#') {		}		/*		 * stop reading when we reach EOF (or error) on help file		 */		if (fgets_ret == NULL) {			fflush(cmd);			break;		}		/*		 * write the line to pager, if possible		 *		 * We have to use fprintf() instead of fputs() because		 * on NetBSD, fputs() function returns 0 on success and		 # EOF on error.  *sigh*		 */	}  while (fprintf(cmd, "%s", buf) > 0);	/*	 * all done, EOF or error, so just clean up	 */	(void) pclose(cmd);	fflush(stderr);	fflush(stdout);	fflush(stdin);	return;}/* * givehelp - display a help file * * given: *	type		the type of help to give, NULL => index */voidgivehelp(char *type){	struct help_alias *p;	/* help alias being considered */	FILE *stream;		/* help file stream */	char *helppath;		/* path to the help file */	char *c;	/*	 * check permissions to see if we are allowed to help	 */	if (!allow_exec || !allow_read) {		fprintf(stderr,		    "sorry, help is only allowed with -m mode 5 or 7\n");		return;	}	/* catch the case where we just print the index */	if (type == NULL) {		type = DEFAULTCALCHELP;		/* the help index file */	}	/* alias the type of help, if needed */	for (p=halias; p->topic; ++p) {		if (strcmp(type, p->topic) == 0) {			type = p->filename;			break;		}	}	/*	 * sanity check on name	 */	/* look for /. or a leading . */	if (strstr(type, "/.") != NULL || type[0] == '.') {		fprintf(stderr, "bad help name\n");		return;	}	/* look for chars that could be shell meta chars */	for (c = type; *c; ++c) {		switch ((int)*c) {		case '+':		case ',':		case '-':		case '.':		case '/':		case '_':			break;		default:			if (!isascii((int)*c) || !isalnum((int)*c)) {				fprintf(stderr, "bogus char in help name\n");				return;			}			break;		}	}	/*	 * special case for Copyright and Copyleft	 */	if (strcmp(type, "copyright") == 0) {		fputs(Copyright, stdout);		fflush(stdout);		return;	}	/*	 * open the helpfile (looking in HELPDIR first)	 */	if (sizeof(CUSTOMHELPDIR) > sizeof(HELPDIR)) {		helppath = (char *)malloc(sizeof(CUSTOMHELPDIR)+1+strlen(type));	} else {		helppath = (char *)malloc(sizeof(HELPDIR)+1+strlen(type));	}	if (helppath == NULL) {		fprintf(stderr, "malloc failure in givehelp()\n");		return;	}	sprintf(helppath, "%s/%s", HELPDIR, type);	stream = fopen(helppath, "r");	if (stream != NULL) {		/*		 * we have the help file open, now display it		 */		page_file(stream);		(void) fclose(stream);	/*	 * open the the helpfile (looking in CUSTOMHELPDIR last)	 */	} else {		sprintf(helppath, "%s/%s", CUSTOMHELPDIR, type);		stream = fopen(helppath, "r");		if (stream == NULL) {			/* no such help file */			fprintf(stderr,				"%s: no such help file, try: help help\n",				type);		} else {			/* we have the help file open, now display it */			page_file(stream);			(void) fclose(stream);		}	}	/*	 * cleanup	 */	free(helppath);	return;}

⌨️ 快捷键说明

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