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