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

File: [local] / OpenXM_contrib2 / fep / fep_alias.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: +9 -20 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_alias.c,v 4.2 88/11/13 15:50:52 utashiro Exp $ (SRA)";
#endif /* lint */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include "fep_defs.h"
#include "fep_funcs.h"
#include "fep_glob.h"

typedef struct _alias {
	char *al_name;
	char *al_value;
	struct _alias *al_next;
} ALIAS;

ALIAS	alias_top = {"top", "top", (ALIAS *)0};
ALIAS	*alias_list = &alias_top;
CHAR	aliased_line[MAXCMDLEN+1];

/*
 * Functions
 */

ALIAS * getap (char *name, int alloc, ALIAS **lastvp);
extern	char	*allocAndCopyThere();
extern	char	*prompt;

/*
 * Check alias list, and if found alias change command by its value
 */
CHAR * check_alias (char *comline)
{
    char *argv[MAXARGS];
    int argc;
    char *av;
    int substitute = 0;

    while (isspace (*comline))
	++comline;
    if (*comline == '\0')
	return ((CHAR *)0);

    argc = mkargv (comline, argv, MAXARGS);

    if (av = look_alias (argv[0])) {
	int len = strlen (argv[0]);
	char *cp;
	CHAR *ap;

	*aliased_line = '\0';
	ap = aliased_line;
	cp = av;
	for (; *cp; ++cp) {

	    if (*cp != '!')
		*ap++ = *cp;
	    else {
		switch (*(cp + 1)) {
		case '^':
		    if (argc > 1) {
			strcpy (ap, argv[1]);
			ap += strlen (argv[1]);
		    }
		    substitute++;
		    break;

		case '$':
		    if (argc > 1) {
			strcpy (ap, argv[argc-1]);
			ap += strlen (argv[argc - 1]);
		    }
		    substitute++;
		    break;

		case '*':
		{
		    int j;

		    for (j = 1; j < argc; j++) {
			strcpy (ap, " ");
			strcat (ap, argv[j]);
			ap += strlen (argv[j]) + 1;
		    }
		    substitute++;
		    break;
		}

		default:
		    *ap = *cp;
		    *++ap = *(cp + 1);
		    break;
		}
		cp++;
	    }
	}
	*ap = '\0';
		    
	/*
	 * If there is no ! notation, copy all arguments in command line.
	 */
	if (substitute == 0)
	    strcat (aliased_line, comline + len);

	return (aliased_line);
    }
    else
	return ((CHAR *)0);
}

/*
 * Set alias
 */
void set_alias (char *name, char *value)
{
    ALIAS *vp;

    vp = getap (name, 1, 0);

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

    vp->al_value = allocAndCopyThere (value);
}

/*
 * Unset alias
 */
void unset_alias (char *name)
{
    ALIAS *vp, *prev;

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

    if (!vp)
	return;

    prev->al_next = vp->al_next;
    free (vp->al_name);
    free (vp->al_value);
    free (vp);
    return;
}

/*
 * Look up alias
 */
char * look_alias (char *name)
{

    ALIAS *vp;

    vp = getap (name, 0, 0);

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

/*
 * Show alias list
 */
void show_aliaslist (char *a)
{
    register ALIAS *vp;

    for (vp = alias_list->al_next; vp; vp = vp->al_next) {
	if (a && strcmp (a, vp->al_name))
	    continue;
	printf ("%-16s %s\n", vp->al_name, vp->al_value);
    }
}


/*
 * Get pointer to ALIAS.
 * If there is no memoly associated to the alias and alloc argument is 1,
 * allocate the area and initialize name field.
 */
ALIAS * getap (char *name, int alloc, ALIAS **lastvp)
{
    ALIAS *vp, *last = (ALIAS *)0;

    for (vp = alias_list->al_next, last = alias_list;
	 vp; last = vp, vp = vp->al_next) {
	int r;

	r = strcmp (name, vp->al_name);
	if (r == 0) {
	    if (lastvp)
		*lastvp = last;
	    return (vp);
	}
	else if (r < 0)
	    break;
    }

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

    vp = (ALIAS *) calloc (sizeof (ALIAS), 1);
    vp->al_value = (char *)0;
    vp->al_next = (ALIAS *) 0;
    vp->al_name = allocAndCopyThere (name);

    vp->al_next = last->al_next;
    last->al_next = vp;
    return (vp);
}