diff usr/src/cmd/cmd-inet/usr.bin/ftp/domacro.c @ 0:c9caec207d52 b86

Initial porting based on b86
author Koji Uno <koji.uno@sun.com>
date Tue, 02 Jun 2009 18:56:50 +0900
parents
children 1a15d5aaf794
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/usr/src/cmd/cmd-inet/usr.bin/ftp/domacro.c	Tue Jun 02 18:56:50 2009 +0900
@@ -0,0 +1,174 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ *	Copyright 2001 Sun Microsystems, Inc.  All rights reserved.
+ *	Use is subject to license terms.
+ */
+
+/*	Copyright (c) 1983, 1984, 1985, 1986, 1987, 1988, 1989 AT&T	*/
+/*	All Rights Reserved  	*/
+
+/*
+ *	University Copyright- Copyright (c) 1982, 1986, 1988
+ *	The Regents of the University of California
+ *	All Rights Reserved
+ *
+ *	University Acknowledgment- Portions of this document are derived from
+ *	software developed by the University of California, Berkeley, and its
+ *	contributors.
+ */
+
+#pragma ident	"@(#)domacro.c	1.16	05/06/08 SMI"
+
+#include <libintl.h>
+#include <stdlib.h>
+
+#include "ftp_var.h"
+
+#include <signal.h>
+#include <stdio.h>
+#include <errno.h>
+#include <ctype.h>
+
+void
+domacro(int argc, char *argv[])
+{
+	register int i, j;
+	register char *cp1, *cp2;
+	int count = 2, loopflg = 0;
+	char line2[200];
+	struct cmd *c;
+	int	len;
+
+	if (argc < 2) {
+		stop_timer();
+		(void) strcat(line, " ");
+		printf("(macro name) ");
+		(void) gets(&line[strlen(line)]);
+		reset_timer();
+		makeargv();
+		argc = margc;
+		argv = margv;
+	}
+	if (argc < 2) {
+		printf("Usage: %s macro_name.\n", argv[0]);
+		code = -1;
+		return;
+	}
+	for (i = 0; i < macnum; ++i) {
+		if (strncmp(argv[1], macros[i].mac_name, 9) == 0) {
+			break;
+		}
+	}
+	if (i == macnum) {
+		printf("'%s' macro not found.\n", argv[1]);
+		code = -1;
+		return;
+	}
+	(void) strcpy(line2, line);
+TOP:
+	cp1 = macros[i].mac_start;
+	while (cp1 != macros[i].mac_end) {
+		while (isspace(*cp1)) {
+			cp1++;
+		}
+		cp2 = line;
+		while (*cp1 != '\0') {
+			switch (*cp1) {
+			case '\\':
+				cp1++;
+				if ((len = mblen(cp1, MB_CUR_MAX)) <= 0)
+					len = 1;
+				memcpy(cp2, cp1, len);
+				cp2 += len;
+				cp1 += len;
+				break;
+
+			case '$':
+				if (isdigit(*(cp1+1))) {
+					j = 0;
+					while (isdigit(*++cp1))
+						j = 10 * j +  *cp1 - '0';
+					if (argc - 2 >= j) {
+						(void) strcpy(cp2, argv[j+1]);
+						cp2 += strlen(argv[j+1]);
+					}
+					break;
+				}
+				if (*(cp1+1) == 'i') {
+					loopflg = 1;
+					cp1 += 2;
+					if (count < argc) {
+						(void) strcpy(cp2, argv[count]);
+						cp2 += strlen(argv[count]);
+					}
+					break;
+				}
+				/* intentional drop through */
+			default:
+				if ((len = mblen(cp1, MB_CUR_MAX)) <= 0)
+					len = 1;
+				memcpy(cp2, cp1, len);
+				cp2 += len;
+				cp1 += len;
+				break;
+			}
+		}
+		*cp2 = '\0';
+		makeargv();
+		if (margv[0] == NULL) {
+			code = -1;
+			return;
+		} else {
+			c = getcmd(margv[0]);
+		}
+		if (c == (struct cmd *)-1) {
+			printf("?Ambiguous command\n");
+			code = -1;
+		} else if (c == 0) {
+			printf("?Invalid command\n");
+			code = -1;
+		} else if (c->c_conn && !connected) {
+			printf("Not connected.\n");
+			code = -1;
+		} else {
+			if (verbose) {
+				printf("%s\n", line);
+			}
+			(*c->c_handler)(margc, margv);
+#define	CTRL(c) ((c)&037)
+			if (bell && c->c_bell) {
+				(void) putchar(CTRL('g'));
+			}
+			(void) strcpy(line, line2);
+			makeargv();
+			argc = margc;
+			argv = margv;
+		}
+		if (cp1 != macros[i].mac_end) {
+			cp1++;
+		}
+	}
+	if (loopflg && ++count < argc) {
+		goto TOP;
+	}
+}