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

📄 filter.c

📁 操作系统SunOS 4.1.3版本的源码
💻 C
字号:
#ifndef lint#ifdef sccsstatic  char sccsid[] = "@(#)filter.c 1.1 92/07/30";#endif#endif/* * Copyright (c) 1986 by Sun Microsystems, Inc. */#include <ctype.h>#include <strings.h>#include <sunwindow/io_stream.h>#include <sunwindow/string_utils.h>#include <sunwindow/sun.h>#include <sunwindow/filter.h>/* * This module parses a file which specifies the mapping from key stations to * filters to be invoked from the editor. The form of each entry in the file * is: key_station filter_name program_name arguments  * * where key_station is either Cnnn, or identifier(nn), e.g. L1, KEY_LEFT(1).  * * Each entry must be separated from the next by a blank line. Comments may * appear in the file, as indicated by either the appearance of a '#' at the * beginning of a line, or the C convention using /'s and *'s.  * * The parser returns an array of pointers to structures (filter_rec) * containing the key name, the integer, the filter name, and an argc-argv * array describing the program call.  * * Unresolved issues:  reporting error positions.  */char	*stream_fgets();enum CharClassbreakProc();struct CharActiondigits();struct filter_rec **parse_filter_table(in, filename)	STREAM         *in;	char			*filename;	/* use this to label errors */{	struct filter_rec *rec_array[50];	char           *arg_array[20];	STREAM         *scratch_stream = NULL;	char            scratch[256], scratch1[32];	int             keynum, i, j, k;	struct filter_rec *rec;	struct filter_rec **val;	struct posrec   pos;	for (i = 0;; i++) {		if (stream_get_token(in, scratch, breakProc) == NULL)			break;		rec = (struct filter_rec *) malloc(sizeof (struct filter_rec));		if (rec == NULL) {			(void) fprintf(stderr, "%s: malloc failed\n", filename);			return (NULL);		}		rec->key_name = strdup(scratch);		if (stream_get_sequence(in, scratch, digits) != NULL)			keynum = atoi(scratch);		else if (!strequal(stream_get_token(in, scratch, breakProc),				   ")")) {			(void)stream_get_sequence(in, scratch, digits);			keynum = atoi(scratch);			if (!strequal(stream_get_token(in, scratch, breakProc),				      ")"))				goto error;		} else			goto error;		rec->key_num = keynum;		(void)stream_get_token(in, scratch, white_space);		rec->class = strdup(scratch);		(void)stream_getc(in);/* discard the newline */		scratch_stream = string_input_stream(			     stream_fgets(scratch, 256, in), scratch_stream);		/* So what if someone fails to specify a command after the		 * key definition		 */		if (!strcmp(scratch, "\n") || !strcmp(scratch, "")) {			fprintf(stderr, "%s: missing command-line; ", filename);			pos = stream_get_pos(in);			goto errorNoSkip;		}		/*		 * storage for stream allocated first time it is needed.		 * subsequent times, will be reused 		 */		if (any_shell_meta(scratch)) {			char *shell;			extern char *getenv();			if ((shell = getenv("SHELL")) == NULL)				shell = "/bin/sh";			rec->call = (char **)sv_calloc(4, sizeof (char *));			rec->call[0] = shell;			rec->call[1] = "-c";			rec->call[2] = strdup(scratch);		} else {			/* tokenize the call, copying results into arg_array */			for (j = 0, k = 0;			     (stream_get_token(scratch_stream,					       scratch1, white_space) != NULL);			     j++)				arg_array[j] = strdup(scratch1);			/*			 * allocate a new array of appropriate size (j+1 so			 * client will know where the array ends) 			 */			rec->call = (char **) sv_calloc((unsigned) j + 1,						     sizeof (char *));			/* and copy the strings from arg_array into it */			for (k = 0; k < j; k++)				rec->call[k] = arg_array[k];		}		rec_array[i] = rec;		continue;error:		pos = stream_get_pos(in);		for (; (stream_fgets(scratch, 256, in) != NULL);)			/* skip characters until you see a blank line */			if (scratch[0] == '\n')				break;		fprintf(stderr, "%s: ", filename);errorNoSkip:		if (pos.lineno != -1)			(void) fprintf(stderr,				"problem on line number %d\n", pos.lineno);		else			(void) fprintf(stderr,				"problem near character position %d\n",				pos.charpos);		i--;	}	val = (struct filter_rec **) calloc((unsigned) i + 1,					    sizeof (struct filter_rec *));	if (val == NULL) {		(void) fprintf(stderr, "%s: calloc failed\n", filename);		return (NULL);	}	for (j = 0; j < i; j++)		val[j] = rec_array[j];	return (val);}voidfree_filter_table(table)	struct filter_rec **table;{	int             i;	for (i = 0; table[i] != NULL; i++) {		cfree((char *) table[i]->call);		free((char *) table[i]);	}	cfree((char *) table);}static struct CharActiondigits(c)	char            c;{	struct CharAction val;	if (isdigit(c)) {		val.include = True;		val.stop = False;	} else {		val.include = False;		val.stop = True;	}	return (val);}static enum CharClassbreakProc(c)	char            c;{	switch (c) {	    case ' ':	    case '\n':	    case '\t':		return (Sepr);	    case '(':	    case ')':		return (Break);	    default:		return (isdigit(c) ? Break : Other);	}}/* * Are there any shell meta-characters in string s? */staticany_shell_meta(s)	register char *s;{	while (*s) {		if (index("~{[*?$`'\"\\", *s))			return (1);		s++;	}	return (0);}

⌨️ 快捷键说明

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