[BACK]Return to fep_set.c CVS log [TXT][DIR] Up to [local] / OpenXM_contrib2 / fep

File: [local] / OpenXM_contrib2 / fep / fep_set.c (download)

Revision 1.3, Sun Nov 1 10:28:22 2020 UTC (3 years, 5 months ago) by noro
Branch: MAIN
CVS Tags: HEAD
Changes since 1.2: +12 -27 lines

Modified various parts for building with Xcode-12.

/*	Copyright (c) 1987, 1988 by Software Research Associates, Inc.	*/

#ifndef lint
static char rcsid[]=
"$Header: fep_set.c,v 4.3 91/05/29 14:31:08 utashiro Exp $ (SRA)";
#endif /* lint */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "fep_defs.h"
#include "fep_funcs.h"
#include "fep_glob.h"
void initViBindings (FUNC cft[], FUNC aft[]);

VAR default_set_vars [] = {
	{"expand-tilde",	"",
	 "Expand ~ to home directory name",	(VAR*)0},
	{"ignore-empty-line",	"",
	 "Don't put empty line to history",	(VAR*)0},
	{"ignore-same-line",	"",
	 "Don't put same line to history",	(VAR*)0},
	{"editmode",		"emacs",
	 "Fep command line edit mode",		(VAR*)0},
	{"history-file",	".fephistory",
	 "Name of history file",		(VAR*)0},
	{"shell",		"/bin/sh",
	 "Shell name used by invoke-shell",	(VAR*)0},
	{"auto-tty-fix",	"",
	 "Fix tty mode automatically",		(VAR*)0},
	{"script-file",		"fepscript",
	 "Script file name",			(VAR*)0},
	{"crt",			"24",
	 "Terminal lines",			(VAR*)0},
	{"showhist",		"24",
	 "History length used by show-history",	(VAR*)0},
	{"delimiters",		" \t",
	 "Argument delemiter characters",	(VAR*)0},
	{"buffer",		"5120",
	"Output buffer size",			(VAR*)0},
	{NULL,			NULL,
	 NULL,					(VAR*)0}
};

VAR default_unset_vars [] = {
	/* below from here is unset by default */
	{"alarm-on-eof",	"",
	 "Alarm once to eof character",		(VAR*)0},
	{"ignore-eof",		"",
	 "Never treat eof character as eof",	(VAR*)0}, 
	{"savehist",		"",
	 "Length of save history",		(VAR*)0},
	{"verbose",		"",
	 NULL,					(VAR*)0}, 
	{"search-string",	"",
	 NULL,					(VAR*)0},
	{"noalias",		"",
	 "Not use alias",			(VAR*)0},
	{"tty-fix-bell",	"",
	 "Ring bell when tty mode changed",	(VAR*)0},
	{"auto-repaint",	"",
	 "Repaint screen when restarting",	(VAR*)0},
	{"clear-repaint",	"",
	 "Clear screen before repaint",		(VAR*)0},
	{"ignore-short-line",	"3",
	"Don't put short line to history",	(VAR*)0},
	{NULL,			NULL,
	 NULL,					(VAR*)0}
};

#ifdef HASH
#define HASHNUM	10
VAR *var_htab[HASHNUM];
#else /* HASH */
VAR var_top = {"top", "top", (char *)0, (VAR *)0};
VAR *var_list = &var_top;
#endif /* HASH */

/*
 * Functions
 */
extern	char	*allocAndCopyThere();
extern	char	*prompt;

/*
 * Set default variables
 */
void set_default_vars ()
{
    register VAR *vp;

    for (vp = default_set_vars; vp->v_name; vp++)
	set_only_var (vp->v_name, vp->v_value);
}

/*
 * Set variable
 */
