OpenCoverage

makepath.c

Absolute File Name:/home/opencoverage/opencoverage/guest-scripts/bash/src/lib/sh/makepath.c
Source codeSwitch to Preprocessed file
LineSourceCount
1/* makepath.c - glue PATH and DIR together into a full pathname. */-
2-
3/* Copyright (C) 1987, 1989, 1991 Free Software Foundation, Inc.-
4-
5 This file is part of GNU Bash, the Bourne Again SHell.-
6-
7 Bash is free software: you can redistribute it and/or modify-
8 it under the terms of the GNU General Public License as published by-
9 the Free Software Foundation, either version 3 of the License, or-
10 (at your option) any later version.-
11-
12 Bash is distributed in the hope that it will be useful,-
13 but WITHOUT ANY WARRANTY; without even the implied warranty of-
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the-
15 GNU General Public License for more details.-
16-
17 You should have received a copy of the GNU General Public License-
18 along with Bash. If not, see <http://www.gnu.org/licenses/>.-
19*/-
20-
21#include <config.h>-
22-
23#if defined (HAVE_UNISTD_H)-
24# ifdef _MINIX-
25# include <sys/types.h>-
26# endif-
27# include <unistd.h>-
28#endif-
29-
30#include <bashansi.h>-
31#include "shell.h"-
32-
33#include <tilde/tilde.h>-
34-
35#ifndef NULL-
36# define NULL 0-
37#endif-
38-
39/* MAKE SURE THESE AGREE WITH ../../externs.h. */-
40-
41#ifndef MP_DOTILDE-
42# define MP_DOTILDE 0x01-
43# define MP_DOCWD 0x02-
44# define MP_RMDOT 0x04-
45# define MP_IGNDOT 0x08-
46#endif-
47-
48extern char *get_working_directory __P((char *));-
49-
50static char *nullpath = "";-
51-
52/* Take PATH, an element from, e.g., $CDPATH, and DIR, a directory name,-
53 and paste them together into PATH/DIR. Tilde expansion is performed on-
54 PATH if (flags & MP_DOTILDE) is non-zero. If PATH is NULL or the empty-
55 string, it is converted to the current directory. A full pathname is-
56 used if (flags & MP_DOCWD) is non-zero, otherwise `./' is used. If-
57 (flags & MP_RMDOT) is non-zero, any `./' is removed from the beginning-
58 of DIR. If (flags & MP_IGNDOT) is non-zero, a PATH that is "." or "./"-
59 is ignored. */-
60-
61#define MAKEDOT() \-
62 do { \-
63 xpath = (char *)xmalloc (2); \-
64 xpath[0] = '.'; \-
65 xpath[1] = '\0'; \-
66 pathlen = 1; \-
67 } while (0)-
68-
69char *-
70sh_makepath (path, dir, flags)-
71 const char *path, *dir;-
72 int flags;-
73{-
74 int dirlen, pathlen;-
75 char *ret, *xpath, *xdir, *r, *s;-
76-
77 if (path == 0 || *path == '\0')
path == 0Description
TRUEnever evaluated
FALSEevaluated 31544 times by 1 test
Evaluated by:
  • Self test
*path == '\0'Description
TRUEnever evaluated
FALSEevaluated 31544 times by 1 test
Evaluated by:
  • Self test
0-31544
78 {-
79 if (flags & MP_DOCWD)
flags & 0x02Description
TRUEnever evaluated
FALSEnever evaluated
0
80 {-
81 xpath = get_working_directory ("sh_makepath");-
82 if (xpath == 0)
xpath == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
83 {-
84 ret = get_string_value ("PWD");-
85 if (ret)
retDescription
TRUEnever evaluated
FALSEnever evaluated
0
86 xpath = savestring (ret);
never executed: xpath = (char *)strcpy (sh_xmalloc((1 + strlen (ret)), "makepath.c", 86), (ret));
0
87 }
never executed: end of block
0
88 if (xpath == 0)
xpath == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
89 MAKEDOT();
never executed: end of block
0
90 else-
91 pathlen = strlen (xpath);
never executed: pathlen = strlen (xpath);
0
92 }-
93 else-
94 MAKEDOT();
never executed: end of block
0
95 }-
96 else if ((flags & MP_IGNDOT) && path[0] == '.' && (path[1] == '\0' ||
(flags & 0x08)Description
TRUEevaluated 579 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 30965 times by 1 test
Evaluated by:
  • Self test
path[0] == '.'Description
TRUEevaluated 94 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 485 times by 1 test
Evaluated by:
  • Self test
path[1] == '\0'Description
TRUEevaluated 94 times by 1 test
Evaluated by:
  • Self test
FALSEnever evaluated
0-30965
97 (path[1] == '/' && path[2] == '\0')))
path[1] == '/'Description
TRUEnever evaluated
FALSEnever evaluated
path[2] == '\0'Description
TRUEnever evaluated
FALSEnever evaluated
0
98 {-
99 xpath = nullpath;-
100 pathlen = 0;-
101 }
executed 94 times by 1 test: end of block
Executed by:
  • Self test
94
102 else-
103 {-
104 xpath = ((flags & MP_DOTILDE) && *path == '~') ? bash_tilde_expand (path, 0) : (char *)path;
(flags & 0x01)Description
TRUEevaluated 2 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 31448 times by 1 test
Evaluated by:
  • Self test
*path == '~'Description
TRUEnever evaluated
FALSEevaluated 2 times by 1 test
Evaluated by:
  • Self test
0-31448
105 pathlen = strlen (xpath);-
106 }
executed 31450 times by 1 test: end of block
Executed by:
  • Self test
31450
107-
108 xdir = (char *)dir;-
109 dirlen = strlen (xdir);-
110 if ((flags & MP_RMDOT) && dir[0] == '.' && dir[1] == '/')
(flags & 0x04)Description
TRUEevaluated 817 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 30727 times by 1 test
Evaluated by:
  • Self test
dir[0] == '.'Description
TRUEnever evaluated
FALSEevaluated 817 times by 1 test
Evaluated by:
  • Self test
dir[1] == '/'Description
TRUEnever evaluated
FALSEnever evaluated
0-30727
111 {-
112 xdir += 2;-
113 dirlen -= 2;-
114 }
never executed: end of block
0
115-
116 r = ret = (char *)xmalloc (2 + dirlen + pathlen);-
117 s = xpath;-
118 while (*s)
*sDescription
TRUEevaluated 502903 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 31544 times by 1 test
Evaluated by:
  • Self test
31544-502903
119 *r++ = *s++;
executed 502903 times by 1 test: *r++ = *s++;
Executed by:
  • Self test
502903
120 if (s > xpath && s[-1] != '/')
s > xpathDescription
TRUEevaluated 31450 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 94 times by 1 test
Evaluated by:
  • Self test
s[-1] != '/'Description
TRUEevaluated 31442 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 8 times by 1 test
Evaluated by:
  • Self test
8-31450
121 *r++ = '/';
executed 31442 times by 1 test: *r++ = '/';
Executed by:
  • Self test
31442
122 s = xdir;-
123 while (*r++ = *s++)
*r++ = *s++Description
TRUEevaluated 91049 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 31544 times by 1 test
Evaluated by:
  • Self test
31544-91049
124 ;
executed 91049 times by 1 test: ;
Executed by:
  • Self test
91049
125 if (xpath != path && xpath != nullpath)
xpath != pathDescription
TRUEevaluated 94 times by 1 test
Evaluated by:
  • Self test
FALSEevaluated 31450 times by 1 test
Evaluated by:
  • Self test
xpath != nullpathDescription
TRUEnever evaluated
FALSEevaluated 94 times by 1 test
Evaluated by:
  • Self test
0-31450
126 free (xpath);
never executed: sh_xfree((xpath), "makepath.c", 126);
0
127 return (ret);
executed 31544 times by 1 test: return (ret);
Executed by:
  • Self test
31544
128}-
Source codeSwitch to Preprocessed file

Generated by Squish Coco 4.1.2