aboutsummaryrefslogtreecommitdiff
path: root/std
diff options
context:
space:
mode:
authorAndrew Kelley <superjoe30@gmail.com>2018-06-02 04:03:25 -0400
committerAndrew Kelley <superjoe30@gmail.com>2018-06-02 04:04:23 -0400
commitf06bce5ddaea368040560f584170aee2864fa399 (patch)
tree61937f83c19f0090cd9daadfa570504801dc24f8 /std
parent7b386ea24285db2fbc40233a232cb294dddf9879 (diff)
downloadzig-f06bce5ddaea368040560f584170aee2864fa399.tar.gz
zig-f06bce5ddaea368040560f584170aee2864fa399.zip
introduce [*] for unknown length pointers
See #770 Currently it does not have any different behavior than `*` but it is now recommended to use `[*]` for unknown length pointers to be future-proof. Instead of [ * ] being separate tokens as the proposal suggested, this commit implements `[*]` as a single token.
Diffstat (limited to 'std')
-rw-r--r--std/cstr.zig8
-rw-r--r--std/zig/parse.zig2
-rw-r--r--std/zig/parser_test.zig7
-rw-r--r--std/zig/tokenizer.zig42
4 files changed, 51 insertions, 8 deletions
diff --git a/std/cstr.zig b/std/cstr.zig
index dfbfb8047f..d60adf8faa 100644
--- a/std/cstr.zig
+++ b/std/cstr.zig
@@ -9,13 +9,13 @@ pub const line_sep = switch (builtin.os) {
else => "\n",
};
-pub fn len(ptr: *const u8) usize {
+pub fn len(ptr: [*]const u8) usize {
var count: usize = 0;
while (ptr[count] != 0) : (count += 1) {}
return count;
}
-pub fn cmp(a: *const u8, b: *const u8) i8 {
+pub fn cmp(a: [*]const u8, b: [*]const u8) i8 {
var index: usize = 0;
while (a[index] == b[index] and a[index] != 0) : (index += 1) {}
if (a[index] > b[index]) {
@@ -27,11 +27,11 @@ pub fn cmp(a: *const u8, b: *const u8) i8 {
}
}
-pub fn toSliceConst(str: *const u8) []const u8 {
+pub fn toSliceConst(str: [*]const u8) []const u8 {
return str[0..len(str)];
}
-pub fn toSlice(str: *u8) []u8 {
+pub fn toSlice(str: [*]u8) []u8 {
return str[0..len(str)];
}
diff --git a/std/zig/parse.zig b/std/zig/parse.zig
index 6adcf34c95..7faca8e11b 100644
--- a/std/zig/parse.zig
+++ b/std/zig/parse.zig
@@ -3292,7 +3292,7 @@ fn tokenIdToPrefixOp(id: @TagType(Token.Id)) ?ast.Node.PrefixOp.Op {
Token.Id.Minus => ast.Node.PrefixOp.Op{ .Negation = void{} },
Token.Id.MinusPercent => ast.Node.PrefixOp.Op{ .NegationWrap = void{} },
Token.Id.Ampersand => ast.Node.PrefixOp.Op{ .AddressOf = void{} },
- Token.Id.Asterisk, Token.Id.AsteriskAsterisk => ast.Node.PrefixOp.Op{
+ Token.Id.Asterisk, Token.Id.AsteriskAsterisk, Token.Id.BracketStarBracket => ast.Node.PrefixOp.Op{
.PtrType = ast.Node.PrefixOp.PtrInfo{
.align_info = null,
.const_token = null,
diff --git a/std/zig/parser_test.zig b/std/zig/parser_test.zig
index bad677580c..c28a70b770 100644
--- a/std/zig/parser_test.zig
+++ b/std/zig/parser_test.zig
@@ -1,3 +1,10 @@
+test "zig fmt: pointer of unknown length" {
+ try testCanonical(
+ \\fn foo(ptr: [*]u8) void {}
+ \\
+ );
+}
+
test "zig fmt: spaces around slice operator" {
try testCanonical(
\\var a = b[c..d];
diff --git a/std/zig/tokenizer.zig b/std/zig/tokenizer.zig
index 8378a9011d..b288a3adb7 100644
--- a/std/zig/tokenizer.zig
+++ b/std/zig/tokenizer.zig
@@ -143,6 +143,7 @@ pub const Token = struct {
FloatLiteral,
LineComment,
DocComment,
+ BracketStarBracket,
Keyword_align,
Keyword_and,
Keyword_asm,
@@ -263,6 +264,8 @@ pub const Tokenizer = struct {
Period,
Period2,
SawAtSign,
+ LBracket,
+ LBracketStar,
};
pub fn next(self: *Tokenizer) Token {
@@ -325,9 +328,7 @@ pub const Tokenizer = struct {
break;
},
'[' => {
- result.id = Token.Id.LBracket;
- self.index += 1;
- break;
+ state = State.LBracket;
},
']' => {
result.id = Token.Id.RBracket;
@@ -429,6 +430,28 @@ pub const Tokenizer = struct {
},
},
+ State.LBracket => switch (c) {
+ '*' => {
+ state = State.LBracketStar;
+ },
+ else => {
+ result.id = Token.Id.LBracket;
+ break;
+ },
+ },
+
+ State.LBracketStar => switch (c) {
+ ']' => {
+ result.id = Token.Id.BracketStarBracket;
+ self.index += 1;
+ break;
+ },
+ else => {
+ result.id = Token.Id.Invalid;
+ break;
+ },
+ },
+
State.Ampersand => switch (c) {
'=' => {
result.id = Token.Id.AmpersandEqual;
@@ -1008,6 +1031,7 @@ pub const Tokenizer = struct {
State.CharLiteralEscape2,
State.CharLiteralEnd,
State.StringLiteralBackslash,
+ State.LBracketStar,
=> {
result.id = Token.Id.Invalid;
},
@@ -1024,6 +1048,9 @@ pub const Tokenizer = struct {
State.Slash => {
result.id = Token.Id.Slash;
},
+ State.LBracket => {
+ result.id = Token.Id.LBracket;
+ },
State.Zero => {
result.id = Token.Id.IntegerLiteral;
},
@@ -1142,6 +1169,15 @@ test "tokenizer" {
testTokenize("test", []Token.Id{Token.Id.Keyword_test});
}
+test "tokenizer - unknown length pointer" {
+ testTokenize(
+ \\[*]u8
+ , []Token.Id{
+ Token.Id.BracketStarBracket,
+ Token.Id.Identifier,
+ });
+}
+
test "tokenizer - char literal with hex escape" {
testTokenize(
\\'\x1b'