| ... | @@ -43,6 +43,9 @@ comptime { | ... | @@ -43,6 +43,9 @@ comptime { |
| 43 | | 43 | |
| 44 | @export(&execveLinux, .{ .name = "execve", .linkage = common.linkage, .visibility = common.visibility }); | 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 | fn _exit(exit_code: c_int) callconv(.c) noreturn { | 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,3 +184,42 @@ fn unlinkatLinux(fd: c_int, path: [*:0]const c_char, flags: c_int) callconv(.c) |
| 181 | fn execveLinux(path: [*:0]const c_char, argv: [*:null]const ?[*:0]c_char, envp: [*:null]const ?[*:0]c_char) callconv(.c) c_int { | 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 | return common.errno(linux.execve(@ptrCast(path), @ptrCast(argv), @ptrCast(envp))); | 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 | } |