domacro.c
上传用户:sddyfurun
上传日期:2007-01-04
资源大小:525k
文件大小:4k
源码类别:

代理服务器

开发平台:

Unix_Linux

  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. #ifdef SHOW_SCCSIDS
  34. static char sccsid[] = "@(#)domacro.c 1.8 (Berkeley) 9/28/90";
  35. #endif /* not lint */
  36. #include "ftp_var.h"
  37. #include <signal.h>
  38. #include <stdio.h>
  39. #include <errno.h>
  40. #include <ctype.h>
  41. #if !defined(SCO) && !defined(_SEQUENT_) && !defined(linux)
  42. #include <sys/ttychars.h>
  43. #endif
  44. void domacro(int argc, char *argv[]) {
  45. register int i, j;
  46. register char *cp1, *cp2;
  47. int count = 2, loopflg = 0;
  48. char line2[200];
  49. struct cmd *getcmd(), *c;
  50. extern char **glob();
  51. if (argc < 2 && !another(&argc, &argv, "macro name")) {
  52. printf("Usage: %s macro_name.n", argv[0]);
  53. code = -1;
  54. return;
  55. }
  56. for (i = 0; i < macnum; ++i) {
  57. if (!strncmp(argv[1], macros[i].mac_name, 9)) 
  58. break;
  59. }
  60. if (i == macnum) {
  61. printf("'%s' macro not found.n", argv[1]);
  62. code = -1;
  63. return;
  64. }
  65. (void) strcpy(line2, line);
  66. TOP:
  67. cp1 = macros[i].mac_start;
  68. while (cp1 != macros[i].mac_end) {
  69. while (isspace(*cp1)) {
  70. cp1++;
  71. }
  72. cp2 = line;
  73. while (*cp1 != '') {
  74.       switch(*cp1) {
  75.         case '\':
  76.  *cp2++ = *++cp1;
  77.  break;
  78.     case '$':
  79.  if (isdigit(*(cp1+1))) {
  80.     j = 0;
  81.     while (isdigit(*++cp1)) {
  82.   j = 10*j +  *cp1 - '0';
  83.     }
  84.     cp1--;
  85.     if (argc - 2 >= j) {
  86. (void) strcpy(cp2, argv[j+1]);
  87. cp2 += strlen(argv[j+1]);
  88.     }
  89.     break;
  90.  }
  91.  if (*(cp1+1) == 'i') {
  92. loopflg = 1;
  93. cp1++;
  94. if (count < argc) {
  95.    (void) strcpy(cp2, argv[count]);
  96.    cp2 += strlen(argv[count]);
  97. }
  98. break;
  99. }
  100. /* intentional drop through */
  101.     default:
  102. *cp2++ = *cp1;
  103. break;
  104.       }
  105.       if (*cp1 != '') {
  106.  cp1++;
  107.       }
  108. }
  109. *cp2 = '';
  110. makeargv();
  111. c = getcmd(margv[0]);
  112. if (c == (struct cmd *)-1) {
  113. printf("?Ambiguous commandn");
  114. code = -1;
  115. }
  116. else if (c == 0) {
  117. printf("?Invalid commandn");
  118. code = -1;
  119. }
  120. else if (c->c_conn && !connected) {
  121. printf("Not connected.n");
  122. code = -1;
  123. }
  124. else {
  125. if (verbose) {
  126. printf("%sn",line);
  127. }
  128. (*c->c_handler)(margc, margv);
  129. if (bell && c->c_bell) {
  130. (void) putchar('07');
  131. }
  132. (void) strcpy(line, line2);
  133. makeargv();
  134. argc = margc;
  135. argv = margv;
  136. }
  137. if (cp1 != macros[i].mac_end) {
  138. cp1++;
  139. }
  140. }
  141. if (loopflg && ++count < argc) {
  142. goto TOP;
  143. }
  144. }