Skip to content

Commit 63d8175

Browse files
committed
read_symlink: always string class
1 parent fcaa3cd commit 63d8175

File tree

4 files changed

+25
-16
lines changed

4 files changed

+25
-16
lines changed

+stdlib/read_symlink.m

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
%% READ_SYMLINK read symbolic link
22
%
33
% empty string if path is not a symlink
4+
% always of string class in Matlab
45

56
function r = read_symlink(p)
67
arguments
@@ -10,7 +11,7 @@
1011

1112
try
1213
[ok, r] = isSymbolicLink(p);
13-
if ~ok, r = ''; end
14+
if ~ok, r = string.empty; end
1415
catch e
1516
switch e.identifier
1617
case "Octave:undefined-function", r = readlink(p);
@@ -23,16 +24,12 @@
2324
% https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/nio/file/Files.html#readSymbolicLink(java.nio.file.Path)
2425
r = java.nio.file.Files.readSymbolicLink(javaPathObject(r)).string;
2526
else
26-
r = '';
27+
r = string.empty;
2728
end
2829
otherwise, rethrow(e)
2930
end
3031
end
3132

32-
if isstring(p)
33-
r = string(r);
34-
end
35-
3633
end
3734

3835
%!test

src/read_symlink.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,12 @@ class MexFunction : public matlab::mex::Function {
1717

1818
matlab::data::ArrayFactory factory;
1919

20-
outputs[0] = factory.createScalar(fs_read_symlink(matlab_1string_input(inputs)));
20+
std::string p = fs_read_symlink(matlab_1string_input(inputs));
21+
22+
if (p.empty()) {
23+
outputs[0] = factory.createArray<matlab::data::MATLABString>({0, 0});
24+
} else {
25+
outputs[0] = factory.createScalar(p);
26+
}
2127
}
2228
};

src/symlink_fs.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ std::string fs_read_symlink(std::string_view path)
7777
std::error_code ec;
7878
if(auto p = std::filesystem::read_symlink(path, ec); !ec)
7979
return p.string();
80+
// need .string() explict for MSVC
8081
#endif
8182

8283
return {};

test/TestSymlink.m

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@ function setup_symlink(tc)
1616

1717
tc.tempDir = tc.createTemporaryFolder();
1818

19-
tc.link = fullfile(tc.tempDir, "my.lnk");
19+
tc.link = fullfile(tc.tempDir, 'my.lnk');
2020

21-
tc.target = mfilename("fullpath") + ".m";
21+
tc.target = strcat(mfilename("fullpath"), '.m');
2222

2323
tc.assumeTrue(stdlib.create_symlink(tc.target, tc.link), ...
2424
"failed to create test link " + tc.link)
@@ -29,27 +29,32 @@ function setup_symlink(tc)
2929
methods (Test)
3030

3131
function test_is_symlink(tc, p)
32+
fprintf("is_symlink mex: %d\n", stdlib.is_mex_fun("stdlib.is_symlink"))
3233
tc.verifyTrue(stdlib.is_symlink(tc.link), "failed to detect own link")
3334
tc.verifyEqual(stdlib.is_symlink(p{1}), p{2}, p{1})
3435
end
3536

3637

3738
function test_read_symlink(tc)
39+
fprintf("read_symlink mex: %d\n", stdlib.is_mex_fun("stdlib.read_symlink"))
40+
tc.verifyEmpty(stdlib.read_symlink(""))
41+
tc.verifyEmpty(stdlib.read_symlink(''))
42+
tc.verifyEmpty(stdlib.read_symlink(tempname))
43+
tc.verifyEmpty(stdlib.read_symlink(tc.target))
3844

39-
tc.verifyEqual(stdlib.read_symlink(""), "")
40-
tc.verifyEqual(stdlib.read_symlink(''), '')
41-
tc.verifyEqual(stdlib.read_symlink(tempname), '')
42-
tc.verifyEqual(stdlib.read_symlink(tc.target), "")
4345

4446
t = stdlib.read_symlink(tc.link);
45-
tc.verifyNotEmpty(t)
46-
tc.verifyClass(t, 'string')
47-
tc.verifyEqual(tc.target, t)
47+
48+
targ = string(tc.target);
49+
50+
tc.verifyEqual(targ, t)
4851

4952
end
5053

5154

5255
function test_create_symlink(tc)
56+
fprintf("create_symlink mex: %d\n", stdlib.is_mex_fun("stdlib.create_symlink"))
57+
5358
tc.applyFixture(matlab.unittest.fixtures.SuppressedWarningsFixture(["MATLAB:io:filesystem:symlink:TargetNotFound","MATLAB:io:filesystem:symlink:FileExists"]))
5459

5560
tc.verifyFalse(stdlib.create_symlink('', tempname()))

0 commit comments

Comments
 (0)