-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path_parsepath.c
More file actions
110 lines (97 loc) · 3.5 KB
/
_parsepath.c
File metadata and controls
110 lines (97 loc) · 3.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
/**
* @file _parsepath.c
* @brief Parse a file elements from a string.
* @author T.Yokobayashi de JR4QPV
* @date 2020/07/01
*/
#include <string.h> /* for strlen,strrchr */
#include "_parsepath.h"
/**
*****************************************************************************
* @brief パス文字列からファイル名要素の位置取得
* @param path パス文字列
* @param dirpos ディレクり名要素開始位置の格納先(NULL時は格納しない)
* @param basepos ベース名要素開始位置の格納先(NULL時は格納しない)
* @param extpos 拡張子名要素開始位置の格納先(NULL時は格納しない)
* @return 解析結果 =0:ファイル要素なし, ≠0:ファイル要素あり(要素フラグ)\n
* (FLG_DIRNAME|FLG_BASENAME|FLG_FILENAME|FLG_EXTENSION| \n
* FLG_WILDCARDS|FLG_ABSPATH)
* @details
* - pathの文字長が不正の時は「0」を返す。
* - ベース名要素には、ファイル名要素と拡張子要素が含まれる。
* - pathの内容は変更しない非破壊で、各要素の開始位置のポインタを返す。\n
* 各要素は、解析結果のポインタ位置から抽出する。
* - 各要素は以下で抽出できる。\n
* ディレクトリ名:*dirpos ~ *basepos (通常は'/'で終わる)\n
* ベース名: *basepos 以降 \n
* ファイル名: *basepos ~ *extpos \n
* 拡張子: *extpos 以降 ('.'で始まる)
*
* @note
* - "."と".."はディレクトリ名に判断し、この時は'/'で終わらない。
* @attention
* - マルチバイト文字には非対応。(UTF-8ならたぶん大丈夫)
*****************************************************************************
*/
int _parsepath(const char *path, char **dirpos, char **basepos, char **extpos)
{
int n, flg;
char *p, *dname, *bname, *ename;
n = strlen(path);
if ((n <= 0) || (n >= SZ_PATH_MAX))
return 0; /* 文字列長が不正 */
dname = bname = (char*)path;
ename = (char*)&path[n];
flg = 0;
/* ディレクトリ名の有無チェック */
if ((p = strrchr(dname, '/')) != NULL) {
/* dirname要素あり */
bname = p+1;
flg |= FLG_DIRNAME;
/* 絶対パス名かチェック */
if (dname[0] == '/') /* '/'で始まるか ? */
flg |= FLG_ABSPATH;
}
else if ((strcmp(dname, ".") == 0) || (strcmp(dname, "..") == 0)) {
/* dirname要素あり */
n = strlen(dname);
bname = &dname[n];
flg |= FLG_DIRNAME;
}
/* ベース名の有無チェック */
n = strlen(bname);
if (n > 0) {
/* basename要素あり */
flg |= FLG_BASENAME;
/* 拡張子の有無チェック */
if ((p = strrchr(bname, '.')) != NULL) {
/* ext要素あり */
ename = p;
flg |= FLG_EXTENSION;
/* ファイル名の有無チェック */
if (bname != ename)
flg |= FLG_FILENAME;
}
/* ワイルドカードの有無チェック */
p = bname;
while (*p != '\0') {
if ((*p == '*') || (*p == '?')) {
flg |= FLG_WILDCARDS; /* ワイルドカード文字を含む */
break;
}
p++;
}
}
/* チェック結果の格納 */
if (dirpos != NULL) *dirpos = dname; /* ディレクトリ名開始位置 */
if (basepos != NULL) *basepos = bname; /* ベース名開始位置 */
if (extpos != NULL) *extpos = ename; /* 拡張子開始位置 */
return flg;
}
/**
*----------------------------------------------------------------------------
* @file _parsepath.c
* History
* -------
* - 2020/06/28 New created by JR4QPV.
*/