Skip to content

Commit 05c89c9

Browse files
committed
Added String.padStart/padEnd
1 parent 8bb747f commit 05c89c9

File tree

4 files changed

+90
-10
lines changed

4 files changed

+90
-10
lines changed

ChangeLog

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
nRF52: CPU now sleeps when while UART/BLE data is waiting to be sent (fix #1938)
1313
JSON.stringify now checks for potential stack overflow when stringifying (fix #1940)
1414
Check for Stack overflow when Garbage Collecting giant linked list (fix #1765)
15+
Added String.padStart/padEnd
1516

1617
2v07 : Graphics.asImage() now contains buffer when bpp != 8 (fix #1863)
1718
nRF52 SDK15: Fix NRF.setScan/findDevices/etc

src/jswrap_string.c

Lines changed: 70 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -329,7 +329,7 @@ JsVar *jswrap_string_replace(JsVar *parent, JsVar *subStr, JsVar *newSubStr) {
329329
JsVarInt idx = jsvGetIntegerAndUnLock(jsvObjectGetChild(match,"index",0));
330330
JsVarInt len = (JsVarInt)jsvGetStringLength(matchStr);
331331
// do the replacement
332-
jsvStringIteratorAppendString(&dst, str, lastIndex, (idx-lastIndex)); // the string before the match
332+
jsvStringIteratorAppendString(&dst, str, (size_t)lastIndex, (idx-lastIndex)); // the string before the match
333333
if (jsvIsFunction(replace)) {
334334
unsigned int argCount = 0;
335335
JsVar *args[13];
@@ -376,7 +376,7 @@ JsVar *jswrap_string_replace(JsVar *parent, JsVar *subStr, JsVar *newSubStr) {
376376
match = jswrap_regexp_exec(subStr, str);
377377
}
378378
}
379-
jsvStringIteratorAppendString(&dst, str, lastIndex, JSVAPPENDSTRINGVAR_MAXLENGTH); // append the rest of the string
379+
jsvStringIteratorAppendString(&dst, str, (size_t)lastIndex, JSVAPPENDSTRINGVAR_MAXLENGTH); // append the rest of the string
380380
jsvStringIteratorFree(&dst);
381381
jsvUnLock3(match,replace,str);
382382
// reset lastIndex if global
@@ -508,15 +508,15 @@ JsVar *jswrap_string_split(JsVar *parent, JsVar *split) {
508508
#ifndef SAVE_ON_FLASH
509509
// Use RegExp if one is passed in
510510
if (jsvIsInstanceOf(split, "RegExp")) {
511-
unsigned int last = 0;
511+
int last = 0;
512512
JsVar *match;
513513
jsvObjectSetChildAndUnLock(split, "lastIndex", jsvNewFromInteger(0));
514514
match = jswrap_regexp_exec(split, parent);
515515
while (match && !jsvIsNull(match)) {
516516
// get info about match
517517
JsVar *matchStr = jsvGetArrayItem(match,0);
518518
JsVarInt idx = jsvGetIntegerAndUnLock(jsvObjectGetChild(match,"index",0));
519-
JsVarInt len = (JsVarInt)jsvGetStringLength(matchStr);
519+
int len = (int)jsvGetStringLength(matchStr);
520520
jsvUnLock(matchStr);
521521
// do the replacement
522522
jsvArrayPushAndUnLock(array, jsvNewFromStringVar(parent, (size_t)last, (size_t)(idx-last)));
@@ -529,7 +529,7 @@ JsVar *jswrap_string_split(JsVar *parent, JsVar *split) {
529529
jsvUnLock(match);
530530
jsvObjectSetChildAndUnLock(split, "lastIndex", jsvNewFromInteger(0));
531531
// add remaining string after last match
532-
if (last<=jsvGetStringLength(parent))
532+
if (last <= (int)jsvGetStringLength(parent))
533533
jsvArrayPushAndUnLock(array, jsvNewFromStringVar(parent, (size_t)last, JSVAPPENDSTRINGVAR_MAXLENGTH));
534534
return array;
535535
}
@@ -657,8 +657,8 @@ bool jswrap_string_startsWith(JsVar *parent, JsVar *search, int position) {
657657
JsVar *searchStr = jsvAsString(search);
658658
bool match = false;
659659
if (position >= 0 &&
660-
jsvGetStringLength(searchStr)+position <= jsvGetStringLength(parent))
661-
match = jsvCompareString(parent, searchStr, position,0,true)==0;
660+
(int)jsvGetStringLength(searchStr)+position <= (int)jsvGetStringLength(parent))
661+
match = jsvCompareString(parent, searchStr, (size_t)position,0,true)==0;
662662
jsvUnLock(searchStr);
663663
return match;
664664
}
@@ -680,11 +680,11 @@ bool jswrap_string_endsWith(JsVar *parent, JsVar *search, JsVar *length) {
680680
if (!jsvIsString(parent)) return false;
681681
int position = jsvIsNumeric(length) ? jsvGetInteger(length) : (int)jsvGetStringLength(parent);
682682
JsVar *searchStr = jsvAsString(search);
683-
position -= jsvGetStringLength(searchStr);
683+
position -= (int)jsvGetStringLength(searchStr);
684684
bool match = false;
685685
if (position >= 0 &&
686-
jsvGetStringLength(searchStr)+position <= jsvGetStringLength(parent))
687-
match = jsvCompareString(parent, searchStr, position,0,true)==0;
686+
(int)jsvGetStringLength(searchStr)+position <= (int)jsvGetStringLength(parent))
687+
match = jsvCompareString(parent, searchStr, (size_t)position,0,true)==0;
688688
jsvUnLock(searchStr);
689689
return match;
690690
}
@@ -728,3 +728,63 @@ JsVar *jswrap_string_repeat(JsVar *parent, int count) {
728728
jsvAppendStringVarComplete(result, parent);
729729
return result;
730730
}
731+
732+
/*JSON{
733+
"type" : "method",
734+
"class" : "String",
735+
"name" : "padStart",
736+
"ifndef" : "SAVE_ON_FLASH",
737+
"generate_full" : "jswrap_string_padX(parent, targetLength, padString, true)",
738+
"params" : [
739+
["targetLength","int","The length to pad this string to"],
740+
["padString","JsVar","[optional] The string to pad with, default is `' '`"]
741+
],
742+
"return" : ["JsVar","A string containing this string padded to the correct length"],
743+
"return_object" : "String"
744+
}
745+
Pad this string at the beginnind to the required number of characters
746+
747+
```
748+
"Hello".padStart(10) == " Hello"
749+
"123".padStart(10,".-") == ".-.-.-.123"
750+
```
751+
*/
752+
/*JSON{
753+
"type" : "method",
754+
"class" : "String",
755+
"name" : "padEnd",
756+
"ifndef" : "SAVE_ON_FLASH",
757+
"generate_full" : "jswrap_string_padX(parent, targetLength, padString, false)",
758+
"params" : [
759+
["targetLength","int","The length to pad this string to"],
760+
["padString","JsVar","[optional] The string to pad with, default is `' '`"]
761+
],
762+
"return" : ["JsVar","A string containing this string padded to the correct length"],
763+
"return_object" : "String"
764+
}
765+
Pad this string at the end to the required number of characters
766+
767+
```
768+
"Hello".padEnd(10) == "Hello "
769+
"123".padEnd(10,".-") == "123.-.-.-."
770+
```
771+
*/
772+
JsVar *jswrap_string_padX(JsVar *str, int targetLength, JsVar *padString, bool padStart) {
773+
if (!jsvIsString(str) || (int)jsvGetStringLength(str)>=targetLength)
774+
return jsvLockAgain(str);
775+
776+
int padChars = targetLength - (int)jsvGetStringLength(str);
777+
778+
JsVar *result = padStart ? jsvNewFromEmptyString() : jsvNewFromStringVar(str,0,JSVAPPENDSTRINGVAR_MAXLENGTH);
779+
if (!result) return 0;
780+
781+
padString = padString ? jsvAsString(padString) : jsvNewFromString(" ");
782+
int padLength = (int)jsvGetStringLength(padString);
783+
while (padChars > 0) {
784+
jsvAppendStringVar(result, padString, 0, (size_t)((padLength > padChars) ? padChars : padLength));
785+
padChars -= padLength;
786+
}
787+
if (padStart) jsvAppendStringVarComplete(result, str);
788+
jsvUnLock(padString);
789+
return result;
790+
}

src/jswrap_string.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,3 +29,4 @@ JsVar *jswrap_string_trim(JsVar *parent);
2929
bool jswrap_string_startsWith(JsVar *parent, JsVar *search, int position);
3030
bool jswrap_string_endsWith(JsVar *parent, JsVar *search, JsVar *length);
3131
JsVar *jswrap_string_repeat(JsVar *parent, int count);
32+
JsVar *jswrap_string_padX(JsVar *str, int targetLength, JsVar *padString, bool padStart);

tests/test_string_pad.js

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
function test(a,b) {
2+
var ea = eval(a);
3+
if (JSON.stringify(ea)!=JSON.stringify(b)) {
4+
console.log(JSON.stringify(a)+" should be "+JSON.stringify(b)+", got "+JSON.stringify(ea))
5+
result = 0;
6+
}
7+
}
8+
9+
result = 1;
10+
test("'abc'.padStart(10); "," abc");
11+
test("'abc'.padStart(10, 'foo'); ","foofoofabc");
12+
test("'abc'.padStart(6,'123465'); ","123abc");
13+
test("'abc'.padStart(8, '0'); ","00000abc");
14+
test("'abc'.padStart(1); ","abc");
15+
test("'abc'.padEnd(10); ", "abc ");
16+
test("'abc'.padEnd(10, 'foo'); ", "abcfoofoof");
17+
test("'abc'.padEnd(6, '123456'); ", "abc123");
18+
test("'abc'.padEnd(1); ", "abc");

0 commit comments

Comments
 (0)