Merge jsvStringIteratorGetChar + jsvStringIteratorNext into jsvStringIteratorGetCharAndNext (fix #1816)

This commit is contained in:
Gordon Williams 2020-05-12 13:04:33 +01:00
parent 4070a6acb1
commit 4f47cdc9bc
18 changed files with 78 additions and 135 deletions

View File

@ -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)

View File

@ -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);

View File

@ -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

View File

@ -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);
}

View File

@ -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);

View File

@ -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;

View File

@ -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);
}

View File

@ -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);

View File

@ -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;

View File

@ -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);

View File

@ -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') {

View File

@ -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);
}

View File

@ -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);

View File

@ -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) {

View File

@ -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);

View File

@ -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));

View File

@ -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);
}

View File

@ -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