diff options
author | Alon Zakai <alonzakai@gmail.com> | 2013-09-16 10:50:24 -0700 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2013-09-16 10:50:24 -0700 |
commit | c72022ee3788281dd764782eb51395e322efb1bc (patch) | |
tree | 24157bf239bf1c29cad368b7f3f6846cf6a7c5a1 /src | |
parent | 147bc5e8b13ee6659b6a259a29400c53c537fb1c (diff) | |
parent | 80e69073322a40fe3b11c85d71b8bfa819aad5b4 (diff) |
Merge pull request #1618 from sbalko/incoming
Incoming
Diffstat (limited to 'src')
-rw-r--r-- | src/library.js | 49 |
1 files changed, 48 insertions, 1 deletions
diff --git a/src/library.js b/src/library.js index aac5a9da..a2ef41a0 100644 --- a/src/library.js +++ b/src/library.js @@ -1705,7 +1705,7 @@ LibraryManager.library = { if (nextC > 0) { var maxx = 1; if (nextC > formatIndex+1) { - var sub = format.substring(formatIndex+1, nextC) + var sub = format.substring(formatIndex+1, nextC); maxx = parseInt(sub); if (maxx != sub) maxx = 0; } @@ -1723,6 +1723,53 @@ LibraryManager.library = { } } + // handle %[...] + if (format[formatIndex] === '%' && format.indexOf('[', formatIndex+1) > 0) { + var match = /\%([0-9]*)\[(\^)?(\]?[^\]]*)\]/.exec(format.substring(formatIndex)); + if (match) { + var maxNumCharacters = parseInt(match[1]) || Infinity; + var negateScanList = (match[2] === '^'); + var scanList = match[3]; + + // expand "middle" dashs into character sets + var middleDashMatch; + while ((middleDashMatch = /([^\-])\-([^\-])/.exec(scanList))) { + var rangeStartCharCode = middleDashMatch[1].charCodeAt(0); + var rangeEndCharCode = middleDashMatch[2].charCodeAt(0); + for (var expanded = ''; rangeStartCharCode <= rangeEndCharCode; expanded += String.fromCharCode(rangeStartCharCode++)); + scanList = scanList.replace(middleDashMatch[1] + '-' + middleDashMatch[2], expanded); + } + + var argPtr = {{{ makeGetValue('varargs', 'argIndex', 'void*') }}}; + argIndex += Runtime.getAlignSize('void*', null, true); + fields++; + + for (var i = 0; i < maxNumCharacters; i++) { + next = get(); + if (negateScanList) { + if (scanList.indexOf(String.fromCharCode(next)) < 0) { + {{{ makeSetValue('argPtr++', 0, 'next', 'i8') }}}; + } else { + unget(); + break; + } + } else { + if (scanList.indexOf(String.fromCharCode(next)) >= 0) { + {{{ makeSetValue('argPtr++', 0, 'next', 'i8') }}}; + } else { + unget(); + break; + } + } + } + + // write out null-terminating character + {{{ makeSetValue('argPtr++', 0, '0', 'i8') }}}; + formatIndex += match[0].length; + + continue; + } + } // remove whitespace while (1) { next = get(); |