authorgravatar for thejoshwolfe@gmail.comJosh Wolfe <thejoshwolfe@gmail.com> 2017-12-22 00:49:17-07:00
committergravatar for thejoshwolfe@gmail.comJosh Wolfe <thejoshwolfe@gmail.com> 2017-12-22 00:52:01-07:00
log0e7fb69bea4d2b50ab352b71de87a563b57a645a
tree4d0222c13dbfff5851af1875778401bb860dc4b6
parentea805c5fe7a8e24597fcd59f064efc2a7dca3859

bufPrint returns an error


2 files changed, 19 insertions(+), 13 deletions(-)

std/fmt/index.zig+18-12
......@@ -371,6 +371,10 @@ test "fmt.parseInt" {
371371 assert(%%parseInt(i32, "-10", 10) == -10);
372372 assert(%%parseInt(i32, "+10", 10) == 10);
373373 assert(if (parseInt(i32, " 10", 10)) |_| false else |err| err == error.InvalidChar);
374 assert(if (parseInt(i32, "10 ", 10)) |_| false else |err| err == error.InvalidChar);
375 assert(if (parseInt(u32, "-10", 10)) |_| false else |err| err == error.InvalidChar);
376 assert(%%parseInt(u8, "255", 10) == 255);
377 assert(if (parseInt(u8, "256", 10)) |_| false else |err| err == error.Overflow);
374378}
375379
376380pub fn parseUnsigned(comptime T: type, buf: []const u8, radix: u8) -> %T {
......@@ -412,14 +416,16 @@ const BufPrintContext = struct {
412416 remaining: []u8,
413417};
414418
419error BufferTooSmall;
415420fn bufPrintWrite(context: &BufPrintContext, bytes: []const u8) -> %void {
421 if (context.remaining.len < bytes.len) return error.BufferTooSmall;
416422 mem.copy(u8, context.remaining, bytes);
417423 context.remaining = context.remaining[bytes.len..];
418424}
419425
420pub fn bufPrint(buf: []u8, comptime fmt: []const u8, args: ...) -> []u8 {
426pub fn bufPrint(buf: []u8, comptime fmt: []const u8, args: ...) -> %[]u8 {
421427 var context = BufPrintContext { .remaining = buf, };
422 %%format(&context, bufPrintWrite, fmt, args);
428 %return format(&context, bufPrintWrite, fmt, args);
423429 return buf[0..buf.len - context.remaining.len];
424430}
425431
......@@ -475,31 +481,31 @@ test "fmt.format" {
475481 {
476482 var buf1: [32]u8 = undefined;
477483 const value: ?i32 = 1234;
478 const result = bufPrint(buf1[0..], "nullable: {}\n", value);
484 const result = %%bufPrint(buf1[0..], "nullable: {}\n", value);
479485 assert(mem.eql(u8, result, "nullable: 1234\n"));
480486 }
481487 {
482488 var buf1: [32]u8 = undefined;
483489 const value: ?i32 = null;
484 const result = bufPrint(buf1[0..], "nullable: {}\n", value);
490 const result = %%bufPrint(buf1[0..], "nullable: {}\n", value);
485491 assert(mem.eql(u8, result, "nullable: null\n"));
486492 }
487493 {
488494 var buf1: [32]u8 = undefined;
489495 const value: %i32 = 1234;
490 const result = bufPrint(buf1[0..], "error union: {}\n", value);
496 const result = %%bufPrint(buf1[0..], "error union: {}\n", value);
491497 assert(mem.eql(u8, result, "error union: 1234\n"));
492498 }
493499 {
494500 var buf1: [32]u8 = undefined;
495501 const value: %i32 = error.InvalidChar;
496 const result = bufPrint(buf1[0..], "error union: {}\n", value);
502 const result = %%bufPrint(buf1[0..], "error union: {}\n", value);
497503 assert(mem.eql(u8, result, "error union: error.InvalidChar\n"));
498504 }
499505 {
500506 var buf1: [32]u8 = undefined;
501507 const value: u3 = 0b101;
502 const result = bufPrint(buf1[0..], "u3: {}\n", value);
508 const result = %%bufPrint(buf1[0..], "u3: {}\n", value);
503509 assert(mem.eql(u8, result, "u3: 5\n"));
504510 }
505511
......@@ -509,28 +515,28 @@ test "fmt.format" {
509515 {
510516 var buf1: [32]u8 = undefined;
511517 const value: f32 = 12.34;
512 const result = bufPrint(buf1[0..], "f32: {}\n", value);
518 const result = %%bufPrint(buf1[0..], "f32: {}\n", value);
513519 assert(mem.eql(u8, result, "f32: 1.23400001e1\n"));
514520 }
515521 {
516522 var buf1: [32]u8 = undefined;
517523 const value: f64 = -12.34e10;
518 const result = bufPrint(buf1[0..], "f64: {}\n", value);
524 const result = %%bufPrint(buf1[0..], "f64: {}\n", value);
519525 assert(mem.eql(u8, result, "f64: -1.234e11\n"));
520526 }
521527 {
522528 var buf1: [32]u8 = undefined;
523 const result = bufPrint(buf1[0..], "f64: {}\n", math.nan_f64);
529 const result = %%bufPrint(buf1[0..], "f64: {}\n", math.nan_f64);
524530 assert(mem.eql(u8, result, "f64: NaN\n"));
525531 }
526532 {
527533 var buf1: [32]u8 = undefined;
528 const result = bufPrint(buf1[0..], "f64: {}\n", math.inf_f64);
534 const result = %%bufPrint(buf1[0..], "f64: {}\n", math.inf_f64);
529535 assert(mem.eql(u8, result, "f64: Infinity\n"));
530536 }
531537 {
532538 var buf1: [32]u8 = undefined;
533 const result = bufPrint(buf1[0..], "f64: {}\n", -math.inf_f64);
539 const result = %%bufPrint(buf1[0..], "f64: {}\n", -math.inf_f64);
534540 assert(mem.eql(u8, result, "f64: -Infinity\n"));
535541 }
536542 }
std/os/path.zig+1-1
......@@ -1012,7 +1012,7 @@ pub fn real(allocator: &Allocator, pathname: []const u8) -> %[]u8 {
10121012 defer os.close(fd);
10131013
10141014 var buf: ["/proc/self/fd/-2147483648".len]u8 = undefined;
1015 const proc_path = fmt.bufPrint(buf[0..], "/proc/self/fd/{}", fd);
1015 const proc_path = %%fmt.bufPrint(buf[0..], "/proc/self/fd/{}", fd);
10161016
10171017 return os.readLink(allocator, proc_path);
10181018 },