| ... | ... | @@ -43,6 +43,9 @@ comptime { |
| 43 | 43 | |
| 44 | 44 | @export(&execveLinux, .{ .name = "execve", .linkage = common.linkage, .visibility = common.visibility }); |
| 45 | 45 | } |
| 46 | if (builtin.target.isMuslLibC() or builtin.target.isWasiLibC()) { |
| 47 | @export(&swab, .{ .name = "swab", .linkage = common.linkage, .visibility = common.visibility }); |
| 48 | } |
| 46 | 49 | } |
| 47 | 50 | |
| 48 | 51 | fn _exit(exit_code: c_int) callconv(.c) noreturn { |
| ... | ... | @@ -181,3 +184,42 @@ fn unlinkatLinux(fd: c_int, path: [*:0]const c_char, flags: c_int) callconv(.c) |
| 181 | 184 | fn execveLinux(path: [*:0]const c_char, argv: [*:null]const ?[*:0]c_char, envp: [*:null]const ?[*:0]c_char) callconv(.c) c_int { |
| 182 | 185 | return common.errno(linux.execve(@ptrCast(path), @ptrCast(argv), @ptrCast(envp))); |
| 183 | 186 | } |
| 187 | |
| 188 | fn swab(noalias src_ptr: *const anyopaque, noalias dest_ptr: *anyopaque, n: isize) callconv(.c) void { |
| 189 | var src: [*]const u8 = @ptrCast(src_ptr); |
| 190 | var dest: [*]u8 = @ptrCast(dest_ptr); |
| 191 | var i = n; |
| 192 | |
| 193 | while (i > 1) : (i -= 2) { |
| 194 | dest[0] = src[1]; |
| 195 | dest[1] = src[0]; |
| 196 | dest += 2; |
| 197 | src += 2; |
| 198 | } |
| 199 | } |
| 200 | |
| 201 | test swab { |
| 202 | var a: [4]u8 = undefined; |
| 203 | @memset(a[0..], '\x00'); |
| 204 | swab("abcd", &a, 4); |
| 205 | try std.testing.expectEqualSlices(u8, "badc", &a); |
| 206 | |
| 207 | // Partial copy |
| 208 | @memset(a[0..], '\x00'); |
| 209 | swab("abcd", &a, 2); |
| 210 | try std.testing.expectEqualSlices(u8, "ba\x00\x00", &a); |
| 211 | |
| 212 | // n < 1 |
| 213 | @memset(a[0..], '\x00'); |
| 214 | swab("abcd", &a, 0); |
| 215 | try std.testing.expectEqualSlices(u8, "\x00" ** 4, &a); |
| 216 | swab("abcd", &a, -1); |
| 217 | try std.testing.expectEqualSlices(u8, "\x00" ** 4, &a); |
| 218 | |
| 219 | // Odd n |
| 220 | @memset(a[0..], '\x00'); |
| 221 | swab("abcd", &a, 1); |
| 222 | try std.testing.expectEqualSlices(u8, "\x00" ** 4, &a); |
| 223 | swab("abcd", &a, 3); |
| 224 | try std.testing.expectEqualSlices(u8, "ba\x00\x00", &a); |
| 225 | } |