This commit was manufactured by cvs2svn to create tag
[krb5.git] / src / appl / gssftp / ftp / domacro.c
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, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  * 3. All advertising materials mentioning features or use of this software
14  *    must display the following acknowledgement:
15  *      This product includes software developed by the University of
16  *      California, Berkeley and its contributors.
17  * 4. Neither the name of the University nor the names of its contributors
18  *    may be used to endorse or promote products derived from this software
19  *    without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31  * SUCH DAMAGE.
32  */
33
34 #ifndef lint
35 static char sccsid[] = "@(#)domacro.c   1.8 (Berkeley) 9/28/90";
36 #endif /* not lint */
37
38 #include <stdio.h>
39
40 #include "ftp_var.h"
41
42 #include <signal.h>
43 #include <errno.h>
44 #include <ctype.h>
45 #include <string.h>
46
47 domacro(argc, argv)
48         int argc;
49         char *argv[];
50 {
51         register int i, j;
52         register char *cp1, *cp2;
53         int count = 2, loopflg = 0;
54         char line2[200];
55         extern char **glob(), *globerr;
56         struct cmd *getcmd(), *c;
57         extern struct cmd cmdtab[];
58
59         if (argc < 2 && !another(&argc, &argv, "macro name")) {
60                 printf("Usage: %s macro_name.\n", argv[0]);
61                 code = -1;
62                 return;
63         }
64         for (i = 0; i < macnum; ++i) {
65                 if (!strncmp(argv[1], macros[i].mac_name, 9)) {
66                         break;
67                 }
68         }
69         if (i == macnum) {
70                 printf("'%s' macro not found.\n", argv[1]);
71                 code = -1;
72                 return;
73         }
74         (void) strncpy(line2, line, sizeof(line2) - 1);
75         line2[sizeof(line2) - 1] = '\0';
76 TOP:
77         cp1 = macros[i].mac_start;
78         while (cp1 != macros[i].mac_end) {
79                 while (isspace(*cp1)) {
80                         cp1++;
81                 }
82                 cp2 = line;
83                 while (*cp1 != '\0') {
84                       switch(*cp1) {
85                             case '\\':
86                                  *cp2++ = *++cp1;
87                                  break;
88                             case '$':
89                                  if (isdigit(*(cp1+1))) {
90                                     j = 0;
91                                     while (isdigit(*++cp1)) {
92                                           j = 10*j +  *cp1 - '0';
93                                     }
94                                     cp1--;
95                                     if (argc - 2 >= j) {
96                                         if(cp2 + strlen(argv[j+1]) - line < sizeof(line))
97                                         (void) strncpy(cp2, argv[j+1],
98                                                        sizeof(line) - 1 -
99                                                        (cp2 - line));
100                                         line[sizeof(line) - 1] = '\0';
101                                         cp2 += strlen(argv[j+1]);
102                                     }
103                                     break;
104                                  }
105                                  if (*(cp1+1) == 'i') {
106                                         loopflg = 1;
107                                         cp1++;
108                                         if (count < argc) {
109                                            if(cp2 + strlen(argv[j+1]) - line < sizeof(line))
110                                            (void) strncpy(cp2, argv[count],
111                                                           sizeof(line) - 1 -
112                                                           (cp2 - line));
113                                            line[sizeof(line) - 1] = '\0';
114                                            cp2 += strlen(argv[count]);
115                                         }
116                                         break;
117                                 }
118                                 /* intentional drop through */
119                             default:
120                                 *cp2++ = *cp1;
121                                 break;
122                       }
123                       if (*cp1 != '\0') {
124                          cp1++;
125                       }
126                 }
127                 *cp2 = '\0';
128                 makeargv();
129                 c = getcmd(margv[0]);
130                 if (c == (struct cmd *)-1) {
131                         printf("?Ambiguous command\n");
132                         code = -1;
133                 }
134                 else if (c == 0) {
135                         printf("?Invalid command\n");
136                         code = -1;
137                 }
138                 else if (c->c_conn && !connected) {
139                         printf("Not connected.\n");
140                         code = -1;
141                 }
142                 else {
143                         if (verbose) {
144                                 printf("%s\n",line);
145                         }
146                         (*c->c_handler)(margc, margv);
147                         if (bell && c->c_bell) {
148                                 (void) putchar('\007');
149                         }
150                         (void) strncpy(line, line2, sizeof(line) - 1);
151                         line[sizeof(line) - 1] = '\0';
152                         makeargv();
153                         argc = margc;
154                         argv = margv;
155                 }
156                 if (cp1 != macros[i].mac_end) {
157                         cp1++;
158                 }
159         }
160         if (loopflg && ++count < argc) {
161                 goto TOP;
162         }
163 }