authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2020-01-14 16:18:32+02:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2020-01-14 16:18:32+02:00
log28daddae81f354da89f917528dab2e5d87bca829
treeefde275b0ba6fd240d3d301adec70686522b2c97
parent4c0776b2a5a8a92e770fe0b08a15e06671000cb6
signaturelock-open Commit is signed but in an unrecognized format.

std-c todos and small fixes


3 files changed, 35 insertions(+), 32 deletions(-)

lib/std/c/ast.zig+3-2
...@@ -221,6 +221,7 @@ pub const Node = struct {...@@ -221,6 +221,7 @@ pub const Node = struct {
221 Root,221 Root,
222 EnumField,222 EnumField,
223 RecordField,223 RecordField,
224 RecordDeclarator,
224 JumpStmt,225 JumpStmt,
225 ExprStmt,226 ExprStmt,
226 LabeledStmt,227 LabeledStmt,
...@@ -437,8 +438,8 @@ pub const Node = struct {...@@ -437,8 +438,8 @@ pub const Node = struct {
437 };438 };
438439
439 pub const RecordDeclarator = struct {440 pub const RecordDeclarator = struct {
440 base: Node = Node{ .id = .RecordField },441 base: Node = Node{ .id = .RecordDeclarator },
441 declarator: *Declarator,442 declarator: ?*Declarator,
442 bit_field_expr: ?*Expr,443 bit_field_expr: ?*Expr,
443 };444 };
444445
lib/std/c/parse.zig+25-29
...@@ -13,8 +13,8 @@ const TokenIterator = ast.Tree.TokenList.Iterator;...@@ -13,8 +13,8 @@ const TokenIterator = ast.Tree.TokenList.Iterator;
13pub const Error = error{ParseError} || Allocator.Error;13pub const Error = error{ParseError} || Allocator.Error;
1414
15pub const Options = struct {15pub const Options = struct {
16 /// Keep simple macros unexpanded and add the definitions to the ast16 // /// Keep simple macros unexpanded and add the definitions to the ast
17 retain_macros: bool = false,17 // retain_macros: bool = false,
1818
19 /// Warning or error19 /// Warning or error
20 warn_as_err: union(enum) {20 warn_as_err: union(enum) {
...@@ -204,12 +204,16 @@ const Parser = struct {...@@ -204,12 +204,16 @@ const Parser = struct {
204 }204 }
205 var first_dr = try parser.declarator(.Must);205 var first_dr = try parser.declarator(.Must);
206 if (first_dr != null and declaratorIsFunction(first_dr.?)) {206 if (first_dr != null and declaratorIsFunction(first_dr.?)) {
207 // TODO typedeffed fn proto-only
207 const dr = @fieldParentPtr(Node.Declarator, "base", first_dr.?);208 const dr = @fieldParentPtr(Node.Declarator, "base", first_dr.?);
208 try parser.declareSymbol(ds.type_spec, dr);209 try parser.declareSymbol(ds.type_spec, dr);
209 var old_decls = Node.FnDecl.OldDeclList.init(parser.arena);210 var old_decls = Node.FnDecl.OldDeclList.init(parser.arena);
210 const body = if (parser.eatToken(.Semicolon)) |_|211 const body = if (parser.eatToken(.Semicolon)) |_|
211 null212 null
212 else blk: {213 else blk: {
214 if (local) {
215 // TODO nested function warning
216 }
213 // TODO first_dr.is_old217 // TODO first_dr.is_old
214 // while (true) {218 // while (true) {
215 // var old_ds = Node.DeclSpec{};219 // var old_ds = Node.DeclSpec{};
...@@ -387,13 +391,11 @@ const Parser = struct {...@@ -387,13 +391,11 @@ const Parser = struct {
387 /// / IDENTIFIER // typedef name391 /// / IDENTIFIER // typedef name
388 /// / TypeQual392 /// / TypeQual
389 fn typeSpec(parser: *Parser, type_spec: *Node.TypeSpec) !bool {393 fn typeSpec(parser: *Parser, type_spec: *Node.TypeSpec) !bool {
390 while (try parser.typeQual(&type_spec.qual)) {}
391 blk: {394 blk: {
392 if (parser.eatToken(.Keyword_void)) |tok| {395 if (parser.eatToken(.Keyword_void)) |tok| {
393 if (type_spec.spec != .None)396 if (type_spec.spec != .None)
394 break :blk;397 break :blk;
395 type_spec.spec = .{ .Void = tok };398 type_spec.spec = .{ .Void = tok };
396 return true;
397 } else if (parser.eatToken(.Keyword_char)) |tok| {399 } else if (parser.eatToken(.Keyword_char)) |tok| {
398 switch (type_spec.spec) {400 switch (type_spec.spec) {
399 .None => {401 .None => {
...@@ -415,7 +417,6 @@ const Parser = struct {...@@ -415,7 +417,6 @@ const Parser = struct {
415 },417 },
416 else => break :blk,418 else => break :blk,
417 }419 }
418 return true;
419 } else if (parser.eatToken(.Keyword_short)) |tok| {420 } else if (parser.eatToken(.Keyword_short)) |tok| {
420 switch (type_spec.spec) {421 switch (type_spec.spec) {
421 .None => {422 .None => {
...@@ -437,7 +438,6 @@ const Parser = struct {...@@ -437,7 +438,6 @@ const Parser = struct {
437 },438 },
438 else => break :blk,439 else => break :blk,
439 }440 }
440 return true;
441 } else if (parser.eatToken(.Keyword_long)) |tok| {441 } else if (parser.eatToken(.Keyword_long)) |tok| {
442 switch (type_spec.spec) {442 switch (type_spec.spec) {
443 .None => {443 .None => {
...@@ -468,7 +468,6 @@ const Parser = struct {...@@ -468,7 +468,6 @@ const Parser = struct {
468 },468 },
469 else => break :blk,469 else => break :blk,
470 }470 }
471 return true;
472 } else if (parser.eatToken(.Keyword_int)) |tok| {471 } else if (parser.eatToken(.Keyword_int)) |tok| {
473 switch (type_spec.spec) {472 switch (type_spec.spec) {
474 .None => {473 .None => {
...@@ -495,7 +494,6 @@ const Parser = struct {...@@ -495,7 +494,6 @@ const Parser = struct {
495 },494 },
496 else => break :blk,495 else => break :blk,
497 }496 }
498 return true;
499 } else if (parser.eatToken(.Keyword_signed) orelse parser.eatToken(.Keyword_unsigned)) |tok| {497 } else if (parser.eatToken(.Keyword_signed) orelse parser.eatToken(.Keyword_unsigned)) |tok| {
500 switch (type_spec.spec) {498 switch (type_spec.spec) {
501 .None => {499 .None => {
...@@ -527,7 +525,6 @@ const Parser = struct {...@@ -527,7 +525,6 @@ const Parser = struct {
527 },525 },
528 else => break :blk,526 else => break :blk,
529 }527 }
530 return true;
531 } else if (parser.eatToken(.Keyword_float)) |tok| {528 } else if (parser.eatToken(.Keyword_float)) |tok| {
532 if (type_spec.spec != .None)529 if (type_spec.spec != .None)
533 break :blk;530 break :blk;
...@@ -536,7 +533,6 @@ const Parser = struct {...@@ -536,7 +533,6 @@ const Parser = struct {
536 .float = tok,533 .float = tok,
537 },534 },
538 };535 };
539 return true;
540 } else if (parser.eatToken(.Keyword_double)) |tok| {536 } else if (parser.eatToken(.Keyword_double)) |tok| {
541 if (type_spec.spec != .None)537 if (type_spec.spec != .None)
542 break :blk;538 break :blk;
...@@ -545,7 +541,6 @@ const Parser = struct {...@@ -545,7 +541,6 @@ const Parser = struct {
545 .double = tok,541 .double = tok,
546 },542 },
547 };543 };
548 return true;
549 } else if (parser.eatToken(.Keyword_complex)) |tok| {544 } else if (parser.eatToken(.Keyword_complex)) |tok| {
550 switch (type_spec.spec) {545 switch (type_spec.spec) {
551 .None => {546 .None => {
...@@ -568,36 +563,34 @@ const Parser = struct {...@@ -568,36 +563,34 @@ const Parser = struct {
568 },563 },
569 else => break :blk,564 else => break :blk,
570 }565 }
571 return true;566 } else if (parser.eatToken(.Keyword_bool)) |tok| {
572 }
573 if (parser.eatToken(.Keyword_bool)) |tok| {
574 if (type_spec.spec != .None)567 if (type_spec.spec != .None)
575 break :blk;568 break :blk;
576 type_spec.spec = .{ .Bool = tok };569 type_spec.spec = .{ .Bool = tok };
577 return true;
578 } else if (parser.eatToken(.Keyword_atomic)) |tok| {570 } else if (parser.eatToken(.Keyword_atomic)) |tok| {
579 if (type_spec.spec != .None)571 // might be _Atomic qualifier
580 break :blk;572 if (parser.eatToken(.LParen)) |_| {
581 _ = try parser.expectToken(.LParen);573 if (type_spec.spec != .None)
582 const name = (try parser.typeName()) orelse return parser.err(.{574 break :blk;
583 .ExpectedTypeName = .{ .token = parser.it.index },575 const name = (try parser.typeName()) orelse return parser.err(.{
584 });576 .ExpectedTypeName = .{ .token = parser.it.index },
585 type_spec.spec.Atomic = .{577 });
586 .atomic = tok,578 type_spec.spec.Atomic = .{
587 .typename = name,579 .atomic = tok,
588 .rparen = try parser.expectToken(.RParen),580 .typename = name,
589 };581 .rparen = try parser.expectToken(.RParen),
590 return true;582 };
583 } else {
584 parser.putBackToken(tok);
585 }
591 } else if (parser.eatToken(.Keyword_enum)) |tok| {586 } else if (parser.eatToken(.Keyword_enum)) |tok| {
592 if (type_spec.spec != .None)587 if (type_spec.spec != .None)
593 break :blk;588 break :blk;
594 type_spec.spec.Enum = try parser.enumSpec(tok);589 type_spec.spec.Enum = try parser.enumSpec(tok);
595 return true;
596 } else if (parser.eatToken(.Keyword_union) orelse parser.eatToken(.Keyword_struct)) |tok| {590 } else if (parser.eatToken(.Keyword_union) orelse parser.eatToken(.Keyword_struct)) |tok| {
597 if (type_spec.spec != .None)591 if (type_spec.spec != .None)
598 break :blk;592 break :blk;
599 type_spec.spec.Record = try parser.recordSpec(tok);593 type_spec.spec.Record = try parser.recordSpec(tok);
600 return true;
601 } else if (parser.eatToken(.Identifier)) |tok| {594 } else if (parser.eatToken(.Identifier)) |tok| {
602 const ty = parser.getSymbol(tok) orelse {595 const ty = parser.getSymbol(tok) orelse {
603 parser.putBackToken(tok);596 parser.putBackToken(tok);
...@@ -637,6 +630,7 @@ const Parser = struct {...@@ -637,6 +630,7 @@ const Parser = struct {
637 parser.putBackToken(tok);630 parser.putBackToken(tok);
638 return false;631 return false;
639 }632 }
633 return parser.typeQual(&type_spec.qual);
640 }634 }
641 return parser.err(.{635 return parser.err(.{
642 .InvalidTypeSpecifier = .{636 .InvalidTypeSpecifier = .{
...@@ -874,6 +868,7 @@ const Parser = struct {...@@ -874,6 +868,7 @@ const Parser = struct {
874 var node: *Node.Declarator = undefined;868 var node: *Node.Declarator = undefined;
875 var inner_fn = false;869 var inner_fn = false;
876870
871 // TODO sizof(int (int))
877 // prefix872 // prefix
878 if (parser.eatToken(.LParen)) |lparen| {873 if (parser.eatToken(.LParen)) |lparen| {
879 const inner = (try parser.declarator(named)) orelse return parser.err(.{874 const inner = (try parser.declarator(named)) orelse return parser.err(.{
...@@ -981,6 +976,7 @@ const Parser = struct {...@@ -981,6 +976,7 @@ const Parser = struct {
981 var ds = Node.DeclSpec{};976 var ds = Node.DeclSpec{};
982 if (try parser.declSpec(&ds)) {977 if (try parser.declSpec(&ds)) {
983 //TODO978 //TODO
979 // TODO try parser.declareSymbol(ds.type_spec, dr);
984 } else if (parser.eatToken(.Identifier)) |tok| {980 } else if (parser.eatToken(.Identifier)) |tok| {
985 old_style = true;981 old_style = true;
986 } else if (parser.eatToken(.Ellipsis)) |tok| {982 } else if (parser.eatToken(.Ellipsis)) |tok| {
lib/std/c/tokenizer.zig+7-1
...@@ -593,9 +593,15 @@ pub const Tokenizer = struct {...@@ -593,9 +593,15 @@ pub const Tokenizer = struct {
593 '\\' => {593 '\\' => {
594 state = .BackSlash;594 state = .BackSlash;
595 },595 },
596 else => {596 '\t', '\x0B', '\x0C', ' ' => {
597 result.start = self.index + 1;597 result.start = self.index + 1;
598 },598 },
599 else => {
600 // TODO handle invalid bytes better
601 result.id = .Invalid;
602 self.index += 1;
603 break;
604 },
599 },605 },
600 .Cr => switch (c) {606 .Cr => switch (c) {
601 '\n' => {607 '\n' => {