xref: /csrg-svn/usr.bin/ftp/domacro.c (revision 26052)
1*26052Sminshall /*
2*26052Sminshall  * Copyright (c) 1985 Regents of the University of California.
3*26052Sminshall  * All rights reserved.  The Berkeley software License Agreement
4*26052Sminshall  * specifies the terms and conditions for redistribution.
5*26052Sminshall  */
6*26052Sminshall 
7*26052Sminshall #ifndef lint
8*26052Sminshall static char sccsid[] = "@(#)domacro.c	1.1 (Berkeley) 02/03/86";
9*26052Sminshall #endif not lint
10*26052Sminshall 
11*26052Sminshall #include "ftp_var.h"
12*26052Sminshall 
13*26052Sminshall #include <signal.h>
14*26052Sminshall #include <stdio.h>
15*26052Sminshall #include <errno.h>
16*26052Sminshall #include <ctype.h>
17*26052Sminshall #include <sys/ttychars.h>
18*26052Sminshall 
19*26052Sminshall jmp_buf macabort;
20*26052Sminshall 
21*26052Sminshall domacro(argc, argv)
22*26052Sminshall 	int argc;
23*26052Sminshall 	char *argv[];
24*26052Sminshall {
25*26052Sminshall 	register int i, j;
26*26052Sminshall 	register char *cp1, *cp2;
27*26052Sminshall 	int count = 2, loopflg = 0, (*oldintr)();
28*26052Sminshall 	char **gargs, **cpp, line2[200];
29*26052Sminshall 	extern char **glob(), *globerr;
30*26052Sminshall 	struct cmd *getcmd(), *c;
31*26052Sminshall 	extern struct cmd cmdtab[];
32*26052Sminshall 
33*26052Sminshall 	if (argc < 2) {
34*26052Sminshall 		strcat(line, " ");
35*26052Sminshall 		printf("(macro name) ");
36*26052Sminshall 		gets(&line[strlen(line)]);
37*26052Sminshall 		makeargv();
38*26052Sminshall 		argc = margc;
39*26052Sminshall 		argv = margv;
40*26052Sminshall 	}
41*26052Sminshall 	if (argc < 2) {
42*26052Sminshall 		printf("Usage: %s macro_name.\n", argv[0]);
43*26052Sminshall 		code = -1;
44*26052Sminshall 		return;
45*26052Sminshall 	}
46*26052Sminshall 	for (i = 0; i < macnum; ++i) {
47*26052Sminshall 		if (!strncmp(argv[1], macros[i].mac_name, 9)) {
48*26052Sminshall 			break;
49*26052Sminshall 		}
50*26052Sminshall 	}
51*26052Sminshall 	if (i == macnum) {
52*26052Sminshall 		printf("'%s' macro not found.\n", argv[1]);
53*26052Sminshall 		code = -1;
54*26052Sminshall 		return;
55*26052Sminshall 	}
56*26052Sminshall 	strcpy(line2, line);
57*26052Sminshall TOP:
58*26052Sminshall 	cp1 = macros[i].mac_start;
59*26052Sminshall 	while (cp1 != macros[i].mac_end) {
60*26052Sminshall 		while (isspace(*cp1)) {
61*26052Sminshall 			cp1++;
62*26052Sminshall 		}
63*26052Sminshall 		cp2 = line;
64*26052Sminshall 		while (*cp1 != '\0') {
65*26052Sminshall 		      switch(*cp1) {
66*26052Sminshall 		   	    case '\\':
67*26052Sminshall 				 *cp2++ = *++cp1;
68*26052Sminshall 				 break;
69*26052Sminshall 			    case '$':
70*26052Sminshall 				 if (isdigit(*(cp1+1))) {
71*26052Sminshall 				    j = 0;
72*26052Sminshall 				    while (isdigit(*++cp1)) {
73*26052Sminshall 					  j = 10*j +  *cp1 - '0';
74*26052Sminshall 				    }
75*26052Sminshall 				    cp1--;
76*26052Sminshall 				    if (argc - 2 >= j) {
77*26052Sminshall 					strcpy(cp2, argv[j+1]);
78*26052Sminshall 					cp2 += strlen(argv[j+1]);
79*26052Sminshall 				    }
80*26052Sminshall 				    break;
81*26052Sminshall 				 }
82*26052Sminshall 				 if (*(cp1+1) == 'i') {
83*26052Sminshall 					loopflg = 1;
84*26052Sminshall 					cp1++;
85*26052Sminshall 					if (count < argc) {
86*26052Sminshall 					   strcpy(cp2, argv[count]);
87*26052Sminshall 					   cp2 += strlen(argv[count]);
88*26052Sminshall 					}
89*26052Sminshall 					break;
90*26052Sminshall 				}
91*26052Sminshall 				/* intentional drop through */
92*26052Sminshall 			    default:
93*26052Sminshall 				*cp2++ = *cp1;
94*26052Sminshall 				break;
95*26052Sminshall 		      }
96*26052Sminshall 		      if (*cp1 != '\0') {
97*26052Sminshall 			 cp1++;
98*26052Sminshall 		      }
99*26052Sminshall 		}
100*26052Sminshall 		*cp2 = '\0';
101*26052Sminshall 		makeargv();
102*26052Sminshall 		c = getcmd(margv[0]);
103*26052Sminshall 		if (c == (struct cmd *)-1) {
104*26052Sminshall 			printf("?Ambiguous command\n");
105*26052Sminshall 			code = -1;
106*26052Sminshall 		}
107*26052Sminshall 		else if (c == 0) {
108*26052Sminshall 			printf("?Invalid command\n");
109*26052Sminshall 			code = -1;
110*26052Sminshall 		}
111*26052Sminshall 		else if (c->c_conn && !connected) {
112*26052Sminshall 			printf("Not connected.\n");
113*26052Sminshall 			code = -1;
114*26052Sminshall 		}
115*26052Sminshall 		else {
116*26052Sminshall 			if (verbose) {
117*26052Sminshall 				printf("%s\n",line);
118*26052Sminshall 			}
119*26052Sminshall 			(*c->c_handler)(margc, margv);
120*26052Sminshall 			if (bell && c->c_bell) {
121*26052Sminshall 				putchar(CTRL(g));
122*26052Sminshall 			}
123*26052Sminshall 			strcpy(line, line2);
124*26052Sminshall 			makeargv();
125*26052Sminshall 			argc = margc;
126*26052Sminshall 			argv = margv;
127*26052Sminshall 		}
128*26052Sminshall 		if (cp1 != macros[i].mac_end) {
129*26052Sminshall 			cp1++;
130*26052Sminshall 		}
131*26052Sminshall 	}
132*26052Sminshall 	if (loopflg && ++count < argc) {
133*26052Sminshall 		goto TOP;
134*26052Sminshall 	}
135*26052Sminshall }
136