// Copyright 2009 the Sputnik authors. All rights reserved. // This code is governed by the BSD license found in the LICENSE file. /*--- info: "CharacterEscape :: c ControlLetter" es5id: 15.10.2.10_A2.1_T3 es6id: B.1.4 description: > "ControlLetter :: RUSSIAN ALPHABET is incorrect" Instead, fall back to semantics to match literal "\\c" ---*/ function* invalidControls() { // Check upper case Cyrillic for (var alpha = 0x0410; alpha <= 0x042F; alpha++) { yield String.fromCharCode(alpha); } // Check lower case Cyrillic for (alpha = 0x0430; alpha <= 0x044F; alpha++) { yield String.fromCharCode(alpha); } // Check ASCII characters which are not in the extended range or syntax // characters for (alpha = 0x00; alpha <= 0x7F; alpha++) { let letter = String.fromCharCode(alpha); if (!letter.match(/[0-9A-Za-z_\$(|)\[\]\/\\^]/)) { yield letter; } } // Check for end of string yield ""; } for (let letter of invalidControls()) { var source = "\\c" + letter; var re = new RegExp(source); if (letter.length > 0) { var char = letter.charCodeAt(0); var str = String.fromCharCode(char % 32); var arr = re.exec(str); assert.sameValue(arr, null, `Character ${letter} unreasonably wrapped around as a control character`); } arr = re.exec(source.substring(1)); assert.sameValue(arr, null, `invalid \\c escape matched c rather than \\c when followed by ${letter}`); arr = re.exec(source); assert.notSameValue(arr, null, `invalid \\c escape failed to match \\c when followed by ${letter}`); }