summaryrefslogtreecommitdiff
path: root/usr/src/cmd/dirname
diff options
context:
space:
mode:
authormuffin <none@none>2005-11-23 12:27:47 -0800
committermuffin <none@none>2005-11-23 12:27:47 -0800
commit55381082fdea0647bb5d44ceeed7d5af386f30d2 (patch)
tree8e6851940bfff2b264e5ed1aae9203658003f7ff /usr/src/cmd/dirname
parent1a48003f96d5bf304ca739198913e42e5adb9bcf (diff)
downloadillumos-joyent-55381082fdea0647bb5d44ceeed7d5af386f30d2.tar.gz
6210677 dirname and basename are slower than they should be
--HG-- rename : usr/src/cmd/basename/basename.sh => deleted_files/usr/src/cmd/basename/basename.sh rename : usr/src/cmd/dirname/dirname.sh => deleted_files/usr/src/cmd/dirname/dirname.sh
Diffstat (limited to 'usr/src/cmd/dirname')
-rw-r--r--usr/src/cmd/dirname/Makefile7
-rw-r--r--usr/src/cmd/dirname/dirname.c108
-rw-r--r--usr/src/cmd/dirname/dirname.sh53
3 files changed, 111 insertions, 57 deletions
diff --git a/usr/src/cmd/dirname/Makefile b/usr/src/cmd/dirname/Makefile
index 14ff338b02..c4fd585cb9 100644
--- a/usr/src/cmd/dirname/Makefile
+++ b/usr/src/cmd/dirname/Makefile
@@ -22,13 +22,12 @@
#
#ident "%Z%%M% %I% %E% SMI"
#
-# Copyright (c) 1989 by Sun Microsystems, Inc.
+# Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
#
PROG= dirname
-SRCS= $(PROG:%=%.sh)
-
include ../Makefile.cmd
.KEEP_STATE:
@@ -39,6 +38,6 @@ install: all $(ROOTPROG)
clean:
-lint:
+lint: lint_PROG
include ../Makefile.targ
diff --git a/usr/src/cmd/dirname/dirname.c b/usr/src/cmd/dirname/dirname.c
new file mode 100644
index 0000000000..6a07801ea2
--- /dev/null
+++ b/usr/src/cmd/dirname/dirname.c
@@ -0,0 +1,108 @@
+/*
+ * 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 2005 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <locale.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <libintl.h>
+
+int
+main(int argc, char **argv)
+{
+ char *p;
+ char *string;
+
+ /*
+ * For better performance, defer the setlocale()/textdomain()
+ * calls until they get really required.
+ */
+#if !defined(TEXT_DOMAIN)
+#define TEXT_DOMAIN "SYS_TEST"
+#endif
+ if (argc == 1) {
+ (void) puts(".");
+ return (0);
+ }
+ if (strcmp(argv[1], "--") == 0) {
+ argv++;
+ argc--;
+ if (argc == 1) {
+ (void) puts(".");
+ return (0);
+ }
+ }
+ if (argc > 2) {
+ (void) setlocale(LC_ALL, "");
+ (void) textdomain(TEXT_DOMAIN);
+ (void) fprintf(stderr, gettext("Usage: dirname [ path ]\n"));
+ return (1);
+ }
+
+ string = argv[1];
+
+ if (*string == '\0') {
+ (void) puts(".");
+ return (0);
+ }
+
+ /* remove trailing slashes */
+ p = string + strlen(string) - 1;
+ while (p >= string && *p == '/')
+ *p-- = '\0';
+
+ if (*string == '\0') {
+ /* string contained only slashes */
+ (void) puts("/");
+ return (0);
+ }
+
+ /* remove non-slashes */
+ while (p >= string && *p != '/')
+ *p-- = '\0';
+
+ if (*string == '\0') {
+ /* string did not begin with a slash */
+ (void) puts(".");
+ return (0);
+ }
+
+ /* remove slashes delimiting dirname and basename */
+ while (p >= string && *p == '/')
+ *p-- = '\0';
+
+ if (*string == '\0') {
+ /* no dirname part found */
+ (void) puts("/");
+ return (0);
+ }
+ /* now string points to dirname part */
+ (void) puts(string);
+ return (0);
+}
diff --git a/usr/src/cmd/dirname/dirname.sh b/usr/src/cmd/dirname/dirname.sh
deleted file mode 100644
index d3cc0928f6..0000000000
--- a/usr/src/cmd/dirname/dirname.sh
+++ /dev/null
@@ -1,53 +0,0 @@
-#!/usr/bin/sh
-#
-# 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 (c) 1984, 1986, 1987, 1988, 1989 AT&T
-# All Rights Reserved
-#
-#
-# Copyright 2004 Sun Microsystems, Inc. All rights reserved.
-# Use is subject to license terms.
-#
-
-#ident "%Z%%M% %I% %E% SMI"
-
-if [ $# -gt 1 ]
-then
- if [ "$1" = "--" -a $# -le 2 ]
- then
- shift
- else
- echo >&2 `/usr/bin/gettext TEXT_DOMAIN \
- "usage: dirname [ path ]"`
- exit 1
- fi
-fi
-
-# First check for pathnames of form //*non-slash*/* in which case the
-# dirname is /.
-# Otherwise, remove the last component in the pathname and slashes
-# that come before it.
-# If nothing is left, dirname is "."
-exec /usr/bin/expr \
- "${1:-.}/" : '\(/\)/*[^/]*//*$' \| \
- "${1:-.}/" : '\(.*[^/]\)//*[^/][^/]*//*$' \| \
- .