/*
 * Csh - a shell by PJAC
 * alias.c - alias handling
 */

#include "csh.h"

do_alias(argc, argv)
char	**argv;
{
	struct	lvars	*lp, *xlp;
	char	**xp, **x1p;
	char	*p, *q;

	if(argc <= 2){
		pr_alias(argv[1]);
		return(OK);
	}
	if(argc < 3)
		return(OK);
	for(lp = Aliases ; lp ; lp = lp->L_next)
		if(strcmp(lp->L_name, argv[1]) == 0)
			break;
	if(lp == 0){
		lp = (struct lvars *)mmalloc(sizeof(struct lvars));
		if(Aliases == 0)
			Aliases = lp;
		else {
			for(xlp = Aliases ; xlp->L_next ; xlp = xlp->L_next);
			xlp->L_next = lp;
		}
		lp->L_next = 0;
		lp->L_aval = 0;
		lp->L_name = strsave(argv[1]);
		lp->L_flags = 0;
	}
	if(lp->L_aval){
		for(xp = lp->L_aval ; *xp ; xp++)
			free(*xp);
		free( (char *)lp->L_aval);
		lp->L_aval = 0;
	}
	lp->L_aval = (char **)mmalloc((argc - 1) *sizeof(char *));
	for(xp = lp->L_aval, argv += 2 ; *argv ; *argv++ = 0)
		*xp++ = *argv;
	*xp = 0;
	return(OK);
}

/*
 * unalias a command
 */

do_ualias(argc, argv)
char	**argv;
{
	struct	lvars	*lp, *xlp;
	char	**xp;

	if(argc < 2)
		return(OK);
	for(lp = Aliases ; lp ; lp = lp->L_next)
		if(strcmp(lp->L_name, argv[1]) == 0)
			break;
	if(lp == 0)	/* command is not aliased - ignore */
		return(OK);
	if(lp == Aliases)
		Aliases = lp->L_next;
	else {
		for(xlp = Aliases ; xlp->L_next != lp ; xlp = xlp->L_next);
		xlp->L_next = lp->L_next;
	}
	free(lp->L_name);
	for(xp = lp->L_aval; *xp ; xp++)
		free(*xp);
	free( (char *)lp->L_aval);
	free( (char *)lp);
	return(OK);
}

pr_alias(aname)
char	*aname;
{
	struct	lvars	*lp;
	char	**xp;

	for(lp = Aliases ; lp ; lp = lp->L_next){
		if(aname && strcmp(aname, lp->L_name))
			continue;
		put_s(lp->L_name);
		if(lp->L_aval != 0){
			put_s(" ");
			for(xp = lp->L_aval ; *xp ; ){
				put_s(*xp++);
				if(*xp && !aname)
					put_s(" ");
			}
		}
		put_s("\n");
	}
}
