| ... | @@ -359,12 +359,9 @@ pub const Tokenizer = struct { | ... | @@ -359,12 +359,9 @@ pub const Tokenizer = struct { |
| 359 | }; | 359 | }; |
| 360 | }; | 360 | }; |
| 361 | | 361 | |
| 362 | // stage1 compiler support | | |
| 363 | var stage2_da = std.heap.DirectAllocator.init(); | | |
| 364 | | | |
| 365 | export fn stage2_DepTokenizer_init(input: [*]const u8, len: usize) stage2_DepTokenizer { | 362 | export fn stage2_DepTokenizer_init(input: [*]const u8, len: usize) stage2_DepTokenizer { |
| 366 | const t = stage2_da.allocator.create(Tokenizer) catch unreachable; | 363 | const t = std.heap.c_allocator.create(Tokenizer) catch @panic("failed to create .d tokenizer"); |
| 367 | t.* = Tokenizer.init(&stage2_da.allocator, input[0..len]); | 364 | t.* = Tokenizer.init(std.heap.c_allocator, input[0..len]); |
| 368 | return stage2_DepTokenizer{ | 365 | return stage2_DepTokenizer{ |
| 369 | .handle = t, | 366 | .handle = t, |
| 370 | }; | 367 | }; |
| ... | @@ -376,20 +373,25 @@ export fn stage2_DepTokenizer_deinit(self: *stage2_DepTokenizer) void { | ... | @@ -376,20 +373,25 @@ export fn stage2_DepTokenizer_deinit(self: *stage2_DepTokenizer) void { |
| 376 | | 373 | |
| 377 | export fn stage2_DepTokenizer_next(self: *stage2_DepTokenizer) stage2_DepNextResult { | 374 | export fn stage2_DepTokenizer_next(self: *stage2_DepTokenizer) stage2_DepNextResult { |
| 378 | const otoken = self.handle.next() catch { | 375 | const otoken = self.handle.next() catch { |
| | 376 | const textz = std.Buffer.init(&self.handle.arena.allocator, self.handle.error_text) catch @panic("failed to create .d tokenizer error text"); |
| 379 | return stage2_DepNextResult{ | 377 | return stage2_DepNextResult{ |
| 380 | .ent = 0, | 378 | .type_id = .error_, |
| 381 | .textz = (std.Buffer.init(&self.handle.arena.allocator, self.handle.error_text) catch unreachable).toSlice().ptr, | 379 | .textz = textz.toSlice().ptr, |
| 382 | }; | 380 | }; |
| 383 | }; | 381 | }; |
| 384 | const token = otoken orelse { | 382 | const token = otoken orelse { |
| 385 | return stage2_DepNextResult{ | 383 | return stage2_DepNextResult{ |
| 386 | .ent = 1, | 384 | .type_id = .null_, |
| 387 | .textz = undefined, | 385 | .textz = undefined, |
| 388 | }; | 386 | }; |
| 389 | }; | 387 | }; |
| | 388 | const textz = std.Buffer.init(&self.handle.arena.allocator, token.bytes) catch @panic("failed to create .d tokenizer token text"); |
| 390 | return stage2_DepNextResult{ | 389 | return stage2_DepNextResult{ |
| 391 | .ent = @enumToInt(token.id) + u8(2), | 390 | .type_id = switch (token.id) { |
| 392 | .textz = (std.Buffer.init(&self.handle.arena.allocator, token.bytes) catch unreachable).toSlice().ptr, | 391 | .target => stage2_DepNextResult.TypeId.target, |
| | 392 | .prereq => stage2_DepNextResult.TypeId.prereq, |
| | 393 | }, |
| | 394 | .textz = textz.toSlice().ptr, |
| 393 | }; | 395 | }; |
| 394 | } | 396 | } |
| 395 | | 397 | |
| ... | @@ -398,13 +400,20 @@ export const stage2_DepTokenizer = extern struct { | ... | @@ -398,13 +400,20 @@ export const stage2_DepTokenizer = extern struct { |
| 398 | }; | 400 | }; |
| 399 | | 401 | |
| 400 | export const stage2_DepNextResult = extern struct { | 402 | export const stage2_DepNextResult = extern struct { |
| 401 | // 0=error, 1=null, 2=token=target, 3=token=prereq | 403 | type_id: TypeId, |
| 402 | ent: u8, | 404 | |
| 403 | // ent=0 -- error text | 405 | // when type_id == error --> error text |
| 404 | // ent=1 -- NEVER | 406 | // when type_id == null --> undefined |
| 405 | // ent=2 -- token text value | 407 | // when type_id == target --> target pathname |
| 406 | // ent=3 -- token text value | 408 | // when type_id == prereq --> prereq pathname |
| 407 | textz: [*]const u8, | 409 | textz: [*]const u8, |
| | 410 | |
| | 411 | export const TypeId = extern enum { |
| | 412 | error_, |
| | 413 | null_, |
| | 414 | target, |
| | 415 | prereq, |
| | 416 | }; |
| 408 | }; | 417 | }; |
| 409 | | 418 | |
| 410 | test "empty file" { | 419 | test "empty file" { |