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