/*JSON{ "type":"method", "class": "String", "name" : "split", "description" : "Return an array made by splitting this string up by the separator. eg. ```'1,2,3'.split(',')==[1,2,3]```", "generate" : "jswrap_string_split", "params" : [ [ "separator", "JsVar", "The start character index"] ], "return" : ["JsVar", "Part of this string from start for len characters"] }*/ JsVar *jswrap_string_split(JsVar *parent, JsVar *split) { JsVar *array; int last, idx, arraylen=0; int splitlen = (int)jsvGetStringLength(split); int l = (int)jsvGetStringLength(parent) - splitlen; last = 0; array = jsvNewWithFlags(JSV_ARRAY); if (!array) return 0; // out of memory for (idx=0;idx<=l;idx++) { if (idx==l || jsvCompareString(parent, split, idx, 0, true)==0) { JsVar *part = jsvNewFromEmptyString(); if (!part) break; // out of memory JsVar *idxvar = jsvMakeIntoVariableName(jsvNewFromInteger(arraylen++), part); if (idxvar) { // could be out of memory if (idx==l) idx=l+splitlen; // if the last element, do to the end of the string jsvAppendStringVar(part, parent, last, idx-last); jsvAddName(array, idxvar); last = idx+splitlen; jsvUnLock(idxvar); } jsvUnLock(part); } } return array; }
/*JSON{ "type" : "method", "class" : "String", "name" : "split", "generate" : "jswrap_string_split", "params" : [ ["separator","JsVar","The start character index"] ], "return" : ["JsVar","Part of this string from start for len characters"] } Return an array made by splitting this string up by the separator. eg. ```'1,2,3'.split(',')==[1,2,3]``` */ JsVar *jswrap_string_split(JsVar *parent, JsVar *split) { JsVar *array = jsvNewWithFlags(JSV_ARRAY); if (!array) return 0; // out of memory if (jsvIsUndefined(split)) { jsvArrayPush(array, parent); return array; } split = jsvAsString(split, false); int idx, last = 0; int splitlen = jsvIsUndefined(split) ? 0 : (int)jsvGetStringLength(split); int l = (int)jsvGetStringLength(parent) + 1 - splitlen; for (idx=0;idx<=l;idx++) { if (splitlen==0 && idx==0) continue; // special case for where split string is "" if (idx==l || splitlen==0 || jsvCompareString(parent, split, (size_t)idx, 0, true)==0) { if (idx==l) { idx=l+splitlen; // if the last element, do to the end of the string if (splitlen==0) break; } JsVar *part = jsvNewFromStringVar(parent, (size_t)last, (size_t)(idx-last)); if (!part) break; // out of memory jsvArrayPush(array, part); jsvUnLock(part); last = idx+splitlen; } } jsvUnLock(split); return array; }
/*JSON{ "type" : "method", "class" : "String", "name" : "startsWith", "ifndef" : "SAVE_ON_FLASH", "generate" : "jswrap_string_startsWith", "params" : [ ["searchString","JsVar","The string to search for"], ["position","int","The start character index (or 0 if not defined)"] ], "return" : ["bool","`true` if the given characters are found at the beginning of the string, otherwise, `false`."] } */ bool jswrap_string_startsWith(JsVar *parent, JsVar *search, int position) { if (!jsvIsString(parent)) return false; JsVar *searchStr = jsvAsString(search); bool match = false; if (position >= 0 && jsvGetStringLength(searchStr)+position <= jsvGetStringLength(parent)) match = jsvCompareString(parent, searchStr, position,0,true)==0; jsvUnLock(searchStr); return match; }
/*JSON{ "type" : "method", "class" : "String", "name" : "endsWith", "ifndef" : "SAVE_ON_FLASH", "generate" : "jswrap_string_endsWith", "params" : [ ["searchString","JsVar","The string to search for"], ["length","JsVar","The 'end' of the string - if left off the actual length of the string is used"] ], "return" : ["bool","`true` if the given characters are found at the end of the string, otherwise, `false`."] } */ bool jswrap_string_endsWith(JsVar *parent, JsVar *search, JsVar *length) { if (!jsvIsString(parent)) return false; int position = jsvIsNumeric(length) ? jsvGetInteger(length) : (int)jsvGetStringLength(parent); JsVar *searchStr = jsvAsString(search); position -= jsvGetStringLength(searchStr); bool match = false; if (position >= 0 && jsvGetStringLength(searchStr)+position <= jsvGetStringLength(parent)) match = jsvCompareString(parent, searchStr, position,0,true)==0; jsvUnLock(searchStr); return match; }
/*JSON{ "type":"method", "class": "String", "name" : "indexOf", "description" : "Return the index of substring in this string, or -1 if not found", "generate" : "jswrap_string_indexOf", "params" : [ [ "substring", "JsVar", "The string to search for"] ], "return" : ["int", "The index of the string, or -1 if not found"] }*/ JsVarInt jswrap_string_indexOf(JsVar *parent, JsVar *v) { // slow, but simple! v = jsvAsString(v, false); if (!v) return 0; // out of memory int idx = -1; int l = (int)jsvGetStringLength(parent) - (int)jsvGetStringLength(v); for (idx=0;idx<l;idx++) { if (jsvCompareString(parent, v, idx, 0, true)==0) { jsvUnLock(v); return idx; } } jsvUnLock(v); return -1; }
/*JSON{ "type" : "method", "class" : "String", "name" : "lastIndexOf", "generate_full" : "jswrap_string_indexOf(parent, substring, fromIndex, true)", "params" : [ ["substring","JsVar","The string to search for"], ["fromIndex","JsVar","Index to search from"] ], "return" : ["int32","The index of the string, or -1 if not found"] } Return the last index of substring in this string, or -1 if not found */ int jswrap_string_indexOf(JsVar *parent, JsVar *substring, JsVar *fromIndex, bool lastIndexOf) { if (!jsvIsString(parent)) return 0; // slow, but simple! substring = jsvAsString(substring, false); if (!substring) return 0; // out of memory int parentLength = (int)jsvGetStringLength(parent); int subStringLength = (int)jsvGetStringLength(substring); if (subStringLength > parentLength) { jsvUnLock(substring); return -1; } int lastPossibleSearch = parentLength - subStringLength; int idx, dir, end; if (!lastIndexOf) { // normal indexOf dir = 1; end = lastPossibleSearch+1; idx = 0; if (jsvIsNumeric(fromIndex)) { idx = (int)jsvGetInteger(fromIndex); if (idx<0) idx=0; if (idx>end) idx=end; } } else { dir = -1; end = -1; idx = lastPossibleSearch; if (jsvIsNumeric(fromIndex)) { idx = (int)jsvGetInteger(fromIndex); if (idx<0) idx=0; if (idx>lastPossibleSearch) idx=lastPossibleSearch; } } for (;idx!=end;idx+=dir) { if (jsvCompareString(parent, substring, (size_t)idx, 0, true)==0) { jsvUnLock(substring); return idx; } } jsvUnLock(substring); return -1; }
/*JSON{ "type" : "method", "class" : "String", "name" : "split", "generate" : "jswrap_string_split", "params" : [ ["separator","JsVar","The separator `String` or `RegExp` to use"] ], "return" : ["JsVar","Part of this string from start for len characters"] } Return an array made by splitting this string up by the separator. eg. ```'1,2,3'.split(',')==['1', '2', '3']``` Regular Expressions can also be used to split strings, eg. `'1a2b3 4'.split(/[^0-9]/)==['1', '2', '3', '4']`. */ JsVar *jswrap_string_split(JsVar *parent, JsVar *split) { if (!jsvIsString(parent)) return 0; JsVar *array = jsvNewEmptyArray(); if (!array) return 0; // out of memory if (jsvIsUndefined(split)) { jsvArrayPush(array, parent); return array; } #ifndef SAVE_ON_FLASH // Use RegExp if one is passed in if (jsvIsInstanceOf(split, "RegExp")) { unsigned int last = 0; JsVar *match; jsvObjectSetChildAndUnLock(split, "lastIndex", jsvNewFromInteger(0)); match = jswrap_regexp_exec(split, parent); while (match && !jsvIsNull(match)) { // get info about match JsVar *matchStr = jsvGetArrayItem(match,0); JsVarInt idx = jsvGetIntegerAndUnLock(jsvObjectGetChild(match,"index",0)); JsVarInt len = (JsVarInt)jsvGetStringLength(matchStr); jsvUnLock(matchStr); // do the replacement jsvArrayPushAndUnLock(array, jsvNewFromStringVar(parent, (size_t)last, (size_t)(idx-last))); last = idx+len; // search again jsvUnLock(match); jsvObjectSetChildAndUnLock(split, "lastIndex", jsvNewFromInteger(last)); match = jswrap_regexp_exec(split, parent); } jsvUnLock(match); jsvObjectSetChildAndUnLock(split, "lastIndex", jsvNewFromInteger(0)); // add remaining string after last match if (last<=jsvGetStringLength(parent)) jsvArrayPushAndUnLock(array, jsvNewFromStringVar(parent, (size_t)last, JSVAPPENDSTRINGVAR_MAXLENGTH)); return array; } #endif split = jsvAsString(split); int idx, last = 0; int splitlen = jsvIsUndefined(split) ? 0 : (int)jsvGetStringLength(split); int l = (int)jsvGetStringLength(parent) + 1 - splitlen; for (idx=0;idx<=l;idx++) { if (splitlen==0 && idx==0) continue; // special case for where split string is "" if (idx==l || splitlen==0 || jsvCompareString(parent, split, (size_t)idx, 0, true)==0) { if (idx==l) { idx=l+splitlen; // if the last element, do to the end of the string if (splitlen==0) break; } JsVar *part = jsvNewFromStringVar(parent, (size_t)last, (size_t)(idx-last)); if (!part) break; // out of memory jsvArrayPush(array, part); jsvUnLock(part); last = idx+splitlen; } } jsvUnLock(split); return array; }