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