int set_var (char *name, char *value)
{
    /*
     * Process special variable
     */
    if (eq (name, "history")) {
	if (!changeHistorySize (atoi (value)))
	    return (0);
    }
    else if (eq (name, "prompt")) {
	free (prompt);
	prompt = allocAndCopyThere (value);
    }
    else if (eq (name, "editmode")) {
	if (eq (value, "emacs")) {
	    editmode = EMACS;
	    initEmacsBindings (curFuncTab, altFuncTab);
	}
	else if (eq (value, "vi")) {
	    editmode = VI;
	    initViBindings (curFuncTab, altFuncTab);
	}
	else
	    printf ("%s: Unknown editmode\n", value);
    }
    else if (eq (name, "auto-tty-fix"))
	auto_tty_fix = ON;
    else if (eq (name, "debug"))
	debug = ON;
    else if (eq (name, "tty-fix-bell"))
	tty_fix_bell = ON;
    else if (eq (name, "delimiters")) {
	/* only in this case, variable points allocated area */
	set_only_var (name, value);
	delimiters = look_var ("delimiters");
    }
    else if (eq (name, "crt"))
	lines = atoi (value);
    else if (eq(name, "buffer")) {
	int s;

	if ((s = atoi(value)) <= 0)
	    return;

	if (!set_buffer (output_buffer, s))
	    return;
    }

    set_only_var (name, value);
}

void set_only_var (char *name, char *value)
{
    VAR *vp;

    vp = getvp (name, 1, 0);

    if (vp->v_value == value)
	return;

    if (vp->v_value)
	free (vp->v_value);

    vp->v_value = allocAndCopyThere (value);
}

/*
 * Unset variable
 */
void unset_var (char *name)
{
    VAR *vp, *prev;

    vp = getvp (name, 0, &prev);

    if (!vp)
	return;

    prev->v_next = vp->v_next;
    free (vp->v_name);
    free (vp->v_value);
    free (vp);

    if (eq (name, "auto-tty-fix"))
	auto_tty_fix = OFF;

    if (eq (name, "debug"))
	debug = OFF;

    if (eq (name, "tty-fix-bell"))
	tty_fix_bell = OFF;

    if (eq (name, "delimiters"))
	delimiters = DEFAULT_DELIMITERS;
    return;
}

/*
 * Look up variable
 */
char * look_var (char *name)
{

    VAR *vp;

    vp = getvp (name, 0, 0);

    if (vp && vp->v_value)
	return (vp->v_value);
    else
	return ((char *)0);
}

/*
 * Look up variable and get integer result
 */
int lookd_var (char *name)
{
    VAR *vp;

    vp = getvp (name, 0, 0);

    if (vp && vp->v_value)
	return (atoi (vp->v_value));
    else
	return (0);
}

/*
 * Show variable list
 */
void show_varlist ()
{
#ifdef HASH
    register int i;

    for (i = 0; i< HASHNUM; i++) {
	register VAR *vp;

	vp = var_htab[i];
	if (vp == (VAR *)0)
	    continue;

	for (; vp != (VAR *)0; vp = vp->v_next)
	    printf ("%-16s %s\n", vp->v_name, vp->v_value);
    }
#else /* HASH */
    register VAR *vp;

    for (vp = var_list->v_next; vp; vp = vp->v_next)
	printf ("%-16s %s\n", vp->v_name, vp->v_value);
#endif /* HASH */
}

#ifdef HASH
/*
 * Get hash index from variable name
 */
static getindex (char *s)
{
    register int sum = 0;

    while (*s)
	sum += *s++;

    return (sum % HASHNUM);
}
#endif /* HASH */

/*
 * Get pointer to VAR.
 * If there is no memoly associated to the variable and alloc argument is 1,
 * allocate the area and initialize name field.
 */
VAR * getvp (char *name, int alloc, VAR **lastvp)
{
#ifdef HASH
    register i = getindex (name);
#endif /* HASH */
    VAR *vp, *last = (VAR *)0;

#ifdef HASH
    for (vp = var_htab[i]; vp; last = vp, vp->v_next) {
	if (strcmp (name, vp->v_value) == 0)
	    return (vp);
    }
#else /* HASH */
    for (vp = var_list->v_next, last = var_list; vp; last = vp, vp = vp->v_next) {
	int r;

	r = strcmp (name, vp->v_name);
	if (r == 0) {
	    if (lastvp)
		*lastvp = last;
	    return (vp);
	}
	else if (r < 0)
	    break;
    }
#endif /* HASH */

    if (alloc == 0)
	return (0);

    vp = (VAR *) calloc (sizeof (VAR), 1);
    vp->v_value = (char *)0;
    vp->v_next = (VAR *) 0;
    vp->v_name = allocAndCopyThere (name);

#ifdef HASH
    if (last) {
	vp->v_next = last->v_next;
	last->v_next = vp;
    }
    else {
	var_htab[i] = vp;
    }
#else /* HASH */
    vp->v_next = last->v_next;
    last->v_next = vp;
#endif /* HASH */
    return (vp);
}