aboutsummaryrefslogtreecommitdiff
path: root/src/clang_options.zig
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2020-09-21 18:38:55 -0700
committerAndrew Kelley <andrew@ziglang.org>2020-09-21 18:38:55 -0700
commit528832bd3a2e7b686ee84aef5887df740a6114db (patch)
tree90ccff9faa2ba2604c8538aeec0a147a4b01148c /src/clang_options.zig
parentb9f61d401502f5d221e72c0d0e3bf448b11dcd68 (diff)
downloadzig-528832bd3a2e7b686ee84aef5887df740a6114db.tar.gz
zig-528832bd3a2e7b686ee84aef5887df740a6114db.zip
rename src-self-hosted/ to src/
Diffstat (limited to 'src/clang_options.zig')
-rw-r--r--src/clang_options.zig134
1 files changed, 134 insertions, 0 deletions
diff --git a/src/clang_options.zig b/src/clang_options.zig
new file mode 100644
index 0000000000..42bfecb746
--- /dev/null
+++ b/src/clang_options.zig
@@ -0,0 +1,134 @@
+const std = @import("std");
+const mem = std.mem;
+
+pub const list = @import("clang_options_data.zig").data;
+
+pub const CliArg = struct {
+ name: []const u8,
+ syntax: Syntax,
+
+ zig_equivalent: @import("main.zig").ClangArgIterator.ZigEquivalent,
+
+ /// Prefixed by "-"
+ pd1: bool = false,
+
+ /// Prefixed by "--"
+ pd2: bool = false,
+
+ /// Prefixed by "/"
+ psl: bool = false,
+
+ pub const Syntax = union(enum) {
+ /// A flag with no values.
+ flag,
+
+ /// An option which prefixes its (single) value.
+ joined,
+
+ /// An option which is followed by its value.
+ separate,
+
+ /// An option which is either joined to its (non-empty) value, or followed by its value.
+ joined_or_separate,
+
+ /// An option which is both joined to its (first) value, and followed by its (second) value.
+ joined_and_separate,
+
+ /// An option followed by its values, which are separated by commas.
+ comma_joined,
+
+ /// An option which consumes an optional joined argument and any other remaining arguments.
+ remaining_args_joined,
+
+ /// An option which is which takes multiple (separate) arguments.
+ multi_arg: u8,
+ };
+
+ pub fn matchEql(self: CliArg, arg: []const u8) u2 {
+ if (self.pd1 and arg.len >= self.name.len + 1 and
+ mem.startsWith(u8, arg, "-") and mem.eql(u8, arg[1..], self.name))
+ {
+ return 1;
+ }
+ if (self.pd2 and arg.len >= self.name.len + 2 and
+ mem.startsWith(u8, arg, "--") and mem.eql(u8, arg[2..], self.name))
+ {
+ return 2;
+ }
+ if (self.psl and arg.len >= self.name.len + 1 and
+ mem.startsWith(u8, arg, "/") and mem.eql(u8, arg[1..], self.name))
+ {
+ return 1;
+ }
+ return 0;
+ }
+
+ pub fn matchStartsWith(self: CliArg, arg: []const u8) usize {
+ if (self.pd1 and arg.len >= self.name.len + 1 and
+ mem.startsWith(u8, arg, "-") and mem.startsWith(u8, arg[1..], self.name))
+ {
+ return self.name.len + 1;
+ }
+ if (self.pd2 and arg.len >= self.name.len + 2 and
+ mem.startsWith(u8, arg, "--") and mem.startsWith(u8, arg[2..], self.name))
+ {
+ return self.name.len + 2;
+ }
+ if (self.psl and arg.len >= self.name.len + 1 and
+ mem.startsWith(u8, arg, "/") and mem.startsWith(u8, arg[1..], self.name))
+ {
+ return self.name.len + 1;
+ }
+ return 0;
+ }
+};
+
+/// Shortcut function for initializing a `CliArg`
+pub fn flagpd1(name: []const u8) CliArg {
+ return .{
+ .name = name,
+ .syntax = .flag,
+ .zig_equivalent = .other,
+ .pd1 = true,
+ };
+}
+
+/// Shortcut function for initializing a `CliArg`
+pub fn flagpsl(name: []const u8) CliArg {
+ return .{
+ .name = name,
+ .syntax = .flag,
+ .zig_equivalent = .other,
+ .psl = true,
+ };
+}
+
+/// Shortcut function for initializing a `CliArg`
+pub fn joinpd1(name: []const u8) CliArg {
+ return .{
+ .name = name,
+ .syntax = .joined,
+ .zig_equivalent = .other,
+ .pd1 = true,
+ };
+}
+
+/// Shortcut function for initializing a `CliArg`
+pub fn jspd1(name: []const u8) CliArg {
+ return .{
+ .name = name,
+ .syntax = .joined_or_separate,
+ .zig_equivalent = .other,
+ .pd1 = true,
+ };
+}
+
+/// Shortcut function for initializing a `CliArg`
+pub fn sepd1(name: []const u8) CliArg {
+ return .{
+ .name = name,
+ .syntax = .separate,
+ .zig_equivalent = .other,
+ .pd1 = true,
+ };
+}