1*26498Sminshall 226052Sminshall /* 326052Sminshall * Copyright (c) 1985 Regents of the University of California. 426052Sminshall * All rights reserved. The Berkeley software License Agreement 526052Sminshall * specifies the terms and conditions for redistribution. 626052Sminshall */ 726052Sminshall 826052Sminshall #ifndef lint 9*26498Sminshall static char sccsid[] = "@(#)domacro.c 1.2 (Berkeley) 03/07/86"; 1026052Sminshall #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; 26*26498Sminshall int count = 2, loopflg = 0; 27*26498Sminshall char line2[200]; 2826052Sminshall extern char **glob(), *globerr; 2926052Sminshall struct cmd *getcmd(), *c; 3026052Sminshall extern struct cmd cmdtab[]; 3126052Sminshall 3226052Sminshall if (argc < 2) { 33*26498Sminshall (void) strcat(line, " "); 3426052Sminshall printf("(macro name) "); 35*26498Sminshall (void) gets(&line[strlen(line)]); 3626052Sminshall makeargv(); 3726052Sminshall argc = margc; 3826052Sminshall argv = margv; 3926052Sminshall } 4026052Sminshall if (argc < 2) { 4126052Sminshall printf("Usage: %s macro_name.\n", argv[0]); 4226052Sminshall code = -1; 4326052Sminshall return; 4426052Sminshall } 4526052Sminshall for (i = 0; i < macnum; ++i) { 4626052Sminshall if (!strncmp(argv[1], macros[i].mac_name, 9)) { 4726052Sminshall break; 4826052Sminshall } 4926052Sminshall } 5026052Sminshall if (i == macnum) { 5126052Sminshall printf("'%s' macro not found.\n", argv[1]); 5226052Sminshall code = -1; 5326052Sminshall return; 5426052Sminshall } 55*26498Sminshall (void) strcpy(line2, line); 5626052Sminshall TOP: 5726052Sminshall cp1 = macros[i].mac_start; 5826052Sminshall while (cp1 != macros[i].mac_end) { 5926052Sminshall while (isspace(*cp1)) { 6026052Sminshall cp1++; 6126052Sminshall } 6226052Sminshall cp2 = line; 6326052Sminshall while (*cp1 != '\0') { 6426052Sminshall switch(*cp1) { 6526052Sminshall case '\\': 6626052Sminshall *cp2++ = *++cp1; 6726052Sminshall break; 6826052Sminshall case '$': 6926052Sminshall if (isdigit(*(cp1+1))) { 7026052Sminshall j = 0; 7126052Sminshall while (isdigit(*++cp1)) { 7226052Sminshall j = 10*j + *cp1 - '0'; 7326052Sminshall } 7426052Sminshall cp1--; 7526052Sminshall if (argc - 2 >= j) { 76*26498Sminshall (void) strcpy(cp2, argv[j+1]); 7726052Sminshall cp2 += strlen(argv[j+1]); 7826052Sminshall } 7926052Sminshall break; 8026052Sminshall } 8126052Sminshall if (*(cp1+1) == 'i') { 8226052Sminshall loopflg = 1; 8326052Sminshall cp1++; 8426052Sminshall if (count < argc) { 85*26498Sminshall (void) strcpy(cp2, argv[count]); 8626052Sminshall cp2 += strlen(argv[count]); 8726052Sminshall } 8826052Sminshall break; 8926052Sminshall } 9026052Sminshall /* intentional drop through */ 9126052Sminshall default: 9226052Sminshall *cp2++ = *cp1; 9326052Sminshall break; 9426052Sminshall } 9526052Sminshall if (*cp1 != '\0') { 9626052Sminshall cp1++; 9726052Sminshall } 9826052Sminshall } 9926052Sminshall *cp2 = '\0'; 10026052Sminshall makeargv(); 10126052Sminshall c = getcmd(margv[0]); 10226052Sminshall if (c == (struct cmd *)-1) { 10326052Sminshall printf("?Ambiguous command\n"); 10426052Sminshall code = -1; 10526052Sminshall } 10626052Sminshall else if (c == 0) { 10726052Sminshall printf("?Invalid command\n"); 10826052Sminshall code = -1; 10926052Sminshall } 11026052Sminshall else if (c->c_conn && !connected) { 11126052Sminshall printf("Not connected.\n"); 11226052Sminshall code = -1; 11326052Sminshall } 11426052Sminshall else { 11526052Sminshall if (verbose) { 11626052Sminshall printf("%s\n",line); 11726052Sminshall } 11826052Sminshall (*c->c_handler)(margc, margv); 11926052Sminshall if (bell && c->c_bell) { 120*26498Sminshall (void) putchar(CTRL(g)); 12126052Sminshall } 122*26498Sminshall (void) strcpy(line, line2); 12326052Sminshall makeargv(); 12426052Sminshall argc = margc; 12526052Sminshall argv = margv; 12626052Sminshall } 12726052Sminshall if (cp1 != macros[i].mac_end) { 12826052Sminshall cp1++; 12926052Sminshall } 13026052Sminshall } 13126052Sminshall if (loopflg && ++count < argc) { 13226052Sminshall goto TOP; 13326052Sminshall } 13426052Sminshall } 135