xref: /csrg-svn/usr.bin/ftp/domacro.c (revision 66672)
126052Sminshall /*
2*66672Spendry  * Copyright (c) 1985, 1993, 1994
362009Sbostic  *	The Regents of the University of California.  All rights reserved.
433737Sbostic  *
542665Sbostic  * %sccs.include.redist.c%
626052Sminshall  */
726052Sminshall 
826052Sminshall #ifndef lint
9*66672Spendry static char sccsid[] = "@(#)domacro.c	8.3 (Berkeley) 04/02/94";
1033737Sbostic #endif /* not lint */
1126052Sminshall 
1266670Spendry #include <ctype.h>
1326052Sminshall #include <signal.h>
1426052Sminshall #include <stdio.h>
1566670Spendry #include <strings.h>
1626052Sminshall 
1766670Spendry #include "ftp_var.h"
1866670Spendry 
1966670Spendry void
domacro(argc,argv)2026052Sminshall domacro(argc, argv)
2126052Sminshall 	int argc;
2226052Sminshall 	char *argv[];
2326052Sminshall {
2466670Spendry 	int i, j, count = 2, loopflg = 0;
2566670Spendry 	char *cp1, *cp2, line2[200];
2666670Spendry 	struct cmd *c;
2726052Sminshall 
2845260Sbostic 	if (argc < 2 && !another(&argc, &argv, "macro name")) {
2926052Sminshall 		printf("Usage: %s macro_name.\n", argv[0]);
3026052Sminshall 		code = -1;
3126052Sminshall 		return;
3226052Sminshall 	}
3326052Sminshall 	for (i = 0; i < macnum; ++i) {
3426052Sminshall 		if (!strncmp(argv[1], macros[i].mac_name, 9)) {
3526052Sminshall 			break;
3626052Sminshall 		}
3726052Sminshall 	}
3826052Sminshall 	if (i == macnum) {
3926052Sminshall 		printf("'%s' macro not found.\n", argv[1]);
4026052Sminshall 		code = -1;
4126052Sminshall 		return;
4226052Sminshall 	}
4326498Sminshall 	(void) strcpy(line2, line);
4426052Sminshall TOP:
4526052Sminshall 	cp1 = macros[i].mac_start;
4626052Sminshall 	while (cp1 != macros[i].mac_end) {
4726052Sminshall 		while (isspace(*cp1)) {
4826052Sminshall 			cp1++;
4926052Sminshall 		}
5026052Sminshall 		cp2 = line;
5126052Sminshall 		while (*cp1 != '\0') {
5226052Sminshall 		      switch(*cp1) {
5326052Sminshall 		   	    case '\\':
5426052Sminshall 				 *cp2++ = *++cp1;
5526052Sminshall 				 break;
5626052Sminshall 			    case '$':
5726052Sminshall 				 if (isdigit(*(cp1+1))) {
5826052Sminshall 				    j = 0;
5926052Sminshall 				    while (isdigit(*++cp1)) {
6026052Sminshall 					  j = 10*j +  *cp1 - '0';
6126052Sminshall 				    }
6226052Sminshall 				    cp1--;
6326052Sminshall 				    if (argc - 2 >= j) {
6426498Sminshall 					(void) strcpy(cp2, argv[j+1]);
6526052Sminshall 					cp2 += strlen(argv[j+1]);
6626052Sminshall 				    }
6726052Sminshall 				    break;
6826052Sminshall 				 }
6926052Sminshall 				 if (*(cp1+1) == 'i') {
7026052Sminshall 					loopflg = 1;
7126052Sminshall 					cp1++;
7226052Sminshall 					if (count < argc) {
7326498Sminshall 					   (void) strcpy(cp2, argv[count]);
7426052Sminshall 					   cp2 += strlen(argv[count]);
7526052Sminshall 					}
7626052Sminshall 					break;
7726052Sminshall 				}
7826052Sminshall 				/* intentional drop through */
7926052Sminshall 			    default:
8026052Sminshall 				*cp2++ = *cp1;
8126052Sminshall 				break;
8226052Sminshall 		      }
8326052Sminshall 		      if (*cp1 != '\0') {
8426052Sminshall 			 cp1++;
8526052Sminshall 		      }
8626052Sminshall 		}
8726052Sminshall 		*cp2 = '\0';
8826052Sminshall 		makeargv();
8926052Sminshall 		c = getcmd(margv[0]);
9026052Sminshall 		if (c == (struct cmd *)-1) {
9126052Sminshall 			printf("?Ambiguous command\n");
9226052Sminshall 			code = -1;
9326052Sminshall 		}
9426052Sminshall 		else if (c == 0) {
9526052Sminshall 			printf("?Invalid command\n");
9626052Sminshall 			code = -1;
9726052Sminshall 		}
9826052Sminshall 		else if (c->c_conn && !connected) {
9926052Sminshall 			printf("Not connected.\n");
10026052Sminshall 			code = -1;
10126052Sminshall 		}
10226052Sminshall 		else {
10326052Sminshall 			if (verbose) {
10426052Sminshall 				printf("%s\n",line);
10526052Sminshall 			}
10626052Sminshall 			(*c->c_handler)(margc, margv);
10726052Sminshall 			if (bell && c->c_bell) {
10836935Skarels 				(void) putchar('\007');
10926052Sminshall 			}
11026498Sminshall 			(void) strcpy(line, line2);
11126052Sminshall 			makeargv();
11226052Sminshall 			argc = margc;
11326052Sminshall 			argv = margv;
11426052Sminshall 		}
11526052Sminshall 		if (cp1 != macros[i].mac_end) {
11626052Sminshall 			cp1++;
11726052Sminshall 		}
11826052Sminshall 	}
11926052Sminshall 	if (loopflg && ++count < argc) {
12026052Sminshall 		goto TOP;
12126052Sminshall 	}
12226052Sminshall }
123