/* * 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"); } }