This source file includes following definitions.
- opal_find_last_path_separator
- opal_basename
- opal_dirname
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 #include "opal_config.h"
24
25 #include <stdlib.h>
26 #include <string.h>
27 #ifdef HAVE_LIBGEN_H
28 #include <libgen.h>
29 #endif
30
31 #include "opal/util/basename.h"
32 #include "opal/util/os_path.h"
33
34
35
36
37
38
39
40
41 static inline char* opal_find_last_path_separator( const char* filename, size_t n )
42 {
43 char* p = (char*)filename + n;
44
45
46 for ( ; p >= filename; p-- ) {
47 if( *p != OPAL_PATH_SEP[0] )
48 break;
49 }
50
51 for ( ; p >= filename; p-- ) {
52 if( *p == OPAL_PATH_SEP[0] )
53 return p;
54 }
55
56 return NULL;
57 }
58
59 char *opal_basename(const char *filename)
60 {
61 size_t i;
62 char *tmp, *ret = NULL;
63 const char sep = OPAL_PATH_SEP[0];
64
65
66 if (NULL == filename) {
67 return NULL;
68 }
69 if (0 == strlen(filename)) {
70 return strdup("");
71 }
72 if (sep == filename[0] && '\0' == filename[1]) {
73 return strdup(filename);
74 }
75
76
77 tmp = strdup(filename);
78 for (i = strlen(tmp) - 1; i > 0; --i) {
79 if (sep == tmp[i]) {
80 tmp[i] = '\0';
81 } else {
82 break;
83 }
84 }
85 if (0 == i) {
86 tmp[0] = sep;
87 return tmp;
88 }
89
90
91 ret = opal_find_last_path_separator( tmp, strlen(tmp) );
92 if (NULL == ret) {
93 return tmp;
94 }
95 ret = strdup(ret + 1);
96 free(tmp);
97 return ret;
98 }
99
100 char* opal_dirname(const char* filename)
101 {
102 #if defined(HAVE_DIRNAME) || OPAL_HAVE_DIRNAME
103 char* safe_tmp = strdup(filename), *result;
104 if (NULL == safe_tmp) {
105 return NULL;
106 }
107 result = strdup(dirname(safe_tmp));
108 free(safe_tmp);
109 return result;
110 #else
111 const char* p = opal_find_last_path_separator(filename, strlen(filename));
112
113
114
115 for( ; NULL != p && p != filename; p-- ) {
116 if( (*p == '\\') || (*p == '/') ) {
117
118 for( --p; p != filename; p-- ) {
119 if( (*p != '\\') && (*p != '/') ) {
120 p++;
121 break;
122 }
123 }
124 if( p != filename ) {
125 char* ret = (char*)malloc( p - filename + 1 );
126 if (NULL == ret) {
127 return NULL;
128 }
129 opal_string_copy(ret, filename, p - filename);
130 ret[p - filename] = '\0';
131 return opal_make_filename_os_friendly(ret);
132 }
133 break;
134 }
135 }
136 return strdup(".");
137 #endif
138 }