/saphire-3.6.5/src/saphire_parser.c

# · C · 2938 lines · 2716 code · 166 blank · 56 comment · 518 complexity · 3f3594dd790f3a0982a87d7b35920558 MD5 · raw file

Large files are truncated click here to view the full file

  1. #include "config.h"
  2. #include <errno.h>
  3. #include <stdlib.h>
  4. #include <fcntl.h>
  5. #include <glob.h>
  6. #include <stdio.h>
  7. #include <string.h>
  8. #include <unistd.h>
  9. #include <sys/stat.h>
  10. #include <sys/types.h>
  11. #include <pwd.h>
  12. #include <limits.h>
  13. #include "saphire/saphire.h"
  14. #include "saphire/saphire_inner.h"
  15. // ????????
  16. static void skip_spaces(char** p, string_obj* not_evaled)
  17. {
  18. while(**p == ' ' || **p == '\t') {
  19. string_push_back2(not_evaled, **p);
  20. (*p)++;
  21. }
  22. }
  23. // {}, <>, (), []????????????????????OK
  24. // ???????parse???
  25. // ???????
  26. static BOOL read_until_next_close_character(char first_char, char last_char, char** p, string_obj* not_evaled, int* read_end_of_statment, BOOL line_inc, char* sname, int* sline)
  27. {
  28. if(**p == first_char) {
  29. string_push_back2(not_evaled, **p);
  30. (*p)++;
  31. int nest = 0;
  32. BOOL squote = FALSE;
  33. BOOL dquote = FALSE;
  34. while(1) {
  35. if(gKitutukiSigInt) {
  36. err_msg("signal interrupt", sname, *sline);
  37. gKitutukiSigInt = FALSE;
  38. return FALSE;
  39. }
  40. /// ???? ///
  41. if(!squote && !dquote && **p == '\\') {
  42. string_push_back2(not_evaled, **p);
  43. (*p)++;
  44. if(line_inc && **p == '\n') {
  45. (*sline)++;
  46. }
  47. else if(**p == 0) {
  48. err_msg("unexpected end(0) after quote", sname, *sline);
  49. return FALSE;
  50. }
  51. string_push_back2(not_evaled, **p);
  52. (*p)++;
  53. }
  54. /// ???????? ///
  55. else if(!dquote && **p == '\'') {
  56. squote = !squote;
  57. string_push_back2(not_evaled, **p);
  58. (*p)++;
  59. }
  60. /// ??????? ///
  61. else if(!squote && **p == '"') {
  62. dquote = !dquote;
  63. string_push_back2(not_evaled, **p);
  64. (*p)++;
  65. }
  66. /// ?????????
  67. else if(!squote && **p == '$') {
  68. // ?????? $()
  69. if(*(*p+1) == '$' && *(*p+2) == '(' || *(*p+1) == '(')
  70. {
  71. if(*(*p+1) == '$') {
  72. string_push_back2(not_evaled, **p); // $
  73. (*p)++;
  74. string_push_back2(not_evaled, **p); // $
  75. (*p)++;
  76. }
  77. else {
  78. string_push_back2(not_evaled, **p); // $
  79. (*p)++;
  80. }
  81. if(!read_until_next_close_character('(', ')', p, not_evaled, read_end_of_statment, line_inc, sname, sline)) {
  82. return FALSE;
  83. }
  84. *read_end_of_statment = 1;
  85. }
  86. /// ???? ///
  87. else {
  88. BOOL quote;
  89. if(*(*p+1) == '$') {
  90. string_push_back2(not_evaled, **p); // $
  91. (*p)++;
  92. string_push_back2(not_evaled, **p); // $
  93. (*p)++;
  94. quote = FALSE;
  95. }
  96. else {
  97. string_push_back2(not_evaled, **p); // $
  98. (*p)++;
  99. quote = TRUE;
  100. }
  101. if(**p >= '0' && **p <= '9' || **p == '{' || **p >= 'a' && **p <= 'z' || **p >= 'A' && **p <= 'Z' || **p == '_') {
  102. if(**p == '{') {
  103. if(!read_until_next_close_character('{', '}', p, not_evaled, read_end_of_statment, TRUE, sname, sline)) {
  104. return FALSE;
  105. }
  106. }
  107. else {
  108. while(**p) {
  109. if(**p >= '0' && **p <= '9' || **p >= 'a' && **p <= 'z' || **p >= 'A' && **p <= 'Z' || **p == '_') {
  110. string_push_back2(not_evaled, **p); // ??
  111. (*p)++;
  112. }
  113. else {
  114. break;
  115. }
  116. }
  117. }
  118. *read_end_of_statment = 1;
  119. }
  120. else {
  121. if(quote) {
  122. string_push_back2(not_evaled, '$');
  123. }
  124. else {
  125. string_push_back2(not_evaled, '$');
  126. string_push_back2(not_evaled, '$');
  127. }
  128. }
  129. }
  130. }
  131. else if(squote || dquote) {
  132. if(**p == 0) {
  133. err_msg("close ' or \" before the end of source", sname, *sline);
  134. return FALSE;
  135. }
  136. else {
  137. if(line_inc && **p == '\n') {
  138. (*sline)++;
  139. }
  140. string_push_back2(not_evaled, **p);
  141. (*p)++;
  142. }
  143. }
  144. else if(**p == first_char) {
  145. nest++;
  146. string_push_back2(not_evaled, **p);
  147. (*p)++;
  148. }
  149. else if(**p == last_char) {
  150. string_push_back2(not_evaled, **p);
  151. (*p)++;
  152. if(nest == 0) {
  153. break;
  154. }
  155. nest--;
  156. }
  157. else if(**p == 0) {
  158. char buf[256];
  159. snprintf(buf, 256, "read_util_next_close_character: unexpected end(0). close with (%c)", last_char);
  160. err_msg(buf, sname, *sline);
  161. return FALSE;
  162. }
  163. else if(line_inc && **p == '\n') {
  164. (*sline)++;
  165. string_push_back2(not_evaled, **p);
  166. (*p)++;
  167. }
  168. else {
  169. string_push_back2(not_evaled, **p);
  170. (*p)++;
  171. }
  172. }
  173. }
  174. return TRUE;
  175. }
  176. // ??????????? contents????
  177. // ?????????????
  178. // ????????????
  179. static BOOL read_block(char** p, string_obj* contents, vector_obj* args, string_obj* not_evaled, BOOL line_inc, char* sname, int* sline)
  180. {
  181. int line_of_head = *sline;
  182. string_push_back2(not_evaled, **p); // {
  183. (*p)++;
  184. while(1) {
  185. if(**p == ' ') {
  186. string_push_back2(not_evaled, **p);
  187. string_push_back2(contents, *((*p)++));
  188. }
  189. else if(**p == '\t') {
  190. string_push_back2(not_evaled, **p);
  191. string_push_back2(contents, *((*p)++));
  192. }
  193. else if(**p == '\n') {
  194. line_inc && (*sline)++;
  195. string_push_back2(not_evaled, **p);
  196. string_push_back2(contents, *((*p)++));
  197. }
  198. else {
  199. break;
  200. }
  201. }
  202. /// ??
  203. if(args) {
  204. if(**p == ':') {
  205. string_push_back2(not_evaled, **p);
  206. (*p)++;
  207. while(**p) {
  208. string_obj* str = STRING_NEW("");
  209. skip_spaces(p, not_evaled);
  210. while(**p >= 'a' && **p <= 'z'
  211. || **p >= 'A' && **p <= 'Z'
  212. || **p == '_')
  213. {
  214. string_push_back2(str, **p);
  215. string_push_back2(not_evaled, **p);
  216. (*p)++;
  217. }
  218. skip_spaces(p, not_evaled);
  219. vector_add(args, str);
  220. if(**p >= 'a' && **p <= 'z'
  221. || **p >= 'A' && **p <= 'Z'
  222. || **p == '_')
  223. {
  224. }
  225. else {
  226. if(**p == ':') {
  227. string_push_back2(not_evaled, **p);
  228. (*p)++;
  229. break;
  230. }
  231. else {
  232. char buf[1024];
  233. snprintf(buf, 1024, "unexpected char(%c)", **p);
  234. err_msg(buf, sname, line_of_head);
  235. return FALSE;
  236. }
  237. }
  238. }
  239. }
  240. while(1) {
  241. if(**p == ' ') {
  242. string_push_back2(not_evaled, **p);
  243. string_push_back2(contents, *((*p)++));
  244. }
  245. else if(**p == '\t') {
  246. string_push_back2(not_evaled, **p);
  247. string_push_back2(contents, *((*p)++));
  248. }
  249. else if(**p == '\n') {
  250. line_inc && (*sline)++;
  251. string_push_back2(not_evaled, **p);
  252. string_push_back2(contents, *((*p)++));
  253. }
  254. else {
  255. break;
  256. }
  257. }
  258. }
  259. BOOL squote = FALSE;
  260. BOOL dquote = FALSE;
  261. int nest = 0;
  262. while(1) {
  263. /// ????
  264. if(!squote && !dquote && **p == '\\') {
  265. string_push_back2(not_evaled, **p);
  266. string_push_back2(contents, *((*p)++));
  267. if(line_inc && **p == '\n') {
  268. (*sline)++;
  269. }
  270. else if(*p == 0) {
  271. err_msg("unsigned end after quote",sname, *sline);
  272. return FALSE;
  273. }
  274. string_push_back2(not_evaled, **p);
  275. string_push_back2(contents, *((*p)++));
  276. }
  277. /// ????????
  278. else if(!dquote && **p == '\'') {
  279. string_push_back2(not_evaled, **p);
  280. string_push_back2(contents, *((*p)++));
  281. squote = !squote;
  282. }
  283. /// ???????
  284. else if(!squote && **p == '"') {
  285. string_push_back2(not_evaled, **p);
  286. string_push_back2(contents, *((*p)++));
  287. dquote = !dquote;
  288. }
  289. /// ????????????????? ///
  290. else if(squote || dquote) {
  291. if(**p == 0) {
  292. err_msg("get block: close \" or \' before the end of block", sname, line_of_head);
  293. return FALSE;
  294. }
  295. else if(line_inc && **p == '\n') {
  296. (*sline)++;
  297. }
  298. string_push_back2(not_evaled, **p);
  299. string_push_back2(contents, *((*p)++));
  300. }
  301. else if(**p == '(') {
  302. string_push_back2(not_evaled, **p);
  303. string_push_back2(contents, *((*p)++));
  304. nest++;
  305. }
  306. else if(**p == ')') {
  307. string_push_back2(not_evaled, **p);
  308. (*p)++;
  309. nest--;
  310. if(nest == -1) {
  311. break;
  312. }
  313. else {
  314. string_push_back2(contents, ')');
  315. }
  316. }
  317. else if(**p == 0) {
  318. err_msg("get block: found 0. close )", sname, line_of_head);
  319. return FALSE;
  320. }
  321. else if(**p == '\n') {
  322. line_inc && (*sline)++;
  323. string_push_back2(not_evaled, **p);
  324. string_push_back2(contents, **p);
  325. (*p)++;
  326. }
  327. else {
  328. string_push_back2(not_evaled, **p);
  329. string_push_back2(contents, **p);
  330. (*p)++;
  331. }
  332. }
  333. return TRUE;
  334. }
  335. /// ?????
  336. static void expand_tilda(string_obj* buf, string_obj* path)
  337. {
  338. char* p = string_c_str(buf);
  339. p++; // ~
  340. string_obj* user = STRING_NEW("");
  341. while(*p && *p != '/') {
  342. string_push_back2(user, *p);
  343. p++;
  344. }
  345. /// ???????????????????
  346. if(string_length(user) == 0) {
  347. char* home = getenv("HOME");
  348. if(home) {
  349. string_push_back(path, home);
  350. }
  351. else {
  352. struct passwd* pw = getpwuid(getuid());
  353. if(pw) {
  354. string_push_back(path, pw->pw_dir);
  355. }
  356. else {
  357. string_push_back(path, "~");
  358. }
  359. }
  360. }
  361. else {
  362. struct passwd* pw = getpwnam(string_c_str(user));
  363. if(pw) {
  364. string_push_back(path, pw->pw_dir);
  365. }
  366. else {
  367. string_push_back2(path, '~');
  368. string_push_back(path, string_c_str(user));
  369. }
  370. }
  371. /// ?????
  372. string_push_back(path, p);
  373. string_delete(user);
  374. }
  375. static BOOL add_arg_to_command(sCommand* command, MANAGED sArg* new_arg, char* sname, int* sline)
  376. {
  377. vector_add(command->mArgs, new_arg);
  378. if(vector_size(command->mArgs) == 1) {
  379. if(new_arg->mKind == 0) {
  380. /// ???????????????? ///
  381. command->mKind = get_command_kind(string_c_str(new_arg->mBody));
  382. }
  383. else {
  384. err_msg("command name must be determined staticaly", sname, *sline);
  385. return FALSE;
  386. }
  387. }
  388. return TRUE;
  389. }
  390. /// ???????
  391. static BOOL read_one_argument(char** p, string_obj* buf, string_obj* not_evaled, int* read_end_of_statment, sCommand* command, char* sname, int* sline, BOOL expand_quote)
  392. {
  393. /// ????????????????? 127????
  394. static unsigned char table[] = {
  395. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
  396. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  397. 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0,
  398. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0,
  399. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  400. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
  401. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  402. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0
  403. };
  404. BOOL squote = FALSE;
  405. BOOL dquote = FALSE;
  406. while(**p) {
  407. if(gKitutukiSigInt) {
  408. gKitutukiSigInt = FALSE;
  409. err_msg("signal interrupt", sname, *sline);
  410. return FALSE;
  411. }
  412. /// ???
  413. if(!squote && !dquote && **p == '"' && *(*p+1) == '"') {
  414. break;
  415. }
  416. else if(!dquote && !squote && **p =='\'' && *(*p+1) == '\'') {
  417. break;
  418. }
  419. else if(**p == '\\' && *(*p+1) == 't') {
  420. string_push_back2(not_evaled, **p);
  421. string_push_back2(not_evaled, *(*p+1));
  422. string_push_back2(buf, '\t');
  423. (*p)+=2;
  424. }
  425. else if(**p == '\\' && *(*p+1) == 'n') {
  426. string_push_back2(not_evaled, **p);
  427. string_push_back2(not_evaled, *(*p+1));
  428. string_push_back2(buf, '\n');
  429. (*p)+=2;
  430. }
  431. else if(**p == '\\' && *(*p+1) == 'r') {
  432. string_push_back2(not_evaled, **p);
  433. string_push_back2(not_evaled, *(*p+1));
  434. string_push_back2(buf, '\r');
  435. (*p)+=2;
  436. }
  437. else if(**p == '\\' && *(*p+1) == 'a') {
  438. string_push_back2(not_evaled, **p);
  439. string_push_back2(not_evaled, *(*p+1));
  440. string_push_back2(buf, '\a');
  441. (*p)+=2;
  442. }
  443. else if(!squote && !dquote && **p == '\\') {
  444. if(expand_quote) {
  445. string_push_back2(not_evaled, **p);
  446. (*p)++;
  447. if(**p == 0) {
  448. err_msg("unexpected end. can't quote null.", sname, *sline);
  449. return FALSE;
  450. }
  451. else if(**p == '\n') {
  452. (*sline)++;
  453. }
  454. string_push_back2(not_evaled, **p);
  455. string_push_back2(buf, **p);
  456. (*p)++;
  457. }
  458. else {
  459. string_push_back2(not_evaled, **p);
  460. string_push_back2(buf, **p);
  461. (*p)++;
  462. }
  463. }
  464. else if(!dquote && **p == '\'') {
  465. if(expand_quote) {
  466. string_push_back2(not_evaled, **p);
  467. (*p)++;
  468. squote = !squote;
  469. }
  470. else {
  471. string_push_back2(not_evaled, **p);
  472. string_push_back2(buf, **p);
  473. (*p)++;
  474. }
  475. }
  476. else if(!squote && **p == '"') {
  477. if(expand_quote) {
  478. dquote = !dquote;
  479. string_push_back2(not_evaled, **p);
  480. (*p)++;
  481. }
  482. else {
  483. string_push_back2(not_evaled, **p);
  484. string_push_back2(buf, **p);
  485. (*p)++;
  486. }
  487. }
  488. /// ?????????
  489. else if(!squote && **p == '$') {
  490. // ?????? $()
  491. if(*(*p+1) == '(' || *(*p+1) == '$' && *(*p+2) == '(')
  492. {
  493. if(*(*p+1) == '$') {
  494. string_push_back2(not_evaled, **p); // $
  495. (*p)++;
  496. string_push_back2(not_evaled, **p); // $
  497. (*p)++;
  498. }
  499. else {
  500. string_push_back2(not_evaled, **p); // $
  501. (*p)++;
  502. }
  503. if(!read_until_next_close_character('(', ')', p, not_evaled, read_end_of_statment, TRUE, sname, sline)) {
  504. return FALSE;
  505. }
  506. *read_end_of_statment = 1;
  507. }
  508. /// ????
  509. else {
  510. BOOL quote;
  511. if(*(*p+1) == '$') {
  512. string_push_back2(not_evaled, **p); // $
  513. (*p)++;
  514. string_push_back2(not_evaled, **p); // $
  515. (*p)++;
  516. quote = FALSE;
  517. }
  518. else {
  519. string_push_back2(not_evaled, **p); // $
  520. (*p)++;
  521. quote = TRUE;
  522. }
  523. if(**p >= '0' && **p <= '9' || **p == '{' || **p >= 'a' && **p <= 'z' || **p >= 'A' && **p <= 'Z' || **p == '_') {
  524. if(**p == '{') {
  525. if(!read_until_next_close_character('{', '}', p, not_evaled, read_end_of_statment, TRUE, sname, sline)) {
  526. return FALSE;
  527. }
  528. }
  529. else {
  530. while(**p) {
  531. if(**p >= '0' && **p <= '9' || **p >= 'a' && **p <= 'z' || **p >= 'A' && **p <= 'Z' || **p == '_') {
  532. string_push_back2(not_evaled, **p); // ??
  533. (*p)++;
  534. }
  535. else {
  536. break;
  537. }
  538. }
  539. }
  540. *read_end_of_statment = 1;
  541. }
  542. else {
  543. if(quote) {
  544. string_push_back2(buf, '$');
  545. }
  546. else {
  547. string_push_back2(buf, '$');
  548. string_push_back2(buf, '$');
  549. }
  550. }
  551. }
  552. }
  553. /// ?????????????????
  554. else if(squote || dquote) {
  555. if(**p == 0) {
  556. err_msg("close single quote or double quote", sname, *sline);
  557. return FALSE;
  558. }
  559. else if(**p == '\n') {
  560. (*sline)++;
  561. }
  562. string_push_back2(not_evaled, **p);
  563. string_push_back2(buf, **p);
  564. (*p)++;
  565. }
  566. /*
  567. /// ?????
  568. else if(command && vector_size(command->mArgs) > 0 && command->mKind != kCommand && string_c_str(buf)[0] == 0 && **p == '-')
  569. {
  570. string_push_back2(not_evaled, **p);
  571. string_push_back2(buf, **p);
  572. (*p)++;
  573. if(!read_one_argument(p, buf, not_evaled, read_end_of_statment, NULL, sname, sline, FALSE))
  574. {
  575. return FALSE;
  576. }
  577. int i = 0;
  578. int options = 0;
  579. while(kCommandOptions[i]) {
  580. if(strcmp(string_c_str(buf), kCommandOptions[command->mKind][i]) == 0)
  581. {
  582. options |= 0x1 << i;
  583. }
  584. i++;
  585. }
  586. if(options) {
  587. command->mOptions |= options;
  588. string_put(buf, "");
  589. }
  590. else {
  591. if(!add_arg_to_command(command, ARG_NEW(0, MANAGED buf), sname, sline))
  592. {
  593. return FALSE;
  594. }
  595. }
  596. }
  597. */
  598. /// ????? ///
  599. else if(**p == '~') {
  600. string_push_back2(not_evaled, **p);
  601. string_push_back2(buf, **p);
  602. (*p)++;
  603. if(strlen(string_c_str(buf)) == 1 && command) {
  604. if(!read_one_argument(p, buf, not_evaled, read_end_of_statment, NULL, sname, sline, FALSE))
  605. {
  606. return FALSE;
  607. }
  608. string_obj* path = STRING_NEW("");
  609. expand_tilda(buf, path);
  610. string_obj* path2 = STRING_NEW("");
  611. BOOL glob_ = FALSE;
  612. char* p = string_c_str(path);
  613. BOOL squote = FALSE;
  614. BOOL dquote = FALSE;
  615. while(*p) {
  616. if(!dquote && *p == '\'') {
  617. p++;
  618. squote = !squote;
  619. }
  620. else if(!squote && *p == '"') {
  621. p++;
  622. dquote = !dquote;
  623. }
  624. else if(squote || dquote) {
  625. string_push_back2(path2, *p);
  626. p++;
  627. }
  628. else if(*p == '\\') {
  629. p++;
  630. string_push_back2(path2, *p);
  631. p++;
  632. }
  633. else if(*p == '[') {
  634. string_push_back2(path2, *p);
  635. p++;
  636. while(*p) {
  637. if(*p == ']') {
  638. glob_ = TRUE;
  639. string_push_back2(path2, *p);
  640. p++;
  641. break;
  642. }
  643. else {
  644. string_push_back2(path2, *p);
  645. p++;
  646. }
  647. }
  648. }
  649. else if(*p == '?' || *p == '*') {
  650. glob_ = TRUE;
  651. string_push_back2(path2, *p);
  652. p++;
  653. }
  654. else {
  655. string_push_back2(path2, *p);
  656. p++;
  657. }
  658. }
  659. string_delete(path);
  660. if(glob_) {
  661. glob_t result;
  662. int rc = glob(string_c_str(path2), 0, NULL, &result);
  663. if(rc == GLOB_NOSPACE) {
  664. err_msg("read_one_argument: out of space during glob operation", sname, *sline);
  665. string_delete(path2);
  666. return FALSE;
  667. }
  668. else if(rc == GLOB_NOMATCH) {
  669. }
  670. else {
  671. int i;
  672. for(i=0; i<result.gl_pathc; i++) {
  673. char* file = result.gl_pathv[i];
  674. if(strcmp(file, ".") != 0 && strcmp(file, "..") != 0)
  675. {
  676. string_obj* str = STRING_NEW(file);
  677. if(!add_arg_to_command(command, ARG_NEW(0, MANAGED str), sname, sline))
  678. {
  679. string_delete(path2);
  680. return FALSE;
  681. }
  682. }
  683. }
  684. string_put(buf, ""); // ?????????mArgs??????
  685. }
  686. string_delete(path2);
  687. }
  688. else {
  689. if(!add_arg_to_command(command, ARG_NEW(0, MANAGED path2), sname, sline))
  690. {
  691. return FALSE;
  692. }
  693. string_put(buf, ""); // ???????????mArgs??????
  694. }
  695. break;
  696. }
  697. }
  698. /// ??? ///
  699. else if(command && vector_size(command->mArgs) > 0 && (**p == '[' || **p == '?' || **p == '*'))
  700. {
  701. string_push_back2(not_evaled, **p);
  702. string_push_back2(buf, **p);
  703. (*p)++;
  704. if(!read_one_argument(p, buf, not_evaled, read_end_of_statment, NULL, sname, sline, TRUE))
  705. {
  706. return FALSE;
  707. }
  708. glob_t result;
  709. int rc = glob(string_c_str(buf), 0, NULL, &result);
  710. if(rc == GLOB_NOSPACE) {
  711. err_msg("read_one_argument: out of space during glob operation", sname, *sline);
  712. return FALSE;
  713. }
  714. else if(rc == GLOB_NOMATCH) {
  715. }
  716. else {
  717. int i;
  718. for(i=0; i<result.gl_pathc; i++) {
  719. char* file = result.gl_pathv[i];
  720. if(strcmp(file, ".") != 0 && strcmp(file, "..") != 0)
  721. {
  722. string_obj* str = STRING_NEW(file);
  723. if(!add_arg_to_command(command, ARG_NEW(0, MANAGED str), sname, sline))
  724. {
  725. return FALSE;
  726. }
  727. }
  728. }
  729. string_put(buf, ""); // ?????????mArgs??????
  730. }
  731. break;
  732. }
  733. // ->?????
  734. else if(command && vector_size(command->mArgs) == 0 && **p == '-' && *(*p+1) == '>')
  735. {
  736. string_push_back2(not_evaled, **p);
  737. string_push_back2(buf, **p);
  738. (*p)++;
  739. string_push_back2(not_evaled, **p);
  740. string_push_back2(buf, **p);
  741. (*p)++;
  742. }
  743. /// utf-8??????
  744. else if(((unsigned char)**p) > 127) {
  745. string_push_back2(not_evaled, **p);
  746. string_push_back2(buf, **p);
  747. (*p)++;
  748. }
  749. // ???????????????
  750. else if(**p == '@' && (*(*p+1) == '(') || (*(*p+1) == '@' && *(*p+2) == '(') || (*(*p+1) == '@' && *(*p+2) >= 'a' && *(*p+2) <= 'z' && *(*p+3) == '('))
  751. {
  752. break;
  753. }
  754. // % ????????????
  755. else if(**p == '%' && (*(*p+1) == '>' || *(*p+1) == '2')) {
  756. break;
  757. }
  758. else if(table[**p]) {
  759. break;
  760. }
  761. else {
  762. string_push_back2(not_evaled, **p);
  763. string_push_back2(buf, **p);
  764. (*p)++;
  765. }
  766. }
  767. if(squote) {
  768. err_msg("require to close '", sname, *sline);
  769. return FALSE;
  770. }
  771. if(dquote) {
  772. err_msg("require to close \"", sname, *sline);
  773. return FALSE;
  774. }
  775. return TRUE;
  776. }
  777. /// if?????
  778. static BOOL read_command_parse_if_statment(char** p, sCommand* command, sStatment* statment, string_obj* not_evaled, int* read_end_of_statment, char* sname, int* sline)
  779. {
  780. skip_spaces(p, not_evaled);
  781. if(**p != '(') {
  782. err_msg("expected (", sname, *sline);
  783. return FALSE;
  784. }
  785. /// ??????? ///
  786. string_obj* str = STRING_NEW("");
  787. int read_end_of_statment2 = -1;
  788. if(!read_until_next_close_character('(', ')', p, str, &read_end_of_statment2, FALSE, sname, sline)) {
  789. string_delete(str);
  790. return FALSE;
  791. }
  792. string_push_back(not_evaled, string_c_str(str));
  793. string_erase(str, 0, 1);
  794. string_trunc(str, string_length(str)-1);
  795. sStatments* condition = STATMENTS_NEW();
  796. if(!parse(string_c_str(str), sname, sline, condition))
  797. {
  798. string_delete(str);
  799. sStatments_delete(condition);
  800. return FALSE;
  801. }
  802. string_delete(str);
  803. skip_spaces(p, not_evaled);
  804. /// ??? ///
  805. sStatments* loop = STATMENTS_NEW();
  806. if(**p == '(') {
  807. string_obj* str = STRING_NEW("");
  808. if(!read_block(p, str, NULL, not_evaled, FALSE, sname, sline)) {
  809. string_delete(str);
  810. sStatments_delete(condition);
  811. sStatments_delete(loop);
  812. return FALSE;
  813. }
  814. if(!parse(string_c_str(str), sname, sline, loop))
  815. {
  816. sStatments_delete(condition);
  817. sStatments_delete(loop);
  818. string_delete(str);
  819. return FALSE;
  820. }
  821. string_delete(str);
  822. }
  823. else {
  824. err_msg("expected block.", sname, *sline);
  825. sStatments_delete(condition);
  826. sStatments_delete(loop);
  827. return FALSE;
  828. }
  829. skip_spaces(p, not_evaled);
  830. vector_obj* conditions = VECTOR_NEW(30);
  831. vector_obj* loops = VECTOR_NEW(30);
  832. vector_add(conditions, condition);
  833. vector_add(loops, loop);
  834. /// elif ?? ///
  835. if(**p == 'e' && *(*p+1) == 'l'
  836. && *(*p+2) == 'i' && *(*p+3) == 'f'
  837. && (*(*p+4) == ' ' || *(*p+4) == '\t' || *(*p+4) == '('))
  838. {
  839. while(**p == 'e' && *(*p+1) == 'l' && *(*p+2) == 'i'
  840. && *(*p+3) == 'f'
  841. && (*(*p+4) == ' ' || *(*p+4) == '\t' || *(*p+4) == '('))
  842. {
  843. string_push_back2(not_evaled, **p);
  844. (*p)++;
  845. string_push_back2(not_evaled, **p);
  846. (*p)++;
  847. string_push_back2(not_evaled, **p);
  848. (*p)++;
  849. string_push_back2(not_evaled, **p);
  850. (*p)++;
  851. skip_spaces(p, not_evaled);
  852. if(**p != '(') {
  853. err_msg("expected (", sname, *sline);
  854. int i;
  855. for(i=0; i<vector_size(conditions); i++) {
  856. sStatments_delete(vector_item(conditions, i));
  857. }
  858. vector_delete(conditions);
  859. for(i=0; i<vector_size(loops); i++) {
  860. sStatments_delete(vector_item(loops, i));
  861. }
  862. vector_delete(loops);
  863. return FALSE;
  864. }
  865. /// ??? ///
  866. string_obj* str = STRING_NEW("");
  867. int read_end_of_statment = -1;
  868. if(!read_until_next_close_character('(', ')', p, str, &read_end_of_statment, FALSE, sname, sline)) {
  869. string_delete(str);
  870. int i;
  871. for(i=0; i<vector_size(conditions); i++) {
  872. sStatments_delete(vector_item(conditions, i));
  873. }
  874. vector_delete(conditions);
  875. for(i=0; i<vector_size(loops); i++) {
  876. sStatments_delete(vector_item(loops, i));
  877. }
  878. vector_delete(loops);
  879. return FALSE;
  880. }
  881. string_push_back(not_evaled, string_c_str(str));
  882. sStatments* condition = STATMENTS_NEW();
  883. if(!parse(string_c_str(str), sname, sline, condition))
  884. {
  885. sStatments_delete(condition);
  886. int i;
  887. for(i=0; i<vector_size(conditions); i++) {
  888. sStatments_delete(vector_item(conditions, i));
  889. }
  890. vector_delete(conditions);
  891. for(i=0; i<vector_size(loops); i++) {
  892. sStatments_delete(vector_item(loops, i));
  893. }
  894. vector_delete(loops);
  895. string_delete(str);
  896. return FALSE;
  897. }
  898. string_delete(str);
  899. vector_add(conditions, condition);
  900. skip_spaces(p, not_evaled);
  901. /// ??? ///
  902. sStatments* loop = STATMENTS_NEW();
  903. if(**p == '(') {
  904. string_obj* str = STRING_NEW("");
  905. if(!read_block(p, str, NULL, not_evaled, FALSE, sname, sline)) {
  906. string_delete(str);
  907. sStatments_delete(loop);
  908. int i;
  909. for(i=0; i<vector_size(conditions); i++) {
  910. sStatments_delete(vector_item(conditions, i));
  911. }
  912. vector_delete(conditions);
  913. for(i=0; i<vector_size(loops); i++) {
  914. sStatments_delete(vector_item(loops, i));
  915. }
  916. vector_delete(loops);
  917. return FALSE;
  918. }
  919. if(!parse(string_c_str(str), sname, sline, loop))
  920. {
  921. sStatments_delete(loop);
  922. string_delete(str);
  923. int i;
  924. for(i=0; i<vector_size(conditions); i++) {
  925. sStatments_delete(vector_item(conditions, i));
  926. }
  927. vector_delete(conditions);
  928. for(i=0; i<vector_size(loops); i++) {
  929. sStatments_delete(vector_item(loops, i));
  930. }
  931. vector_delete(loops);
  932. return FALSE;
  933. }
  934. string_delete(str);
  935. }
  936. else {
  937. err_msg("expected block.", sname, *sline);
  938. sStatments_delete(loop);
  939. int i;
  940. for(i=0; i<vector_size(conditions); i++) {
  941. sStatments_delete(vector_item(conditions, i));
  942. }
  943. vector_delete(conditions);
  944. for(i=0; i<vector_size(loops); i++) {
  945. sStatments_delete(vector_item(loops, i));
  946. }
  947. vector_delete(loops);
  948. return FALSE;
  949. }
  950. skip_spaces(p, not_evaled);
  951. vector_add(loops, loop);
  952. }
  953. }
  954. /// else ?? ///
  955. if(**p == 'e' && *(*p+1) == 'l' && *(*p+2) == 's' && *(*p+3) == 'e' && (*(*p+4) == ' ' || *(*p+4) == '\t' || *(*p+4) == '('))
  956. {
  957. string_push_back2(not_evaled, **p);
  958. (*p)++;
  959. string_push_back2(not_evaled, **p);
  960. (*p)++;
  961. string_push_back2(not_evaled, **p);
  962. (*p)++;
  963. string_push_back2(not_evaled, **p);
  964. (*p)++;
  965. skip_spaces(p, not_evaled);
  966. /// ??? ///
  967. sStatments* loop = STATMENTS_NEW();
  968. if(**p == '(') {
  969. string_obj* str = STRING_NEW("");
  970. if(!read_block(p, str, NULL, not_evaled, FALSE, sname, sline)) {
  971. string_delete(str);
  972. sStatments_delete(loop);
  973. int i;
  974. for(i=0; i<vector_size(conditions); i++) {
  975. sStatments_delete(vector_item(conditions, i));
  976. }
  977. vector_delete(conditions);
  978. for(i=0; i<vector_size(loops); i++) {
  979. sStatments_delete(vector_item(loops, i));
  980. }
  981. vector_delete(loops);
  982. return FALSE;
  983. }
  984. if(!parse(string_c_str(str), sname, sline, loop))
  985. {
  986. string_delete(str);
  987. sStatments_delete(loop);
  988. int i;
  989. for(i=0; i<vector_size(conditions); i++) {
  990. sStatments_delete(vector_item(conditions, i));
  991. }
  992. vector_delete(conditions);
  993. for(i=0; i<vector_size(loops); i++) {
  994. sStatments_delete(vector_item(loops, i));
  995. }
  996. return FALSE;
  997. }
  998. string_delete(str);
  999. }
  1000. else {
  1001. err_msg("expected block.", sname, *sline);
  1002. int i;
  1003. for(i=0; i<vector_size(conditions); i++) {
  1004. sStatments_delete(vector_item(conditions, i));
  1005. }
  1006. vector_delete(conditions);
  1007. for(i=0; i<vector_size(loops); i++) {
  1008. sStatments_delete(vector_item(loops, i));
  1009. }
  1010. sStatments_delete(loop);
  1011. return FALSE;
  1012. }
  1013. skip_spaces(p, not_evaled);
  1014. vector_add(loops, loop);
  1015. }
  1016. command->mKind = kIf;
  1017. command->mExtra = sIf_new(MANAGED conditions, MANAGED loops);
  1018. return TRUE;
  1019. }
  1020. /// while?????
  1021. static BOOL read_command_parse_while_statment(char** p, sCommand* command, sStatment* statment, string_obj* not_evaled, int* read_end_of_statment, char* sname, int* sline)
  1022. {
  1023. skip_spaces(p, not_evaled);
  1024. if(**p != '(') {
  1025. err_msg("expected (", sname, *sline);
  1026. return FALSE;
  1027. }
  1028. /// ??????? ///
  1029. string_obj* str = STRING_NEW("");
  1030. int read_end_of_statment2 = -1;
  1031. if(!read_until_next_close_character('(', ')', p, str, &read_end_of_statment2, FALSE, sname, sline)) {
  1032. string_delete(str);
  1033. return FALSE;
  1034. }
  1035. string_push_back(not_evaled, string_c_str(str));
  1036. string_erase(str, 0, 1);
  1037. string_trunc(str, string_length(str)-1);
  1038. sStatments* conditions = STATMENTS_NEW();
  1039. if(!parse(string_c_str(str), sname, sline, conditions))
  1040. {
  1041. sStatments_delete(conditions);
  1042. string_delete(str);
  1043. return FALSE;
  1044. }
  1045. string_delete(str);
  1046. while(**p) {
  1047. if(**p == '\n') {
  1048. (*sline)++;
  1049. string_push_back2(not_evaled, **p);
  1050. (*p)++;
  1051. }
  1052. else if(**p == ' ' || **p == '\t') {
  1053. string_push_back2(not_evaled, **p);
  1054. (*p)++;
  1055. }
  1056. else {
  1057. break;
  1058. }
  1059. }
  1060. /// ???????? ///
  1061. sStatments* loops = STATMENTS_NEW();
  1062. if(**p == '(') {
  1063. string_obj* str = STRING_NEW("");
  1064. if(!read_block(p, str, NULL, not_evaled, FALSE, sname, sline)) {
  1065. sStatments_delete(conditions);
  1066. sStatments_delete(loops);
  1067. string_delete(str);
  1068. return FALSE;
  1069. }
  1070. if(!parse(string_c_str(str), sname, sline, loops))
  1071. {
  1072. string_delete(str);
  1073. sStatments_delete(conditions);
  1074. sStatments_delete(loops);
  1075. return FALSE;
  1076. }
  1077. string_delete(str);
  1078. }
  1079. else {
  1080. err_msg("expected block.", sname, *sline);
  1081. sStatments_delete(conditions);
  1082. sStatments_delete(loops);
  1083. return FALSE;
  1084. }
  1085. command->mKind = kWhile;
  1086. // ??????mNotEvaled????????????
  1087. // ???command??????
  1088. command->mExtra = sWhile_new(MANAGED conditions, MANAGED loops);
  1089. return TRUE;
  1090. }
  1091. /// ?????????
  1092. static BOOL read_command(char** p, sCommand* command, sStatment* statment, string_obj* not_evaled, int* read_end_of_statment, char* sname, int* sline)
  1093. {
  1094. while(**p) {
  1095. string_obj* buf = STRING_NEW("");
  1096. if(!read_one_argument(p, buf, not_evaled, read_end_of_statment, command, sname, sline, TRUE))
  1097. {
  1098. string_delete(buf);
  1099. return FALSE;
  1100. }
  1101. /// ??????? ///
  1102. if(strcmp(string_c_str(buf), "") != 0) {
  1103. if(vector_size(command->mArgs) == 0) {
  1104. if(strcmp(string_c_str(buf), "if") == 0) {
  1105. if(!add_arg_to_command(command, ARG_NEW(0, MANAGED buf), sname, sline))
  1106. {
  1107. return FALSE;
  1108. }
  1109. string_push_back(statment->mTitle, string_c_str(buf));
  1110. string_push_back(statment->mTitle, " ");
  1111. if(!read_command_parse_if_statment(p, command, statment, not_evaled, read_end_of_statment, sname, sline))
  1112. {
  1113. return FALSE;
  1114. }
  1115. }
  1116. else if(strcmp(string_c_str(buf), "while") == 0) {
  1117. if(!add_arg_to_command(command, ARG_NEW(0, MANAGED buf), sname, sline))
  1118. {
  1119. return FALSE;
  1120. }
  1121. string_push_back(statment->mTitle, string_c_str(buf));
  1122. string_push_back(statment->mTitle, " ");
  1123. if(!read_command_parse_while_statment(p, command, statment, not_evaled, read_end_of_statment, sname, sline))
  1124. {
  1125. return FALSE;
  1126. }
  1127. }
  1128. else {
  1129. if(vector_size(statment->mCommands) == 0 && strcmp(string_c_str(buf), "!") == 0)
  1130. {
  1131. statment->mRCodeReverse = TRUE;
  1132. }
  1133. if(!add_arg_to_command(command, ARG_NEW(0, MANAGED buf), sname, sline))
  1134. {
  1135. return FALSE;
  1136. }
  1137. string_push_back(statment->mTitle, string_c_str(buf));
  1138. string_push_back(statment->mTitle, " ");
  1139. }
  1140. }
  1141. else {
  1142. if(!add_arg_to_command(command, ARG_NEW(0, MANAGED buf), sname, sline))
  1143. {
  1144. return FALSE;
  1145. }
  1146. string_push_back(statment->mTitle, string_c_str(buf));
  1147. string_push_back(statment->mTitle, " ");
  1148. }
  1149. }
  1150. else {
  1151. /// ?????
  1152. if(**p == '\'') {
  1153. string_push_back(not_evaled, "''");
  1154. (*p)+=2;
  1155. if(!add_arg_to_command(command, ARG_NEW(0, MANAGED buf), sname, sline))
  1156. {
  1157. return FALSE;
  1158. }
  1159. string_push_back(statment->mTitle, "'");
  1160. string_push_back(statment->mTitle, " ");
  1161. continue;
  1162. }
  1163. else if(**p == '"') {
  1164. string_push_back(not_evaled, "\"\"");
  1165. (*p)+=2;
  1166. /// ???????????????? ///
  1167. if(!add_arg_to_command(command, ARG_NEW(0, MANAGED buf), sname, sline))
  1168. {
  1169. return FALSE;
  1170. }
  1171. string_push_back(statment->mTitle, "\"\"");
  1172. string_push_back(statment->mTitle, " ");
  1173. continue;
  1174. }
  1175. else {
  1176. string_delete(buf);
  1177. }
  1178. }
  1179. /// ?????????? ///
  1180. if((**p == '@' && *(*p+1) == '(') || (**p == '@' && *(*p+1) == '@' && *(*p+2) == '(') || (**p == '@' && *(*p+1) == '@' && *(*p+2) >= 'a' && *(*p+2) <= 'z' && *(*p+3) == '('))
  1181. {
  1182. string_push_back2(not_evaled, **p);
  1183. (*p)++;
  1184. BOOL double_;
  1185. enum eLineField lf;
  1186. if(**p == '@') {
  1187. string_push_back2(not_evaled, **p);
  1188. (*p)++;
  1189. double_ = TRUE;
  1190. if(**p == '(') {
  1191. lf = kLF;
  1192. }
  1193. else if(*(*p+1) == 'a') {
  1194. lf = kBel;
  1195. string_push_back2(not_evaled, **p);
  1196. (*p)++;
  1197. }
  1198. else if(*(*p+1) == 'm') {
  1199. lf = kCR;
  1200. string_push_back2(not_evaled, **p);
  1201. (*p)++;
  1202. }
  1203. else if(*(*p+1) == 'w') {
  1204. lf = kCRLF;
  1205. string_push_back2(not_evaled, **p);
  1206. (*p)++;
  1207. }
  1208. else {
  1209. lf = kLF;
  1210. string_push_back2(not_evaled, **p);
  1211. (*p)++;
  1212. }
  1213. }
  1214. else if(**p == '(') {
  1215. double_ = FALSE;
  1216. lf = kLF;
  1217. }
  1218. string_obj* str = STRING_NEW("");
  1219. int read_end_of_statment = -1;
  1220. if(!read_until_next_close_character('(', ')', p, str, &read_end_of_statment, FALSE, sname, sline)) {
  1221. string_delete(str);
  1222. return FALSE;
  1223. }
  1224. string_push_back(not_evaled, string_c_str(str));
  1225. string_push_back(statment->mTitle, string_c_str(str));
  1226. string_erase(str, 0, 1);
  1227. string_trunc(str, string_length(str)-1);
  1228. sStatments* statments = STATMENTS_NEW();
  1229. if(!parse(string_c_str(str), sname, sline, statments))
  1230. {
  1231. string_delete(str);
  1232. sStatments_delete(statments);
  1233. return FALSE;
  1234. }
  1235. string_delete(str);
  1236. if(double_) {
  1237. if(!add_arg_to_command(command, ARG_NEW(4, MANAGED sAtCommand_new(MANAGED statments, lf)), sname, sline))
  1238. {
  1239. return FALSE;
  1240. }
  1241. }
  1242. else {
  1243. if(!add_arg_to_command(command, ARG_NEW(2, MANAGED statments), sname, sline))
  1244. {
  1245. return FALSE;
  1246. }
  1247. }
  1248. }
  1249. else if(**p == '>') {
  1250. /// ?????? ///
  1251. if(*(*p+1) == '(') {
  1252. string_push_back2(not_evaled, **p);
  1253. (*p)++;
  1254. string_obj* cmd = STRING_NEW("");
  1255. if(!read_until_next_close_character('(', ')', p, cmd, read_end_of_statment, FALSE, sname, sline)) {
  1256. string_delete(cmd);
  1257. return FALSE;
  1258. }
  1259. string_push_back(not_evaled, string_c_str(cmd));
  1260. string_erase(cmd, 0, 1); // (???
  1261. string_trunc(cmd, string_length(cmd)-1); // )???
  1262. sStatments* statments = STATMENTS_NEW();
  1263. if(!parse(string_c_str(cmd), sname, sline, statments)) {
  1264. sStatments_delete(statments);
  1265. string_delete(cmd);
  1266. return FALSE;
  1267. }
  1268. string_delete(cmd);
  1269. if(vector_size(command->mArgs) == 0) {
  1270. err_msg("command name must be determined staticaly", sname, *sline);
  1271. sStatments_delete(statments);
  1272. return FALSE;
  1273. }
  1274. if(!add_arg_to_command(command, ARG_NEW(8, MANAGED statments), sname, sline))
  1275. {
  1276. return FALSE;
  1277. }
  1278. }
  1279. /// ??????
  1280. else if(*(*p+1) == '>') {
  1281. string_push_back(not_evaled, ">>");
  1282. (*p)+=2;
  1283. int fd = 1;
  1284. enum eRedirect type = kRedirectAppend;
  1285. skip_spaces(p, not_evaled);
  1286. if(!add_arg_to_command(command, ARG_NEW(9, MANAGED sRedirect_new(type, fd)), sname, sline))
  1287. {
  1288. return FALSE;
  1289. }
  1290. }
  1291. /// ??????
  1292. else {
  1293. string_push_back(not_evaled, ">");
  1294. (*p)++;
  1295. int fd = 1;
  1296. enum eRedirect type = kRedirectOverwrite;
  1297. skip_spaces(p, not_evaled);
  1298. if(!add_arg_to_command(command, ARG_NEW(9, MANAGED sRedirect_new(type, fd)), sname, sline))
  1299. {
  1300. return FALSE;
  1301. }
  1302. }
  1303. }
  1304. else if(**p == '<') {
  1305. /// ????????
  1306. if(*(*p+1) == '<') {
  1307. string_push_back2(not_evaled, **p);
  1308. (*p)++;
  1309. string_push_back2(not_evaled, **p);
  1310. (*p)++;
  1311. skip_spaces(p, not_evaled);
  1312. BOOL expand_env = TRUE;
  1313. BOOL squote = FALSE;
  1314. BOOL dquote = FALSE;
  1315. if(**p == '\'') {
  1316. squote = TRUE;
  1317. string_push_back2(not_evaled, **p);
  1318. (*p)++;
  1319. }
  1320. else if(**p == '"') {
  1321. dquote = TRUE;
  1322. string_push_back2(not_evaled, **p);
  1323. (*p)++;
  1324. }
  1325. string_obj* name = STRING_NEW("");
  1326. while(**p) {
  1327. if(**p == '\n') {
  1328. string_push_back2(not_evaled, **p);
  1329. (*p)++;
  1330. break;
  1331. }
  1332. else if(**p == ' ' || **p == '\t') {
  1333. skip_spaces(p, not_evaled);
  1334. if(**p != '\n') {
  1335. err_msg("invalid here document name1", sname, *sline);
  1336. string_delete(name);
  1337. return FALSE;
  1338. }
  1339. string_push_back2(not_evaled, **p);
  1340. (*p)++;
  1341. break;
  1342. }
  1343. else if(**p >='A' && ** p <= 'Z' || **p >='a' && **p <='z')
  1344. {
  1345. string_push_back2(name, **p);
  1346. string_push_back2(not_evaled, **p);
  1347. (*p)++;
  1348. }
  1349. else if(dquote && **p == '"') {
  1350. expand_env = TRUE;
  1351. dquote = FALSE;
  1352. string_push_back2(not_evaled, **p);
  1353. (*p)++;
  1354. skip_spaces(p, not_evaled);
  1355. if(**p != '\n') {
  1356. err_msg("invalid here document name2", sname, *sline);
  1357. string_delete(name);
  1358. return FALSE;
  1359. }
  1360. string_push_back2(not_evaled, **p);
  1361. (*p)++;
  1362. break;
  1363. }
  1364. else if(squote && **p == '\'') {
  1365. expand_env = FALSE;
  1366. squote = FALSE;
  1367. string_push_back2(not_evaled, **p);
  1368. (*p)++;
  1369. skip_spaces(p, not_evaled);
  1370. if(**p != '\n') {
  1371. err_msg("invalid here document name3", sname, *sline);
  1372. string_delete(name);
  1373. return FALSE;
  1374. }
  1375. string_push_back2(not_evaled, **p);
  1376. (*p)++;
  1377. break;
  1378. }
  1379. else {