1/* basename - return nondirectory portion of pathname */
2
3/* See Makefile for compilation details. */
4
5#include "config.h"
6
7#if defined (HAVE_UNISTD_H)
8#  include <unistd.h>
9#endif
10
11#include <stdio.h>
12#include "builtins.h"
13#include "shell.h"
14
15basename_builtin (list)
16     WORD_LIST *list;
17{
18  int slen, sufflen, off;
19  char *string, *suffix, *fn;
20
21  if (list == 0)
22    {
23      builtin_usage ();
24      return (EX_USAGE);
25    }
26
27  if (no_options (list))
28    return (EX_USAGE);
29
30  string = list->word->word;
31  suffix = (char *)NULL;
32  if (list->next)
33    {
34      list = list->next;
35      suffix = list->word->word;
36    }
37
38  if (list->next)
39    {
40      builtin_usage ();
41      return (EX_USAGE);
42    }
43
44  slen = strlen (string);
45
46  /* Strip trailing slashes */
47  while (slen > 0 && string[slen - 1] == '/')
48    slen--;
49
50  /* (2) If string consists entirely of slash characters, string shall be
51	 set to a single slash character.  In this case, skip steps (3)
52	 through (5). */
53  if (slen == 0)
54    {
55      fputs ("/\n", stdout);
56      return (EXECUTION_SUCCESS);
57    }
58
59  /* (3) If there are any trailing slash characters in string, they
60	 shall be removed. */
61  string[slen] = '\0';
62
63  /* (4) If there are any slash characters remaining in string, the prefix
64	 of string up to an including the last slash character in string
65	 shall be removed. */
66  while (--slen >= 0)
67    if (string[slen] == '/')
68      break;
69
70  fn = string + slen + 1;
71
72  /* (5) If the suffix operand is present, is not identical to the
73	 characters remaining in string, and is identical to a suffix
74	 of the characters remaining in string, the suffix suffix
75	 shall be removed from string.  Otherwise, string shall not be
76	 modified by this step. */
77  if (suffix)
78    {
79      sufflen = strlen (suffix);
80      slen = strlen (fn);
81      if (sufflen < slen)
82        {
83          off = slen - sufflen;
84          if (strcmp (fn + off, suffix) == 0)
85            fn[off] = '\0';
86        }
87    }
88  printf ("%s\n", fn);
89  return (EXECUTION_SUCCESS);
90}
91
92char *basename_doc[] = {
93	"The STRING is converted to a filename corresponding to the last",
94	"pathname component in STRING.  If the suffix string SUFFIX is",
95	"supplied, it is removed.",
96	(char *)NULL
97};
98
99/* The standard structure describing a builtin command.  bash keeps an array
100   of these structures. */
101struct builtin basename_struct = {
102	"basename",		/* builtin name */
103	basename_builtin,	/* function implementing the builtin */
104	BUILTIN_ENABLED,	/* initial flags for builtin */
105	basename_doc,		/* array of long documentation strings. */
106	"basename string [suffix]",	/* usage synopsis */
107	0			/* reserved for internal use */
108};
109