1cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* dirname.c -- return all but the last element in a file name
2cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   Copyright (C) 1990, 1998, 2000, 2001, 2003, 2004, 2005 Free Software
4cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   Foundation, Inc.
5cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   This program is free software; you can redistribute it and/or modify
7cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   it under the terms of the GNU General Public License as published by
8cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   the Free Software Foundation; either version 2, or (at your option)
9cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   any later version.
10cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
11cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   This program is distributed in the hope that it will be useful,
12cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   but WITHOUT ANY WARRANTY; without even the implied warranty of
13cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   GNU General Public License for more details.
15cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
16cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   You should have received a copy of the GNU General Public License
17cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   along with this program; if not, write to the Free Software Foundation,
18cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
19cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
20cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#ifdef HAVE_CONFIG_H
21cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# include <config.h>
22cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
23cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
24cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "dirname.h"
25cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
26cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include <string.h>
27cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "xalloc.h"
28cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
29cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Return the length of `dirname (FILE)', or zero if FILE is
30cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   in the working directory.  Works properly even if
31cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   there are trailing slashes (by effectively ignoring them).  */
32cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectsize_t
33cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdir_len (char const *file)
34cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
35cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  size_t prefix_length = FILE_SYSTEM_PREFIX_LEN (file);
36cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  size_t length;
37cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
38cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Strip the basename and any redundant slashes before it.  */
39cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  for (length = base_name (file) - file;  prefix_length < length;  length--)
40cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    if (! ISSLASH (file[length - 1]))
41cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      return length;
42cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
43cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* But don't strip the only slash from "/".  */
44cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return prefix_length + ISSLASH (file[prefix_length]);
45cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
46cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
47cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Return the leading directories part of FILE,
48cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   allocated with xmalloc.
49cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   Works properly even if there are trailing slashes
50cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   (by effectively ignoring them).  */
51cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
52cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectchar *
53cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdir_name (char const *file)
54cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
55cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  size_t length = dir_len (file);
56cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  bool append_dot = (length == FILE_SYSTEM_PREFIX_LEN (file));
57cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  char *dir = xmalloc (length + append_dot + 1);
58cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  memcpy (dir, file, length);
59cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (append_dot)
60cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    dir[length++] = '.';
61cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  dir[length] = 0;
62cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return dir;
63cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
64cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
65cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#ifdef TEST_DIRNAME
66cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*
67cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
68cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectRun the test like this (expect no output):
69cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  gcc -DHAVE_CONFIG_H -DTEST_DIRNAME -I.. -O -Wall \
70cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     basename.c dirname.c xmalloc.c error.c
71cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  sed -n '/^BEGIN-DATA$/,/^END-DATA$/p' dirname.c|grep -v DATA|./a.out
72cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
73cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectIf it's been built on a DOS or Windows platforms, run another test like
74cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectthis (again, expect no output):
75cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  sed -n '/^BEGIN-DOS-DATA$/,/^END-DOS-DATA$/p' dirname.c|grep -v DATA|./a.out
76cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
77cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectBEGIN-DATA
78cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfoo//// .
79cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbar/foo//// bar
80cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectfoo/ .
81cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/ /
82cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project. .
83cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecta .
84cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectEND-DATA
85cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
86cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectBEGIN-DOS-DATA
87cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectc:///// c:/
88cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectc:/ c:/
89cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectc:/. c:/
90cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectc:foo c:.
91cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectc:foo/bar c:foo
92cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source ProjectEND-DOS-DATA
93cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
94cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project*/
95cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
96cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define MAX_BUFF_LEN 1024
97cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# include <stdio.h>
98cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
99cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectchar *program_name;
100cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
101cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectint
102cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmain (int argc, char *argv[])
103cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
104cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  char buff[MAX_BUFF_LEN + 1];
105cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
106cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  program_name = argv[0];
107cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
108cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  buff[MAX_BUFF_LEN] = 0;
109cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  while (fgets (buff, MAX_BUFF_LEN, stdin) && buff[0])
110cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    {
111cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      char file[MAX_BUFF_LEN];
112cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      char expected_result[MAX_BUFF_LEN];
113cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      char const *result;
114cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      sscanf (buff, "%s %s", file, expected_result);
115cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      result = dir_name (file);
116cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      if (strcmp (result, expected_result))
117cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	printf ("%s: got %s, expected %s\n", file, result, expected_result);
118cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    }
119cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return 0;
120cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
121cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
122