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 {
221221 Root,
222222 EnumField,
223223 RecordField,
224 RecordDeclarator,
224225 JumpStmt,
225226 ExprStmt,
226227 LabeledStmt,
......@@ -437,8 +438,8 @@ pub const Node = struct {
437438 };
438439
439440 pub const RecordDeclarator = struct {
440 base: Node = Node{ .id = .RecordField },
441 declarator: *Declarator,
441 base: Node = Node{ .id = .RecordDeclarator },
442 declarator: ?*Declarator,
442443 bit_field_expr: ?*Expr,
443444 };
444445
lib/std/c/parse.zig+25-29
......@@ -13,8 +13,8 @@ const TokenIterator = ast.Tree.TokenList.Iterator;
1313pub const Error = error{ParseError} || Allocator.Error;
1414
1515pub const Options = struct {
16 /// Keep simple macros unexpanded and add the definitions to the ast
17 retain_macros: bool = false,
16 // /// Keep simple macros unexpanded and add the definitions to the ast
17 // retain_macros: bool = false,
1818
1919 /// Warning or error
2020 warn_as_err: union(enum) {
......@@ -204,12 +204,16 @@ const Parser = struct {
204204 }
205205 var first_dr = try parser.declarator(.Must);
206206 if (first_dr != null and declaratorIsFunction(first_dr.?)) {
207 // TODO typedeffed fn proto-only
207208 const dr = @fieldParentPtr(Node.Declarator, "base", first_dr.?);
208209 try parser.declareSymbol(ds.type_spec, dr);
209210 var old_decls = Node.FnDecl.OldDeclList.init(parser.arena);
210211 const body = if (parser.eatToken(.Semicolon)) |_|
211212 null
212213 else blk: {
214 if (local) {
215 // TODO nested function warning
216 }
213217 // TODO first_dr.is_old
214218 // while (true) {
215219 // var old_ds = Node.DeclSpec{};
......@@ -387,13 +391,11 @@ const Parser = struct {
387391 /// / IDENTIFIER // typedef name
388392 /// / TypeQual
389393 fn typeSpec(parser: *Parser, type_spec: *Node.TypeSpec) !bool {
390 while (try parser.typeQual(&type_spec.qual)) {}
391394 blk: {
392395 if (parser.eatToken(.Keyword_void)) |tok| {
393396 if (type_spec.spec != .None)
394397 break :blk;
395398 type_spec.spec = .{ .Void = tok };
396 return true;
397399 } else if (parser.eatToken(.Keyword_char)) |tok| {
398400 switch (type_spec.spec) {
399401 .None => {
......@@ -415,7 +417,6 @@ const Parser = struct {
415417 },
416418 else => break :blk,
417419 }
418 return true;
419420 } else if (parser.eatToken(.Keyword_short)) |tok| {
420421 switch (type_spec.spec) {
421422 .None => {
......@@ -437,7 +438,6 @@ const Parser = struct {
437438 },
438439 else => break :blk,
439440 }
440 return true;
441441 } else if (parser.eatToken(.Keyword_long)) |tok| {
442442 switch (type_spec.spec) {
443443 .None => {
......@@ -468,7 +468,6 @@ const Parser = struct {
468468 },
469469 else => break :blk,
470470 }
471 return true;
472471 } else if (parser.eatToken(.Keyword_int)) |tok| {
473472 switch (type_spec.spec) {
474473 .None => {
......@@ -495,7 +494,6 @@ const Parser = struct {
495494 },
496495 else => break :blk,
497496 }
498 return true;
499497 } else if (parser.eatToken(.Keyword_signed) orelse parser.eatToken(.Keyword_unsigned)) |tok| {
500498 switch (type_spec.spec) {
501499 .None => {
......@@ -527,7 +525,6 @@ const Parser = struct {
527525 },
528526 else => break :blk,
529527 }
530 return true;
531528 } else if (parser.eatToken(.Keyword_float)) |tok| {
532529 if (type_spec.spec != .None)
533530 break :blk;
......@@ -536,7 +533,6 @@ const Parser = struct {
536533 .float = tok,
537534 },
538535 };
539 return true;
540536 } else if (parser.eatToken(.Keyword_double)) |tok| {
541537 if (type_spec.spec != .None)
542538 break :blk;
......@@ -545,7 +541,6 @@ const Parser = struct {
545541 .double = tok,
546542 },
547543 };
548 return true;
549544 } else if (parser.eatToken(.Keyword_complex)) |tok| {
550545 switch (type_spec.spec) {
551546 .None => {
......@@ -568,36 +563,34 @@ const Parser = struct {
568563 },
569564 else => break :blk,
570565 }
571 return true;
572 }
573 if (parser.eatToken(.Keyword_bool)) |tok| {
566 } else if (parser.eatToken(.Keyword_bool)) |tok| {
574567 if (type_spec.spec != .None)
575568 break :blk;
576569 type_spec.spec = .{ .Bool = tok };
577 return true;
578570 } else if (parser.eatToken(.Keyword_atomic)) |tok| {
579 if (type_spec.spec != .None)
580 break :blk;
581 _ = try parser.expectToken(.LParen);
582 const name = (try parser.typeName()) orelse return parser.err(.{
583 .ExpectedTypeName = .{ .token = parser.it.index },
584 });
585 type_spec.spec.Atomic = .{
586 .atomic = tok,
587 .typename = name,
588 .rparen = try parser.expectToken(.RParen),
589 };
590 return true;
571 // might be _Atomic qualifier
572 if (parser.eatToken(.LParen)) |_| {
573 if (type_spec.spec != .None)
574 break :blk;
575 const name = (try parser.typeName()) orelse return parser.err(.{
576 .ExpectedTypeName = .{ .token = parser.it.index },
577 });
578 type_spec.spec.Atomic = .{
579 .atomic = tok,
580 .typename = name,
581 .rparen = try parser.expectToken(.RParen),
582 };
583 } else {
584 parser.putBackToken(tok);
585 }
591586 } else if (parser.eatToken(.Keyword_enum)) |tok| {
592587 if (type_spec.spec != .None)
593588 break :blk;
594589 type_spec.spec.Enum = try parser.enumSpec(tok);
595 return true;
596590 } else if (parser.eatToken(.Keyword_union) orelse parser.eatToken(.Keyword_struct)) |tok| {
597591 if (type_spec.spec != .None)
598592 break :blk;
599593 type_spec.spec.Record = try parser.recordSpec(tok);
600 return true;
601594 } else if (parser.eatToken(.Identifier)) |tok| {
602595 const ty = parser.getSymbol(tok) orelse {
603596 parser.putBackToken(tok);
......@@ -637,6 +630,7 @@ const Parser = struct {
637630 parser.putBackToken(tok);
638631 return false;
639632 }
633 return parser.typeQual(&type_spec.qual);
640634 }
641635 return parser.err(.{
642636 .InvalidTypeSpecifier = .{
......@@ -874,6 +868,7 @@ const Parser = struct {
874868 var node: *Node.Declarator = undefined;
875869 var inner_fn = false;
876870
871 // TODO sizof(int (int))
877872 // prefix
878873 if (parser.eatToken(.LParen)) |lparen| {
879874 const inner = (try parser.declarator(named)) orelse return parser.err(.{
......@@ -981,6 +976,7 @@ const Parser = struct {
981976 var ds = Node.DeclSpec{};
982977 if (try parser.declSpec(&ds)) {
983978 //TODO
979 // TODO try parser.declareSymbol(ds.type_spec, dr);
984980 } else if (parser.eatToken(.Identifier)) |tok| {
985981 old_style = true;
986982 } else if (parser.eatToken(.Ellipsis)) |tok| {
lib/std/c/tokenizer.zig+7-1
......@@ -593,9 +593,15 @@ pub const Tokenizer = struct {
593593 '\\' => {
594594 state = .BackSlash;
595595 },
596 else => {
596 '\t', '\x0B', '\x0C', ' ' => {
597597 result.start = self.index + 1;
598598 },
599 else => {
600 // TODO handle invalid bytes better
601 result.id = .Invalid;
602 self.index += 1;
603 break;
604 },
599605 },
600606 .Cr => switch (c) {
601607 '\n' => {