| ... | @@ -16,7 +16,6 @@ const std = @import("std"); | ... | @@ -16,7 +16,6 @@ const std = @import("std"); |
| 16 | const common = @import("./common.zig"); | 16 | const common = @import("./common.zig"); |
| 17 | const builtin = @import("builtin"); | 17 | const builtin = @import("builtin"); |
| 18 | | 18 | |
| 19 | extern fn strncpy(dest: [*:0]u8, src: [*:0]const u8, n: usize) callconv(.C) [*:0]u8; | | |
| 20 | extern fn memset(dest: ?[*]u8, c: u8, n: usize) callconv(.C) ?[*]u8; | 19 | extern fn memset(dest: ?[*]u8, c: u8, n: usize) callconv(.C) ?[*]u8; |
| 21 | extern fn memcpy(noalias dest: ?[*]u8, noalias src: ?[*]const u8, n: usize) callconv(.C) ?[*]u8; | 20 | extern fn memcpy(noalias dest: ?[*]u8, noalias src: ?[*]const u8, n: usize) callconv(.C) ?[*]u8; |
| 22 | extern fn memmove(dest: ?[*]u8, src: ?[*]const u8, n: usize) callconv(.C) ?[*]u8; | 21 | extern fn memmove(dest: ?[*]u8, src: ?[*]const u8, n: usize) callconv(.C) ?[*]u8; |
| ... | @@ -66,8 +65,16 @@ fn __strcpy_chk(dest: [*:0]u8, src: [*:0]const u8, dest_n: usize) callconv(.C) [ | ... | @@ -66,8 +65,16 @@ fn __strcpy_chk(dest: [*:0]u8, src: [*:0]const u8, dest_n: usize) callconv(.C) [ |
| 66 | } | 65 | } |
| 67 | | 66 | |
| 68 | fn __strncpy_chk(dest: [*:0]u8, src: [*:0]const u8, n: usize, dest_n: usize) callconv(.C) [*:0]u8 { | 67 | fn __strncpy_chk(dest: [*:0]u8, src: [*:0]const u8, n: usize, dest_n: usize) callconv(.C) [*:0]u8 { |
| | 68 | @setRuntimeSafety(false); |
| 69 | if (dest_n < n) __chk_fail(); | 69 | if (dest_n < n) __chk_fail(); |
| 70 | return strncpy(dest, src, n); | 70 | var i: usize = 0; |
| | 71 | while (i < n and src[i] != 0) : (i += 1) { |
| | 72 | dest[i] = src[i]; |
| | 73 | } |
| | 74 | while (i < n) : (i += 1) { |
| | 75 | dest[i] = 0; |
| | 76 | } |
| | 77 | return dest; |
| 71 | } | 78 | } |
| 72 | | 79 | |
| 73 | fn __strcat_chk(dest: [*:0]u8, src: [*:0]const u8, dest_n: usize) callconv(.C) [*:0]u8 { | 80 | fn __strcat_chk(dest: [*:0]u8, src: [*:0]const u8, dest_n: usize) callconv(.C) [*:0]u8 { |