1 /*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License, Version 1.0 only
6 * (the "License"). You may not use this file except in compliance
7 * with the License.
8 *
9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 * or http://www.opensolaris.org/os/licensing.
11 * See the License for the specific language governing permissions
12 * and limitations under the License.
13 *
14 * When distributing Covered Code, include this CDDL HEADER in each
15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 * If applicable, add the following below this CDDL HEADER, with the
17 * fields enclosed by brackets "[]" replaced with your own identifying
18 * information: Portions Copyright [yyyy] [name of copyright owner]
19 *
20 * CDDL HEADER END
21 */
22 /*
23 * Copyright 2001 Sun Microsystems, Inc. All rights reserved.
24 * Use is subject to license terms.
25 */
26
27 /* Copyright (c) 1983, 1984, 1985, 1986, 1987, 1988, 1989 AT&T */
28 /* All Rights Reserved */
29
30 /*
31 * University Copyright- Copyright (c) 1982, 1986, 1988
32 * The Regents of the University of California
33 * All Rights Reserved
34 *
35 * University Acknowledgment- Portions of this document are derived from
36 * software developed by the University of California, Berkeley, and its
37 * contributors.
38 */
39
40 #include <libintl.h>
41 #include <stdlib.h>
42
43 #include "ftp_var.h"
44
45 #include <signal.h>
46 #include <stdio.h>
47 #include <errno.h>
48 #include <ctype.h>
49
50 void
domacro(int argc,char * argv[])51 domacro(int argc, char *argv[])
52 {
53 register int i, j;
54 register char *cp1, *cp2;
55 int count = 2, loopflg = 0;
56 char line2[200];
57 struct cmd *c;
58 int len;
59
60 if (argc < 2) {
61 stop_timer();
62 (void) strcat(line, " ");
63 printf("(macro name) ");
64 (void) gets(&line[strlen(line)]);
65 reset_timer();
66 makeargv();
67 argc = margc;
68 argv = margv;
69 }
70 if (argc < 2) {
71 printf("Usage: %s macro_name.\n", argv[0]);
72 code = -1;
73 return;
74 }
75 for (i = 0; i < macnum; ++i) {
76 if (strncmp(argv[1], macros[i].mac_name, 9) == 0) {
77 break;
78 }
79 }
80 if (i == macnum) {
81 printf("'%s' macro not found.\n", argv[1]);
82 code = -1;
83 return;
84 }
85 (void) strcpy(line2, line);
86 TOP:
87 cp1 = macros[i].mac_start;
88 while (cp1 != macros[i].mac_end) {
89 while (isspace(*cp1)) {
90 cp1++;
91 }
92 cp2 = line;
93 while (*cp1 != '\0') {
94 switch (*cp1) {
95 case '\\':
96 cp1++;
97 if ((len = mblen(cp1, MB_CUR_MAX)) <= 0)
98 len = 1;
99 memcpy(cp2, cp1, len);
100 cp2 += len;
101 cp1 += len;
102 break;
103
104 case '$':
105 if (isdigit(*(cp1+1))) {
106 j = 0;
107 while (isdigit(*++cp1))
108 j = 10 * j + *cp1 - '0';
109 if (argc - 2 >= j) {
110 (void) strcpy(cp2, argv[j+1]);
111 cp2 += strlen(argv[j+1]);
112 }
113 break;
114 }
115 if (*(cp1+1) == 'i') {
116 loopflg = 1;
117 cp1 += 2;
118 if (count < argc) {
119 (void) strcpy(cp2, argv[count]);
120 cp2 += strlen(argv[count]);
121 }
122 break;
123 }
124 /* FALLTHROUGH */
125 default:
126 if ((len = mblen(cp1, MB_CUR_MAX)) <= 0)
127 len = 1;
128 memcpy(cp2, cp1, len);
129 cp2 += len;
130 cp1 += len;
131 break;
132 }
133 }
134 *cp2 = '\0';
135 makeargv();
136 if (margv[0] == NULL) {
137 code = -1;
138 return;
139 } else {
140 c = getcmd(margv[0]);
141 }
142 if (c == (struct cmd *)-1) {
143 printf("?Ambiguous command\n");
144 code = -1;
145 } else if (c == 0) {
146 printf("?Invalid command\n");
147 code = -1;
148 } else if (c->c_conn && !connected) {
149 printf("Not connected.\n");
150 code = -1;
151 } else {
152 if (verbose) {
153 printf("%s\n", line);
154 }
155 (*c->c_handler)(margc, margv);
156 #define CTRL(c) ((c)&037)
157 if (bell && c->c_bell) {
158 (void) putchar(CTRL('g'));
159 }
160 (void) strcpy(line, line2);
161 makeargv();
162 argc = margc;
163 argv = margv;
164 }
165 if (cp1 != macros[i].mac_end) {
166 cp1++;
167 }
168 }
169 if (loopflg && ++count < argc) {
170 goto TOP;
171 }
172 }
173