Sync with trunk head (part 1 or 2)
[reactos.git] / base / applications / network / 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 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 MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
16 */
17
18 #ifndef lint
19 static char sccsid[] = "@(#)domacro.c 1.6 (Berkeley) 2/28/89";
20 #endif /* not lint */
21
22 #include "ftp_var.h"
23 #include "prototypes.h"
24
25 #include <signal.h>
26 #include <stdio.h>
27 //#include <errno.h>
28 #include <ctype.h>
29 //#include <sys/ttychars.h>
30
31 void domacro(argc, argv)
32 int argc;
33 const char *argv[];
34 {
35 int i, j;
36 const char *cp1;
37 char *cp2;
38 int count = 2, loopflg = 0;
39 char line2[200];
40 struct cmd *getcmd(), *c;
41
42 if (argc < 2) {
43 (void) strcat(line, " ");
44 printf("(macro name) ");
45 (void) fflush(stdout);
46 (void) gets(&line[strlen(line)]);
47 makeargv();
48 argc = margc;
49 argv = margv;
50 }
51 if (argc < 2) {
52 printf("Usage: %s macro_name.\n", argv[0]);
53 (void) fflush(stdout);
54 code = -1;
55 return;
56 }
57 for (i = 0; i < macnum; ++i) {
58 if (!strncmp(argv[1], macros[i].mac_name, 9)) {
59 break;
60 }
61 }
62 if (i == macnum) {
63 printf("'%s' macro not found.\n", argv[1]);
64 (void) fflush(stdout);
65 code = -1;
66 return;
67 }
68 (void) strcpy(line2, line);
69 TOP:
70 cp1 = macros[i].mac_start;
71 while (cp1 != macros[i].mac_end) {
72 while (isspace(*cp1)) {
73 cp1++;
74 }
75 cp2 = line;
76 while (*cp1 != '\0') {
77 switch(*cp1) {
78 case '\\':
79 *cp2++ = *++cp1;
80 break;
81 case '$':
82 if (isdigit(*(cp1+1))) {
83 j = 0;
84 while (isdigit(*++cp1)) {
85 j = 10*j + *cp1 - '0';
86 }
87 cp1--;
88 if (argc - 2 >= j) {
89 (void) strcpy(cp2, argv[j+1]);
90 cp2 += strlen(argv[j+1]);
91 }
92 break;
93 }
94 if (*(cp1+1) == 'i') {
95 loopflg = 1;
96 cp1++;
97 if (count < argc) {
98 (void) strcpy(cp2, argv[count]);
99 cp2 += strlen(argv[count]);
100 }
101 break;
102 }
103 /* intentional drop through */
104 default:
105 *cp2++ = *cp1;
106 break;
107 }
108 if (*cp1 != '\0') {
109 cp1++;
110 }
111 }
112 *cp2 = '\0';
113 makeargv();
114 c = getcmd(margv[0]);
115 if (c == (struct cmd *)-1) {
116 printf("?Ambiguous command\n");
117 code = -1;
118 }
119 else if (c == 0) {
120 printf("?Invalid command\n");
121 code = -1;
122 }
123 else if (c->c_conn && !connected) {
124 printf("Not connected.\n");
125 code = -1;
126 }
127 else {
128 if (verbose) {
129 printf("%s\n",line);
130 }
131 (*c->c_handler)(margc, margv);
132 if (bell && c->c_bell) {
133 (void) putchar('\007');
134 }
135 (void) strcpy(line, line2);
136 makeargv();
137 argc = margc;
138 argv = margv;
139 }
140 if (cp1 != macros[i].mac_end) {
141 cp1++;
142 }
143 (void) fflush(stdout);
144 }
145 if (loopflg && ++count < argc) {
146 goto TOP;
147 }
148 }