-
Notifications
You must be signed in to change notification settings - Fork 0
/
Options.cs
136 lines (126 loc) · 3.85 KB
/
Options.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
using System;
using System.IO;
using System.Linq;
using System.Reflection;
namespace TuckBytesInCode
{
public static class Options
{
public static void Usage()
{
Log.Message(
nameof(TuckBytesInCode) + " - Converts text-encoded binary data from one base to another"
+"\nUsage: "+nameof(TuckBytesInCode)+" [options] [data]"
+"\n\n Options:"
+"\n -f (file) read data from a file"
+"\n -o (file) write data to a file"
+"\n -bi (base) input base (default base256)"
+"\n -bo (base) output base (default base256)"
+"\n -dc enable direct conversion without going though base256 first"
+"\n note: in many cases this will produce invalid output"
+"\n -dl disables adding newlines to the output"
+"\n -ll (number) set how many characters per line (default 76)"
// +"\n\n Custom Base Options:"
// +"\n -cbi (name) custom input base (see below)"
// +"\n -cbo (name) custom output base (see below)"
// +"\n -cdef (json) custom base definition (see below)
// {name:"", alphabet:"", padding:""}
);
PrintBasesAndVariants();
}
static void PrintBasesAndVariants()
{
Log.Message("\nAvailable Bases:");
foreach(Base item in Enum.GetValues(typeof(Base)))
{
if (item == Base.None) { continue; }
IBaseInfo info = BaseMap.GetInfo(item);
if (info == null) { continue; }
string arg = item.ToString().ToLowerInvariant();
Log.Message(
" " + arg.PadTo(12) + info.DisplayName+" - "+info.Description
);
}
}
public static bool Parse(string[] args)
{
int len = args.Length;
for(int a=0; a<len; a++)
{
string curr = args[a];
if (curr == "-f" && ++a < len) {
FileNameIn = args[a];
}
else if (curr == "-o" && ++a < len) {
FileNameOut = args[a];
}
else if (curr == "-bi" && ++a < len) {
if (!TryParseBase(args[a], out BaseIn)) {
Log.Error("Cound not parse base "+args[a]);
return false;
}
}
else if (curr == "-bo" && ++a < len) {
if (!TryParseBase(args[a], out BaseOut)) {
Log.Error("Cound not parse base "+args[a]);
return false;
}
}
else if (curr == "-dl") {
DisableNewLines = true;
}
else if (curr == "-ll" && ++a < len) {
if (!int.TryParse(args[a],out int CharactersPerLine)) {
Log.Error("Count not parse number \""+args[a]+"\"");
return false;
}
}
else if (curr == "-dc") {
DirectConvert = true;
}
else {
if (DataFromArgs == null) { DataFromArgs = ""; }
DataFromArgs += curr;
}
}
//sanity checks
if (FileNameIn != null && !File.Exists(FileNameIn)) {
Log.Error("Cannot find file \""+FileNameIn+"\"");
return false;
}
if (CharactersPerLine < 1) {
Log.Error("Characters per line must be at least 1");
return false;
}
return true;
}
static bool TryParseBase(string arg, out Base found)
{
found = Base.None;
foreach(string name in Enum.GetNames(typeof(Base)))
{
if (!name.StartsWithIC("base")) { continue; }
//try to match the whole name
if (name.EqualsIC(arg)) {
found = Enum.Parse<Base>(name);
return true;
}
//try to match just the number part
string num = name.Substring(4);
if (num.EqualsIC(arg)) {
found = Enum.Parse<Base>(name);
return true;
}
}
return false;
}
public static string FileNameIn = null;
public static string FileNameOut = null;
public static Base BaseIn = Base.Base256;
public static Base BaseOut = Base.Base256;
public static bool DisableNewLines = false;
public static int CharactersPerLine = 76;
public static bool DirectConvert = false;
public static string DataFromArgs = null;
}
}