diff options
| author | shaolin <[email protected]> | 2014-03-04 09:14:48 +0800 |
|---|---|---|
| committer | shaolin <[email protected]> | 2014-03-04 09:14:48 +0800 |
| commit | 020e95d91b5e1d7f902674a320e42657bee3ebfe (patch) | |
| tree | 65b65bfa527e0e8670dc807a8fee8d507d67ca48 /components/external/espruino/src/jswrap_string.c | |
| parent | 0fb9c54efda7fef4346523fdc4b92512a0441ee1 (diff) | |
| parent | 738871fd9ebbd53da6cfcc429dfdd5ffc17fd685 (diff) | |
Merge branch 'master' of https://github.com/RT-Thread/rt-thread
Diffstat (limited to 'components/external/espruino/src/jswrap_string.c')
| -rw-r--r-- | components/external/espruino/src/jswrap_string.c | 173 |
1 files changed, 173 insertions, 0 deletions
diff --git a/components/external/espruino/src/jswrap_string.c b/components/external/espruino/src/jswrap_string.c new file mode 100644 index 0000000000..23a272b7d5 --- /dev/null +++ b/components/external/espruino/src/jswrap_string.c @@ -0,0 +1,173 @@ +/* + * This file is part of Espruino, a JavaScript interpreter for Microcontrollers + * + * Copyright (C) 2013 Gordon Williams <[email protected]> + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * ---------------------------------------------------------------------------- + * This file is designed to be parsed during the build process + * + * JavaScript String Functions + * ---------------------------------------------------------------------------- + */ +#include "jswrap_string.h" + +/*JSON{ "type":"class", + "class" : "String", + "check" : "jsvIsString(var)", + "description" : ["This is the built-in class for Text Strings.", + "Text Strings in Espruino are not zero-terminated, so you can store zeros in them." ] +}*/ + +/*JSON{ "type":"constructor", "class": "String", "name": "String", + "description" : "Create a new String", + "generate" : "jswrap_string_constructor", + "params" : [ [ "str", "JsVar", "A value to turn into a string. If undefined or not supplied, an empty String is created." ] ], + "return" : [ "JsVar", "A String" ] + +}*/ +JsVar *jswrap_string_constructor(JsVar *a) { + if (!a) return jsvNewFromEmptyString(); // no argument - return an empty string + return jsvAsString(a, false); +} + +/*JSON{ "type":"staticmethod", "class": "String", "name" : "fromCharCode", + "description" : "Return the character represented by the given character code.", + "generate" : "jswrap_string_fromCharCode", + "params" : [ [ "code", "int", "The character code to create a character from (range 0-255)"] ], + "return" : ["JsVar", "The character"] +}*/ +JsVar *jswrap_string_fromCharCode(JsVarInt code) { + // We do this so we can handle '/0' in a string + JsVar *r = jsvNewFromEmptyString(); + if (r) { // out of mem? + char ch = (char)code; + jsvAppendStringBuf(r, &ch, 1); + } + return r; +} + +/*JSON{ "type":"method", "class": "String", "name" : "charAt", + "description" : "Return a single character at the given position in the String.", + "generate" : "jswrap_string_charAt", + "params" : [ [ "pos", "int", "The character number in the string. Negative values return characters from end of string (-1 = last char)"] ], + "return" : ["JsVar", "The character in the string"] +}*/ +JsVar *jswrap_string_charAt(JsVar *parent, JsVarInt idx) { + // We do this so we can handle '/0' in a string + JsVar *r = jsvNewFromEmptyString(); + if (r) { // out of mem? + char ch = jsvGetCharInString(parent, (int)idx); + jsvAppendStringBuf(r, &ch, 1); + } + return r; +} + +/*JSON{ "type":"method", "class": "String", "name" : "charCodeAt", + "description" : ["Return the integer value of a single character at the given position in the String.", + "Note that this returns 0 not 'NaN' for out of bounds characters"], + "generate" : "jswrap_string_charCodeAt", + "params" : [ [ "pos", "int", "The character number in the string. Negative values return characters from end of string (-1 = last char)"] ], + "return" : ["int", "The integer value of a character in the string"] +}*/ +JsVarInt jswrap_string_charCodeAt(JsVar *parent, JsVarInt idx) { + return jsvGetCharInString(parent, (int)idx); +} + + +/*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" : "substring", + "generate" : "jswrap_string_substring", + "params" : [ [ "start", "int", "The start character index"], + [ "end", "JsVar", "The end character index"] ], + "return" : ["JsVar", "The part of this string between start and end"] +}*/ +JsVar *jswrap_string_substring(JsVar *parent, JsVarInt pStart, JsVar *vEnd) { + JsVar *res; + JsVarInt pEnd = jsvIsUndefined(vEnd) ? JSVAPPENDSTRINGVAR_MAXLENGTH : (int)jsvGetInteger(vEnd); + if (pStart<0) pStart=0; + if (pEnd<0) pEnd=0; + if (pEnd<pStart) { + JsVarInt l = pStart; + pStart = pEnd; + pEnd = l; + } + res = jsvNewWithFlags(JSV_STRING); + if (!res) return 0; // out of memory + jsvAppendStringVar(res, parent, (int)pStart, (int)(pEnd-pStart)); + return res; +} + +/*JSON{ "type":"method", "class": "String", "name" : "substr", + "generate" : "jswrap_string_substr", + "params" : [ [ "start", "int", "The start character index"], + [ "len", "JsVar", "The number of characters"] ], + "return" : ["JsVar", "Part of this string from start for len characters"] +}*/ +JsVar *jswrap_string_substr(JsVar *parent, JsVarInt pStart, JsVar *vLen) { + JsVar *res; + JsVarInt pLen = jsvIsUndefined(vLen) ? JSVAPPENDSTRINGVAR_MAXLENGTH : (int)jsvGetInteger(vLen); + if (pLen<0) pLen=0; + res = jsvNewWithFlags(JSV_STRING); + if (!res) return 0; // out of memory + jsvAppendStringVar(res, parent, (int)pStart, (int)pLen); + return res; +} + +/*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; +} |
