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

📄 tla_parse.c

📁 操作系统SunOS 4.1.3版本的源码
💻 C
字号:
#ifndef lint#ifdef sccsstatic	char sccsid[] = "@(#)tla_parse.c 1.1 92/07/30";#endif#endif/* * Copyright (c) 1984, 1988 by Sun Microsystems, Inc. *//* *  tla_parse.c - Do standard parse on argv and in attribute list. */#include <sys/types.h>#include <sys/file.h>#include <sys/time.h>#include <sys/stat.h>#include <stdio.h>#include <pixrect/pixrect.h>#include <pixrect/pixfont.h>#include <pixrect/pr_util.h>#include <pixrect/memvar.h>#include <sunwindow/notify.h>#include <sunwindow/rect.h>#include <sunwindow/rectlist.h>#include <sunwindow/cms.h>#include <sunwindow/pixwin.h>#include <sunwindow/win_input.h>#include <sunwindow/win_screen.h>#include <sunwindow/win_struct.h>#include "sunwindow/sv_malloc.h"#include <suntool/icon.h>#include <suntool/icon_load.h>#include <suntool/tool.h>#include <suntool/tool_impl.h>int tool_tried_to_get_font_from_defaults; /* FIXME:					   * This is a process wide default					   * because the pixrect lib uses the					   * environment variable DEFAULT_FONT.					   * If we go to defaults for					   * individual tools this will have					   * to be fixed.					   */typedef struct {	    char 	*short_name, *long_name;	    char	num_args;} Tool_cmd_line_flag;typedef enum {    TOOL_FLAG_FONT,    TOOL_FLAG_WIDTH,    TOOL_FLAG_HEIGHT,    TOOL_FLAG_SIZE,    TOOL_FLAG_POSITION,    TOOL_FLAG_ICON_POSITION,    TOOL_FLAG_LABEL,    TOOL_FLAG_ICONIC,    TOOL_FLAG_NO_NAME_STRIPE,    TOOL_FLAG_FOREGROUND_COLOR,    TOOL_FLAG_BACKGROUND_COLOR,    TOOL_FLAG_SET_DEFAULT_COLOR,    TOOL_FLAG_ICON_IMAGE,    TOOL_FLAG_ICON_LABEL,    TOOL_FLAG_ICON_FONT,    TOOL_FLAG_HELP} Tool_flag_name;/* Note that the order of the command line flags * and the Tool_flag_name enum above must match. */static Tool_cmd_line_flag	tool_cmd_line_flags[] = {	"-Wt", "-font", 1,	"-Ww", "-width", 1,	"-Wh", "-height", 1,	"-Ws", "-size", 2,	"-Wp", "-position", 2,	"-WP", "-icon_position", 2,	"-Wl", "-label", 1,	"-Wi", "-iconic", 0,	"-Wn", "-no_name_stripe", 0,	"-Wf", "-foreground_color", 3,        "-Wb", "-background_color", 3,	"-Wg", "-set_default_color", 0,	"-WI", "-icon_image", 1,	"-WL", "-icon_label", 1,	"-WT", "-icon_font", 1,	"-WH", "-help", 0,	0, 0, 0};static Tool_cmd_line_flag	*tool_find_cmd_flag();inttool_parse_all(argc_ptr, argv, avlist_ptr, tool_name)	int *argc_ptr;	char **argv;	char ***avlist_ptr;	char *tool_name;{	int argc = *argc_ptr;	int n;	while (argc > 0) {		switch ((n = tool_parse_one(argc, argv, avlist_ptr,		    tool_name))) {		case 0:			argc--;			argv++;			break;		case -1:			return(-1);		default:			while (n--) {				(void)cmdline_scrunch(argc_ptr, argv);				argc--;			}		}	}	return(0);}inttool_parse_one(argc, argv, avlist_ptr, tool_name)	register int argc;	register char **argv;	register char ***avlist_ptr;	char *tool_name;{	register int plus;	int bad_arg = 0;	register Tool_cmd_line_flag	*slot;	Tool_flag_name			flag_name;	extern char *defaults_get_string();        struct stat stat_buf;        char font_file[128]; /* Note: assuming max pathname length of 128 chars */	if (!tool_tried_to_get_font_from_defaults) {	    char *fname;	    fname = defaults_get_string("/SunView/Font", 	    			"", (int *)NULL);	    if (*fname != '\0') (void)setenv("DEFAULT_FONT", fname);	    tool_tried_to_get_font_from_defaults = 1;	}			if (argc < 1 || **argv != '-')		return(0);	slot = tool_find_cmd_flag(argv[0]);	if (!slot)	    return 0;	if (argc <= slot->num_args) {	    (void)fprintf(stderr, "%s: missing argument after %s\n", tool_name, 		    argv[0]);	    return(-1);	}	flag_name = (Tool_flag_name) (slot - tool_cmd_line_flags);	switch (flag_name) {	    case TOOL_FLAG_WIDTH:	    case TOOL_FLAG_HEIGHT:		if ((plus = atoi(argv[1])) < 0) {		    bad_arg = 1;		    goto NegArg;		}		tool_avl_add(avlist_ptr, flag_name == TOOL_FLAG_WIDTH ?			     (int)(LINT_CAST(WIN_COLUMNS)) : 			     (int)(LINT_CAST(WIN_LINES)), 			     (char *)(LINT_CAST(plus)));		break;	    case TOOL_FLAG_SIZE:		if ((plus = atoi(argv[1])) < 0) {			bad_arg = 1;			goto NegArg;		}		tool_avl_add(avlist_ptr, (int)(LINT_CAST(WIN_WIDTH)), 				(char *)(LINT_CAST(plus)));		if ((plus = atoi(argv[2])) < 0) {			bad_arg = 2;			goto NegArg;		}		tool_avl_add(avlist_ptr, (int)(LINT_CAST(WIN_HEIGHT)), 				(char *)(LINT_CAST(plus)));		break;	    case TOOL_FLAG_POSITION:		tool_avl_add(avlist_ptr, (int)(LINT_CAST(WIN_LEFT)), 				(char *)(LINT_CAST(atoi(argv[1]))));		tool_avl_add(avlist_ptr, (int)(LINT_CAST(WIN_TOP)), 				(char *)(LINT_CAST(atoi(argv[2]))));		break;	    case TOOL_FLAG_ICON_POSITION:		tool_avl_add(avlist_ptr, (int)(LINT_CAST(WIN_ICON_LEFT)), 				(char *)(LINT_CAST(atoi(argv[1]))));		tool_avl_add(avlist_ptr, (int)(LINT_CAST(WIN_ICON_TOP)), 				(char *)(LINT_CAST(atoi(argv[2]))));		break;	    case TOOL_FLAG_LABEL:		tool_avl_add(avlist_ptr, (int)(LINT_CAST(WIN_LABEL)),		    tool_copy_attr((int)(LINT_CAST(WIN_LABEL)), argv[1]));		break;	    case TOOL_FLAG_ICONIC:		tool_avl_add(avlist_ptr, (int)(LINT_CAST(WIN_ICONIC)), 				(char *)(LINT_CAST(1)));		break;	    case TOOL_FLAG_NO_NAME_STRIPE:		tool_avl_add(avlist_ptr, (int)(LINT_CAST(WIN_NAME_STRIPE)), 				(char *)0);		break;	    case TOOL_FLAG_FONT:		/*		 * Note: Need error checking on the existence and		 * goodness of font file.		 */                /* If the font file specified does not exist, then                 * try /usr/lib/fonts/fixedwidthfonts/<name>.                 * If that doesn't exist either, then declare an error.                 * Note: font_file is assumed to be <= 128 characters long.                 */                strcpy(font_file, argv[1]);                if (stat(font_file, &stat_buf)) {                        strcpy(font_file, "/usr/lib/fonts/fixedwidthfonts/");                        strcat(font_file, argv[1]);                        if (stat(font_file, &stat_buf))                                goto BadFont;                        }                (void)setenv("DEFAULT_FONT", font_file);		break;	    case TOOL_FLAG_FOREGROUND_COLOR:	    case TOOL_FLAG_BACKGROUND_COLOR: {		struct singlecolor color;		char **argvtmp;		int attr = (int) (flag_name == TOOL_FLAG_FOREGROUND_COLOR ? 				  WIN_FOREGROUND : WIN_BACKGROUND);		argvtmp = argv+1;		if (win_getsinglecolor(&argvtmp, &color) == 0) {		    tool_avl_add(avlist_ptr, attr,				 tool_copy_attr(attr, 				 	(char *)(LINT_CAST(&color))));		} else		    /* win_getsinglecolor prints error message */		    goto NoMsgError;		break;	    }	    case TOOL_FLAG_SET_DEFAULT_COLOR:		tool_avl_add(avlist_ptr, (int)(LINT_CAST(WIN_DEFAULT_CMS)), 				(char *)(LINT_CAST(1)));		break;	    case TOOL_FLAG_ICON_IMAGE: {		char err[IL_ERRORMSG_SIZE];		struct pixrect *mpr;		if ((mpr = icon_load_mpr(argv[1], err)) ==		    (struct pixrect *)0) {		    (void)fprintf(stderr, "%s: ", tool_name);		    (void)fprintf(stderr, err);		    goto NoMsgError;		}		tool_avl_add(avlist_ptr, (int)(LINT_CAST(WIN_ICON_IMAGE)), 				(char *)(LINT_CAST(mpr)));		break;	    }	    case TOOL_FLAG_ICON_LABEL:		tool_avl_add(avlist_ptr, (int)(LINT_CAST(WIN_ICON_LABEL)),			    tool_copy_attr((int)(LINT_CAST(WIN_ICON_LABEL)), 			    		argv[1]));		break;	    case TOOL_FLAG_ICON_FONT: {		PIXFONT *font;		char *dfont;		extern char *getenv();		/*		 * Note: Treating WIN_ICON_FONT's value as static until get		 * reasonable font manager that handles reference counting.		 * If kept changing icon font using the interface (assuming		 * that old one freed) then could waste space in a BIG way.		 */		if ((dfont = getenv("DEFAULT_FONT")) &&		    (strcmp(dfont, argv[1]) == 0))		    font = pw_pfsysopen();		else		    font = pf_open(argv[1]);		if (font) {		    tool_avl_add(avlist_ptr, (int)(LINT_CAST(WIN_ICON_FONT)), 		    		(char *)(LINT_CAST(font)));		} else		    goto BadFont;		break;	    }	    case TOOL_FLAG_HELP:		return(-1);	    default:		return(0);        }	return(slot->num_args + 1);BadFont:	(void)fprintf(stderr, "%s: bad font file (%s)\n", tool_name, argv[1]);	return(-1);NegArg:	(void)fprintf(stderr, "%s: can't have negative argument %s after %s\n",	    tool_name, argv[bad_arg], argv[0]);	return(-1);NoMsgError:	return(-1);}statictool_avl_add(avlist_ptr, attr, v)	char ***avlist_ptr;	int attr;	char *v;{	register char **argv;	register int i, n;	char *calloc();	if (*avlist_ptr == (char **)0)		*avlist_ptr = (char **)(LINT_CAST(			sv_calloc(TOOL_ATTR_MAX, sizeof(char *))));	argv = *avlist_ptr;	i = 0;	while (i < TOOL_ATTR_MAX) {		if (argv[i]) {			if ((n = tool_card_attr((int)(LINT_CAST(argv[i])))) == -1) {				(void)fprintf(stderr,				    "tool_attr doesn't support choice lists\n");				return;			}			i += n+1;		} else {			if (i+2 >= TOOL_ATTR_MAX) {				(void)fprintf(stderr, "tool_attr overflow\n");				return;			}			argv[i++] = (char *)attr;			argv[i++] = v;			argv[i] = NULL;			return;		}	}}	static Tool_cmd_line_flag *tool_find_cmd_flag(key)	register char	*key;{	register Tool_cmd_line_flag	*slot = tool_cmd_line_flags;	for (slot = tool_cmd_line_flags; slot->short_name; slot++)	    if ((strcmp(key, slot->short_name) == 0) ||	        (strcmp(key, slot->long_name) == 0))		    return slot;	return 0;}tool_parse_font(argc, argv)	register int argc;	register char **argv;{    register 		int n;    Tool_cmd_line_flag	*slot;    struct stat stat_buf;    char font_file[128]; /* Note: assuming max pathname length of 128 chars */    int ret_val=0;    while (argc > 0) {	if ((strcmp("-Wt", argv[0]) == 0) || 	    (strcmp("-font", argv[0]) == 0)) {            /* if no value for font */            if (argv[1] == NULL) ret_val = 1;            else  {                /* If the font file specified does not exist, then                 * try /usr/lib/fonts/fixedwidthfonts/<name>.                 * Note: font_file is assumed to be <= 128 characters long.                 */                strcpy(font_file, argv[1]);                if (stat(font_file, &stat_buf)) {                        strcpy(font_file, "/usr/lib/fonts/fixedwidthfonts/");                        strcat(font_file, argv[1]);                }                (void)setenv("DEFAULT_FONT", font_file);	    }	    n = 2;	} else {	    slot = tool_find_cmd_flag(argv[0]);	    n = slot ? slot->num_args + 1 : 1;	}	argv += n;	argc -= n;    }    return ret_val;}int	tool_defaultlines = 34;int	tool_defaultcolumns = 80;extern	struct pixfont *pf_sys;inttool_heightfromlines(n, namestripe)	int	n, namestripe;{	return (n * pf_sys->pf_defaultsize.y)		+ TOOL_BORDERWIDTH		+ tool_headerheight(namestripe);}inttool_widthfromcolumns(x)        int x; {         return (x * pf_sys->pf_defaultsize.x) + (2 * TOOL_BORDERWIDTH);}inttool_linesfromheight(tool, y)        struct tool *tool;           int y;  {  	return((y-tool_borderwidth(tool)		- tool_headerheight(tool->tl_flags&TOOL_NAMESTRIPE))/	    pf_sys->pf_defaultsize.y);}inttool_columnsfromwidth(tool, x)        struct tool *tool;           int x;  {          return(((x) - 2 * tool_borderwidth((tool))) /	    (pf_sys->pf_defaultsize.x));}

⌨️ 快捷键说明

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