OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [uclinux/] [userland/] [ftp/] [ftp/] [domacro.c] - Blame information for rev 1765

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 763 simons
/*
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
/*
35
 * from: @(#)domacro.c  1.8 (Berkeley) 9/28/90
36
 */
37
char domacro_rcsid[] =
38
  "$Id: domacro.c,v 1.1 2002-03-25 22:32:01 simons Exp $";
39
 
40
#include <errno.h>
41
#include <ctype.h>
42
#include <stdio.h>
43
#include <string.h>
44
 
45
#include "ftp_var.h"
46
 
47
void
48
domacro(int argc, char *argv[])
49
{
50
        int margc;
51
        char *marg;
52
        char **margv;
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
 
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) strcpy(line2, line);
75
TOP:
76
        cp1 = macros[i].mac_start;
77
        while (cp1 != macros[i].mac_end) {
78
                while (isspace(*cp1)) {
79
                        cp1++;
80
                }
81
                cp2 = line;
82
                while (*cp1 != '\0') {
83
                      switch(*cp1) {
84
                            case '\\':
85
                                 *cp2++ = *++cp1;
86
                                 break;
87
                            case '$':
88
                                 if (isdigit(*(cp1+1))) {
89
                                    j = 0;
90
                                    while (isdigit(*++cp1)) {
91
                                          j = 10*j +  *cp1 - '0';
92
                                    }
93
                                    cp1--;
94
                                    if (argc - 2 >= j) {
95
                                        (void) strcpy(cp2, argv[j+1]);
96
                                        cp2 += strlen(argv[j+1]);
97
                                    }
98
                                    break;
99
                                 }
100
                                 if (*(cp1+1) == 'i') {
101
                                        loopflg = 1;
102
                                        cp1++;
103
                                        if (count < argc) {
104
                                           (void) strcpy(cp2, argv[count]);
105
                                           cp2 += strlen(argv[count]);
106
                                        }
107
                                        break;
108
                                }
109
                                /* intentional drop through */
110
                            default:
111
                                *cp2++ = *cp1;
112
                                break;
113
                      }
114
                      if (*cp1 != '\0') {
115
                         cp1++;
116
                      }
117
                }
118
                *cp2 = '\0';
119
                margv = makeargv(&margc, &marg);
120
                c = getcmd(margv[0]);
121
                if (c == (struct cmd *)-1) {
122
                        printf("?Ambiguous command\n");
123
                        code = -1;
124
                }
125
                else if (c == NULL) {
126
                        printf("?Invalid command\n");
127
                        code = -1;
128
                }
129
                else if (c->c_conn && !connected) {
130
                        printf("Not connected.\n");
131
                        code = -1;
132
                }
133
                else {
134
                        if (verbose) {
135
                                printf("%s\n",line);
136
                        }
137
                        if (c->c_handler_v) c->c_handler_v(margc, margv);
138
                        else if (c->c_handler_0) c->c_handler_0();
139
                        else c->c_handler_1(marg);
140
 
141
                        if (bell && c->c_bell) {
142
                                (void) putchar('\007');
143
                        }
144
                        (void) strcpy(line, line2);
145
                        margv = makeargv(&margc, &marg);
146
                        argc = margc;
147
                        argv = margv;
148
                }
149
                if (cp1 != macros[i].mac_end) {
150
                        cp1++;
151
                }
152
        }
153
        if (loopflg && ++count < argc) {
154
                goto TOP;
155
        }
156
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.