mirror of
https://github.com/espruino/Espruino.git
synced 2025-12-08 19:06:15 +00:00
Merge jsvStringIteratorGetChar + jsvStringIteratorNext into jsvStringIteratorGetCharAndNext (fix #1816)
This commit is contained in:
parent
4070a6acb1
commit
4f47cdc9bc
@ -31,6 +31,7 @@
|
||||
Bangle.js: use double math FFT to save a few bytes of flash
|
||||
Storage.writeJSON (fix memory leak)
|
||||
dump() is now aware of pretokenised code (fix #1821)
|
||||
Merge jsvStringIteratorGetChar + jsvStringIteratorNext into jsvStringIteratorGetCharAndNext (fix #1816)
|
||||
|
||||
2v05 : Add Array.includes
|
||||
Fix (Number.toFixed) rounding, eg (1234.505).toFixed(2)
|
||||
|
||||
@ -153,10 +153,8 @@ const char *bleVarToUUID(ble_uuid_t *uuid, JsVar *v) {
|
||||
if (expectedLength==16 && jsvStringIteratorGetChar(&it)=='-')
|
||||
jsvStringIteratorNext(&it);
|
||||
// Read a byte
|
||||
char hi = jsvStringIteratorGetChar(&it);
|
||||
jsvStringIteratorNext(&it);
|
||||
char lo = jsvStringIteratorGetChar(&it);
|
||||
jsvStringIteratorNext(&it);
|
||||
char hi = jsvStringIteratorGetCharAndNext(&it);
|
||||
char lo = jsvStringIteratorGetCharAndNext(&it);
|
||||
int v = hexToByte(hi,lo);
|
||||
if (v<0) {
|
||||
jsvStringIteratorFree(&it);
|
||||
|
||||
@ -402,7 +402,7 @@ JsVar *jswrap_graphics_createImage(JsVar *data) {
|
||||
// First iterate and work out width and height
|
||||
jsvStringIteratorNew(&it,data,0);
|
||||
while (jsvStringIteratorHasChar(&it)) {
|
||||
char ch = jsvStringIteratorGetChar(&it);
|
||||
char ch = jsvStringIteratorGetCharAndNext(&it);
|
||||
if (ch=='\n') {
|
||||
if (x==0 && y==0) startCharacter = 1; // ignore first character
|
||||
x=0;
|
||||
@ -412,7 +412,6 @@ JsVar *jswrap_graphics_createImage(JsVar *data) {
|
||||
x++;
|
||||
if (x>width) width=x;
|
||||
}
|
||||
jsvStringIteratorNext(&it);
|
||||
}
|
||||
jsvStringIteratorFree(&it);
|
||||
// Sorted - now create the object, set it up and create the buffer
|
||||
@ -432,7 +431,7 @@ JsVar *jswrap_graphics_createImage(JsVar *data) {
|
||||
y=0;
|
||||
jsvStringIteratorNew(&it,data,startCharacter);
|
||||
while (jsvStringIteratorHasChar(&it)) {
|
||||
char ch = jsvStringIteratorGetChar(&it);
|
||||
char ch = jsvStringIteratorGetCharAndNext(&it);
|
||||
if (ch=='\n') {
|
||||
x=0;
|
||||
y++;
|
||||
@ -446,7 +445,6 @@ JsVar *jswrap_graphics_createImage(JsVar *data) {
|
||||
}
|
||||
x++;
|
||||
}
|
||||
jsvStringIteratorNext(&it);
|
||||
}
|
||||
jsvStringIteratorFree(&it);
|
||||
jsvObjectSetChildAndUnLock(img, "buffer", buffer);
|
||||
@ -1369,11 +1367,10 @@ JsVar *jswrap_graphics_drawString(JsVar *parent, JsVar *var, int x, int y, bool
|
||||
JsvStringIterator it;
|
||||
jsvStringIteratorNew(&it, str, 0);
|
||||
while (jsvStringIteratorHasChar(&it)) {
|
||||
char ch = jsvStringIteratorGetChar(&it);
|
||||
char ch = jsvStringIteratorGetCharAndNext(&it);
|
||||
if (ch=='\n') {
|
||||
x = startx;
|
||||
y += customHeight;
|
||||
jsvStringIteratorNext(&it);
|
||||
continue;
|
||||
}
|
||||
if (font == JSGRAPHICS_FONTSIZE_VECTOR) {
|
||||
@ -1401,8 +1398,7 @@ JsVar *jswrap_graphics_drawString(JsVar *parent, JsVar *var, int x, int y, bool
|
||||
JsvStringIterator wit;
|
||||
jsvStringIteratorNew(&wit, customWidth, 0);
|
||||
while (jsvStringIteratorHasChar(&wit) && (int)jsvStringIteratorGetIndex(&wit)<(ch-customFirstChar)) {
|
||||
bmpOffset += (unsigned char)jsvStringIteratorGetChar(&wit);
|
||||
jsvStringIteratorNext(&wit);
|
||||
bmpOffset += (unsigned char)jsvStringIteratorGetCharAndNext(&wit);
|
||||
}
|
||||
width = (unsigned char)jsvStringIteratorGetChar(&wit);
|
||||
jsvStringIteratorFree(&wit);
|
||||
@ -1441,7 +1437,6 @@ JsVar *jswrap_graphics_drawString(JsVar *parent, JsVar *var, int x, int y, bool
|
||||
x += width*scale;
|
||||
}
|
||||
if (jspIsInterrupted()) break;
|
||||
jsvStringIteratorNext(&it);
|
||||
}
|
||||
jsvStringIteratorFree(&it);
|
||||
jsvUnLock3(str, customBitmap, customWidth);
|
||||
@ -2047,8 +2042,7 @@ JsVar *jswrap_graphics_drawImage(JsVar *parent, JsVar *image, int xPos, int yPos
|
||||
for (x=0;x<img.width;x++) {
|
||||
// Get the data we need...
|
||||
while (bits < img.bpp) {
|
||||
colData = (colData<<8) | ((unsigned char)jsvStringIteratorGetChar(&it));
|
||||
jsvStringIteratorNext(&it);
|
||||
colData = (colData<<8) | ((unsigned char)jsvStringIteratorGetCharAndNext(&it));
|
||||
bits += 8;
|
||||
}
|
||||
// extract just the bits we want
|
||||
@ -2083,8 +2077,7 @@ JsVar *jswrap_graphics_drawImage(JsVar *parent, JsVar *image, int xPos, int yPos
|
||||
for (x=0;x<img.width;x++) {
|
||||
// Get the data we need...
|
||||
while (bits < img.bpp) {
|
||||
colData = (colData<<8) | ((unsigned char)jsvStringIteratorGetChar(&it));
|
||||
jsvStringIteratorNext(&it);
|
||||
colData = (colData<<8) | ((unsigned char)jsvStringIteratorGetCharAndNext(&it));
|
||||
bits += 8;
|
||||
}
|
||||
// extract just the bits we want
|
||||
@ -2155,8 +2148,7 @@ JsVar *jswrap_graphics_drawImage(JsVar *parent, JsVar *image, int xPos, int yPos
|
||||
for (x=0;x<img.width;x++) {
|
||||
// Get the data we need...
|
||||
while (bits < img.bpp) {
|
||||
colData = (colData<<8) | ((unsigned char)jsvStringIteratorGetChar(&it));
|
||||
jsvStringIteratorNext(&it);
|
||||
colData = (colData<<8) | ((unsigned char)jsvStringIteratorGetCharAndNext(&it));
|
||||
bits += 8;
|
||||
}
|
||||
// extract just the bits we want
|
||||
|
||||
@ -327,8 +327,7 @@ void lcdST7789_blit1Bit(int x, int y, int w, int h, int scale, JsvStringIterator
|
||||
if (y1>=LCD_BUFFER_HEIGHT) y1-=LCD_BUFFER_HEIGHT;
|
||||
if (y2>=LCD_BUFFER_HEIGHT) y2-=LCD_BUFFER_HEIGHT;
|
||||
lcdST7789_blitStartRaw(x,y1, x+(w*scale)-1,(y2>y1)?y2:239);
|
||||
int bitData = jsvStringIteratorGetChar(pixels);
|
||||
jsvStringIteratorNext(pixels);
|
||||
int bitData = jsvStringIteratorGetCharAndNext(pixels);
|
||||
int bitCnt = 8;
|
||||
for (int y=0;y<h;y++) {
|
||||
JsvStringIterator lastPixels;
|
||||
@ -346,8 +345,7 @@ void lcdST7789_blit1Bit(int x, int y, int w, int h, int scale, JsvStringIterator
|
||||
bitData <<= 1;
|
||||
bitCnt--;
|
||||
if (bitCnt==0) {
|
||||
bitData = jsvStringIteratorGetChar(pixels);
|
||||
jsvStringIteratorNext(pixels);
|
||||
bitData = jsvStringIteratorGetCharAndNext(pixels);
|
||||
bitCnt = 8;
|
||||
}
|
||||
for (int s=0;s<scale;s++)
|
||||
@ -383,28 +381,24 @@ void lcdST7789_blit8Bit(int x, int y, int w, int h, int scale, JsvStringIterator
|
||||
}
|
||||
if (scale==1) {
|
||||
for (int x=0;x<w;x++) {
|
||||
lcdST7789_blitPixel(palette[(uint8_t)jsvStringIteratorGetChar(pixels)]);
|
||||
jsvStringIteratorNext(pixels);
|
||||
lcdST7789_blitPixel(palette[(uint8_t)jsvStringIteratorGetCharAndNext(pixels)]);
|
||||
}
|
||||
} else if (scale==2) {
|
||||
for (int x=0;x<w;x++) {
|
||||
uint16_t c = palette[(uint8_t)jsvStringIteratorGetChar(pixels)];
|
||||
jsvStringIteratorNext(pixels);
|
||||
uint16_t c = palette[(uint8_t)jsvStringIteratorGetCharAndNext(pixels)];
|
||||
lcdST7789_blitPixel(c);
|
||||
lcdST7789_blitPixel(c);
|
||||
}
|
||||
} else if (scale==3) {
|
||||
for (int x=0;x<w;x++) {
|
||||
uint16_t c = palette[(uint8_t)jsvStringIteratorGetChar(pixels)];
|
||||
jsvStringIteratorNext(pixels);
|
||||
uint16_t c = palette[(uint8_t)jsvStringIteratorGetCharAndNext(pixels)];
|
||||
lcdST7789_blitPixel(c);
|
||||
lcdST7789_blitPixel(c);
|
||||
lcdST7789_blitPixel(c);
|
||||
}
|
||||
} else { // fallback for not 1/2/3 scale
|
||||
for (int x=0;x<w;x++) {
|
||||
uint16_t c = palette[(uint8_t)jsvStringIteratorGetChar(pixels)];
|
||||
jsvStringIteratorNext(pixels);
|
||||
uint16_t c = palette[(uint8_t)jsvStringIteratorGetCharAndNext(pixels)];
|
||||
for (int s=0;s<scale;s++)
|
||||
lcdST7789_blitPixel(c);
|
||||
}
|
||||
|
||||
@ -102,7 +102,7 @@ JsVar *jswrap_url_parse(JsVar *url, bool parseQuery) {
|
||||
int charIdx = 0;
|
||||
int portNumber = 0;
|
||||
while (jsvStringIteratorHasChar(&it)) {
|
||||
char ch = jsvStringIteratorGetChar(&it);
|
||||
char ch = jsvStringIteratorGetCharAndNext(&it);
|
||||
if (ch == '/') {
|
||||
slashes++;
|
||||
if (pathStart<0) pathStart = charIdx;
|
||||
@ -125,8 +125,6 @@ JsVar *jswrap_url_parse(JsVar *url, bool parseQuery) {
|
||||
if (ch == '?' && pathStart>=0) {
|
||||
searchStart = charIdx;
|
||||
}
|
||||
|
||||
jsvStringIteratorNext(&it);
|
||||
charIdx++;
|
||||
}
|
||||
jsvStringIteratorFree(&it);
|
||||
@ -165,7 +163,7 @@ JsVar *jswrap_url_parse(JsVar *url, bool parseQuery) {
|
||||
bool hadEquals = false;
|
||||
|
||||
while (jsvStringIteratorHasChar(&it)) {
|
||||
char ch = jsvStringIteratorGetChar(&it);
|
||||
char ch = jsvStringIteratorGetCharAndNext(&it);
|
||||
if (ch=='&') {
|
||||
if (jsvGetStringLength(key)>0 || jsvGetStringLength(val)>0) {
|
||||
key = jsvAsArrayIndexAndUnLock(key); // make sure "0" gets made into 0
|
||||
@ -181,17 +179,14 @@ JsVar *jswrap_url_parse(JsVar *url, bool parseQuery) {
|
||||
} else {
|
||||
// decode percent escape chars
|
||||
if (ch=='%') {
|
||||
jsvStringIteratorNext(&it);
|
||||
char hi = jsvStringIteratorGetChar(&it);
|
||||
jsvStringIteratorNext(&it);
|
||||
char lo = jsvStringIteratorGetChar(&it);
|
||||
char hi = jsvStringIteratorGetCharAndNext(&it);
|
||||
char lo = jsvStringIteratorGetCharAndNext(&it);
|
||||
ch = (char)hexToByte(hi,lo);
|
||||
}
|
||||
|
||||
if (hadEquals) jsvAppendCharacter(val, ch);
|
||||
else jsvAppendCharacter(key, ch);
|
||||
}
|
||||
jsvStringIteratorNext(&it);
|
||||
charIdx++;
|
||||
}
|
||||
jsvStringIteratorFree(&it);
|
||||
|
||||
@ -100,7 +100,7 @@ bool httpParseHeaders(JsVar **receiveData, JsVar *objectForData, bool isServer)
|
||||
JsvStringIterator it;
|
||||
jsvStringIteratorNew(&it, *receiveData, 0);
|
||||
while (jsvStringIteratorHasChar(&it)) {
|
||||
char ch = jsvStringIteratorGetChar(&it);
|
||||
char ch = jsvStringIteratorGetCharAndNext(&it);
|
||||
if (ch == '\r') {
|
||||
if (newlineIdx==0) newlineIdx=1;
|
||||
else if (newlineIdx==2) newlineIdx=3;
|
||||
@ -111,7 +111,6 @@ bool httpParseHeaders(JsVar **receiveData, JsVar *objectForData, bool isServer)
|
||||
break;
|
||||
}
|
||||
} else newlineIdx=0;
|
||||
jsvStringIteratorNext(&it);
|
||||
strIdx++;
|
||||
}
|
||||
jsvStringIteratorFree(&it);
|
||||
@ -131,7 +130,7 @@ bool httpParseHeaders(JsVar **receiveData, JsVar *objectForData, bool isServer)
|
||||
//jsiConsolePrintStringVar(receiveData);
|
||||
jsvStringIteratorNew(&it, *receiveData, 0);
|
||||
while (jsvStringIteratorHasChar(&it)) {
|
||||
char ch = jsvStringIteratorGetChar(&it);
|
||||
char ch = jsvStringIteratorGetCharAndNext(&it);
|
||||
if (ch==' ' || ch=='\r') {
|
||||
if (firstSpace<0) firstSpace = strIdx;
|
||||
else if (secondSpace<0) secondSpace = strIdx;
|
||||
@ -158,8 +157,6 @@ bool httpParseHeaders(JsVar **receiveData, JsVar *objectForData, bool isServer)
|
||||
if (ch == '\r' || ch == '\n') {
|
||||
lastLineStart = strIdx+1;
|
||||
}
|
||||
|
||||
jsvStringIteratorNext(&it);
|
||||
strIdx++;
|
||||
}
|
||||
jsvStringIteratorFree(&it);
|
||||
@ -198,8 +195,7 @@ size_t httpStringGet(JsVar *v, char *str, size_t len) {
|
||||
jsvStringIteratorFree(&it);
|
||||
return len;
|
||||
}
|
||||
*(str++) = jsvStringIteratorGetChar(&it);
|
||||
jsvStringIteratorNext(&it);
|
||||
*(str++) = jsvStringIteratorGetCharAndNext(&it);
|
||||
}
|
||||
jsvStringIteratorFree(&it);
|
||||
return len-l;
|
||||
|
||||
@ -269,11 +269,10 @@ void jsiConsolePrintStringVarUntilEOL(JsVar *v, size_t fromCharacter, size_t max
|
||||
JsvStringIterator it;
|
||||
jsvStringIteratorNew(&it, v, fromCharacter);
|
||||
while (jsvStringIteratorHasChar(&it) && chars<maxChars) {
|
||||
char ch = jsvStringIteratorGetChar(&it);
|
||||
char ch = jsvStringIteratorGetCharAndNext(&it);
|
||||
if (ch == '\n') break;
|
||||
jsiConsolePrintChar(ch);
|
||||
chars++;
|
||||
jsvStringIteratorNext(&it);
|
||||
}
|
||||
jsvStringIteratorFree(&it);
|
||||
if (andBackup) {
|
||||
@ -288,11 +287,10 @@ void jsiConsolePrintStringVarWithNewLineChar(JsVar *v, size_t fromCharacter, cha
|
||||
JsvStringIterator it;
|
||||
jsvStringIteratorNew(&it, v, fromCharacter);
|
||||
while (jsvStringIteratorHasChar(&it)) {
|
||||
char ch = jsvStringIteratorGetChar(&it);
|
||||
char ch = jsvStringIteratorGetCharAndNext(&it);
|
||||
if (ch == '\n') jsiConsolePrintChar('\r');
|
||||
jsiConsolePrintChar(ch);
|
||||
if (ch == '\n' && newLineCh) jsiConsolePrintChar(newLineCh);
|
||||
jsvStringIteratorNext(&it);
|
||||
}
|
||||
jsvStringIteratorFree(&it);
|
||||
}
|
||||
|
||||
15
src/jslex.c
15
src/jslex.c
@ -939,8 +939,7 @@ JsVar *jslNewTokenisedStringFromLexer(JslCharPos *charFrom, size_t charTo) {
|
||||
JsvStringIterator it;
|
||||
jsvStringIteratorClone(&it, &lex->tokenStart.it);
|
||||
while (jsvStringIteratorGetIndex(&it)+1 < jsvStringIteratorGetIndex(&lex->it)) {
|
||||
jsvStringIteratorSetCharAndNext(&dstit, jsvStringIteratorGetChar(&it));
|
||||
jsvStringIteratorNext(&it);
|
||||
jsvStringIteratorSetCharAndNext(&dstit, jsvStringIteratorGetCharAndNext(&it));
|
||||
}
|
||||
jsvStringIteratorFree(&it);
|
||||
} else { // single char for the token
|
||||
@ -973,8 +972,7 @@ JsVar *jslNewStringFromLexer(JslCharPos *charFrom, size_t charTo) {
|
||||
JsvStringIterator it;
|
||||
jsvStringIteratorClone(&it, &charFrom->it);
|
||||
while (jsvStringIteratorHasChar(&it) && (--maxLength>0)) {
|
||||
*(flatPtr++) = jsvStringIteratorGetChar(&it);
|
||||
jsvStringIteratorNext(&it);
|
||||
*(flatPtr++) = jsvStringIteratorGetCharAndNext(&it);
|
||||
}
|
||||
jsvStringIteratorFree(&it);
|
||||
return var;
|
||||
@ -996,7 +994,7 @@ JsVar *jslNewStringFromLexer(JslCharPos *charFrom, size_t charTo) {
|
||||
JsvStringIterator it;
|
||||
jsvStringIteratorClone(&it, &charFrom->it);
|
||||
while (jsvStringIteratorHasChar(&it) && (--maxLength>0)) {
|
||||
char ch = jsvStringIteratorGetChar(&it);
|
||||
char ch = jsvStringIteratorGetCharAndNext(&it);
|
||||
if (blockChars >= jsvGetMaxCharactersInVar(block)) {
|
||||
jsvSetCharactersInVar(block, blockChars);
|
||||
JsVar *next = jsvNewWithFlags(JSV_STRING_EXT_0);
|
||||
@ -1008,7 +1006,6 @@ JsVar *jslNewStringFromLexer(JslCharPos *charFrom, size_t charTo) {
|
||||
blockChars=0; // it's new, so empty
|
||||
}
|
||||
block->varData.str[blockChars++] = ch;
|
||||
jsvStringIteratorNext(&it);
|
||||
}
|
||||
jsvSetCharactersInVar(block, blockChars);
|
||||
jsvUnLock(block);
|
||||
@ -1043,12 +1040,11 @@ void jslPrintTokenisedString(JsVar *code, vcbprintf_callback user_callback, void
|
||||
JsvStringIterator it;
|
||||
jsvStringIteratorNew(&it, code, 0);
|
||||
while (jsvStringIteratorHasChar(&it)) {
|
||||
unsigned char ch = (unsigned char)jsvStringIteratorGetChar(&it);
|
||||
unsigned char ch = (unsigned char)jsvStringIteratorGetCharAndNext(&it);
|
||||
if (jslNeedSpaceBetween(lastch, ch))
|
||||
user_callback(" ", user_data);
|
||||
jslFunctionCharAsString(ch, buf, sizeof(buf));
|
||||
user_callback(buf, user_data);
|
||||
jsvStringIteratorNext(&it);
|
||||
lastch = ch;
|
||||
}
|
||||
jsvStringIteratorFree(&it);
|
||||
@ -1091,7 +1087,7 @@ void jslPrintTokenLineMarker(vcbprintf_callback user_callback, void *user_data,
|
||||
jsvStringIteratorNew(&it, lex->sourceVar, startOfLine);
|
||||
unsigned char lastch = 0;
|
||||
while (jsvStringIteratorHasChar(&it) && chars<60) {
|
||||
unsigned char ch = (unsigned char)jsvStringIteratorGetChar(&it);
|
||||
unsigned char ch = (unsigned char)jsvStringIteratorGetCharAndNext(&it);
|
||||
if (ch == '\n') break;
|
||||
if (jslNeedSpaceBetween(lastch, ch)) {
|
||||
col++;
|
||||
@ -1104,7 +1100,6 @@ void jslPrintTokenLineMarker(vcbprintf_callback user_callback, void *user_data,
|
||||
user_callback(buf, user_data);
|
||||
chars++;
|
||||
lastch = ch;
|
||||
jsvStringIteratorNext(&it);
|
||||
}
|
||||
jsvStringIteratorFree(&it);
|
||||
|
||||
|
||||
@ -1378,9 +1378,8 @@ JsVar *jspeTemplateLiteral() {
|
||||
jsvStringIteratorNew(&it, template, 0);
|
||||
jsvStringIteratorNew(&dit, a, 0);
|
||||
while (jsvStringIteratorHasChar(&it)) {
|
||||
char ch = jsvStringIteratorGetChar(&it);
|
||||
char ch = jsvStringIteratorGetCharAndNext(&it);
|
||||
if (ch=='$') {
|
||||
jsvStringIteratorNext(&it);
|
||||
ch = jsvStringIteratorGetChar(&it);
|
||||
if (ch=='{') {
|
||||
// Now parse out the expression
|
||||
@ -1391,8 +1390,7 @@ JsVar *jspeTemplateLiteral() {
|
||||
JsvStringIterator eit;
|
||||
jsvStringIteratorNew(&eit, expr, 0);
|
||||
while (jsvStringIteratorHasChar(&it)) {
|
||||
ch = jsvStringIteratorGetChar(&it);
|
||||
jsvStringIteratorNext(&it);
|
||||
ch = jsvStringIteratorGetCharAndNext(&it);
|
||||
if (ch=='{') brackets++;
|
||||
if (ch=='}') {
|
||||
brackets--;
|
||||
@ -1411,7 +1409,6 @@ JsVar *jspeTemplateLiteral() {
|
||||
}
|
||||
} else {
|
||||
jsvStringIteratorAppend(&dit, ch);
|
||||
jsvStringIteratorNext(&it);
|
||||
}
|
||||
}
|
||||
jsvStringIteratorFree(&it);
|
||||
@ -1643,9 +1640,8 @@ NO_INLINE JsVar *jspeFactor() {
|
||||
jsvStringIteratorNew(&it, regex, 0);
|
||||
while (jsvStringIteratorHasChar(&it)) {
|
||||
regexLen++;
|
||||
if (jsvStringIteratorGetChar(&it)=='/')
|
||||
if (jsvStringIteratorGetCharAndNext(&it)=='/')
|
||||
regexEnd = regexLen;
|
||||
jsvStringIteratorNext(&it);
|
||||
}
|
||||
jsvStringIteratorFree(&it);
|
||||
JsVar *flags = 0;
|
||||
|
||||
@ -763,13 +763,12 @@ void vcbprintf(
|
||||
jsvStringIteratorNew(&it, v, 0);
|
||||
// OPT: this could be faster than it is (sending whole blocks at once)
|
||||
while (jsvStringIteratorHasChar(&it)) {
|
||||
buf[0] = jsvStringIteratorGetChar(&it);
|
||||
buf[0] = jsvStringIteratorGetCharAndNext(&it);
|
||||
if (quoted) {
|
||||
user_callback(escapeCharacter(buf[0], isJSONStyle), user_data);
|
||||
} else {
|
||||
user_callback(buf,user_data);
|
||||
}
|
||||
jsvStringIteratorNext(&it);
|
||||
}
|
||||
jsvStringIteratorFree(&it);
|
||||
jsvUnLock(v);
|
||||
|
||||
45
src/jsvar.c
45
src/jsvar.c
@ -1097,8 +1097,7 @@ JsVar *jsvMakeIntoVariableName(JsVar *var, JsVar *valueOrZero) {
|
||||
ext = ext2;
|
||||
nChars = 0;
|
||||
}
|
||||
ext->varData.str[nChars++] = jsvStringIteratorGetChar(&it);
|
||||
jsvStringIteratorNext(&it);
|
||||
ext->varData.str[nChars++] = jsvStringIteratorGetCharAndNext(&it);
|
||||
}
|
||||
jsvStringIteratorFree(&it);
|
||||
if (ext) {
|
||||
@ -1200,8 +1199,8 @@ bool jsvIsBasicVarEqual(JsVar *a, JsVar *b) {
|
||||
jsvStringIteratorNew(&ita, a, 0);
|
||||
jsvStringIteratorNew(&itb, b, 0);
|
||||
while (true) {
|
||||
char a = jsvStringIteratorGetChar(&ita);
|
||||
char b = jsvStringIteratorGetChar(&itb);
|
||||
char a = jsvStringIteratorGetCharAndNext(&ita);
|
||||
char b = jsvStringIteratorGetCharAndNext(&itb);
|
||||
if (a != b) {
|
||||
jsvStringIteratorFree(&ita);
|
||||
jsvStringIteratorFree(&itb);
|
||||
@ -1212,8 +1211,6 @@ bool jsvIsBasicVarEqual(JsVar *a, JsVar *b) {
|
||||
jsvStringIteratorFree(&itb);
|
||||
return true;
|
||||
}
|
||||
jsvStringIteratorNext(&ita);
|
||||
jsvStringIteratorNext(&itb);
|
||||
}
|
||||
// we never get here
|
||||
return false; // make compiler happy
|
||||
@ -1331,8 +1328,7 @@ size_t jsvGetStringChars(const JsVar *v, size_t startChar, char *str, size_t len
|
||||
jsvStringIteratorFree(&it);
|
||||
return len;
|
||||
}
|
||||
*(str++) = jsvStringIteratorGetChar(&it);
|
||||
jsvStringIteratorNext(&it);
|
||||
*(str++) = jsvStringIteratorGetCharAndNext(&it);
|
||||
}
|
||||
jsvStringIteratorFree(&it);
|
||||
return len-l;
|
||||
@ -1349,8 +1345,7 @@ void jsvSetString(JsVar *v, const char *str, size_t len) {
|
||||
jsvStringIteratorNew(&it, v, 0);
|
||||
size_t i;
|
||||
for (i=0;i<len;i++) {
|
||||
jsvStringIteratorSetChar(&it, str[i]);
|
||||
jsvStringIteratorNext(&it);
|
||||
jsvStringIteratorSetCharAndNext(&it, str[i]);
|
||||
}
|
||||
jsvStringIteratorFree(&it);
|
||||
}
|
||||
@ -1422,11 +1417,7 @@ JsVar *jsvAsFlatString(JsVar *var) {
|
||||
jsvStringIteratorNew(&src, str, 0);
|
||||
jsvStringIteratorNew(&dst, flat, 0);
|
||||
while (len--) {
|
||||
jsvStringIteratorSetChar(&dst, jsvStringIteratorGetChar(&src));
|
||||
if (len>0) {
|
||||
jsvStringIteratorNext(&src);
|
||||
jsvStringIteratorNext(&dst);
|
||||
}
|
||||
jsvStringIteratorSetCharAndNext(&dst, jsvStringIteratorGetCharAndNext(&src));
|
||||
}
|
||||
jsvStringIteratorFree(&src);
|
||||
jsvStringIteratorFree(&dst);
|
||||
@ -1557,8 +1548,7 @@ size_t jsvGetLinesInString(JsVar *v) {
|
||||
JsvStringIterator it;
|
||||
jsvStringIteratorNew(&it, v, 0);
|
||||
while (jsvStringIteratorHasChar(&it)) {
|
||||
if (jsvStringIteratorGetChar(&it)=='\n') lines++;
|
||||
jsvStringIteratorNext(&it);
|
||||
if (jsvStringIteratorGetCharAndNext(&it)=='\n') lines++;
|
||||
}
|
||||
jsvStringIteratorFree(&it);
|
||||
return lines;
|
||||
@ -1571,11 +1561,10 @@ size_t jsvGetCharsOnLine(JsVar *v, size_t line) {
|
||||
JsvStringIterator it;
|
||||
jsvStringIteratorNew(&it, v, 0);
|
||||
while (jsvStringIteratorHasChar(&it)) {
|
||||
if (jsvStringIteratorGetChar(&it)=='\n') {
|
||||
if (jsvStringIteratorGetCharAndNext(&it)=='\n') {
|
||||
currentLine++;
|
||||
if (currentLine > line) break;
|
||||
} else if (currentLine==line) chars++;
|
||||
jsvStringIteratorNext(&it);
|
||||
}
|
||||
jsvStringIteratorFree(&it);
|
||||
return chars;
|
||||
@ -1591,7 +1580,7 @@ void jsvGetLineAndCol(JsVar *v, size_t charIdx, size_t *line, size_t *col) {
|
||||
JsvStringIterator it;
|
||||
jsvStringIteratorNew(&it, v, 0);
|
||||
while (jsvStringIteratorHasChar(&it)) {
|
||||
char ch = jsvStringIteratorGetChar(&it);
|
||||
char ch = jsvStringIteratorGetCharAndNext(&it);
|
||||
if (n==charIdx) {
|
||||
jsvStringIteratorFree(&it);
|
||||
*line = y;
|
||||
@ -1603,7 +1592,6 @@ void jsvGetLineAndCol(JsVar *v, size_t charIdx, size_t *line, size_t *col) {
|
||||
x=1; y++;
|
||||
}
|
||||
n++;
|
||||
jsvStringIteratorNext(&it);
|
||||
}
|
||||
jsvStringIteratorFree(&it);
|
||||
// uh-oh - not found
|
||||
@ -1619,7 +1607,7 @@ size_t jsvGetIndexFromLineAndCol(JsVar *v, size_t line, size_t col) {
|
||||
JsvStringIterator it;
|
||||
jsvStringIteratorNew(&it, v, 0);
|
||||
while (jsvStringIteratorHasChar(&it)) {
|
||||
char ch = jsvStringIteratorGetChar(&it);
|
||||
char ch = jsvStringIteratorGetCharAndNext(&it);
|
||||
if ((y==line && x>=col) || y>line) {
|
||||
jsvStringIteratorFree(&it);
|
||||
return (y>line) ? (n-1) : n;
|
||||
@ -1629,7 +1617,6 @@ size_t jsvGetIndexFromLineAndCol(JsVar *v, size_t line, size_t col) {
|
||||
x=1; y++;
|
||||
}
|
||||
n++;
|
||||
jsvStringIteratorNext(&it);
|
||||
}
|
||||
jsvStringIteratorFree(&it);
|
||||
return n;
|
||||
@ -1712,9 +1699,8 @@ void jsvAppendStringVar(JsVar *var, const JsVar *str, size_t stridx, size_t maxL
|
||||
JsvStringIterator it;
|
||||
jsvStringIteratorNewConst(&it, str, stridx);
|
||||
while (jsvStringIteratorHasChar(&it) && (maxLength-->0)) {
|
||||
char ch = jsvStringIteratorGetChar(&it);
|
||||
char ch = jsvStringIteratorGetCharAndNext(&it);
|
||||
jsvStringIteratorAppend(&dst, ch);
|
||||
jsvStringIteratorNext(&it);
|
||||
}
|
||||
jsvStringIteratorFree(&it);
|
||||
jsvStringIteratorFree(&dst);
|
||||
@ -1798,7 +1784,7 @@ bool jsvIsStringNumericInt(const JsVar *var, bool allowDecimalPoint) {
|
||||
int chars=0;
|
||||
while (jsvStringIteratorHasChar(&it)) {
|
||||
chars++;
|
||||
char ch = jsvStringIteratorGetChar(&it);
|
||||
char ch = jsvStringIteratorGetCharAndNext(&it);
|
||||
if (ch=='.' && allowDecimalPoint) {
|
||||
allowDecimalPoint = false; // there can be only one
|
||||
} else {
|
||||
@ -1808,7 +1794,6 @@ bool jsvIsStringNumericInt(const JsVar *var, bool allowDecimalPoint) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
jsvStringIteratorNext(&it);
|
||||
}
|
||||
jsvStringIteratorFree(&it);
|
||||
return chars>0;
|
||||
@ -1825,7 +1810,7 @@ bool jsvIsStringNumericStrict(const JsVar *var) {
|
||||
int chars = 0;
|
||||
while (jsvStringIteratorHasChar(&it)) {
|
||||
chars++;
|
||||
char ch = jsvStringIteratorGetChar(&it);
|
||||
char ch = jsvStringIteratorGetCharAndNext(&it);
|
||||
if (!isNumeric(ch)) {
|
||||
// test for leading zero ensures int_to_string(string_to_int(var))==var
|
||||
jsvStringIteratorFree(&it);
|
||||
@ -1833,7 +1818,6 @@ bool jsvIsStringNumericStrict(const JsVar *var) {
|
||||
}
|
||||
if (!hadNonZero && ch=='0') hasLeadingZero=true;
|
||||
if (ch!='0') hadNonZero=true;
|
||||
jsvStringIteratorNext(&it);
|
||||
}
|
||||
jsvStringIteratorFree(&it);
|
||||
return chars>0 && (!hasLeadingZero || chars==1);
|
||||
@ -3988,8 +3972,7 @@ JsVar *jsvStringTrimRight(JsVar *srcString) {
|
||||
jsvStringIteratorNew(&dst, dstString, 0);
|
||||
int spaces = 0;
|
||||
while (jsvStringIteratorHasChar(&src)) {
|
||||
char ch = jsvStringIteratorGetChar(&src);
|
||||
jsvStringIteratorNext(&src);
|
||||
char ch = jsvStringIteratorGetCharAndNext(&src);
|
||||
|
||||
if (ch==' ') spaces++;
|
||||
else if (ch=='\n') {
|
||||
|
||||
@ -66,9 +66,8 @@ bool jsvIterateCallback(
|
||||
JsvStringIterator it;
|
||||
jsvStringIteratorNew(&it, data, 0);
|
||||
while (jsvStringIteratorHasChar(&it) && ok) {
|
||||
char ch = jsvStringIteratorGetChar(&it);
|
||||
char ch = jsvStringIteratorGetCharAndNext(&it);
|
||||
callback(ch, callbackData);
|
||||
jsvStringIteratorNext(&it);
|
||||
}
|
||||
jsvStringIteratorFree(&it);
|
||||
}
|
||||
@ -285,12 +284,20 @@ void jsvStringIteratorClone(JsvStringIterator *dstit, JsvStringIterator *it) {
|
||||
}
|
||||
}
|
||||
|
||||
char jsvStringIteratorGetCharAndNext(JsvStringIterator *it) {
|
||||
char ch = jsvStringIteratorGetChar(it);
|
||||
jsvStringIteratorNextInline(it);
|
||||
return ch;
|
||||
}
|
||||
|
||||
|
||||
/// Gets the current (>=0) character (or -1)
|
||||
int jsvStringIteratorGetCharOrMinusOne(JsvStringIterator *it) {
|
||||
if (!it->ptr || it->charIdx>=it->charsInVar) return -1;
|
||||
return (int)(unsigned char)READ_FLASH_UINT8(&it->ptr[it->charIdx]);
|
||||
}
|
||||
|
||||
|
||||
void jsvStringIteratorSetChar(JsvStringIterator *it, char c) {
|
||||
if (jsvStringIteratorHasChar(it))
|
||||
it->ptr[it->charIdx] = c;
|
||||
@ -378,8 +385,7 @@ void jsvStringIteratorAppendString(JsvStringIterator *it, JsVar *str, size_t sta
|
||||
JsvStringIterator sit;
|
||||
jsvStringIteratorNew(&sit, str, startIdx);
|
||||
while (jsvStringIteratorHasChar(&sit)) {
|
||||
jsvStringIteratorAppend(it, jsvStringIteratorGetChar(&sit));
|
||||
jsvStringIteratorNext(&sit);
|
||||
jsvStringIteratorAppend(it, jsvStringIteratorGetCharAndNext(&sit));
|
||||
}
|
||||
jsvStringIteratorFree(&sit);
|
||||
}
|
||||
|
||||
@ -74,6 +74,9 @@ static ALWAYS_INLINE char jsvStringIteratorGetChar(JsvStringIterator *it) {
|
||||
return (char)READ_FLASH_UINT8(&it->ptr[it->charIdx]);
|
||||
}
|
||||
|
||||
/// Gets the current character (or 0) and increment iterator. Not inlined for speed
|
||||
char jsvStringIteratorGetCharAndNext(JsvStringIterator *it);
|
||||
|
||||
/// Gets the current (>=0) character (or -1)
|
||||
int jsvStringIteratorGetCharOrMinusOne(JsvStringIterator *it);
|
||||
|
||||
|
||||
@ -723,8 +723,7 @@ a copy or other allocation. The same applies if there's a single argument which
|
||||
is itself a flat string.
|
||||
*/
|
||||
void (_jswrap_espruino_toString_char)(int ch, JsvStringIterator *it) {
|
||||
jsvStringIteratorSetChar(it, (char)ch);
|
||||
jsvStringIteratorNext(it);
|
||||
jsvStringIteratorSetCharAndNext(it, (char)ch);
|
||||
}
|
||||
|
||||
JsVar *jswrap_espruino_toString(JsVar *args) {
|
||||
|
||||
@ -235,11 +235,10 @@ bool jswrap_isNaN(JsVar *v) {
|
||||
JsvStringIterator it;
|
||||
jsvStringIteratorNew(&it,v,0);
|
||||
while (jsvStringIteratorHasChar(&it)) {
|
||||
if (!isWhitespace(jsvStringIteratorGetChar(&it))) {
|
||||
if (!isWhitespace(jsvStringIteratorGetCharAndNext(&it))) {
|
||||
allWhiteSpace = false;
|
||||
break;
|
||||
}
|
||||
jsvStringIteratorNext(&it);
|
||||
}
|
||||
jsvStringIteratorFree(&it);
|
||||
if (allWhiteSpace) return false;
|
||||
@ -363,8 +362,7 @@ JsVar *jswrap_atob(JsVar *base64Data) {
|
||||
int i, valid=0;
|
||||
for (i=0;i<4;i++) {
|
||||
if (jsvStringIteratorHasChar(&itsrc)) {
|
||||
int sextet = jswrap_atob_decode(jsvStringIteratorGetChar(&itsrc));
|
||||
jsvStringIteratorNext(&itsrc);
|
||||
int sextet = jswrap_atob_decode(jsvStringIteratorGetCharAndNext(&itsrc));
|
||||
if (sextet>=0) {
|
||||
triple |= (unsigned int)(sextet) << ((3-i)*6);
|
||||
valid=i;
|
||||
@ -405,7 +403,7 @@ JsVar *jswrap_encodeURIComponent(JsVar *arg) {
|
||||
JsvStringIterator dst;
|
||||
jsvStringIteratorNew(&dst, result, 0);
|
||||
while (jsvStringIteratorHasChar(&it)) {
|
||||
char ch = jsvStringIteratorGetChar(&it);
|
||||
char ch = jsvStringIteratorGetCharAndNext(&it);
|
||||
if (isAlpha(ch) || isNumeric(ch) ||
|
||||
ch=='-' || // _ in isAlpha
|
||||
ch=='.' ||
|
||||
@ -423,7 +421,6 @@ JsVar *jswrap_encodeURIComponent(JsVar *arg) {
|
||||
d = ((unsigned)ch)&15;
|
||||
jsvStringIteratorAppend(&dst, (char)((d>9)?('A'+d-10):('0'+d)));
|
||||
}
|
||||
jsvStringIteratorNext(&it);
|
||||
}
|
||||
jsvStringIteratorFree(&dst);
|
||||
jsvStringIteratorFree(&it);
|
||||
@ -454,7 +451,7 @@ JsVar *jswrap_decodeURIComponent(JsVar *arg) {
|
||||
JsvStringIterator dst;
|
||||
jsvStringIteratorNew(&dst, result, 0);
|
||||
while (jsvStringIteratorHasChar(&it)) {
|
||||
char ch = jsvStringIteratorGetChar(&it);
|
||||
char ch = jsvStringIteratorGetCharAndNext(&it);
|
||||
if (ch>>7) {
|
||||
jsExceptionHere(JSET_ERROR, "ASCII only\n");
|
||||
break;
|
||||
@ -462,10 +459,8 @@ JsVar *jswrap_decodeURIComponent(JsVar *arg) {
|
||||
if (ch!='%') {
|
||||
jsvStringIteratorAppend(&dst, ch);
|
||||
} else {
|
||||
jsvStringIteratorNext(&it);
|
||||
int hi = jsvStringIteratorGetChar(&it);
|
||||
jsvStringIteratorNext(&it);
|
||||
int lo = jsvStringIteratorGetChar(&it);
|
||||
int hi = jsvStringIteratorGetCharAndNext(&it);
|
||||
int lo = jsvStringIteratorGetCharAndNext(&it);
|
||||
int v = (char)hexToByte(hi,lo);
|
||||
if (v<0) {
|
||||
jsExceptionHere(JSET_ERROR, "Invalid URI\n");
|
||||
@ -474,7 +469,6 @@ JsVar *jswrap_decodeURIComponent(JsVar *arg) {
|
||||
ch = (char)v;
|
||||
jsvStringIteratorAppend(&dst, ch);
|
||||
}
|
||||
jsvStringIteratorNext(&it);
|
||||
}
|
||||
jsvStringIteratorFree(&dst);
|
||||
jsvStringIteratorFree(&it);
|
||||
|
||||
@ -152,10 +152,8 @@ void jswrap_onewire_select(JsVar *parent, JsVar *rom) {
|
||||
int i;
|
||||
for (i=0;i<8;i++) {
|
||||
char b[3];
|
||||
b[0] = jsvStringIteratorGetChar(&it);
|
||||
jsvStringIteratorNext(&it);
|
||||
b[1] = jsvStringIteratorGetChar(&it);
|
||||
jsvStringIteratorNext(&it);
|
||||
b[0] = jsvStringIteratorGetCharAndNext(&it);
|
||||
b[1] = jsvStringIteratorGetCharAndNext(&it);
|
||||
b[2] = 0;
|
||||
romdata = romdata | (((unsigned long long)stringToIntWithRadix(b,16,NULL,NULL)) << (i*8));
|
||||
|
||||
|
||||
@ -397,8 +397,7 @@ bool jswrap_regexp_hasFlag(JsVar *parent, char flag) {
|
||||
JsvStringIterator it;
|
||||
jsvStringIteratorNew(&it, flags, 0);
|
||||
while (jsvStringIteratorHasChar(&it)) {
|
||||
has |= jsvStringIteratorGetChar(&it)==flag;
|
||||
jsvStringIteratorNext(&it);
|
||||
has |= jsvStringIteratorGetCharAndNext(&it)==flag;
|
||||
}
|
||||
jsvStringIteratorFree(&it);
|
||||
}
|
||||
|
||||
@ -347,10 +347,9 @@ JsVar *jswrap_string_replace(JsVar *parent, JsVar *subStr, JsVar *newSubStr) {
|
||||
JsvStringIterator src;
|
||||
jsvStringIteratorNew(&src, replace, 0);
|
||||
while (jsvStringIteratorHasChar(&src)) {
|
||||
char ch = jsvStringIteratorGetChar(&src);
|
||||
char ch = jsvStringIteratorGetCharAndNext(&src);
|
||||
if (ch=='$') {
|
||||
jsvStringIteratorNext(&src);
|
||||
ch = jsvStringIteratorGetChar(&src);
|
||||
ch = jsvStringIteratorGetCharAndNext(&src);
|
||||
JsVar *group = 0;
|
||||
if (ch>'0' && ch<='9')
|
||||
group = jsvGetArrayItem(match, ch-'0');
|
||||
@ -364,7 +363,6 @@ JsVar *jswrap_string_replace(JsVar *parent, JsVar *subStr, JsVar *newSubStr) {
|
||||
} else {
|
||||
jsvStringIteratorAppend(&dst, ch);
|
||||
}
|
||||
jsvStringIteratorNext(&src);
|
||||
}
|
||||
jsvStringIteratorFree(&src);
|
||||
}
|
||||
@ -594,10 +592,9 @@ JsVar *jswrap_string_toUpperLowerCase(JsVar *parent, bool upper) {
|
||||
jsvStringIteratorNew(&itdst, res, 0);
|
||||
|
||||
while (jsvStringIteratorHasChar(&itsrc)) {
|
||||
char ch = jsvStringIteratorGetChar(&itsrc);
|
||||
char ch = jsvStringIteratorGetCharAndNext(&itsrc);
|
||||
ch = upper ? jsvStringCharToUpper(ch) : jsvStringCharToLower(ch);
|
||||
jsvStringIteratorAppend(&itdst, ch);
|
||||
jsvStringIteratorNext(&itsrc);
|
||||
}
|
||||
|
||||
jsvStringIteratorFree(&itsrc);
|
||||
@ -628,12 +625,12 @@ JsVar *jswrap_string_trim(JsVar *parent) {
|
||||
JsvStringIterator it;
|
||||
jsvStringIteratorNew(&it, s, 0);
|
||||
while (jsvStringIteratorHasChar(&it)) {
|
||||
bool ws = isWhitespace(jsvStringIteratorGetChar(&it));
|
||||
size_t idx = jsvStringIteratorGetIndex(&it);
|
||||
bool ws = isWhitespace(jsvStringIteratorGetCharAndNext(&it));
|
||||
if (!ws) {
|
||||
if (end<0) start = (unsigned int)jsvStringIteratorGetIndex(&it);
|
||||
end = (int)jsvStringIteratorGetIndex(&it); // last
|
||||
if (end<0) start = (unsigned int)idx;
|
||||
end = (int)idx; // last
|
||||
}
|
||||
jsvStringIteratorNext(&it);
|
||||
}
|
||||
jsvStringIteratorFree(&it);
|
||||
// work out length
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user