1 /* 2 * Copyright (c) 1985 Regents of the University of California. 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms are permitted 6 * provided that the above copyright notice and this paragraph are 7 * duplicated in all such forms and that any documentation, 8 * advertising materials, and other materials related to such 9 * distribution and use acknowledge that the software was developed 10 * by the University of California, Berkeley. The name of the 11 * University may not be used to endorse or promote products derived 12 * from this software without specific prior written permission. 13 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR 14 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED 15 * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. 16 */ 17 18 #ifndef lint 19 static char sccsid[] = "@(#)domacro.c 1.5 (Berkeley) 06/29/88"; 20 #endif /* not lint */ 21 22 #include "ftp_var.h" 23 24 #include <signal.h> 25 #include <stdio.h> 26 #include <errno.h> 27 #include <ctype.h> 28 #include <sys/ttychars.h> 29 30 domacro(argc, argv) 31 int argc; 32 char *argv[]; 33 { 34 register int i, j; 35 register char *cp1, *cp2; 36 int count = 2, loopflg = 0; 37 char line2[200]; 38 extern char **glob(), *globerr; 39 struct cmd *getcmd(), *c; 40 extern struct cmd cmdtab[]; 41 42 if (argc < 2) { 43 (void) strcat(line, " "); 44 printf("(macro name) "); 45 (void) gets(&line[strlen(line)]); 46 makeargv(); 47 argc = margc; 48 argv = margv; 49 } 50 if (argc < 2) { 51 printf("Usage: %s macro_name.\n", argv[0]); 52 code = -1; 53 return; 54 } 55 for (i = 0; i < macnum; ++i) { 56 if (!strncmp(argv[1], macros[i].mac_name, 9)) { 57 break; 58 } 59 } 60 if (i == macnum) { 61 printf("'%s' macro not found.\n", argv[1]); 62 code = -1; 63 return; 64 } 65 (void) strcpy(line2, line); 66 TOP: 67 cp1 = macros[i].mac_start; 68 while (cp1 != macros[i].mac_end) { 69 while (isspace(*cp1)) { 70 cp1++; 71 } 72 cp2 = line; 73 while (*cp1 != '\0') { 74 switch(*cp1) { 75 case '\\': 76 *cp2++ = *++cp1; 77 break; 78 case '$': 79 if (isdigit(*(cp1+1))) { 80 j = 0; 81 while (isdigit(*++cp1)) { 82 j = 10*j + *cp1 - '0'; 83 } 84 cp1--; 85 if (argc - 2 >= j) { 86 (void) strcpy(cp2, argv[j+1]); 87 cp2 += strlen(argv[j+1]); 88 } 89 break; 90 } 91 if (*(cp1+1) == 'i') { 92 loopflg = 1; 93 cp1++; 94 if (count < argc) { 95 (void) strcpy(cp2, argv[count]); 96 cp2 += strlen(argv[count]); 97 } 98 break; 99 } 100 /* intentional drop through */ 101 default: 102 *cp2++ = *cp1; 103 break; 104 } 105 if (*cp1 != '\0') { 106 cp1++; 107 } 108 } 109 *cp2 = '\0'; 110 makeargv(); 111 c = getcmd(margv[0]); 112 if (c == (struct cmd *)-1) { 113 printf("?Ambiguous command\n"); 114 code = -1; 115 } 116 else if (c == 0) { 117 printf("?Invalid command\n"); 118 code = -1; 119 } 120 else if (c->c_conn && !connected) { 121 printf("Not connected.\n"); 122 code = -1; 123 } 124 else { 125 if (verbose) { 126 printf("%s\n",line); 127 } 128 (*c->c_handler)(margc, margv); 129 if (bell && c->c_bell) { 130 (void) putchar(CTRL('g')); 131 } 132 (void) strcpy(line, line2); 133 makeargv(); 134 argc = margc; 135 argv = margv; 136 } 137 if (cp1 != macros[i].mac_end) { 138 cp1++; 139 } 140 } 141 if (loopflg && ++count < argc) { 142 goto TOP; 143 } 144 } 145