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

📄 vars.c

📁 操作系统SunOS 4.1.3版本的源码
💻 C
字号:
#ifndef lint#ifdef sccsstatic  char sccsid[] = "@(#)vars.c 1.1 92/07/30 Copyr 1987 Sun Micro";#endif#endif/* * Copyright (c) 1985 by Sun Microsystems, Inc. *//* * Mailtool - variable handling, stolen from Mail */#include <stdio.h>#include <sys/types.h>#include <sunwindow/sun.h>#include "glob.h"extern int mt_debugging;char	*calloc();static	void vfree(), mt_puthash();/* * Structure of a variable node.  All variables are * kept on a singly-linked list of these, rooted by * "variables" */struct var {	struct	var *v_link;		/* Forward link to next variable */	char	*v_name;		/* The variable's name */	caddr_t	v_value;		/* And it's current value */};#define	HSHSIZE	19static struct	var *variables[HSHSIZE];	/* Pointer to active var list */char	*mt_value();static char	*vcopy();static struct	var *lookup();/* * Assign a value to a mail variable. */voidmt_assign(name, val)	char name[], val[];{	if (name[0]=='-')		(void) mt_deassign(name+1);	else if (name[0]=='n' && name[1]=='o')		(void) mt_deassign(name+2);	else mt_puthash(name, vcopy(val), variables);}/* * associate val with name in hasharray */static voidmt_puthash(name, val, hasharray)	char name[];	caddr_t	val;	struct	var *hasharray[];{	register struct var *vp;	register int h;	vp = lookup(name, hasharray);	if (vp == (struct var *)NULL) {		h = hash(name);		vp = (struct var *) (LINT_CAST(calloc(sizeof *vp, 1)));		vp->v_name = vcopy(name);		vp->v_link = hasharray[h];		hasharray[h] = vp;	} else		vfree(vp->v_value);	vp->v_value = val;}intmt_deassign(s)	register char *s;{	register struct var *vp, *vp2;	register int h;	if ((vp2 = lookup(s, variables)) == (struct var *)NULL) {		if (mt_debugging)		    (void)fprintf(stderr, "\"%s\": undefined variable\n", s);		return (1);	}	h = hash(s);	if (vp2 == variables[h]) {		variables[h] = variables[h]->v_link;		vfree(vp2->v_name);		vfree(vp2->v_value);		cfree((char *)vp2);		return (0);	}	for (vp = variables[h]; vp->v_link != vp2; vp = vp->v_link)		;	vp->v_link = vp2->v_link;	vfree(vp2->v_name);	vfree(vp2->v_value);	cfree((char *)vp2);	return (0);}/* * Free up a variable string.  We do not bother to allocate * strings whose value is "" since they are expected to be frequent. * Thus, we cannot free same! */static voidvfree(cp)	register char *cp;{	if (strcmp(cp, "") != 0)		cfree(cp);}/* * Copy a variable value into permanent space. * Do not bother to alloc space for "". */static char *vcopy(str)	char str[];{	if (strcmp(str, "") == 0)		return ("");	return (mt_savestr(str));}/* * Get the value of a variable and return it. * Look in the environment if its not available locally. */char *mt_value(name)	char name[];{	register struct var *vp;	register char *cp;	if ((vp = lookup(name, variables)) == (struct var *)NULL)		cp = getenv(name);	else		cp = vp->v_value;	return (cp);}/* * Locate a variable and return its variable * node. */static struct var *lookup(name, hasharray)	char name[];	struct	var *hasharray[];{	register struct var *vp;	register int h;	h = hash(name);	for (vp = hasharray[h]; vp != (struct var *)NULL; vp = vp->v_link)		if (strcmp(vp->v_name, name) == 0)			return (vp);	return ((struct var *)NULL);}/* * Hash the passed string and return an index into * the variable or group hash table. */static inthash(name)	char name[];{	register unsigned h;	register char *cp;	for (cp = name, h = 0; *cp; h = (h << 2) + *cp++)		;	return (h % HSHSIZE);}

⌨️ 快捷键说明

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