-
Notifications
You must be signed in to change notification settings - Fork 0
/
Program.cs
207 lines (154 loc) · 6.52 KB
/
Program.cs
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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
if (args is ["debug", string]) {
var lower = args[1].ToLower(Helpers.cultureInfoEnUs);
if (lower == "enable") {
Console.WriteLine("$env:Base16384_Net_Debug = 1");
Console.WriteLine("export Base16384_Net_Debug=1");
Console.WriteLine("set Base16384_Net_Debug=1");
return 0;
}
if (lower == "disable") {
Console.WriteLine("$env:Base16384_Net_Debug = $null");
Console.WriteLine("unset Base16384_Net_Debug");
Console.WriteLine("set Base16384_Net_Debug=");
return 0;
}
Console.WriteLine("Usage: Base16384.Net.exe <\"e\" | \"d\"> <source | \"-\"> [out | \"-\"]");
return 1;
}
if (args.Length is not 2 and not 3 || args is not ["e", ..] and not ["d", ..]) {
Console.WriteLine("Usage: Base16384.Net.exe <\"e\" | \"d\"> <source | \"-\"> [out | \"-\"]");
return 1;
}
bool readFromStdin = args[1] == "-",
isDefaultOutput = args.Length == 2,
writeToStdout = (readFromStdin && isDefaultOutput) || (args is [string, string, "-"]), // `x -` or `x x -`
isEncodeMode = args[0] == "e"; // Encode mode or decode mode
if (readFromStdin) { // Read from stdin
try {
using var stdin = Console.OpenStandardInput();
if (writeToStdout) { // Write to stdout
return Helpers.WriteToStdOut(isEncodeMode ? Base16384.EncodeToStream : Base16384.DecodeToStream, stdin);
}
// Write to file
FileInfo output = new(args[2]);
return output.Exists
? Helpers.PrintErrorMessage("The output file already exists.", null, 2)
: Helpers.WriteToFile(isEncodeMode ? Base16384.EncodeToNewFile : Base16384.DecodeToNewFile,
stdin, output, "<stdin>");
} catch (Exception e) {
// If write to stdout, do not print message
return Helpers.PrintException(writeToStdout ? null : "Can not open stdin.", e, 3);
}
}
// Read from file
if (writeToStdout) { // Write to stdout
if (args[1].Contains(',')) {
return Helpers.PrintErrorMessage(null, "Source file cannot be a list when writing to stdout.", 2);
}
if (!File.Exists(args[1])) {
return Helpers.PrintErrorMessage(null, "Source file not found.", 2);
}
return Helpers.WriteToStdOut(isEncodeMode ? Base16384.EncodeFromFileToStream : Base16384.DecodeFromFileToStream, new FileInfo(args[1]));
}
// Write to file
var codedString = $"{(isEncodeMode ? "en" : "de")}coded";
if (!isDefaultOutput && args[2].Contains(',')) {
return Helpers.PrintErrorMessage("Output file or directory cannot be a list.", null, 2);
}
// Encode or decode multiple files
if (args[1].Contains(',')) {
if (args[1].StartsWith(',') || args[1].EndsWith(',')) {
return Helpers.PrintErrorMessage("Invalid file list.", null, 2);
}
DirectoryInfo outputDirectoryInfo = new(isDefaultOutput ? codedString : args[2]);
if (!outputDirectoryInfo.Exists) { // Try to create output directory
if (File.Exists(outputDirectoryInfo.FullName)) {
return Helpers.PrintErrorMessage("Output directory is an existing file.", null, 5);
}
try {
outputDirectoryInfo.Create();
} catch (Exception e) {
return Helpers.PrintException("Failed to create output directory.", e, 5);
}
}
FileInfo? input = null, output = null;
// foreach files in the list
foreach (var file in args[1].Split(',')) {
input = new(file);
output = new(Path.Combine(outputDirectoryInfo.FullName, input.Name));
if (output.Exists) {
Console.WriteLine($"{input.Name} -> {output.Name} ... The output file in the directory \"{outputDirectoryInfo.Name}\" already exists.");
continue;
}
if (!input.Exists) {
Console.WriteLine($"{input.Name} -> {output.Name} ... Source file not found.");
continue;
}
Helpers.Execute(isEncodeMode ? Base16384.EncodeFromFileToNewFile : Base16384.DecodeFromFileToNewFile,
input, output, input.Name, output.Name);
}
return 0;
}
// File not found or Directory exists
if (!File.Exists(args[1])) {
if (Directory.Exists(args[1])) { // Encode or decode all files in the directory
DirectoryInfo inputDirectoryInfo = new(args[1]),
outputDirectoryInfo = new(isDefaultOutput ? codedString : args[2]);
if (!outputDirectoryInfo.Exists) { // Try to create output directory
if (File.Exists(outputDirectoryInfo.FullName)) {
return Helpers.PrintErrorMessage("Output directory is an existing file.", null, 5);
}
try {
outputDirectoryInfo.Create();
} catch (Exception e) {
return Helpers.PrintException("Failed to create output directory.", e, 5);
}
}
FileInfo? output = null;
DirectoryInfo? outputParentDirectoryInfo = null;
string? relativePath = null, relativeDirectory = null;
// foreach files in the list
foreach (var input in inputDirectoryInfo.EnumerateFiles("*", SearchOption.AllDirectories)) {
relativePath = Path.GetRelativePath(inputDirectoryInfo.FullName, input.FullName);
output = new(Path.Combine(outputDirectoryInfo.FullName, relativePath));
relativeDirectory = Path.GetDirectoryName(relativePath)!;
relativeDirectory = string.IsNullOrWhiteSpace(relativeDirectory) ? "." : relativeDirectory;
outputParentDirectoryInfo = output.Directory!;
if (!outputParentDirectoryInfo.Exists) {
if (File.Exists(outputParentDirectoryInfo.FullName)) {
Console.WriteLine($"{input.Name} -> {output.Name} ... The output directory \"{relativeDirectory}\" is an existing file.");
}
try {
outputParentDirectoryInfo.Create();
} catch (Exception e) {
_ = Helpers.PrintException($"{input.Name} -> {output.Name} ... Failed to create output directory \"{outputParentDirectoryInfo.FullName}\".", e, 5);
continue;
}
}
if (output.Exists) {
Console.WriteLine($"{input.Name} -> {output.Name} ... The output file in the directory \"{relativeDirectory}\" already exists.");
continue;
}
if (!input.Exists) {
Console.WriteLine($"{input.Name} -> {output.Name} ... Source file not found.");
continue;
}
Helpers.Execute(isEncodeMode ? Base16384.EncodeFromFileToNewFile : Base16384.DecodeFromFileToNewFile,
input, output, input.Name, output.Name);
}
return 0;
}
return Helpers.PrintErrorMessage("Source file not found.", null, 2);
}
// Encode or decode single file
FileInfo inputFileInfo = new(args[1]),
outputFileInfo = new(isDefaultOutput ? $"{args[1]}.{codedString}" : args[2]);
if (outputFileInfo.Exists) {
return Helpers.PrintErrorMessage($"{inputFileInfo.Name} -> {outputFileInfo.Name} ... The output file already exists.", null, 2);
}
if (!inputFileInfo.Exists) {
return Helpers.PrintErrorMessage(null, $"{inputFileInfo.Name} -> Source file not found.", 2);
}
Helpers.Execute(isEncodeMode ? Base16384.EncodeFromFileToNewFile : Base16384.DecodeFromFileToNewFile,
inputFileInfo, outputFileInfo, inputFileInfo.Name, outputFileInfo.Name);
return 0;