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