Skip to content

Commit

Permalink
Merge pull request #4774 from ziglang/zig-cc
Browse files Browse the repository at this point in the history
ability to use `zig cc` as a drop-in C compiler
  • Loading branch information
andrewrk authored Mar 22, 2020
2 parents 9d19d90 + 2b65dc1 commit 7ffdf59
Show file tree
Hide file tree
Showing 14 changed files with 6,851 additions and 24 deletions.
126 changes: 126 additions & 0 deletions src-self-hosted/clang_options.zig
Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@
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,

/// TODO we're going to want to change this when we start shipping self-hosted because this causes
/// all the functions in stage2.zig to get exported.
zig_equivalent: @import("stage2.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 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,
};
}
Loading

0 comments on commit 7ffdf59

Please sign in to comment.