1*26052Sminshall /* 2*26052Sminshall * Copyright (c) 1985 Regents of the University of California. 3*26052Sminshall * All rights reserved. The Berkeley software License Agreement 4*26052Sminshall * specifies the terms and conditions for redistribution. 5*26052Sminshall */ 6*26052Sminshall 7*26052Sminshall #ifndef lint 8*26052Sminshall static char sccsid[] = "@(#)domacro.c 1.1 (Berkeley) 02/03/86"; 9*26052Sminshall #endif not lint 10*26052Sminshall 11*26052Sminshall #include "ftp_var.h" 12*26052Sminshall 13*26052Sminshall #include <signal.h> 14*26052Sminshall #include <stdio.h> 15*26052Sminshall #include <errno.h> 16*26052Sminshall #include <ctype.h> 17*26052Sminshall #include <sys/ttychars.h> 18*26052Sminshall 19*26052Sminshall jmp_buf macabort; 20*26052Sminshall 21*26052Sminshall domacro(argc, argv) 22*26052Sminshall int argc; 23*26052Sminshall char *argv[]; 24*26052Sminshall { 25*26052Sminshall register int i, j; 26*26052Sminshall register char *cp1, *cp2; 27*26052Sminshall int count = 2, loopflg = 0, (*oldintr)(); 28*26052Sminshall char **gargs, **cpp, line2[200]; 29*26052Sminshall extern char **glob(), *globerr; 30*26052Sminshall struct cmd *getcmd(), *c; 31*26052Sminshall extern struct cmd cmdtab[]; 32*26052Sminshall 33*26052Sminshall if (argc < 2) { 34*26052Sminshall strcat(line, " "); 35*26052Sminshall printf("(macro name) "); 36*26052Sminshall gets(&line[strlen(line)]); 37*26052Sminshall makeargv(); 38*26052Sminshall argc = margc; 39*26052Sminshall argv = margv; 40*26052Sminshall } 41*26052Sminshall if (argc < 2) { 42*26052Sminshall printf("Usage: %s macro_name.\n", argv[0]); 43*26052Sminshall code = -1; 44*26052Sminshall return; 45*26052Sminshall } 46*26052Sminshall for (i = 0; i < macnum; ++i) { 47*26052Sminshall if (!strncmp(argv[1], macros[i].mac_name, 9)) { 48*26052Sminshall break; 49*26052Sminshall } 50*26052Sminshall } 51*26052Sminshall if (i == macnum) { 52*26052Sminshall printf("'%s' macro not found.\n", argv[1]); 53*26052Sminshall code = -1; 54*26052Sminshall return; 55*26052Sminshall } 56*26052Sminshall strcpy(line2, line); 57*26052Sminshall TOP: 58*26052Sminshall cp1 = macros[i].mac_start; 59*26052Sminshall while (cp1 != macros[i].mac_end) { 60*26052Sminshall while (isspace(*cp1)) { 61*26052Sminshall cp1++; 62*26052Sminshall } 63*26052Sminshall cp2 = line; 64*26052Sminshall while (*cp1 != '\0') { 65*26052Sminshall switch(*cp1) { 66*26052Sminshall case '\\': 67*26052Sminshall *cp2++ = *++cp1; 68*26052Sminshall break; 69*26052Sminshall case '$': 70*26052Sminshall if (isdigit(*(cp1+1))) { 71*26052Sminshall j = 0; 72*26052Sminshall while (isdigit(*++cp1)) { 73*26052Sminshall j = 10*j + *cp1 - '0'; 74*26052Sminshall } 75*26052Sminshall cp1--; 76*26052Sminshall if (argc - 2 >= j) { 77*26052Sminshall strcpy(cp2, argv[j+1]); 78*26052Sminshall cp2 += strlen(argv[j+1]); 79*26052Sminshall } 80*26052Sminshall break; 81*26052Sminshall } 82*26052Sminshall if (*(cp1+1) == 'i') { 83*26052Sminshall loopflg = 1; 84*26052Sminshall cp1++; 85*26052Sminshall if (count < argc) { 86*26052Sminshall strcpy(cp2, argv[count]); 87*26052Sminshall cp2 += strlen(argv[count]); 88*26052Sminshall } 89*26052Sminshall break; 90*26052Sminshall } 91*26052Sminshall /* intentional drop through */ 92*26052Sminshall default: 93*26052Sminshall *cp2++ = *cp1; 94*26052Sminshall break; 95*26052Sminshall } 96*26052Sminshall if (*cp1 != '\0') { 97*26052Sminshall cp1++; 98*26052Sminshall } 99*26052Sminshall } 100*26052Sminshall *cp2 = '\0'; 101*26052Sminshall makeargv(); 102*26052Sminshall c = getcmd(margv[0]); 103*26052Sminshall if (c == (struct cmd *)-1) { 104*26052Sminshall printf("?Ambiguous command\n"); 105*26052Sminshall code = -1; 106*26052Sminshall } 107*26052Sminshall else if (c == 0) { 108*26052Sminshall printf("?Invalid command\n"); 109*26052Sminshall code = -1; 110*26052Sminshall } 111*26052Sminshall else if (c->c_conn && !connected) { 112*26052Sminshall printf("Not connected.\n"); 113*26052Sminshall code = -1; 114*26052Sminshall } 115*26052Sminshall else { 116*26052Sminshall if (verbose) { 117*26052Sminshall printf("%s\n",line); 118*26052Sminshall } 119*26052Sminshall (*c->c_handler)(margc, margv); 120*26052Sminshall if (bell && c->c_bell) { 121*26052Sminshall putchar(CTRL(g)); 122*26052Sminshall } 123*26052Sminshall strcpy(line, line2); 124*26052Sminshall makeargv(); 125*26052Sminshall argc = margc; 126*26052Sminshall argv = margv; 127*26052Sminshall } 128*26052Sminshall if (cp1 != macros[i].mac_end) { 129*26052Sminshall cp1++; 130*26052Sminshall } 131*26052Sminshall } 132*26052Sminshall if (loopflg && ++count < argc) { 133*26052Sminshall goto TOP; 134*26052Sminshall } 135*26052Sminshall } 136