Annotation of OpenXM_contrib2/fep/fep_alias.c, Revision 1.3
1.1 noro 1: /* Copyright (c) 1987, 1988 by Software Research Associates, Inc. */
2:
3: #ifndef lint
4: static char rcsid[]=
5: "$Header: fep_alias.c,v 4.2 88/11/13 15:50:52 utashiro Exp $ (SRA)";
6: #endif /* lint */
7:
8: #include <stdio.h>
1.3 ! noro 9: #include <stdlib.h>
1.2 ohara 10: #include <string.h>
1.1 noro 11: #include <ctype.h>
12: #include "fep_defs.h"
1.3 ! noro 13: #include "fep_funcs.h"
1.1 noro 14: #include "fep_glob.h"
15:
16: typedef struct _alias {
17: char *al_name;
18: char *al_value;
19: struct _alias *al_next;
20: } ALIAS;
21:
22: ALIAS alias_top = {"top", "top", (ALIAS *)0};
23: ALIAS *alias_list = &alias_top;
24: CHAR aliased_line[MAXCMDLEN+1];
25:
26: /*
27: * Functions
28: */
29:
1.3 ! noro 30: ALIAS * getap (char *name, int alloc, ALIAS **lastvp);
1.1 noro 31: extern char *allocAndCopyThere();
32: extern char *prompt;
33:
34: /*
35: * Check alias list, and if found alias change command by its value
36: */
1.3 ! noro 37: CHAR * check_alias (char *comline)
1.1 noro 38: {
39: char *argv[MAXARGS];
40: int argc;
41: char *av;
42: int substitute = 0;
43:
44: while (isspace (*comline))
45: ++comline;
46: if (*comline == '\0')
47: return ((CHAR *)0);
48:
49: argc = mkargv (comline, argv, MAXARGS);
50:
51: if (av = look_alias (argv[0])) {
52: int len = strlen (argv[0]);
53: char *cp;
54: CHAR *ap;
55:
56: *aliased_line = '\0';
57: ap = aliased_line;
58: cp = av;
59: for (; *cp; ++cp) {
60:
61: if (*cp != '!')
62: *ap++ = *cp;
63: else {
64: switch (*(cp + 1)) {
65: case '^':
66: if (argc > 1) {
67: strcpy (ap, argv[1]);
68: ap += strlen (argv[1]);
69: }
70: substitute++;
71: break;
72:
73: case '$':
74: if (argc > 1) {
75: strcpy (ap, argv[argc-1]);
76: ap += strlen (argv[argc - 1]);
77: }
78: substitute++;
79: break;
80:
81: case '*':
82: {
83: int j;
84:
85: for (j = 1; j < argc; j++) {
86: strcpy (ap, " ");
87: strcat (ap, argv[j]);
88: ap += strlen (argv[j]) + 1;
89: }
90: substitute++;
91: break;
92: }
93:
94: default:
95: *ap = *cp;
96: *++ap = *(cp + 1);
97: break;
98: }
99: cp++;
100: }
101: }
102: *ap = '\0';
103:
104: /*
105: * If there is no ! notation, copy all arguments in command line.
106: */
107: if (substitute == 0)
108: strcat (aliased_line, comline + len);
109:
110: return (aliased_line);
111: }
112: else
113: return ((CHAR *)0);
114: }
115:
116: /*
117: * Set alias
118: */
1.3 ! noro 119: void set_alias (char *name, char *value)
1.1 noro 120: {
121: ALIAS *vp;
122:
123: vp = getap (name, 1, 0);
124:
125: if (vp->al_value)
126: free (vp->al_value);
127:
128: vp->al_value = allocAndCopyThere (value);
129: }
130:
131: /*
132: * Unset alias
133: */
1.3 ! noro 134: void unset_alias (char *name)
1.1 noro 135: {
136: ALIAS *vp, *prev;
137:
138: vp = getap (name, 0, &prev);
139:
140: if (!vp)
141: return;
142:
143: prev->al_next = vp->al_next;
144: free (vp->al_name);
145: free (vp->al_value);
146: free (vp);
147: return;
148: }
149:
150: /*
151: * Look up alias
152: */
1.3 ! noro 153: char * look_alias (char *name)
1.1 noro 154: {
155:
156: ALIAS *vp;
157:
158: vp = getap (name, 0, 0);
159:
160: if (vp && vp->al_value)
161: return (vp->al_value);
162: else
163: return ((char *)0);
164: }
165:
166: /*
167: * Show alias list
168: */
1.3 ! noro 169: void show_aliaslist (char *a)
1.1 noro 170: {
171: register ALIAS *vp;
172:
173: for (vp = alias_list->al_next; vp; vp = vp->al_next) {
174: if (a && strcmp (a, vp->al_name))
175: continue;
176: printf ("%-16s %s\n", vp->al_name, vp->al_value);
177: }
178: }
179:
180:
181: /*
182: * Get pointer to ALIAS.
183: * If there is no memoly associated to the alias and alloc argument is 1,
184: * allocate the area and initialize name field.
185: */
1.3 ! noro 186: ALIAS * getap (char *name, int alloc, ALIAS **lastvp)
1.1 noro 187: {
188: ALIAS *vp, *last = (ALIAS *)0;
189:
190: for (vp = alias_list->al_next, last = alias_list;
191: vp; last = vp, vp = vp->al_next) {
192: int r;
193:
194: r = strcmp (name, vp->al_name);
195: if (r == 0) {
196: if (lastvp)
197: *lastvp = last;
198: return (vp);
199: }
200: else if (r < 0)
201: break;
202: }
203:
204: if (alloc == 0)
205: return (0);
206:
207: vp = (ALIAS *) calloc (sizeof (ALIAS), 1);
208: vp->al_value = (char *)0;
209: vp->al_next = (ALIAS *) 0;
210: vp->al_name = allocAndCopyThere (name);
211:
212: vp->al_next = last->al_next;
213: last->al_next = vp;
214: return (vp);
215: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>