xref: /csrg-svn/usr.bin/ftp/domacro.c (revision 62009)
126052Sminshall /*
2*62009Sbostic  * Copyright (c) 1985, 1993
3*62009Sbostic  *	The Regents of the University of California.  All rights reserved.
433737Sbostic  *
542665Sbostic  * %sccs.include.redist.c%
626052Sminshall  */
726052Sminshall 
826052Sminshall #ifndef lint
9*62009Sbostic static char sccsid[] = "@(#)domacro.c	8.1 (Berkeley) 06/06/93";
1033737Sbostic #endif /* not lint */
1126052Sminshall 
1226052Sminshall #include "ftp_var.h"
1326052Sminshall 
1426052Sminshall #include <signal.h>
1526052Sminshall #include <stdio.h>
1626052Sminshall #include <errno.h>
1726052Sminshall #include <ctype.h>
1826052Sminshall #include <sys/ttychars.h>
1926052Sminshall 
2026052Sminshall domacro(argc, argv)
2126052Sminshall 	int argc;
2226052Sminshall 	char *argv[];
2326052Sminshall {
2426052Sminshall 	register int i, j;
2526052Sminshall 	register char *cp1, *cp2;
2626498Sminshall 	int count = 2, loopflg = 0;
2726498Sminshall 	char line2[200];
2826052Sminshall 	extern char **glob(), *globerr;
2926052Sminshall 	struct cmd *getcmd(), *c;
3026052Sminshall 	extern struct cmd cmdtab[];
3126052Sminshall 
3245260Sbostic 	if (argc < 2 && !another(&argc, &argv, "macro name")) {
3326052Sminshall 		printf("Usage: %s macro_name.\n", argv[0]);
3426052Sminshall 		code = -1;
3526052Sminshall 		return;
3626052Sminshall 	}
3726052Sminshall 	for (i = 0; i < macnum; ++i) {
3826052Sminshall 		if (!strncmp(argv[1], macros[i].mac_name, 9)) {
3926052Sminshall 			break;
4026052Sminshall 		}
4126052Sminshall 	}
4226052Sminshall 	if (i == macnum) {
4326052Sminshall 		printf("'%s' macro not found.\n", argv[1]);
4426052Sminshall 		code = -1;
4526052Sminshall 		return;
4626052Sminshall 	}
4726498Sminshall 	(void) strcpy(line2, line);
4826052Sminshall TOP:
4926052Sminshall 	cp1 = macros[i].mac_start;
5026052Sminshall 	while (cp1 != macros[i].mac_end) {
5126052Sminshall 		while (isspace(*cp1)) {
5226052Sminshall 			cp1++;
5326052Sminshall 		}
5426052Sminshall 		cp2 = line;
5526052Sminshall 		while (*cp1 != '\0') {
5626052Sminshall 		      switch(*cp1) {
5726052Sminshall 		   	    case '\\':
5826052Sminshall 				 *cp2++ = *++cp1;
5926052Sminshall 				 break;
6026052Sminshall 			    case '$':
6126052Sminshall 				 if (isdigit(*(cp1+1))) {
6226052Sminshall 				    j = 0;
6326052Sminshall 				    while (isdigit(*++cp1)) {
6426052Sminshall 					  j = 10*j +  *cp1 - '0';
6526052Sminshall 				    }
6626052Sminshall 				    cp1--;
6726052Sminshall 				    if (argc - 2 >= j) {
6826498Sminshall 					(void) strcpy(cp2, argv[j+1]);
6926052Sminshall 					cp2 += strlen(argv[j+1]);
7026052Sminshall 				    }
7126052Sminshall 				    break;
7226052Sminshall 				 }
7326052Sminshall 				 if (*(cp1+1) == 'i') {
7426052Sminshall 					loopflg = 1;
7526052Sminshall 					cp1++;
7626052Sminshall 					if (count < argc) {
7726498Sminshall 					   (void) strcpy(cp2, argv[count]);
7826052Sminshall 					   cp2 += strlen(argv[count]);
7926052Sminshall 					}
8026052Sminshall 					break;
8126052Sminshall 				}
8226052Sminshall 				/* intentional drop through */
8326052Sminshall 			    default:
8426052Sminshall 				*cp2++ = *cp1;
8526052Sminshall 				break;
8626052Sminshall 		      }
8726052Sminshall 		      if (*cp1 != '\0') {
8826052Sminshall 			 cp1++;
8926052Sminshall 		      }
9026052Sminshall 		}
9126052Sminshall 		*cp2 = '\0';
9226052Sminshall 		makeargv();
9326052Sminshall 		c = getcmd(margv[0]);
9426052Sminshall 		if (c == (struct cmd *)-1) {
9526052Sminshall 			printf("?Ambiguous command\n");
9626052Sminshall 			code = -1;
9726052Sminshall 		}
9826052Sminshall 		else if (c == 0) {
9926052Sminshall 			printf("?Invalid command\n");
10026052Sminshall 			code = -1;
10126052Sminshall 		}
10226052Sminshall 		else if (c->c_conn && !connected) {
10326052Sminshall 			printf("Not connected.\n");
10426052Sminshall 			code = -1;
10526052Sminshall 		}
10626052Sminshall 		else {
10726052Sminshall 			if (verbose) {
10826052Sminshall 				printf("%s\n",line);
10926052Sminshall 			}
11026052Sminshall 			(*c->c_handler)(margc, margv);
11126052Sminshall 			if (bell && c->c_bell) {
11236935Skarels 				(void) putchar('\007');
11326052Sminshall 			}
11426498Sminshall 			(void) strcpy(line, line2);
11526052Sminshall 			makeargv();
11626052Sminshall 			argc = margc;
11726052Sminshall 			argv = margv;
11826052Sminshall 		}
11926052Sminshall 		if (cp1 != macros[i].mac_end) {
12026052Sminshall 			cp1++;
12126052Sminshall 		}
12226052Sminshall 	}
12326052Sminshall 	if (loopflg && ++count < argc) {
12426052Sminshall 		goto TOP;
12526052Sminshall 	}
12626052Sminshall }
127