126052Sminshall /* 262009Sbostic * Copyright (c) 1985, 1993 362009Sbostic * The Regents of the University of California. All rights reserved. 433737Sbostic * 542665Sbostic * %sccs.include.redist.c% 626052Sminshall */ 726052Sminshall 826052Sminshall #ifndef lint 9*66670Spendry static char sccsid[] = "@(#)domacro.c 8.2 (Berkeley) 04/02/94"; 1033737Sbostic #endif /* not lint */ 1126052Sminshall 12*66670Spendry #include <ctype.h> 1326052Sminshall #include <signal.h> 1426052Sminshall #include <stdio.h> 15*66670Spendry #include <strings.h> 1626052Sminshall 17*66670Spendry #include "ftp_var.h" 18*66670Spendry 19*66670Spendry void 2026052Sminshall domacro(argc, argv) 2126052Sminshall int argc; 2226052Sminshall char *argv[]; 2326052Sminshall { 24*66670Spendry int i, j, count = 2, loopflg = 0; 25*66670Spendry char *cp1, *cp2, line2[200]; 26*66670Spendry 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