Skip to content

Commit e2a5af7

Browse files
Fix #1292 - Enhance String Handling and Table Display
- Implement optimized join() function for string concatenation - Add strjust() implementation with performance improvements - Refactor table display functionality
1 parent e5a882a commit e2a5af7

29 files changed

+1632
-223
lines changed

CHANGELOG.md

+3
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1717
- `dlmread`: Read ASCII-delimited file of numeric data into matrix.
1818
- `realmin`: Smallest normalized floating-point number.
1919
- [#1288](http://github.com/nelson-lang/nelson/issues/1288) `mustBeMatrix`, `mustBeRow`, `mustBeColumn` validator functions.
20+
- `join`: Combine strings.
21+
- [#1292](http://github.com/nelson-lang/nelson/issues/1292) Large Table Display.
2022

2123
### Changed
2224

@@ -25,6 +27,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
2527
- `title`: `Visible` property is inherited from the parent if not explicitly defined.
2628
- i18n: migration PO files to JSON.
2729
- `dlmwrite`: rework the function to be more fast and robust.
30+
- `strjust`: rework the function to be more fast and robust.
2831

2932
### Fixed
3033

modules/display_format/functions/formattedDisplayText.m

+8-10
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
% LICENCE_BLOCK_END
99
%=============================================================================
1010
function result = formattedDisplayText(varargin)
11-
nbArgsValid = (nargin >= 1) && (mod(nargin, 2) == 1);
11+
nbArgsValid = mod(nargin, 2) == 1;
1212
if ~nbArgsValid
1313
error(_('Wrong number of input arguments.'));
1414
end
@@ -25,23 +25,21 @@
2525
validField = false;
2626
name = lower(args{i});
2727
value = args{i + 1};
28-
if strcmp(name, 'numericformat')
28+
switch name
29+
case 'numericformat'
2930
validateNumericFormat(value, i + 1);
3031
newFormat.NumericFormat = value;
3132
validField = true;
32-
end
33-
if strcmp(name, 'linespacing')
33+
34+
case 'linespacing'
3435
validateLineSpacing(value, i + 1);
3536
newFormat.LineSpacing = value;
3637
validField = true;
37-
end
38-
if strcmp(name, 'suppressmarkup')
39-
% not managed -> ignored
40-
validField = true;
41-
end
42-
if strcmp(name, 'usetruefalseforlogical')
38+
39+
case {'suppressmarkup', 'usetruefalseforlogical'}
4340
% not managed -> ignored
4441
validField = true;
42+
4543
end
4644
if ~validField
4745
msg = sprintf(_('Invalid name-value argument: %s.'), args{i});

modules/spreadsheet/tests/test_readtable.m

+12-11
Original file line numberDiff line numberDiff line change
@@ -43,14 +43,15 @@
4343
R = readtable(csv_filename);
4444
assert_isequal(R, REF)
4545
%=============================================================================
46-
47-
48-
49-
50-
51-
52-
53-
54-
55-
56-
46+
LastName = {'Sanchez';'Johnson';'Li';'Diaz';'Brown'};
47+
Age = [38;43;38;40;49];
48+
Smoker = [1;NaN;NaN;0;1];
49+
Height = [71;69;64;67;64];
50+
Weight = [176;163;131;133;119];
51+
BloodPressure_1 = [124; 109; 125; 117; 122];
52+
BloodPressure_2 = [93;77;83;75;80];
53+
REF = table(LastName, Age, Smoker, Height, Weight, BloodPressure_1, BloodPressure_2, 'VariableNames', {'Last Name','Age','Smoker','Height','Weight','BloodPressure 1','BloodPressure 2'});
54+
csv_filename = [modulepath('spreadsheet'), '/tests/test_readtable_4.csv'];
55+
R = readtable(csv_filename);
56+
assert_isequal(R, REF)
57+
%=============================================================================
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
Last Name,Age,Smoker,Height,Weight,BloodPressure 1,BloodPressure 2
2+
Sanchez,38,1,71,176,124,93
3+
Johnson,43,'0',69,163,109,77
4+
Li,38,'1',64,131,125,83
5+
Diaz,40,0,67,133,117,75
6+
Brown,49,1,64,119,122,80

modules/string/builtin/c/nlsString_builtin.vcxproj

+4
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,7 @@
192192
<ClCompile Include="..\cpp\Gateway.cpp" />
193193
<ClCompile Include="..\cpp\int2strBuiltin.cpp" />
194194
<ClCompile Include="..\cpp\isletterBuiltin.cpp" />
195+
<ClCompile Include="..\cpp\joinBuiltin.cpp" />
195196
<ClCompile Include="..\cpp\mat2strBuiltin.cpp" />
196197
<ClCompile Include="..\cpp\matchesBuiltin.cpp" />
197198
<ClCompile Include="..\cpp\num2strBuiltin.cpp" />
@@ -204,6 +205,7 @@
204205
<ClCompile Include="..\cpp\strfindBuiltin.cpp" />
205206
<ClCompile Include="..\cpp\stringBuiltin.cpp" />
206207
<ClCompile Include="..\cpp\stringsBuiltin.cpp" />
208+
<ClCompile Include="..\cpp\strjustBuiltin.cpp" />
207209
<ClCompile Include="..\cpp\strlengthBuiltin.cpp" />
208210
<ClCompile Include="..\cpp\strncmpBuiltin.cpp" />
209211
<ClCompile Include="..\cpp\strrepBuiltin.cpp" />
@@ -250,6 +252,7 @@
250252
<ClInclude Include="..\include\endsWithBuiltin.hpp" />
251253
<ClInclude Include="..\include\int2strBuiltin.hpp" />
252254
<ClInclude Include="..\include\isletterBuiltin.hpp" />
255+
<ClInclude Include="..\include\joinBuiltin.hpp" />
253256
<ClInclude Include="..\include\mat2strBuiltin.hpp" />
254257
<ClInclude Include="..\include\matchesBuiltin.hpp" />
255258
<ClInclude Include="..\include\nlsString_builtin_exports.h" />
@@ -262,6 +265,7 @@
262265
<ClInclude Include="..\include\strfindBuiltin.hpp" />
263266
<ClInclude Include="..\include\stringBuiltin.hpp" />
264267
<ClInclude Include="..\include\stringsBuiltin.hpp" />
268+
<ClInclude Include="..\include\strjustBuiltin.hpp" />
265269
<ClInclude Include="..\include\strlengthBuiltin.hpp" />
266270
<ClInclude Include="..\include\strncmpBuiltin.hpp" />
267271
<ClInclude Include="..\include\strrepBuiltin.hpp" />

modules/string/builtin/c/nlsString_builtin.vcxproj.filters

+12
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,12 @@
108108
<ClCompile Include="..\cpp\dllMain.cpp">
109109
<Filter>Source Files</Filter>
110110
</ClCompile>
111+
<ClCompile Include="..\cpp\joinBuiltin.cpp">
112+
<Filter>Source Files</Filter>
113+
</ClCompile>
114+
<ClCompile Include="..\cpp\strjustBuiltin.cpp">
115+
<Filter>Source Files</Filter>
116+
</ClCompile>
111117
</ItemGroup>
112118
<ItemGroup>
113119
<Text Include="..\..\CMakeLists.txt" />
@@ -203,6 +209,12 @@
203209
<ClInclude Include="..\include\isletterBuiltin.hpp">
204210
<Filter>Header Files</Filter>
205211
</ClInclude>
212+
<ClInclude Include="..\include\joinBuiltin.hpp">
213+
<Filter>Header Files</Filter>
214+
</ClInclude>
215+
<ClInclude Include="..\include\strjustBuiltin.hpp">
216+
<Filter>Header Files</Filter>
217+
</ClInclude>
206218
</ItemGroup>
207219
<ItemGroup>
208220
<None Include="..\..\loader.m" />

modules/string/builtin/cpp/Gateway.cpp

+4
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@
4141
#include "strcatBuiltin.hpp"
4242
#include "appendBuiltin.hpp"
4343
#include "isletterBuiltin.hpp"
44+
#include "joinBuiltin.hpp"
45+
#include "strjustBuiltin.hpp"
4446
//=============================================================================
4547
using namespace Nelson;
4648
//=============================================================================
@@ -83,6 +85,8 @@ static const nlsGateway gateway[] = {
8385
{ "strcat", (ptrBuiltin)Nelson::StringGateway::strcatBuiltin, 1, -1 },
8486
{ "append", (ptrBuiltin)Nelson::StringGateway::appendBuiltin, 1, -1 },
8587
{ "isletter", (ptrBuiltin)Nelson::StringGateway::isletterBuiltin, 1, 1 },
88+
{ "join", (ptrBuiltin)Nelson::StringGateway::joinBuiltin, 1, -2 },
89+
{ "strjust", (ptrBuiltin)Nelson::StringGateway::strjustBuiltin, 1, 2 },
8690
};
8791
//=============================================================================
8892
NLSGATEWAYFUNC(gateway)
+76
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
//=============================================================================
2+
// Copyright (c) 2016-present Allan CORNET (Nelson)
3+
//=============================================================================
4+
// This file is part of the Nelson.
5+
//=============================================================================
6+
// LICENCE_BLOCK_BEGIN
7+
// SPDX-License-Identifier: LGPL-3.0-or-later
8+
// LICENCE_BLOCK_END
9+
//=============================================================================
10+
#include "joinBuiltin.hpp"
11+
#include "StringJoin.hpp"
12+
#include "Error.hpp"
13+
#include "i18n.hpp"
14+
#include "InputOutputArgumentsCheckers.hpp"
15+
#include "OverloadRequired.hpp"
16+
//=============================================================================
17+
using namespace Nelson;
18+
//=============================================================================
19+
ArrayOfVector
20+
Nelson::StringGateway::joinBuiltin(int nLhs, const ArrayOfVector& argIn)
21+
{
22+
ArrayOfVector retval;
23+
nargoutcheck(nLhs, 0, 1);
24+
nargincheck(argIn, 1, 3);
25+
ArrayOf delimiters;
26+
ArrayOf A = argIn[0];
27+
std::vector<indexType> vec = A.getDimensions().getAsVector();
28+
indexType dim = 0;
29+
if (!A.isEmpty()) {
30+
for (int k = static_cast<int>(vec.size()) - 1; k >= 0; --k) {
31+
if (vec[k] != 0 && vec[k] != 1) {
32+
dim = k;
33+
break;
34+
}
35+
}
36+
}
37+
dim += 1;
38+
switch (argIn.size()) {
39+
case 1: {
40+
delimiters = ArrayOf::stringArrayConstructor(L" ");
41+
} break;
42+
case 2: {
43+
if (argIn[1].isRowVectorCharacterArray()) {
44+
delimiters = ArrayOf::stringArrayConstructor(argIn[1].getContentAsWideString());
45+
} else if (argIn[1].isStringArray()) {
46+
delimiters = argIn[1];
47+
} else if (argIn[1].isCellArrayOfCharacterVectors()) {
48+
delimiters = ArrayOf::stringArrayConstructor(
49+
argIn[1].getContentAsWideStringVector(false), argIn[1].getDimensions());
50+
} else {
51+
dim = argIn[1].getContentAsScalarIndex(false, true);
52+
delimiters = ArrayOf::stringArrayConstructor(" ");
53+
}
54+
} break;
55+
case 3: {
56+
if (argIn[1].isRowVectorCharacterArray()) {
57+
delimiters = ArrayOf::stringArrayConstructor(argIn[1].getContentAsWideString());
58+
} else if (argIn[1].isStringArray()) {
59+
delimiters = argIn[1];
60+
} else if (argIn[1].isCellArrayOfCharacterVectors()) {
61+
delimiters = ArrayOf::stringArrayConstructor(
62+
argIn[1].getContentAsWideStringVector(false), argIn[1].getDimensions());
63+
} else {
64+
Error(_W(
65+
"Wrong type for argument #3: string, characters or cell of characters expected."));
66+
}
67+
dim = argIn[2].getContentAsScalarIndex(false, true);
68+
} break;
69+
default: {
70+
Error(ERROR_WRONG_NUMBERS_INPUT_ARGS);
71+
} break;
72+
}
73+
retval << StringJoin(A, delimiters, dim);
74+
return retval;
75+
}
76+
//=============================================================================
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
//=============================================================================
2+
// Copyright (c) 2016-present Allan CORNET (Nelson)
3+
//=============================================================================
4+
// This file is part of the Nelson.
5+
//=============================================================================
6+
// LICENCE_BLOCK_BEGIN
7+
// SPDX-License-Identifier: LGPL-3.0-or-later
8+
// LICENCE_BLOCK_END
9+
//=============================================================================
10+
#include "strjustBuiltin.hpp"
11+
#include "StringJustify.hpp"
12+
#include "Error.hpp"
13+
#include "i18n.hpp"
14+
#include "InputOutputArgumentsCheckers.hpp"
15+
#include "OverloadRequired.hpp"
16+
//=============================================================================
17+
using namespace Nelson;
18+
//=============================================================================
19+
ArrayOfVector
20+
Nelson::StringGateway::strjustBuiltin(int nLhs, const ArrayOfVector& argIn)
21+
{
22+
ArrayOfVector retval;
23+
nargincheck(argIn, 1, 2);
24+
nargoutcheck(nLhs, 0, 1);
25+
ArrayOf A = argIn[0];
26+
if (A.isEmpty()) {
27+
retval << A;
28+
return retval;
29+
}
30+
if ((A.isNumeric() || A.isLogical()) && !A.isSparse()) {
31+
A.promoteType(NLS_CHAR);
32+
}
33+
if (A.isCharacterArray() || A.isStringArray() || A.isCellArrayOfCharacterVectors()) {
34+
STRINGJUSTIFY side = STRINGJUSTIFY::NLS_JUSTIFY_LEFT;
35+
if (argIn.size() == 2) {
36+
std::wstring style = argIn[1].getContentAsWideString();
37+
if (style == L"left") {
38+
side = STRINGJUSTIFY::NLS_JUSTIFY_LEFT;
39+
} else if (style == L"center") {
40+
side = STRINGJUSTIFY::NLS_JUSTIFY_CENTER;
41+
} else if (style == L"right") {
42+
side = STRINGJUSTIFY::NLS_JUSTIFY_RIGHT;
43+
} else {
44+
Error(_W("Wrong value for #2 argument: 'left', 'right', 'center' expected."));
45+
}
46+
}
47+
retval << StringJustify(A, side);
48+
} else {
49+
OverloadRequired("strjust");
50+
}
51+
return retval;
52+
}
53+
//=============================================================================
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
//=============================================================================
2+
// Copyright (c) 2016-present Allan CORNET (Nelson)
3+
//=============================================================================
4+
// This file is part of the Nelson.
5+
//=============================================================================
6+
// LICENCE_BLOCK_BEGIN
7+
// SPDX-License-Identifier: LGPL-3.0-or-later
8+
// LICENCE_BLOCK_END
9+
//=============================================================================
10+
#pragma once
11+
//=============================================================================
12+
#include "ArrayOf.hpp"
13+
//=============================================================================
14+
namespace Nelson::StringGateway {
15+
//=============================================================================
16+
ArrayOfVector
17+
joinBuiltin(int nLhs, const ArrayOfVector& argIn);
18+
//=============================================================================
19+
} // namespace Nelson
20+
//=============================================================================
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
//=============================================================================
2+
// Copyright (c) 2016-present Allan CORNET (Nelson)
3+
//=============================================================================
4+
// This file is part of the Nelson.
5+
//=============================================================================
6+
// LICENCE_BLOCK_BEGIN
7+
// SPDX-License-Identifier: LGPL-3.0-or-later
8+
// LICENCE_BLOCK_END
9+
//=============================================================================
10+
#pragma once
11+
//=============================================================================
12+
#include "ArrayOf.hpp"
13+
//=============================================================================
14+
namespace Nelson::StringGateway {
15+
//=============================================================================
16+
ArrayOfVector
17+
strjustBuiltin(int nLhs, const ArrayOfVector& argIn);
18+
//=============================================================================
19+
} // namespace Nelson
20+
//=============================================================================

modules/string/functions/@cell/strjust.m

-35
This file was deleted.

0 commit comments

Comments
 (0)