forked from ffftp/ffftp
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfilelist.h
113 lines (112 loc) · 7.88 KB
/
filelist.h
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
111
112
113
// Copyright(C) Kurata Sayuri. All rights reserved.
#pragma once
#include <format>
#include <string_view>
#include <tuple>
inline namespace {
using namespace std::literals;
struct filelistparser {
constexpr static std::tuple mlsd = {
// 以下の形式に対応
// fact1=value1;fact2=value2;fact3=value3; filename\r\n
// 不完全な実装のホストが存在するため以下の形式も許容
// fact1=value1;fact2=value2;fact3=value3 filename\r\n
// fact1=value1;fact2=value2;fact3=value3;filename\r\n
// 1. facts、2. ファイル名
R"(((?:(?:^|;)[^ ;=]+=[^ ;]+)+)(?:;? |;(?=[^ ]+$))(.+)$)"sv, false
};
static inline const auto unix = [] {
static auto const pattern = std::format(
// 1. ファイル種別、2. パーミッション、ACL、(リンク)、3. Owner、スキップ、4. サイズ、(5. 月、6. 日、(7. 年|8. 時、9. 分)|10. 年、11. 月、12. 日(?!年)(?!時、 分))、13. ファイル名
R"(^ *([-+dfl])([^ ]{{9}})[.+]?(?:[0-9]+| +[0-9]+|) +([^ ]+) +.*?([0-9]+) +(?:({1})[^ 0-9]* *({2})[^ 0-9]* +(?:({0})[^ 0-9]*|({3})[^ 0-9]+({4})[^ 0-9]*)|({0})[^ 0-9]* +({1})[^ 0-9]* +({2})[^ 0-9]*(?! +{0}[^ 0-9]* )(?! +{3}[^ 0-9]+{4}[^ 0-9]* )) +([^ ].*)$)"sv,
"(?:1[6-9][0-9]{2}|[2-9][0-9]{3})"sv, // 0: Year
"(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec|0?[1-9]|1[0-2])"sv, // 1: Month
"(?:0?[1-9]|[12][0-9]|3[01])"sv, // 2: Day
"(?:[01]?[0-9]|2[0-3])"sv, // 3: Hour
"(?:[0-5]?[0-9])"sv // 4: Minute
);
return std::tuple{ std::string_view{ pattern }, true };
}();
constexpr static std::tuple linux = {
// 1. ファイル種別、2. パーミッション、リンク、3. Owner、Group、4. サイズ、5. 年、6. 月、7. 日、8. 時、9. 分、10. ファイル名
R"(^ *([-+dfl])([^ ]{9}) +[0-9]+ +([^ ]+) +[^ ]+ +([0-9]+) +(1[6-9][0-9]{2}|[2-9][0-9]{3})-(0?[1-9]|1[0-2])-(0?[1-9]|[12][0-9]|3[01]) +([01]?[0-9]|2[0-3]):([0-5]?[0-9]) +(.*)$)"sv, false
};
constexpr static std::tuple melcom80 = {
// 1. ファイル種別、2. パーミッション、リンク数、3. Owner、4. サイズ、5. 月、6. 日、7. 年、8. ファイル名、9. ファイル種別
R"(^ *([-+dfl]) +([^ ]{9}) +[0-9]+ +([^ ]+) +([0-9]+) +(JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC) +([1-9]|[12][0-9]|3[01]) + (1[6-9][0-9]{2}|[2-9][0-9]{3}) +(?=([^ ]{1,14})).{14}(.).*$)"sv, false
};
constexpr static std::tuple agilent = {
// 1. ファイル種別、2. パーミッション、不明、3. Owner、不明、4. サイズ、5. ファイル名
R"(^ *([-+dfl])([^ ]{9}) +[0-9]+ +([0-9]+) +[0-9]+ +([0-9]+) +(.+)$)"sv, false
};
static inline const auto dos = [] {
static auto const pattern = std::format(
// (1. 月、2. 区切り、3. 日、\2、4. 年 | 5. 年、6. 区切り、7. 月、\6、8. 日) 、9. 時、10. 分、(11. 秒)?、12. AMPM、13. サイズ、14. ファイル名
R"(^ *(?:{1}(-|/){2}\2{0}|{0}(-|/){1}\6{2}) +{3}:{4}(?::{5})?([AaPp])?[^ ]* +(<DIR>|[0-9]+) +(.*)$)"sv,
"((?:|1[6-9]?|[2-9][0-9])[0-9]{2})"sv, // 0: Year
"(0?[1-9]|1[0-2])"sv, // 1: Month
"(0?[1-9]|[12][0-9]|3[01])"sv, // 2: Day
"([01]?[0-9]|2[0-3])"sv, // 3: Hour
"([0-5]?[0-9])"sv, // 4: Minute
"([0-5]?[0-9])"sv // 5: Second
);
return std::tuple{ std::string_view{ pattern }, false };
}();
constexpr static std::tuple chameleon = {
// 1. ファイル名、2. サイズ、3. 月、4. 日、5. 年、6. 時、7. 分、ファイル種別
R"(^ *([^ ]+) +(<DIR>|[0-9]+) +(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec|0?[1-9]|1[0-2])(?: +|-)(0?[1-9]|[12][0-9]|3[01])(?: +|-)((?:|1[6-9]?|[2-9][0-9])[0-9]{2}) +([01]?[0-9]|2[0-3]):([0-5]?[0-9]) +[^ ]*$)"sv, false
};
constexpr static std::tuple os2 = {
// 1. サイズ、(属性)?、(2. ファイル種別)?、3. 月、4. 日、5. 年、6. 時、7. 分、8. ファイル名
R"(^ *([0-9]+) +(?:[^ ]+ +)?(DIR +)?(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])-((?:|1[6-9]?|[2-9][0-9])[0-9]{2}) +([01][0-9]|2[0-3]):([0-5][0-9]) +([^ ]+)$)"sv, false
};
constexpr static std::tuple allied = {
// 1. サイズ、2. ファイル名、曜日、3. 月、4. 日、5. 時、6. 分、7. 秒、8. 年
R"(^ *(<dir>|[0-9]+) +([^ ]+) +(?:Sun|Mon|Tue|Wed|Thu|Fri|Sat) +(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) +(0?[1-9]|[12][0-9]|3[01]) +([01][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9]) +(1[6-9][0-9]{2}|[2-9][0-9]{3})$)"sv, false
};
constexpr static std::tuple shibasoku = {
// 1. サイズ、2. 月、3. 日、4. 年、5. 時、6. 分、7. 秒、8. ファイル名、9. ファイル種別
R"(^ *([0-9]+) +(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-(0[1-9]|[12][0-9]|3[01])-(1[6-9][0-9]{2}|[2-9][0-9]{3}) +([01][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9]) +([^ ]+) +(<DIR>)?$)"sv, false
};
constexpr static std::tuple as400 = {
// 1. Owner、2. サイズ、3. 年、4. 月、5. 日、6. 時、7. 分、8. 秒、不明、9. ファイル名、10. ファイル種別
R"(^ *([^ ]+) +([0-9]+) +((?:|1[6-9]?|[2-9][0-9])[0-9]{2})/(0[1-9]|1[0-2])/(0[1-9]|[12][0-9]|3[01]) +([01][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9]) +[^ ]+ +([^/ ]+)(/)?$)"sv, false
};
constexpr static std::tuple m1800 = {
// ファイル種別、1. パーミッション、不明、不明、不明、不明、(2. 年、3. 月、4. 日 | **.**.**)、5. ファイル名、6. ファイル種別
R"(^ *[^ ]([^ ]{3}) +[^ ]+ +[0-9*]+ +[0-9*]+ +[^ ]+ +(?:((?:|1[6-9]?|[2-9][0-9])[0-9]{2})\.(0[1-9]|1[0-2])\.(0[1-9]|[12][0-9]|3[01])|\*{2,4}\.\*\*\.\*\*) +([^/ ]+)(/)? *$)"sv, false
};
constexpr static std::tuple gp6000 = {
// 1. ファイル種別、2. パーミッション、3. 年、4. 月、5. 日、6. 時、7. 分、8. 秒、9. Owner、不明、10. サイズ、11. ファイル名
R"(^ *([^ ])([^ ]{9}) +((?:|1[6-9]?|[2-9][0-9])[0-9]{2})\.(0[1-9]|1[0-2])\.(0[1-9]|[12][0-9]|3[01]) +([01][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9]) +([^ ]+) +[^ ]+ +([0-9]+) +(.+)$)"sv, false
};
constexpr static std::tuple os7 = {
// 1. ファイル種別、2. パーミッション、(不明、3. サイズ)?、4. 年、5. 月、6. 日、7. 時、8. 分、9. 秒、10. ファイル名
R"(^ *([^ ])([^ ]{9}) +(?:[^ ]+ +([0-9]+) +)?((?:|1[6-9]?|[2-9][0-9])[0-9]{2})/(0[1-9]|1[0-2])/(0[1-9]|[12][0-9]|3[01]) +([01][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9]) +(.+?) *$)"sv, false
};
constexpr static std::tuple os9 = {
// 1. Owner、2. 年、3. 月、4. 日、5. 時、6. 分、7. ファイル種別、不明、8. サイズ、9. ファイル名
R"(^ *([^ ]+) +((?:|1[6-9]?|[2-9][0-9])[0-9]{2})/(0[1-9]|1[0-2])/(0[1-9]|[12][0-9]|3[01]) +([01][0-9]|2[0-3])([0-5][0-9]) +([^ ])[^ ]+ +[^ ]+ +([0-9]+) +(.+)$)"sv, false
};
constexpr static std::tuple ibm = {
// 不明、不明、1. 年、2. 月、3. 日、不明、不明、不明、不明、不明、4. ファイル種別、5. ファイル名
R"(^ *[^ ]+ +[0-9]+ +(1[6-9][0-9]{2}|[2-9][0-9]{3})/(0[1-9]|1[0-2])/(0[1-9]|[12][0-9]|3[01]) +[0-9]+ +[0-9]+ +[^ ]+ +[0-9]+ +[0-9]+ +P(O|S) +(.+)$)"sv, false
};
constexpr static std::tuple stratus = {
// (1. ファイルリスト | 2. ディレクトリリスト | 3. リンクリスト | 不明、4. サイズ、(5. Owner)?、6. 年、7. 月、8. 日、9. 時、10. 分、11. 秒、12. ファイル名)
R"(^ *(?:(Files:.*)|(Dirs:.*)|(Links:.*)|[^ ]+ +([0-9]+) +(?:([^ ]+) +)?((?:|1[6-9]?|[2-9][0-9])[0-9]{2})-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01]) +([01][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9]) +(.+))$)"sv, false
};
constexpr static std::tuple vms = {
// 1. OpenVMS用ファイル名、2. ファイル名、3. ファイル種別、4. サイズ、5. 日、6. 月、7. 年、8. 時、9. 分、10. 秒、不明
R"(^ *(([^ ]+?)(\.DIR;[^ ]*)?) +([0-9]+)/[0-9]+ +(0?[1-9]|[12][0-9]|3[01])-(JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)-(1[6-9][0-9]{2}|[2-9][0-9]{3}) +([01][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9]) +.+$)"sv, false
};
constexpr static std::tuple irmx = {
// 1. ファイル名、2. ファイル種別、不明?、不明、3. サイズ、不明、不明、4. Owner、5. 日、6. 月、7. 年
R"(^ *([^ ]+)( +DR)?.+? +[0-9]+ +([0-9,]+) +[0-9,]+ +[0-9]+ +(.+?) +(0[1-9]|[12][0-9]|3[01]) +(JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC) +((?:|1[6-9]?|[2-9][0-9])[0-9]{2})$)"sv, false
};
constexpr static std::tuple tandem = {
// 1. ファイル名、Open中、2. Code、3. サイズ、4. 日、5. 月、6. 年、7. 時、8. 分、9. 秒、10. Owner、不明
R"(^ *([^ ]+) +(?:O +)?([0-9]+) +([0-9]+) +(0?[1-9]|[12][0-9]|3[01])-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-((?:|1[6-9]?|[2-9][0-9])[0-9]{2}) +([01][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9]) +(.+?) +[^ ]+$)"sv, false
};
};
}