json_scanner.c 36 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661
  1. /* Generated by re2c 1.0.3 */
  2. /*
  3. +----------------------------------------------------------------------+
  4. | PHP Version 7 |
  5. +----------------------------------------------------------------------+
  6. | Copyright (c) 1997-2018 The PHP Group |
  7. +----------------------------------------------------------------------+
  8. | This source file is subject to version 3.01 of the PHP license, |
  9. | that is bundled with this package in the file LICENSE, and is |
  10. | available through the world-wide-web at the following url: |
  11. | http://www.php.net/license/3_01.txt |
  12. | If you did not receive a copy of the PHP license and are unable to |
  13. | obtain it through the world-wide-web, please send a note to |
  14. | license@php.net so we can mail you a copy immediately. |
  15. +----------------------------------------------------------------------+
  16. | Author: Jakub Zelenka <bukka@php.net> |
  17. +----------------------------------------------------------------------+
  18. */
  19. #include "php.h"
  20. #include "php_json_scanner.h"
  21. #include "php_json_scanner_defs.h"
  22. #include "php_json_parser.h"
  23. #include "json_parser.tab.h"
  24. #define YYCTYPE php_json_ctype
  25. #define YYCURSOR s->cursor
  26. #define YYLIMIT s->limit
  27. #define YYMARKER s->marker
  28. #define YYCTXMARKER s->ctxmarker
  29. #define YYGETCONDITION() s->state
  30. #define YYSETCONDITION(yystate) s->state = yystate
  31. #define YYFILL(n)
  32. #define PHP_JSON_CONDITION_SET(condition) YYSETCONDITION(yyc##condition)
  33. #define PHP_JSON_CONDITION_GOTO(condition) goto yyc_##condition
  34. #define PHP_JSON_CONDITION_SET_AND_GOTO(condition) \
  35. PHP_JSON_CONDITION_SET(condition); \
  36. PHP_JSON_CONDITION_GOTO(condition)
  37. #define PHP_JSON_CONDITION_GOTO_STR_P2() \
  38. do { \
  39. if (s->utf8_invalid) { \
  40. PHP_JSON_CONDITION_GOTO(STR_P2_BIN); \
  41. } else { \
  42. PHP_JSON_CONDITION_GOTO(STR_P2_UTF); \
  43. } \
  44. } while(0)
  45. #define PHP_JSON_SCANNER_COPY_ESC() php_json_scanner_copy_string(s, 0)
  46. #define PHP_JSON_SCANNER_COPY_UTF() php_json_scanner_copy_string(s, 5)
  47. #define PHP_JSON_SCANNER_COPY_UTF_SP() php_json_scanner_copy_string(s, 11)
  48. #define PHP_JSON_INT_MAX_LENGTH (MAX_LENGTH_OF_LONG - 1)
  49. static void php_json_scanner_copy_string(php_json_scanner *s, int esc_size)
  50. {
  51. size_t len = s->cursor - s->str_start - esc_size - 1;
  52. if (len) {
  53. memcpy(s->pstr, s->str_start, len);
  54. s->pstr += len;
  55. }
  56. }
  57. static int php_json_hex_to_int(char code)
  58. {
  59. if (code >= '0' && code <= '9') {
  60. return code - '0';
  61. } else if (code >= 'A' && code <= 'F') {
  62. return code - ('A' - 10);
  63. } else if (code >= 'a' && code <= 'f') {
  64. return code - ('a' - 10);
  65. } else {
  66. /* this should never happened (just to suppress compiler warning) */
  67. return -1;
  68. }
  69. }
  70. static int php_json_ucs2_to_int_ex(php_json_scanner *s, int size, int start)
  71. {
  72. int i, code = 0;
  73. php_json_ctype *pc = s->cursor - start;
  74. for (i = 0; i < size; i++) {
  75. code |= php_json_hex_to_int(*(pc--)) << (i * 4);
  76. }
  77. return code;
  78. }
  79. static int php_json_ucs2_to_int(php_json_scanner *s, int size)
  80. {
  81. return php_json_ucs2_to_int_ex(s, size, 1);
  82. }
  83. void php_json_scanner_init(php_json_scanner *s, char *str, size_t str_len, int options)
  84. {
  85. s->cursor = (php_json_ctype *) str;
  86. s->limit = (php_json_ctype *) str + str_len;
  87. s->options = options;
  88. PHP_JSON_CONDITION_SET(JS);
  89. }
  90. int php_json_scan(php_json_scanner *s)
  91. {
  92. ZVAL_NULL(&s->value);
  93. std:
  94. s->token = s->cursor;
  95. {
  96. YYCTYPE yych;
  97. unsigned int yyaccept = 0;
  98. if (YYGETCONDITION() < 2) {
  99. if (YYGETCONDITION() < 1) {
  100. goto yyc_JS;
  101. } else {
  102. goto yyc_STR_P1;
  103. }
  104. } else {
  105. if (YYGETCONDITION() < 3) {
  106. goto yyc_STR_P2_BIN;
  107. } else {
  108. goto yyc_STR_P2_UTF;
  109. }
  110. }
  111. /* *********************************** */
  112. yyc_JS:
  113. {
  114. static const unsigned char yybm[] = {
  115. 0, 0, 0, 0, 0, 0, 0, 0,
  116. 0, 64, 0, 0, 0, 64, 0, 0,
  117. 0, 0, 0, 0, 0, 0, 0, 0,
  118. 0, 0, 0, 0, 0, 0, 0, 0,
  119. 64, 0, 0, 0, 0, 0, 0, 0,
  120. 0, 0, 0, 0, 0, 0, 0, 0,
  121. 128, 128, 128, 128, 128, 128, 128, 128,
  122. 128, 128, 0, 0, 0, 0, 0, 0,
  123. 0, 0, 0, 0, 0, 0, 0, 0,
  124. 0, 0, 0, 0, 0, 0, 0, 0,
  125. 0, 0, 0, 0, 0, 0, 0, 0,
  126. 0, 0, 0, 0, 0, 0, 0, 0,
  127. 0, 0, 0, 0, 0, 0, 0, 0,
  128. 0, 0, 0, 0, 0, 0, 0, 0,
  129. 0, 0, 0, 0, 0, 0, 0, 0,
  130. 0, 0, 0, 0, 0, 0, 0, 0,
  131. 0, 0, 0, 0, 0, 0, 0, 0,
  132. 0, 0, 0, 0, 0, 0, 0, 0,
  133. 0, 0, 0, 0, 0, 0, 0, 0,
  134. 0, 0, 0, 0, 0, 0, 0, 0,
  135. 0, 0, 0, 0, 0, 0, 0, 0,
  136. 0, 0, 0, 0, 0, 0, 0, 0,
  137. 0, 0, 0, 0, 0, 0, 0, 0,
  138. 0, 0, 0, 0, 0, 0, 0, 0,
  139. 0, 0, 0, 0, 0, 0, 0, 0,
  140. 0, 0, 0, 0, 0, 0, 0, 0,
  141. 0, 0, 0, 0, 0, 0, 0, 0,
  142. 0, 0, 0, 0, 0, 0, 0, 0,
  143. 0, 0, 0, 0, 0, 0, 0, 0,
  144. 0, 0, 0, 0, 0, 0, 0, 0,
  145. 0, 0, 0, 0, 0, 0, 0, 0,
  146. 0, 0, 0, 0, 0, 0, 0, 0,
  147. };
  148. yych = *YYCURSOR;
  149. if (yych <= ']') {
  150. if (yych <= '"') {
  151. if (yych <= '\f') {
  152. if (yych <= 0x08) {
  153. if (yych >= 0x01) goto yy5;
  154. } else {
  155. if (yych <= '\t') goto yy7;
  156. if (yych <= '\n') goto yy10;
  157. goto yy5;
  158. }
  159. } else {
  160. if (yych <= 0x1F) {
  161. if (yych <= '\r') goto yy11;
  162. goto yy5;
  163. } else {
  164. if (yych <= ' ') goto yy7;
  165. if (yych <= '!') goto yy12;
  166. goto yy14;
  167. }
  168. }
  169. } else {
  170. if (yych <= '0') {
  171. if (yych <= ',') {
  172. if (yych <= '+') goto yy12;
  173. goto yy16;
  174. } else {
  175. if (yych <= '-') goto yy18;
  176. if (yych <= '/') goto yy12;
  177. goto yy19;
  178. }
  179. } else {
  180. if (yych <= 'Z') {
  181. if (yych <= '9') goto yy21;
  182. if (yych <= ':') goto yy23;
  183. goto yy12;
  184. } else {
  185. if (yych <= '[') goto yy25;
  186. if (yych <= '\\') goto yy12;
  187. goto yy27;
  188. }
  189. }
  190. }
  191. } else {
  192. if (yych <= '}') {
  193. if (yych <= 's') {
  194. if (yych <= 'f') {
  195. if (yych <= 'e') goto yy12;
  196. goto yy29;
  197. } else {
  198. if (yych == 'n') goto yy30;
  199. goto yy12;
  200. }
  201. } else {
  202. if (yych <= 'z') {
  203. if (yych <= 't') goto yy31;
  204. goto yy12;
  205. } else {
  206. if (yych <= '{') goto yy32;
  207. if (yych <= '|') goto yy12;
  208. goto yy34;
  209. }
  210. }
  211. } else {
  212. if (yych <= 0xEC) {
  213. if (yych <= 0xC1) {
  214. if (yych <= 0x7F) goto yy12;
  215. goto yy36;
  216. } else {
  217. if (yych <= 0xDF) goto yy38;
  218. if (yych <= 0xE0) goto yy39;
  219. goto yy40;
  220. }
  221. } else {
  222. if (yych <= 0xF0) {
  223. if (yych <= 0xED) goto yy41;
  224. if (yych <= 0xEF) goto yy40;
  225. goto yy42;
  226. } else {
  227. if (yych <= 0xF3) goto yy43;
  228. if (yych <= 0xF4) goto yy44;
  229. goto yy36;
  230. }
  231. }
  232. }
  233. }
  234. ++YYCURSOR;
  235. {
  236. if (s->limit < s->cursor) {
  237. return PHP_JSON_T_EOI;
  238. } else {
  239. s->errcode = PHP_JSON_ERROR_CTRL_CHAR;
  240. return PHP_JSON_T_ERROR;
  241. }
  242. }
  243. yy5:
  244. ++YYCURSOR;
  245. {
  246. s->errcode = PHP_JSON_ERROR_CTRL_CHAR;
  247. return PHP_JSON_T_ERROR;
  248. }
  249. yy7:
  250. yych = *++YYCURSOR;
  251. yy8:
  252. if (yybm[0+yych] & 64) {
  253. goto yy7;
  254. }
  255. yy9:
  256. { goto std; }
  257. yy10:
  258. ++YYCURSOR;
  259. goto yy9;
  260. yy11:
  261. yych = *++YYCURSOR;
  262. if (yych == '\n') goto yy10;
  263. goto yy8;
  264. yy12:
  265. ++YYCURSOR;
  266. yy13:
  267. {
  268. s->errcode = PHP_JSON_ERROR_SYNTAX;
  269. return PHP_JSON_T_ERROR;
  270. }
  271. yy14:
  272. ++YYCURSOR;
  273. {
  274. s->str_start = s->cursor;
  275. s->str_esc = 0;
  276. s->utf8_invalid = 0;
  277. s->utf8_invalid_count = 0;
  278. PHP_JSON_CONDITION_SET_AND_GOTO(STR_P1);
  279. }
  280. yy16:
  281. ++YYCURSOR;
  282. { return ','; }
  283. yy18:
  284. yych = *++YYCURSOR;
  285. if (yych <= '/') goto yy13;
  286. if (yych <= '0') goto yy19;
  287. if (yych <= '9') goto yy21;
  288. goto yy13;
  289. yy19:
  290. yyaccept = 0;
  291. yych = *(YYMARKER = ++YYCURSOR);
  292. if (yych <= 'D') {
  293. if (yych == '.') goto yy45;
  294. } else {
  295. if (yych <= 'E') goto yy47;
  296. if (yych == 'e') goto yy47;
  297. }
  298. yy20:
  299. {
  300. zend_bool bigint = 0, negative = s->token[0] == '-';
  301. size_t digits = (size_t) (s->cursor - s->token - negative);
  302. if (digits >= PHP_JSON_INT_MAX_LENGTH) {
  303. if (digits == PHP_JSON_INT_MAX_LENGTH) {
  304. int cmp = strncmp((char *) (s->token + negative), LONG_MIN_DIGITS, PHP_JSON_INT_MAX_LENGTH);
  305. if (!(cmp < 0 || (cmp == 0 && negative))) {
  306. bigint = 1;
  307. }
  308. } else {
  309. bigint = 1;
  310. }
  311. }
  312. if (!bigint) {
  313. ZVAL_LONG(&s->value, ZEND_STRTOL((char *) s->token, NULL, 10));
  314. return PHP_JSON_T_INT;
  315. } else if (s->options & PHP_JSON_BIGINT_AS_STRING) {
  316. ZVAL_STRINGL(&s->value, (char *) s->token, s->cursor - s->token);
  317. return PHP_JSON_T_STRING;
  318. } else {
  319. ZVAL_DOUBLE(&s->value, zend_strtod((char *) s->token, NULL));
  320. return PHP_JSON_T_DOUBLE;
  321. }
  322. }
  323. yy21:
  324. yyaccept = 0;
  325. yych = *(YYMARKER = ++YYCURSOR);
  326. if (yybm[0+yych] & 128) {
  327. goto yy21;
  328. }
  329. if (yych <= 'D') {
  330. if (yych == '.') goto yy45;
  331. goto yy20;
  332. } else {
  333. if (yych <= 'E') goto yy47;
  334. if (yych == 'e') goto yy47;
  335. goto yy20;
  336. }
  337. yy23:
  338. ++YYCURSOR;
  339. { return ':'; }
  340. yy25:
  341. ++YYCURSOR;
  342. { return '['; }
  343. yy27:
  344. ++YYCURSOR;
  345. { return ']'; }
  346. yy29:
  347. yyaccept = 1;
  348. yych = *(YYMARKER = ++YYCURSOR);
  349. if (yych == 'a') goto yy48;
  350. goto yy13;
  351. yy30:
  352. yyaccept = 1;
  353. yych = *(YYMARKER = ++YYCURSOR);
  354. if (yych == 'u') goto yy49;
  355. goto yy13;
  356. yy31:
  357. yyaccept = 1;
  358. yych = *(YYMARKER = ++YYCURSOR);
  359. if (yych == 'r') goto yy50;
  360. goto yy13;
  361. yy32:
  362. ++YYCURSOR;
  363. { return '{'; }
  364. yy34:
  365. ++YYCURSOR;
  366. { return '}'; }
  367. yy36:
  368. ++YYCURSOR;
  369. yy37:
  370. {
  371. s->errcode = PHP_JSON_ERROR_UTF8;
  372. return PHP_JSON_T_ERROR;
  373. }
  374. yy38:
  375. yych = *++YYCURSOR;
  376. if (yych <= 0x7F) goto yy37;
  377. if (yych <= 0xBF) goto yy12;
  378. goto yy37;
  379. yy39:
  380. yyaccept = 2;
  381. yych = *(YYMARKER = ++YYCURSOR);
  382. if (yych <= 0x9F) goto yy37;
  383. if (yych <= 0xBF) goto yy51;
  384. goto yy37;
  385. yy40:
  386. yyaccept = 2;
  387. yych = *(YYMARKER = ++YYCURSOR);
  388. if (yych <= 0x7F) goto yy37;
  389. if (yych <= 0xBF) goto yy51;
  390. goto yy37;
  391. yy41:
  392. yyaccept = 2;
  393. yych = *(YYMARKER = ++YYCURSOR);
  394. if (yych <= 0x7F) goto yy37;
  395. if (yych <= 0x9F) goto yy51;
  396. goto yy37;
  397. yy42:
  398. yyaccept = 2;
  399. yych = *(YYMARKER = ++YYCURSOR);
  400. if (yych <= 0x8F) goto yy37;
  401. if (yych <= 0xBF) goto yy52;
  402. goto yy37;
  403. yy43:
  404. yyaccept = 2;
  405. yych = *(YYMARKER = ++YYCURSOR);
  406. if (yych <= 0x7F) goto yy37;
  407. if (yych <= 0xBF) goto yy52;
  408. goto yy37;
  409. yy44:
  410. yyaccept = 2;
  411. yych = *(YYMARKER = ++YYCURSOR);
  412. if (yych <= 0x7F) goto yy37;
  413. if (yych <= 0x8F) goto yy52;
  414. goto yy37;
  415. yy45:
  416. yych = *++YYCURSOR;
  417. if (yych <= '/') goto yy46;
  418. if (yych <= '9') goto yy53;
  419. yy46:
  420. YYCURSOR = YYMARKER;
  421. if (yyaccept <= 1) {
  422. if (yyaccept == 0) {
  423. goto yy20;
  424. } else {
  425. goto yy13;
  426. }
  427. } else {
  428. if (yyaccept == 2) {
  429. goto yy37;
  430. } else {
  431. goto yy55;
  432. }
  433. }
  434. yy47:
  435. yych = *++YYCURSOR;
  436. if (yych <= ',') {
  437. if (yych == '+') goto yy56;
  438. goto yy46;
  439. } else {
  440. if (yych <= '-') goto yy56;
  441. if (yych <= '/') goto yy46;
  442. if (yych <= '9') goto yy57;
  443. goto yy46;
  444. }
  445. yy48:
  446. yych = *++YYCURSOR;
  447. if (yych == 'l') goto yy59;
  448. goto yy46;
  449. yy49:
  450. yych = *++YYCURSOR;
  451. if (yych == 'l') goto yy60;
  452. goto yy46;
  453. yy50:
  454. yych = *++YYCURSOR;
  455. if (yych == 'u') goto yy61;
  456. goto yy46;
  457. yy51:
  458. yych = *++YYCURSOR;
  459. if (yych <= 0x7F) goto yy46;
  460. if (yych <= 0xBF) goto yy12;
  461. goto yy46;
  462. yy52:
  463. yych = *++YYCURSOR;
  464. if (yych <= 0x7F) goto yy46;
  465. if (yych <= 0xBF) goto yy51;
  466. goto yy46;
  467. yy53:
  468. yyaccept = 3;
  469. yych = *(YYMARKER = ++YYCURSOR);
  470. if (yych <= 'D') {
  471. if (yych <= '/') goto yy55;
  472. if (yych <= '9') goto yy53;
  473. } else {
  474. if (yych <= 'E') goto yy47;
  475. if (yych == 'e') goto yy47;
  476. }
  477. yy55:
  478. {
  479. ZVAL_DOUBLE(&s->value, zend_strtod((char *) s->token, NULL));
  480. return PHP_JSON_T_DOUBLE;
  481. }
  482. yy56:
  483. yych = *++YYCURSOR;
  484. if (yych <= '/') goto yy46;
  485. if (yych >= ':') goto yy46;
  486. yy57:
  487. yych = *++YYCURSOR;
  488. if (yych <= '/') goto yy55;
  489. if (yych <= '9') goto yy57;
  490. goto yy55;
  491. yy59:
  492. yych = *++YYCURSOR;
  493. if (yych == 's') goto yy62;
  494. goto yy46;
  495. yy60:
  496. yych = *++YYCURSOR;
  497. if (yych == 'l') goto yy63;
  498. goto yy46;
  499. yy61:
  500. yych = *++YYCURSOR;
  501. if (yych == 'e') goto yy65;
  502. goto yy46;
  503. yy62:
  504. yych = *++YYCURSOR;
  505. if (yych == 'e') goto yy67;
  506. goto yy46;
  507. yy63:
  508. ++YYCURSOR;
  509. {
  510. ZVAL_NULL(&s->value);
  511. return PHP_JSON_T_NUL;
  512. }
  513. yy65:
  514. ++YYCURSOR;
  515. {
  516. ZVAL_TRUE(&s->value);
  517. return PHP_JSON_T_TRUE;
  518. }
  519. yy67:
  520. ++YYCURSOR;
  521. {
  522. ZVAL_FALSE(&s->value);
  523. return PHP_JSON_T_FALSE;
  524. }
  525. }
  526. /* *********************************** */
  527. yyc_STR_P1:
  528. yych = *YYCURSOR;
  529. if (yych <= 0xDF) {
  530. if (yych <= '[') {
  531. if (yych <= 0x1F) goto yy71;
  532. if (yych == '"') goto yy75;
  533. goto yy73;
  534. } else {
  535. if (yych <= '\\') goto yy77;
  536. if (yych <= 0x7F) goto yy73;
  537. if (yych <= 0xC1) goto yy79;
  538. goto yy81;
  539. }
  540. } else {
  541. if (yych <= 0xEF) {
  542. if (yych <= 0xE0) goto yy82;
  543. if (yych == 0xED) goto yy84;
  544. goto yy83;
  545. } else {
  546. if (yych <= 0xF0) goto yy85;
  547. if (yych <= 0xF3) goto yy86;
  548. if (yych <= 0xF4) goto yy87;
  549. goto yy79;
  550. }
  551. }
  552. yy71:
  553. ++YYCURSOR;
  554. {
  555. s->errcode = PHP_JSON_ERROR_CTRL_CHAR;
  556. return PHP_JSON_T_ERROR;
  557. }
  558. yy73:
  559. ++YYCURSOR;
  560. { PHP_JSON_CONDITION_GOTO(STR_P1); }
  561. yy75:
  562. ++YYCURSOR;
  563. {
  564. zend_string *str;
  565. size_t len = s->cursor - s->str_start - s->str_esc - 1 + s->utf8_invalid_count;
  566. if (len == 0) {
  567. PHP_JSON_CONDITION_SET(JS);
  568. ZVAL_EMPTY_STRING(&s->value);
  569. return PHP_JSON_T_ESTRING;
  570. }
  571. str = zend_string_alloc(len, 0);
  572. ZSTR_VAL(str)[len] = '\0';
  573. ZVAL_STR(&s->value, str);
  574. if (s->str_esc || s->utf8_invalid) {
  575. s->pstr = (php_json_ctype *) Z_STRVAL(s->value);
  576. s->cursor = s->str_start;
  577. PHP_JSON_CONDITION_GOTO_STR_P2();
  578. } else {
  579. memcpy(Z_STRVAL(s->value), s->str_start, len);
  580. PHP_JSON_CONDITION_SET(JS);
  581. return PHP_JSON_T_STRING;
  582. }
  583. }
  584. yy77:
  585. yyaccept = 0;
  586. yych = *(YYMARKER = ++YYCURSOR);
  587. if (yych <= 'e') {
  588. if (yych <= '/') {
  589. if (yych == '"') goto yy88;
  590. if (yych >= '/') goto yy88;
  591. } else {
  592. if (yych <= '\\') {
  593. if (yych >= '\\') goto yy88;
  594. } else {
  595. if (yych == 'b') goto yy88;
  596. }
  597. }
  598. } else {
  599. if (yych <= 'q') {
  600. if (yych <= 'f') goto yy88;
  601. if (yych == 'n') goto yy88;
  602. } else {
  603. if (yych <= 's') {
  604. if (yych <= 'r') goto yy88;
  605. } else {
  606. if (yych <= 't') goto yy88;
  607. if (yych <= 'u') goto yy90;
  608. }
  609. }
  610. }
  611. yy78:
  612. {
  613. s->errcode = PHP_JSON_ERROR_SYNTAX;
  614. return PHP_JSON_T_ERROR;
  615. }
  616. yy79:
  617. ++YYCURSOR;
  618. yy80:
  619. {
  620. if (s->options & (PHP_JSON_INVALID_UTF8_IGNORE | PHP_JSON_INVALID_UTF8_SUBSTITUTE)) {
  621. if (s->options & PHP_JSON_INVALID_UTF8_SUBSTITUTE) {
  622. if (s->utf8_invalid_count > INT_MAX - 2) {
  623. s->errcode = PHP_JSON_ERROR_UTF8;
  624. return PHP_JSON_T_ERROR;
  625. }
  626. s->utf8_invalid_count += 2;
  627. } else {
  628. s->utf8_invalid_count--;
  629. }
  630. s->utf8_invalid = 1;
  631. PHP_JSON_CONDITION_GOTO(STR_P1);
  632. }
  633. s->errcode = PHP_JSON_ERROR_UTF8;
  634. return PHP_JSON_T_ERROR;
  635. }
  636. yy81:
  637. yych = *++YYCURSOR;
  638. if (yych <= 0x7F) goto yy80;
  639. if (yych <= 0xBF) goto yy73;
  640. goto yy80;
  641. yy82:
  642. yyaccept = 1;
  643. yych = *(YYMARKER = ++YYCURSOR);
  644. if (yych <= 0x9F) goto yy80;
  645. if (yych <= 0xBF) goto yy92;
  646. goto yy80;
  647. yy83:
  648. yyaccept = 1;
  649. yych = *(YYMARKER = ++YYCURSOR);
  650. if (yych <= 0x7F) goto yy80;
  651. if (yych <= 0xBF) goto yy92;
  652. goto yy80;
  653. yy84:
  654. yyaccept = 1;
  655. yych = *(YYMARKER = ++YYCURSOR);
  656. if (yych <= 0x7F) goto yy80;
  657. if (yych <= 0x9F) goto yy92;
  658. goto yy80;
  659. yy85:
  660. yyaccept = 1;
  661. yych = *(YYMARKER = ++YYCURSOR);
  662. if (yych <= 0x8F) goto yy80;
  663. if (yych <= 0xBF) goto yy93;
  664. goto yy80;
  665. yy86:
  666. yyaccept = 1;
  667. yych = *(YYMARKER = ++YYCURSOR);
  668. if (yych <= 0x7F) goto yy80;
  669. if (yych <= 0xBF) goto yy93;
  670. goto yy80;
  671. yy87:
  672. yyaccept = 1;
  673. yych = *(YYMARKER = ++YYCURSOR);
  674. if (yych <= 0x7F) goto yy80;
  675. if (yych <= 0x8F) goto yy93;
  676. goto yy80;
  677. yy88:
  678. ++YYCURSOR;
  679. {
  680. s->str_esc++;
  681. PHP_JSON_CONDITION_GOTO(STR_P1);
  682. }
  683. yy90:
  684. yych = *++YYCURSOR;
  685. if (yych <= 'D') {
  686. if (yych <= '9') {
  687. if (yych <= '/') goto yy91;
  688. if (yych <= '0') goto yy94;
  689. goto yy95;
  690. } else {
  691. if (yych <= '@') goto yy91;
  692. if (yych <= 'C') goto yy95;
  693. goto yy96;
  694. }
  695. } else {
  696. if (yych <= 'c') {
  697. if (yych <= 'F') goto yy95;
  698. if (yych >= 'a') goto yy95;
  699. } else {
  700. if (yych <= 'd') goto yy96;
  701. if (yych <= 'f') goto yy95;
  702. }
  703. }
  704. yy91:
  705. YYCURSOR = YYMARKER;
  706. if (yyaccept <= 1) {
  707. if (yyaccept == 0) {
  708. goto yy78;
  709. } else {
  710. goto yy80;
  711. }
  712. } else {
  713. goto yy114;
  714. }
  715. yy92:
  716. yych = *++YYCURSOR;
  717. if (yych <= 0x7F) goto yy91;
  718. if (yych <= 0xBF) goto yy73;
  719. goto yy91;
  720. yy93:
  721. yych = *++YYCURSOR;
  722. if (yych <= 0x7F) goto yy91;
  723. if (yych <= 0xBF) goto yy92;
  724. goto yy91;
  725. yy94:
  726. yych = *++YYCURSOR;
  727. if (yych <= '9') {
  728. if (yych <= '/') goto yy91;
  729. if (yych <= '0') goto yy97;
  730. if (yych <= '7') goto yy98;
  731. goto yy99;
  732. } else {
  733. if (yych <= 'F') {
  734. if (yych <= '@') goto yy91;
  735. goto yy99;
  736. } else {
  737. if (yych <= '`') goto yy91;
  738. if (yych <= 'f') goto yy99;
  739. goto yy91;
  740. }
  741. }
  742. yy95:
  743. yych = *++YYCURSOR;
  744. if (yych <= '@') {
  745. if (yych <= '/') goto yy91;
  746. if (yych <= '9') goto yy99;
  747. goto yy91;
  748. } else {
  749. if (yych <= 'F') goto yy99;
  750. if (yych <= '`') goto yy91;
  751. if (yych <= 'f') goto yy99;
  752. goto yy91;
  753. }
  754. yy96:
  755. yych = *++YYCURSOR;
  756. if (yych <= 'B') {
  757. if (yych <= '7') {
  758. if (yych <= '/') goto yy91;
  759. goto yy99;
  760. } else {
  761. if (yych <= '9') goto yy100;
  762. if (yych <= '@') goto yy91;
  763. goto yy100;
  764. }
  765. } else {
  766. if (yych <= '`') {
  767. if (yych <= 'F') goto yy101;
  768. goto yy91;
  769. } else {
  770. if (yych <= 'b') goto yy100;
  771. if (yych <= 'f') goto yy101;
  772. goto yy91;
  773. }
  774. }
  775. yy97:
  776. yych = *++YYCURSOR;
  777. if (yych <= '@') {
  778. if (yych <= '/') goto yy91;
  779. if (yych <= '7') goto yy102;
  780. if (yych <= '9') goto yy103;
  781. goto yy91;
  782. } else {
  783. if (yych <= 'F') goto yy103;
  784. if (yych <= '`') goto yy91;
  785. if (yych <= 'f') goto yy103;
  786. goto yy91;
  787. }
  788. yy98:
  789. yych = *++YYCURSOR;
  790. if (yych <= '@') {
  791. if (yych <= '/') goto yy91;
  792. if (yych <= '9') goto yy103;
  793. goto yy91;
  794. } else {
  795. if (yych <= 'F') goto yy103;
  796. if (yych <= '`') goto yy91;
  797. if (yych <= 'f') goto yy103;
  798. goto yy91;
  799. }
  800. yy99:
  801. yych = *++YYCURSOR;
  802. if (yych <= '@') {
  803. if (yych <= '/') goto yy91;
  804. if (yych <= '9') goto yy104;
  805. goto yy91;
  806. } else {
  807. if (yych <= 'F') goto yy104;
  808. if (yych <= '`') goto yy91;
  809. if (yych <= 'f') goto yy104;
  810. goto yy91;
  811. }
  812. yy100:
  813. yych = *++YYCURSOR;
  814. if (yych <= '@') {
  815. if (yych <= '/') goto yy91;
  816. if (yych <= '9') goto yy105;
  817. goto yy91;
  818. } else {
  819. if (yych <= 'F') goto yy105;
  820. if (yych <= '`') goto yy91;
  821. if (yych <= 'f') goto yy105;
  822. goto yy91;
  823. }
  824. yy101:
  825. yych = *++YYCURSOR;
  826. if (yych <= '@') {
  827. if (yych <= '/') goto yy91;
  828. if (yych <= '9') goto yy106;
  829. goto yy91;
  830. } else {
  831. if (yych <= 'F') goto yy106;
  832. if (yych <= '`') goto yy91;
  833. if (yych <= 'f') goto yy106;
  834. goto yy91;
  835. }
  836. yy102:
  837. yych = *++YYCURSOR;
  838. if (yych <= '@') {
  839. if (yych <= '/') goto yy91;
  840. if (yych <= '9') goto yy107;
  841. goto yy91;
  842. } else {
  843. if (yych <= 'F') goto yy107;
  844. if (yych <= '`') goto yy91;
  845. if (yych <= 'f') goto yy107;
  846. goto yy91;
  847. }
  848. yy103:
  849. yych = *++YYCURSOR;
  850. if (yych <= '@') {
  851. if (yych <= '/') goto yy91;
  852. if (yych <= '9') goto yy109;
  853. goto yy91;
  854. } else {
  855. if (yych <= 'F') goto yy109;
  856. if (yych <= '`') goto yy91;
  857. if (yych <= 'f') goto yy109;
  858. goto yy91;
  859. }
  860. yy104:
  861. yych = *++YYCURSOR;
  862. if (yych <= '@') {
  863. if (yych <= '/') goto yy91;
  864. if (yych <= '9') goto yy111;
  865. goto yy91;
  866. } else {
  867. if (yych <= 'F') goto yy111;
  868. if (yych <= '`') goto yy91;
  869. if (yych <= 'f') goto yy111;
  870. goto yy91;
  871. }
  872. yy105:
  873. yych = *++YYCURSOR;
  874. if (yych <= '@') {
  875. if (yych <= '/') goto yy91;
  876. if (yych <= '9') goto yy113;
  877. goto yy91;
  878. } else {
  879. if (yych <= 'F') goto yy113;
  880. if (yych <= '`') goto yy91;
  881. if (yych <= 'f') goto yy113;
  882. goto yy91;
  883. }
  884. yy106:
  885. yych = *++YYCURSOR;
  886. if (yych <= '@') {
  887. if (yych <= '/') goto yy91;
  888. if (yych <= '9') goto yy115;
  889. goto yy91;
  890. } else {
  891. if (yych <= 'F') goto yy115;
  892. if (yych <= '`') goto yy91;
  893. if (yych <= 'f') goto yy115;
  894. goto yy91;
  895. }
  896. yy107:
  897. ++YYCURSOR;
  898. {
  899. s->str_esc += 5;
  900. PHP_JSON_CONDITION_GOTO(STR_P1);
  901. }
  902. yy109:
  903. ++YYCURSOR;
  904. {
  905. s->str_esc += 4;
  906. PHP_JSON_CONDITION_GOTO(STR_P1);
  907. }
  908. yy111:
  909. ++YYCURSOR;
  910. {
  911. s->str_esc += 3;
  912. PHP_JSON_CONDITION_GOTO(STR_P1);
  913. }
  914. yy113:
  915. yyaccept = 2;
  916. yych = *(YYMARKER = ++YYCURSOR);
  917. if (yych == '\\') goto yy116;
  918. yy114:
  919. {
  920. s->errcode = PHP_JSON_ERROR_UTF16;
  921. return PHP_JSON_T_ERROR;
  922. }
  923. yy115:
  924. ++YYCURSOR;
  925. goto yy114;
  926. yy116:
  927. yych = *++YYCURSOR;
  928. if (yych != 'u') goto yy91;
  929. yych = *++YYCURSOR;
  930. if (yych == 'D') goto yy118;
  931. if (yych != 'd') goto yy91;
  932. yy118:
  933. yych = *++YYCURSOR;
  934. if (yych <= 'B') goto yy91;
  935. if (yych <= 'F') goto yy119;
  936. if (yych <= 'b') goto yy91;
  937. if (yych >= 'g') goto yy91;
  938. yy119:
  939. yych = *++YYCURSOR;
  940. if (yych <= '@') {
  941. if (yych <= '/') goto yy91;
  942. if (yych >= ':') goto yy91;
  943. } else {
  944. if (yych <= 'F') goto yy120;
  945. if (yych <= '`') goto yy91;
  946. if (yych >= 'g') goto yy91;
  947. }
  948. yy120:
  949. yych = *++YYCURSOR;
  950. if (yych <= '@') {
  951. if (yych <= '/') goto yy91;
  952. if (yych >= ':') goto yy91;
  953. } else {
  954. if (yych <= 'F') goto yy121;
  955. if (yych <= '`') goto yy91;
  956. if (yych >= 'g') goto yy91;
  957. }
  958. yy121:
  959. ++YYCURSOR;
  960. {
  961. s->str_esc += 8;
  962. PHP_JSON_CONDITION_GOTO(STR_P1);
  963. }
  964. /* *********************************** */
  965. yyc_STR_P2_BIN:
  966. yych = *YYCURSOR;
  967. if (yych <= 0xDF) {
  968. if (yych <= '[') {
  969. if (yych == '"') goto yy127;
  970. } else {
  971. if (yych <= '\\') goto yy129;
  972. if (yych <= 0x7F) goto yy125;
  973. if (yych <= 0xC1) goto yy131;
  974. goto yy133;
  975. }
  976. } else {
  977. if (yych <= 0xEF) {
  978. if (yych <= 0xE0) goto yy134;
  979. if (yych == 0xED) goto yy136;
  980. goto yy135;
  981. } else {
  982. if (yych <= 0xF0) goto yy137;
  983. if (yych <= 0xF3) goto yy138;
  984. if (yych <= 0xF4) goto yy139;
  985. goto yy131;
  986. }
  987. }
  988. yy125:
  989. ++YYCURSOR;
  990. { PHP_JSON_CONDITION_GOTO(STR_P2_BIN); }
  991. yy127:
  992. ++YYCURSOR;
  993. YYSETCONDITION(yycJS);
  994. {
  995. PHP_JSON_SCANNER_COPY_ESC();
  996. return PHP_JSON_T_STRING;
  997. }
  998. yy129:
  999. yyaccept = 0;
  1000. yych = *(YYMARKER = ++YYCURSOR);
  1001. if (yych == 'u') goto yy140;
  1002. yy130:
  1003. {
  1004. char esc;
  1005. PHP_JSON_SCANNER_COPY_ESC();
  1006. switch (*s->cursor) {
  1007. case 'b':
  1008. esc = '\b';
  1009. break;
  1010. case 'f':
  1011. esc = '\f'; break;
  1012. case 'n':
  1013. esc = '\n';
  1014. break;
  1015. case 'r':
  1016. esc = '\r';
  1017. break;
  1018. case 't':
  1019. esc = '\t';
  1020. break;
  1021. case '\\':
  1022. case '/':
  1023. case '"':
  1024. esc = *s->cursor;
  1025. break;
  1026. default:
  1027. s->errcode = PHP_JSON_ERROR_SYNTAX;
  1028. return PHP_JSON_T_ERROR;
  1029. }
  1030. *(s->pstr++) = esc;
  1031. ++YYCURSOR;
  1032. s->str_start = s->cursor;
  1033. PHP_JSON_CONDITION_GOTO_STR_P2();
  1034. }
  1035. yy131:
  1036. ++YYCURSOR;
  1037. yy132:
  1038. {
  1039. if (s->utf8_invalid) {
  1040. PHP_JSON_SCANNER_COPY_ESC();
  1041. if (s->options & PHP_JSON_INVALID_UTF8_SUBSTITUTE) {
  1042. *(s->pstr++) = (char) (0xe0 | (0xfffd >> 12));
  1043. *(s->pstr++) = (char) (0x80 | ((0xfffd >> 6) & 0x3f));
  1044. *(s->pstr++) = (char) (0x80 | (0xfffd & 0x3f));
  1045. }
  1046. s->str_start = s->cursor;
  1047. }
  1048. PHP_JSON_CONDITION_GOTO(STR_P2_BIN);
  1049. }
  1050. yy133:
  1051. yych = *++YYCURSOR;
  1052. if (yych <= 0x7F) goto yy132;
  1053. if (yych <= 0xBF) goto yy125;
  1054. goto yy132;
  1055. yy134:
  1056. yyaccept = 1;
  1057. yych = *(YYMARKER = ++YYCURSOR);
  1058. if (yych <= 0x9F) goto yy132;
  1059. if (yych <= 0xBF) goto yy142;
  1060. goto yy132;
  1061. yy135:
  1062. yyaccept = 1;
  1063. yych = *(YYMARKER = ++YYCURSOR);
  1064. if (yych <= 0x7F) goto yy132;
  1065. if (yych <= 0xBF) goto yy142;
  1066. goto yy132;
  1067. yy136:
  1068. yyaccept = 1;
  1069. yych = *(YYMARKER = ++YYCURSOR);
  1070. if (yych <= 0x7F) goto yy132;
  1071. if (yych <= 0x9F) goto yy142;
  1072. goto yy132;
  1073. yy137:
  1074. yyaccept = 1;
  1075. yych = *(YYMARKER = ++YYCURSOR);
  1076. if (yych <= 0x8F) goto yy132;
  1077. if (yych <= 0xBF) goto yy143;
  1078. goto yy132;
  1079. yy138:
  1080. yyaccept = 1;
  1081. yych = *(YYMARKER = ++YYCURSOR);
  1082. if (yych <= 0x7F) goto yy132;
  1083. if (yych <= 0xBF) goto yy143;
  1084. goto yy132;
  1085. yy139:
  1086. yyaccept = 1;
  1087. yych = *(YYMARKER = ++YYCURSOR);
  1088. if (yych <= 0x7F) goto yy132;
  1089. if (yych <= 0x8F) goto yy143;
  1090. goto yy132;
  1091. yy140:
  1092. yych = *++YYCURSOR;
  1093. if (yych <= 'D') {
  1094. if (yych <= '9') {
  1095. if (yych <= '/') goto yy141;
  1096. if (yych <= '0') goto yy144;
  1097. goto yy145;
  1098. } else {
  1099. if (yych <= '@') goto yy141;
  1100. if (yych <= 'C') goto yy145;
  1101. goto yy146;
  1102. }
  1103. } else {
  1104. if (yych <= 'c') {
  1105. if (yych <= 'F') goto yy145;
  1106. if (yych >= 'a') goto yy145;
  1107. } else {
  1108. if (yych <= 'd') goto yy146;
  1109. if (yych <= 'f') goto yy145;
  1110. }
  1111. }
  1112. yy141:
  1113. YYCURSOR = YYMARKER;
  1114. if (yyaccept == 0) {
  1115. goto yy130;
  1116. } else {
  1117. goto yy132;
  1118. }
  1119. yy142:
  1120. yych = *++YYCURSOR;
  1121. if (yych <= 0x7F) goto yy141;
  1122. if (yych <= 0xBF) goto yy125;
  1123. goto yy141;
  1124. yy143:
  1125. yych = *++YYCURSOR;
  1126. if (yych <= 0x7F) goto yy141;
  1127. if (yych <= 0xBF) goto yy142;
  1128. goto yy141;
  1129. yy144:
  1130. yych = *++YYCURSOR;
  1131. if (yych <= '9') {
  1132. if (yych <= '/') goto yy141;
  1133. if (yych <= '0') goto yy147;
  1134. if (yych <= '7') goto yy148;
  1135. goto yy149;
  1136. } else {
  1137. if (yych <= 'F') {
  1138. if (yych <= '@') goto yy141;
  1139. goto yy149;
  1140. } else {
  1141. if (yych <= '`') goto yy141;
  1142. if (yych <= 'f') goto yy149;
  1143. goto yy141;
  1144. }
  1145. }
  1146. yy145:
  1147. yych = *++YYCURSOR;
  1148. if (yych <= '@') {
  1149. if (yych <= '/') goto yy141;
  1150. if (yych <= '9') goto yy149;
  1151. goto yy141;
  1152. } else {
  1153. if (yych <= 'F') goto yy149;
  1154. if (yych <= '`') goto yy141;
  1155. if (yych <= 'f') goto yy149;
  1156. goto yy141;
  1157. }
  1158. yy146:
  1159. yych = *++YYCURSOR;
  1160. if (yych <= '@') {
  1161. if (yych <= '/') goto yy141;
  1162. if (yych <= '7') goto yy149;
  1163. if (yych <= '9') goto yy150;
  1164. goto yy141;
  1165. } else {
  1166. if (yych <= 'B') goto yy150;
  1167. if (yych <= '`') goto yy141;
  1168. if (yych <= 'b') goto yy150;
  1169. goto yy141;
  1170. }
  1171. yy147:
  1172. yych = *++YYCURSOR;
  1173. if (yych <= '@') {
  1174. if (yych <= '/') goto yy141;
  1175. if (yych <= '7') goto yy151;
  1176. if (yych <= '9') goto yy152;
  1177. goto yy141;
  1178. } else {
  1179. if (yych <= 'F') goto yy152;
  1180. if (yych <= '`') goto yy141;
  1181. if (yych <= 'f') goto yy152;
  1182. goto yy141;
  1183. }
  1184. yy148:
  1185. yych = *++YYCURSOR;
  1186. if (yych <= '@') {
  1187. if (yych <= '/') goto yy141;
  1188. if (yych <= '9') goto yy152;
  1189. goto yy141;
  1190. } else {
  1191. if (yych <= 'F') goto yy152;
  1192. if (yych <= '`') goto yy141;
  1193. if (yych <= 'f') goto yy152;
  1194. goto yy141;
  1195. }
  1196. yy149:
  1197. yych = *++YYCURSOR;
  1198. if (yych <= '@') {
  1199. if (yych <= '/') goto yy141;
  1200. if (yych <= '9') goto yy153;
  1201. goto yy141;
  1202. } else {
  1203. if (yych <= 'F') goto yy153;
  1204. if (yych <= '`') goto yy141;
  1205. if (yych <= 'f') goto yy153;
  1206. goto yy141;
  1207. }
  1208. yy150:
  1209. yych = *++YYCURSOR;
  1210. if (yych <= '@') {
  1211. if (yych <= '/') goto yy141;
  1212. if (yych <= '9') goto yy154;
  1213. goto yy141;
  1214. } else {
  1215. if (yych <= 'F') goto yy154;
  1216. if (yych <= '`') goto yy141;
  1217. if (yych <= 'f') goto yy154;
  1218. goto yy141;
  1219. }
  1220. yy151:
  1221. yych = *++YYCURSOR;
  1222. if (yych <= '@') {
  1223. if (yych <= '/') goto yy141;
  1224. if (yych <= '9') goto yy155;
  1225. goto yy141;
  1226. } else {
  1227. if (yych <= 'F') goto yy155;
  1228. if (yych <= '`') goto yy141;
  1229. if (yych <= 'f') goto yy155;
  1230. goto yy141;
  1231. }
  1232. yy152:
  1233. yych = *++YYCURSOR;
  1234. if (yych <= '@') {
  1235. if (yych <= '/') goto yy141;
  1236. if (yych <= '9') goto yy157;
  1237. goto yy141;
  1238. } else {
  1239. if (yych <= 'F') goto yy157;
  1240. if (yych <= '`') goto yy141;
  1241. if (yych <= 'f') goto yy157;
  1242. goto yy141;
  1243. }
  1244. yy153:
  1245. yych = *++YYCURSOR;
  1246. if (yych <= '@') {
  1247. if (yych <= '/') goto yy141;
  1248. if (yych <= '9') goto yy159;
  1249. goto yy141;
  1250. } else {
  1251. if (yych <= 'F') goto yy159;
  1252. if (yych <= '`') goto yy141;
  1253. if (yych <= 'f') goto yy159;
  1254. goto yy141;
  1255. }
  1256. yy154:
  1257. yych = *++YYCURSOR;
  1258. if (yych <= '@') {
  1259. if (yych <= '/') goto yy141;
  1260. if (yych <= '9') goto yy161;
  1261. goto yy141;
  1262. } else {
  1263. if (yych <= 'F') goto yy161;
  1264. if (yych <= '`') goto yy141;
  1265. if (yych <= 'f') goto yy161;
  1266. goto yy141;
  1267. }
  1268. yy155:
  1269. ++YYCURSOR;
  1270. {
  1271. int utf16 = php_json_ucs2_to_int(s, 2);
  1272. PHP_JSON_SCANNER_COPY_UTF();
  1273. *(s->pstr++) = (char) utf16;
  1274. s->str_start = s->cursor;
  1275. PHP_JSON_CONDITION_GOTO_STR_P2();
  1276. }
  1277. yy157:
  1278. ++YYCURSOR;
  1279. {
  1280. int utf16 = php_json_ucs2_to_int(s, 3);
  1281. PHP_JSON_SCANNER_COPY_UTF();
  1282. *(s->pstr++) = (char) (0xc0 | (utf16 >> 6));
  1283. *(s->pstr++) = (char) (0x80 | (utf16 & 0x3f));
  1284. s->str_start = s->cursor;
  1285. PHP_JSON_CONDITION_GOTO_STR_P2();
  1286. }
  1287. yy159:
  1288. ++YYCURSOR;
  1289. {
  1290. int utf16 = php_json_ucs2_to_int(s, 4);
  1291. PHP_JSON_SCANNER_COPY_UTF();
  1292. *(s->pstr++) = (char) (0xe0 | (utf16 >> 12));
  1293. *(s->pstr++) = (char) (0x80 | ((utf16 >> 6) & 0x3f));
  1294. *(s->pstr++) = (char) (0x80 | (utf16 & 0x3f));
  1295. s->str_start = s->cursor;
  1296. PHP_JSON_CONDITION_GOTO_STR_P2();
  1297. }
  1298. yy161:
  1299. yych = *++YYCURSOR;
  1300. if (yych != '\\') goto yy141;
  1301. yych = *++YYCURSOR;
  1302. if (yych != 'u') goto yy141;
  1303. yych = *++YYCURSOR;
  1304. if (yych == 'D') goto yy164;
  1305. if (yych != 'd') goto yy141;
  1306. yy164:
  1307. yych = *++YYCURSOR;
  1308. if (yych <= 'B') goto yy141;
  1309. if (yych <= 'F') goto yy165;
  1310. if (yych <= 'b') goto yy141;
  1311. if (yych >= 'g') goto yy141;
  1312. yy165:
  1313. yych = *++YYCURSOR;
  1314. if (yych <= '@') {
  1315. if (yych <= '/') goto yy141;
  1316. if (yych >= ':') goto yy141;
  1317. } else {
  1318. if (yych <= 'F') goto yy166;
  1319. if (yych <= '`') goto yy141;
  1320. if (yych >= 'g') goto yy141;
  1321. }
  1322. yy166:
  1323. yych = *++YYCURSOR;
  1324. if (yych <= '@') {
  1325. if (yych <= '/') goto yy141;
  1326. if (yych >= ':') goto yy141;
  1327. } else {
  1328. if (yych <= 'F') goto yy167;
  1329. if (yych <= '`') goto yy141;
  1330. if (yych >= 'g') goto yy141;
  1331. }
  1332. yy167:
  1333. ++YYCURSOR;
  1334. {
  1335. int utf32, utf16_hi, utf16_lo;
  1336. utf16_hi = php_json_ucs2_to_int(s, 4);
  1337. utf16_lo = php_json_ucs2_to_int_ex(s, 4, 7);
  1338. utf32 = ((utf16_lo & 0x3FF) << 10) + (utf16_hi & 0x3FF) + 0x10000;
  1339. PHP_JSON_SCANNER_COPY_UTF_SP();
  1340. *(s->pstr++) = (char) (0xf0 | (utf32 >> 18));
  1341. *(s->pstr++) = (char) (0x80 | ((utf32 >> 12) & 0x3f));
  1342. *(s->pstr++) = (char) (0x80 | ((utf32 >> 6) & 0x3f));
  1343. *(s->pstr++) = (char) (0x80 | (utf32 & 0x3f));
  1344. s->str_start = s->cursor;
  1345. PHP_JSON_CONDITION_GOTO_STR_P2();
  1346. }
  1347. /* *********************************** */
  1348. yyc_STR_P2_UTF:
  1349. yych = *YYCURSOR;
  1350. if (yych == '"') goto yy173;
  1351. if (yych == '\\') goto yy175;
  1352. ++YYCURSOR;
  1353. { PHP_JSON_CONDITION_GOTO(STR_P2_UTF); }
  1354. yy173:
  1355. ++YYCURSOR;
  1356. YYSETCONDITION(yycJS);
  1357. {
  1358. PHP_JSON_SCANNER_COPY_ESC();
  1359. return PHP_JSON_T_STRING;
  1360. }
  1361. yy175:
  1362. yych = *(YYMARKER = ++YYCURSOR);
  1363. if (yych == 'u') goto yy177;
  1364. yy176:
  1365. {
  1366. char esc;
  1367. PHP_JSON_SCANNER_COPY_ESC();
  1368. switch (*s->cursor) {
  1369. case 'b':
  1370. esc = '\b';
  1371. break;
  1372. case 'f':
  1373. esc = '\f'; break;
  1374. case 'n':
  1375. esc = '\n';
  1376. break;
  1377. case 'r':
  1378. esc = '\r';
  1379. break;
  1380. case 't':
  1381. esc = '\t';
  1382. break;
  1383. case '\\':
  1384. case '/':
  1385. case '"':
  1386. esc = *s->cursor;
  1387. break;
  1388. default:
  1389. s->errcode = PHP_JSON_ERROR_SYNTAX;
  1390. return PHP_JSON_T_ERROR;
  1391. }
  1392. *(s->pstr++) = esc;
  1393. ++YYCURSOR;
  1394. s->str_start = s->cursor;
  1395. PHP_JSON_CONDITION_GOTO_STR_P2();
  1396. }
  1397. yy177:
  1398. yych = *++YYCURSOR;
  1399. if (yych <= 'D') {
  1400. if (yych <= '9') {
  1401. if (yych <= '/') goto yy178;
  1402. if (yych <= '0') goto yy179;
  1403. goto yy180;
  1404. } else {
  1405. if (yych <= '@') goto yy178;
  1406. if (yych <= 'C') goto yy180;
  1407. goto yy181;
  1408. }
  1409. } else {
  1410. if (yych <= 'c') {
  1411. if (yych <= 'F') goto yy180;
  1412. if (yych >= 'a') goto yy180;
  1413. } else {
  1414. if (yych <= 'd') goto yy181;
  1415. if (yych <= 'f') goto yy180;
  1416. }
  1417. }
  1418. yy178:
  1419. YYCURSOR = YYMARKER;
  1420. goto yy176;
  1421. yy179:
  1422. yych = *++YYCURSOR;
  1423. if (yych <= '9') {
  1424. if (yych <= '/') goto yy178;
  1425. if (yych <= '0') goto yy182;
  1426. if (yych <= '7') goto yy183;
  1427. goto yy184;
  1428. } else {
  1429. if (yych <= 'F') {
  1430. if (yych <= '@') goto yy178;
  1431. goto yy184;
  1432. } else {
  1433. if (yych <= '`') goto yy178;
  1434. if (yych <= 'f') goto yy184;
  1435. goto yy178;
  1436. }
  1437. }
  1438. yy180:
  1439. yych = *++YYCURSOR;
  1440. if (yych <= '@') {
  1441. if (yych <= '/') goto yy178;
  1442. if (yych <= '9') goto yy184;
  1443. goto yy178;
  1444. } else {
  1445. if (yych <= 'F') goto yy184;
  1446. if (yych <= '`') goto yy178;
  1447. if (yych <= 'f') goto yy184;
  1448. goto yy178;
  1449. }
  1450. yy181:
  1451. yych = *++YYCURSOR;
  1452. if (yych <= '@') {
  1453. if (yych <= '/') goto yy178;
  1454. if (yych <= '7') goto yy184;
  1455. if (yych <= '9') goto yy185;
  1456. goto yy178;
  1457. } else {
  1458. if (yych <= 'B') goto yy185;
  1459. if (yych <= '`') goto yy178;
  1460. if (yych <= 'b') goto yy185;
  1461. goto yy178;
  1462. }
  1463. yy182:
  1464. yych = *++YYCURSOR;
  1465. if (yych <= '@') {
  1466. if (yych <= '/') goto yy178;
  1467. if (yych <= '7') goto yy186;
  1468. if (yych <= '9') goto yy187;
  1469. goto yy178;
  1470. } else {
  1471. if (yych <= 'F') goto yy187;
  1472. if (yych <= '`') goto yy178;
  1473. if (yych <= 'f') goto yy187;
  1474. goto yy178;
  1475. }
  1476. yy183:
  1477. yych = *++YYCURSOR;
  1478. if (yych <= '@') {
  1479. if (yych <= '/') goto yy178;
  1480. if (yych <= '9') goto yy187;
  1481. goto yy178;
  1482. } else {
  1483. if (yych <= 'F') goto yy187;
  1484. if (yych <= '`') goto yy178;
  1485. if (yych <= 'f') goto yy187;
  1486. goto yy178;
  1487. }
  1488. yy184:
  1489. yych = *++YYCURSOR;
  1490. if (yych <= '@') {
  1491. if (yych <= '/') goto yy178;
  1492. if (yych <= '9') goto yy188;
  1493. goto yy178;
  1494. } else {
  1495. if (yych <= 'F') goto yy188;
  1496. if (yych <= '`') goto yy178;
  1497. if (yych <= 'f') goto yy188;
  1498. goto yy178;
  1499. }
  1500. yy185:
  1501. yych = *++YYCURSOR;
  1502. if (yych <= '@') {
  1503. if (yych <= '/') goto yy178;
  1504. if (yych <= '9') goto yy189;
  1505. goto yy178;
  1506. } else {
  1507. if (yych <= 'F') goto yy189;
  1508. if (yych <= '`') goto yy178;
  1509. if (yych <= 'f') goto yy189;
  1510. goto yy178;
  1511. }
  1512. yy186:
  1513. yych = *++YYCURSOR;
  1514. if (yych <= '@') {
  1515. if (yych <= '/') goto yy178;
  1516. if (yych <= '9') goto yy190;
  1517. goto yy178;
  1518. } else {
  1519. if (yych <= 'F') goto yy190;
  1520. if (yych <= '`') goto yy178;
  1521. if (yych <= 'f') goto yy190;
  1522. goto yy178;
  1523. }
  1524. yy187:
  1525. yych = *++YYCURSOR;
  1526. if (yych <= '@') {
  1527. if (yych <= '/') goto yy178;
  1528. if (yych <= '9') goto yy192;
  1529. goto yy178;
  1530. } else {
  1531. if (yych <= 'F') goto yy192;
  1532. if (yych <= '`') goto yy178;
  1533. if (yych <= 'f') goto yy192;
  1534. goto yy178;
  1535. }
  1536. yy188:
  1537. yych = *++YYCURSOR;
  1538. if (yych <= '@') {
  1539. if (yych <= '/') goto yy178;
  1540. if (yych <= '9') goto yy194;
  1541. goto yy178;
  1542. } else {
  1543. if (yych <= 'F') goto yy194;
  1544. if (yych <= '`') goto yy178;
  1545. if (yych <= 'f') goto yy194;
  1546. goto yy178;
  1547. }
  1548. yy189:
  1549. yych = *++YYCURSOR;
  1550. if (yych <= '@') {
  1551. if (yych <= '/') goto yy178;
  1552. if (yych <= '9') goto yy196;
  1553. goto yy178;
  1554. } else {
  1555. if (yych <= 'F') goto yy196;
  1556. if (yych <= '`') goto yy178;
  1557. if (yych <= 'f') goto yy196;
  1558. goto yy178;
  1559. }
  1560. yy190:
  1561. ++YYCURSOR;
  1562. {
  1563. int utf16 = php_json_ucs2_to_int(s, 2);
  1564. PHP_JSON_SCANNER_COPY_UTF();
  1565. *(s->pstr++) = (char) utf16;
  1566. s->str_start = s->cursor;
  1567. PHP_JSON_CONDITION_GOTO_STR_P2();
  1568. }
  1569. yy192:
  1570. ++YYCURSOR;
  1571. {
  1572. int utf16 = php_json_ucs2_to_int(s, 3);
  1573. PHP_JSON_SCANNER_COPY_UTF();
  1574. *(s->pstr++) = (char) (0xc0 | (utf16 >> 6));
  1575. *(s->pstr++) = (char) (0x80 | (utf16 & 0x3f));
  1576. s->str_start = s->cursor;
  1577. PHP_JSON_CONDITION_GOTO_STR_P2();
  1578. }
  1579. yy194:
  1580. ++YYCURSOR;
  1581. {
  1582. int utf16 = php_json_ucs2_to_int(s, 4);
  1583. PHP_JSON_SCANNER_COPY_UTF();
  1584. *(s->pstr++) = (char) (0xe0 | (utf16 >> 12));
  1585. *(s->pstr++) = (char) (0x80 | ((utf16 >> 6) & 0x3f));
  1586. *(s->pstr++) = (char) (0x80 | (utf16 & 0x3f));
  1587. s->str_start = s->cursor;
  1588. PHP_JSON_CONDITION_GOTO_STR_P2();
  1589. }
  1590. yy196:
  1591. yych = *++YYCURSOR;
  1592. if (yych != '\\') goto yy178;
  1593. yych = *++YYCURSOR;
  1594. if (yych != 'u') goto yy178;
  1595. yych = *++YYCURSOR;
  1596. if (yych == 'D') goto yy199;
  1597. if (yych != 'd') goto yy178;
  1598. yy199:
  1599. yych = *++YYCURSOR;
  1600. if (yych <= 'B') goto yy178;
  1601. if (yych <= 'F') goto yy200;
  1602. if (yych <= 'b') goto yy178;
  1603. if (yych >= 'g') goto yy178;
  1604. yy200:
  1605. yych = *++YYCURSOR;
  1606. if (yych <= '@') {
  1607. if (yych <= '/') goto yy178;
  1608. if (yych >= ':') goto yy178;
  1609. } else {
  1610. if (yych <= 'F') goto yy201;
  1611. if (yych <= '`') goto yy178;
  1612. if (yych >= 'g') goto yy178;
  1613. }
  1614. yy201:
  1615. yych = *++YYCURSOR;
  1616. if (yych <= '@') {
  1617. if (yych <= '/') goto yy178;
  1618. if (yych >= ':') goto yy178;
  1619. } else {
  1620. if (yych <= 'F') goto yy202;
  1621. if (yych <= '`') goto yy178;
  1622. if (yych >= 'g') goto yy178;
  1623. }
  1624. yy202:
  1625. ++YYCURSOR;
  1626. {
  1627. int utf32, utf16_hi, utf16_lo;
  1628. utf16_hi = php_json_ucs2_to_int(s, 4);
  1629. utf16_lo = php_json_ucs2_to_int_ex(s, 4, 7);
  1630. utf32 = ((utf16_lo & 0x3FF) << 10) + (utf16_hi & 0x3FF) + 0x10000;
  1631. PHP_JSON_SCANNER_COPY_UTF_SP();
  1632. *(s->pstr++) = (char) (0xf0 | (utf32 >> 18));
  1633. *(s->pstr++) = (char) (0x80 | ((utf32 >> 12) & 0x3f));
  1634. *(s->pstr++) = (char) (0x80 | ((utf32 >> 6) & 0x3f));
  1635. *(s->pstr++) = (char) (0x80 | (utf32 & 0x3f));
  1636. s->str_start = s->cursor;
  1637. PHP_JSON_CONDITION_GOTO_STR_P2();
  1638. }
  1639. }
  1640. }