| ... | @@ -5,27 +5,26 @@ comptime { | ... | @@ -5,27 +5,26 @@ comptime { |
| 5 | @export(memcmp, .{ .name = "memcmp", .linkage = common.linkage }); | 5 | @export(memcmp, .{ .name = "memcmp", .linkage = common.linkage }); |
| 6 | } | 6 | } |
| 7 | | 7 | |
| 8 | pub fn memcmp(vl: ?[*]const u8, vr: ?[*]const u8, n: usize) callconv(.C) c_int { | 8 | pub fn memcmp(vl: [*]const u8, vr: [*]const u8, n: usize) callconv(.C) c_int { |
| 9 | @setRuntimeSafety(false); | 9 | var i: usize = 0; |
| 10 | | 10 | while (i < n) : (i += 1) { |
| 11 | var index: usize = 0; | 11 | const compared = @as(c_int, vl[i]) -% @as(c_int, vr[i]); |
| 12 | while (index != n) : (index += 1) { | 12 | if (compared != 0) return compared; |
| 13 | const compare_val = @bitCast(i8, vl.?[index] -% vr.?[index]); | | |
| 14 | if (compare_val != 0) { | | |
| 15 | return compare_val; | | |
| 16 | } | | |
| 17 | } | 13 | } |
| 18 | | | |
| 19 | return 0; | 14 | return 0; |
| 20 | } | 15 | } |
| 21 | | 16 | |
| 22 | test "memcmp" { | 17 | test "memcmp" { |
| 23 | const base_arr = &[_]u8{ 1, 1, 1 }; | 18 | const arr0 = &[_]u8{ 1, 1, 1 }; |
| 24 | const arr1 = &[_]u8{ 1, 1, 1 }; | 19 | const arr1 = &[_]u8{ 1, 1, 1 }; |
| 25 | const arr2 = &[_]u8{ 1, 0, 1 }; | 20 | const arr2 = &[_]u8{ 1, 0, 1 }; |
| 26 | const arr3 = &[_]u8{ 1, 2, 1 }; | 21 | const arr3 = &[_]u8{ 1, 2, 1 }; |
| | 22 | const arr4 = &[_]u8{ 1, 0xff, 1 }; |
| | 23 | |
| | 24 | try std.testing.expect(memcmp(arr0, arr1, 3) == 0); |
| | 25 | try std.testing.expect(memcmp(arr0, arr2, 3) > 0); |
| | 26 | try std.testing.expect(memcmp(arr0, arr3, 3) < 0); |
| 27 | | 27 | |
| 28 | try std.testing.expect(memcmp(base_arr[0..], arr1[0..], base_arr.len) == 0); | 28 | try std.testing.expect(memcmp(arr0, arr4, 3) < 0); |
| 29 | try std.testing.expect(memcmp(base_arr[0..], arr2[0..], base_arr.len) > 0); | 29 | try std.testing.expect(memcmp(arr4, arr0, 3) > 0); |
| 30 | try std.testing.expect(memcmp(base_arr[0..], arr3[0..], base_arr.len) < 0); | | |
| 31 | } | 30 | } |