|
|
1.1 root 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:
24: #include <stdio.h>
25: #include <errno.h>
26: #include <ctype.h>
27:
28: domacro(argc, argv)
29: int argc;
30: char *argv[];
31: {
32: register int i, j;
33: register char *cp1, *cp2;
34: int count = 2, loopflg = 0;
35: char line2[200];
36: extern char **glob(), *globerr;
37: struct cmd *getcmd(), *c;
38: extern struct cmd cmdtab[];
39:
40: if (argc < 2) {
41: (void) strcat(line, " ");
42: printf("(macro name) ");
43: safegets(&line[strlen(line)], sizeof(line)-strlen(line));
44: makeargv();
45: argc = margc;
46: argv = margv;
47: }
48: if (argc < 2) {
49: printf("Usage: %s macro_name.\n", argv[0]);
50: code = -1;
51: return;
52: }
53: for (i = 0; i < macnum; ++i) {
54: if (!strncmp(argv[1], macros[i].mac_name, 9)) {
55: break;
56: }
57: }
58: if (i == macnum) {
59: printf("'%s' macro not found.\n", argv[1]);
60: code = -1;
61: return;
62: }
63: (void) strcpy(line2, line);
64: TOP:
65: cp1 = macros[i].mac_start;
66: while (cp1 != macros[i].mac_end) {
67: while (isspace(*cp1)) {
68: cp1++;
69: }
70: cp2 = line;
71: while (*cp1 != '\0') {
72: switch(*cp1) {
73: case '\\':
74: *cp2++ = *++cp1;
75: break;
76: case '$':
77: if (isdigit(*(cp1+1))) {
78: j = 0;
79: while (isdigit(*++cp1)) {
80: j = 10*j + *cp1 - '0';
81: }
82: cp1--;
83: if (argc - 2 >= j) {
84: (void) strcpy(cp2, argv[j+1]);
85: cp2 += strlen(argv[j+1]);
86: }
87: break;
88: }
89: if (*(cp1+1) == 'i') {
90: loopflg = 1;
91: cp1++;
92: if (count < argc) {
93: (void) strcpy(cp2, argv[count]);
94: cp2 += strlen(argv[count]);
95: }
96: break;
97: }
98: /* intentional drop through */
99: default:
100: *cp2++ = *cp1;
101: break;
102: }
103: if (*cp1 != '\0') {
104: cp1++;
105: }
106: }
107: *cp2 = '\0';
108: makeargv();
109: c = getcmd(margv[0]);
110: if (c == (struct cmd *)-1) {
111: printf("?Ambiguous command\n");
112: code = -1;
113: }
114: else if (c == 0) {
115: printf("?Invalid command\n");
116: code = -1;
117: }
118: else if (c->c_conn && !connected) {
119: printf("Not connected.\n");
120: code = -1;
121: }
122: else {
123: if (verbose) {
124: printf("%s\n",line);
125: }
126: (*c->c_handler)(margc, margv);
127: if (bell && c->c_bell) {
128: (void) putchar('\007');
129: }
130: (void) strcpy(line, line2);
131: makeargv();
132: argc = margc;
133: argv = margv;
134: }
135: if (cp1 != macros[i].mac_end) {
136: cp1++;
137: }
138: }
139: if (loopflg && ++count < argc) {
140: goto TOP;
141: }
142: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.