first.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701
  1. #include <stdio.h>
  2. #include <stdbool.h>
  3. #include <stdarg.h>
  4. #include <dirent.h>
  5. #include <sys/wait.h>
  6. #include <sys/stat.h>
  7. #include <errno.h>
  8. /* #define STR_SIZE_LIMIT 65536 */
  9. #define STR_SIZE_LIMIT 5458264
  10. #define IMP
  11. #define WANT_BUILD
  12. #define WANT_CSTR
  13. #define WANT_STR
  14. #define WANT_MAP
  15. #define WANT_TOKENIZER
  16. #define WANT_DYN_ARR
  17. #define WANT_PATH
  18. #define WANT_ENV
  19. #define WANT_SLOP
  20. #define WANT_CMD
  21. #include "./src/lib.h"
  22. #include <stdlib.h>
  23. #include <stdio.h>
  24. /*
  25. # define DIE(f, e) \
  26. (f); \
  27. if ( (e) != ERR_OK ) {\
  28. fprintf(stderr, \
  29. "Error while running `" #f "`: %s\n", \
  30. err_to_name[(e)]); \
  31. goto exit_err; \
  32. }
  33. # define PPP(f) \
  34. printf("PRE: `" #f "`\n"); \
  35. f; \
  36. printf("POST: `" #f "`\n");
  37. */
  38. int
  39. main(int argc, char *argv[])
  40. {
  41. enum err err = ERR_OK;
  42. GO_REBUILD_YOURSELF(
  43. .debug=true,
  44. .deps=CSTR_ARRAY("./src/lib.h")
  45. );
  46. printf("-------------------------\n");
  47. struct dir dir = {0};
  48. struct dirs dirs = {0};
  49. dirs = dir_list_cstr("./src", &err, .stat=true, .recurse=true);
  50. if ( err == ERR_OK ) DA_FOREACH(dirs, it) {
  51. if ( ! cstr_endswith(CSTR_WITH_SIZE(it->path, &err), ".c", 2, &err) )
  52. continue;
  53. if ( it->stat.st_mtime > dir.stat.st_mtime ) {
  54. dir = *it;
  55. }
  56. }
  57. struct str exec = {0};
  58. {
  59. struct str tmp = {0};
  60. struct str last = {0};
  61. struct str_tokenizer tkn = {0};
  62. tkn = str_tokenize(
  63. str_from_cstr_ns(dir.path, NULL), '/'
  64. );
  65. tmp = str_tokenizer_next(&tkn);
  66. while ( tmp.size != (u64) -1 ) {
  67. last = tmp;
  68. tmp = str_tokenizer_next(&tkn);
  69. }
  70. tkn = str_tokenize(last, '.');
  71. last = str_tokenizer_next(&tkn);
  72. exec = str_dup(last);
  73. }
  74. struct cmd cmd = cmd_create_ns(CC, &err);
  75. cmd_append_args_cstrs(
  76. &cmd, &err,
  77. CC_FLAGS, dir.path, "-o", exec.data
  78. );
  79. cmd_exec(&cmd, &err);
  80. cmd_destroy(&cmd, &err);
  81. free((void *)exec.data);
  82. dir_list_destroy(&dirs, &err);
  83. if ( err != ERR_OK ) {
  84. fprintf(stderr, "Failed doing something: %s\n", err2cstr(err));
  85. exit(EXIT_FAILURE);
  86. }
  87. printf("-------------------------\n");
  88. /*
  89. bool was_rebuild = false;
  90. struct dyn_arr dirs = {0};
  91. size_t i = 0;
  92. was_rebuild = build_go_rebuild_yourself(__FILE__, &err);
  93. if ( was_rebuild == true ) {
  94. return 0;
  95. }
  96. dirs = dir_list_with_ext("./src", ".c", &err);
  97. free(dirs);
  98. */
  99. UNUSED(argc);
  100. UNUSED(argv);
  101. return 0;
  102. }
  103. bool skip_token(struct tokenizer *tkn, char c);
  104. enum c_token_type {
  105. _TT = TK_LAST,
  106. TK_PP_DEF,
  107. TK_PP_INC
  108. };
  109. struct pp_def {
  110. struct str name;
  111. struct str val;
  112. };
  113. # define PP_DEF_DESTROY(Var) \
  114. if ( (Var) != NULL ) { \
  115. STR_DESTROY((Var)->name); \
  116. STR_DESTROY((Var)->val); \
  117. LIB_FREE((Var)); \
  118. }
  119. struct var_decl {
  120. bool is_ptr;
  121. struct str type;
  122. struct str name;
  123. };
  124. # define VAR_DECL_DESTROY(Var) \
  125. if ( (Var) != NULL ) { \
  126. STR_DESTROY((Var)->type); \
  127. STR_DESTROY((Var)->name); \
  128. }
  129. struct func_decl {
  130. struct str ret_type;
  131. struct str name;
  132. struct {
  133. struct var_decl *data;
  134. u64 size;
  135. u64 cap;
  136. } args;
  137. };
  138. void func_decl_destroy(struct func_decl *fd);
  139. void
  140. func_decl_destroy(struct func_decl *fd)
  141. {
  142. u64 i = 0;
  143. if ( fd == NULL ) return;
  144. STR_DESTROY(fd->ret_type);
  145. STR_DESTROY(fd->name);
  146. for ( i = 0; i < fd->args.size; ++i ) {
  147. STR_DESTROY(fd->args.data[i].type);
  148. STR_DESTROY(fd->args.data[i].name);
  149. }
  150. LIB_FREE(fd->args.data);
  151. LIB_FREE(fd);
  152. }
  153. bool tkn_expect(struct tokenizer *tkn, enum token_type type,
  154. struct token *out_tk, enum err *out_err);
  155. bool tkn_expect_id(struct tokenizer *tkn, const char *cstr,
  156. struct token *out_tk, enum err *out_err);
  157. bool tkn_parse_function(struct tokenizer *tkn);
  158. bool run_function(struct str str);
  159. bool tkn_parse_pp_directive(struct tokenizer *tkn, struct token *out_tk,
  160. enum err *out_err);
  161. bool tkn_parse_var(struct tokenizer *tkn, struct token *out_tk,
  162. enum err *out_err);
  163. bool tkn_parse_decl(struct tokenizer *tkn, struct token *out_tk,
  164. enum err *out_err);
  165. bool is_space(char c);
  166. bool
  167. is_space(char c)
  168. {
  169. return (c == ' ') || (c == '\r') || (c == '\n')
  170. || (c == '\t') || (c == '\v');
  171. }
  172. int main2(int argc, char *argv[]);
  173. int
  174. main2(int argc, char *argv[])
  175. {
  176. enum err err = ERR_OK;
  177. struct path src_path = {0};
  178. struct file f = {0};
  179. struct str code = {0};
  180. struct tokenizer tkn = {0};
  181. struct tokenizer_options tkn_opts = {0};
  182. struct token tk = {0};
  183. struct dyn_arr tk_da = {0};
  184. tk_da = dyn_arr_create(sizeof(struct token), &err);
  185. src_path = path_from_cstr_ns("./first.c", &err);
  186. f = path_file_read_all(&src_path, &err);
  187. code = str_from_cstr((char*)f.data, f.size, &err);
  188. tkn_opts.skip_token = skip_token;
  189. tkn = tokenizer_create(code, src_path, &tkn_opts, &err);
  190. tk = tokenizer_next_token(&tkn, &err);
  191. do {
  192. if ( err != ERR_OK ) {
  193. fprintf(stderr, "ERROR: Failed tokenizing `%.*s`: %s\n",
  194. (int) src_path.size, src_path.data, err2cstr(err));
  195. goto error_exit;
  196. }
  197. switch ( tk.type ) {
  198. case TK_POUND: {
  199. if ( ! tkn_parse_pp_directive(&tkn, NULL, &err) ) goto error_exit;
  200. } break;
  201. case TK_ID: if ( ! tkn_parse_decl(&tkn, NULL, &err) ) goto error_exit;
  202. case TK_NL: break;
  203. case TK_SLASH: {
  204. if ( ! tkn_expect(&tkn, TK_ASTERISK, NULL, &err) ) goto error_exit;
  205. while ( tk.type != TK_ASTERISK )
  206. tk = tokenizer_next_token(&tkn, &err);
  207. if ( ! tkn_expect(&tkn, TK_SLASH, NULL, &err) ) goto error_exit;
  208. } break;
  209. default: fprintf(stderr, "%s ERROR: Invalid Token `%s`\n",
  210. tokenizer_token_loc_temp(&tkn, &tk, TLF_VIM, NULL),
  211. token_to_cstr(tk.type));
  212. goto error_exit;
  213. }
  214. tk = tokenizer_next_token(&tkn, &err);
  215. } while ( tk.type != TK_EOF );
  216. printf("%s\n", err2cstr(err));
  217. error_exit:
  218. if ( f.data != NULL ) free(f.data);
  219. if ( tk_da.data != NULL ) dyn_arr_destroy(&tk_da, NULL);
  220. (void) argc; (void) argv;
  221. return 0;
  222. }
  223. bool
  224. skip_token(struct tokenizer *tkn, char c)
  225. {
  226. UNUSED(tkn);
  227. return (c == ' ') || (c == '\r') || (c == '\t');
  228. }
  229. bool
  230. tkn_expect(struct tokenizer *tkn, enum token_type type, struct token *out_tk,
  231. enum err *out_err)
  232. {
  233. enum err err = ERR_OK;
  234. enum err *perr = &err;
  235. LIB_ARG_IF_NOT_NULL_MUST_BE(out_err, ERR_OK, false);
  236. if ( tokenizer_is_next(tkn, type, out_tk, perr) == false ) {
  237. struct token tk = {0};
  238. tk = tokenizer_next_token(tkn, perr);
  239. if ( err != ERR_OK ) {
  240. fprintf(stderr, "Failed to get next token: %s\n",
  241. err2cstr(err));
  242. return false;
  243. }
  244. fprintf(stderr, "%s ERRRO: Got wrong token, expected: %s, got: %s\n",
  245. tokenizer_token_loc_temp(tkn, &tk, TLF_VIM, NULL),
  246. token_to_cstr(type), token_to_cstr(tk.type));
  247. return false;
  248. }
  249. return true;
  250. }
  251. bool
  252. tkn_expect_id(struct tokenizer *tkn, const char *cstr, struct token *out_tk,
  253. enum err *out_err)
  254. {
  255. enum err err = ERR_OK;
  256. struct str str = {0};
  257. LIB_ARG_IF_NOT_NULL_MUST_BE(out_err, ERR_OK, false);
  258. LIB_ARG_MUST_NOT_BE_NULL(cstr, out_err, false);
  259. str = str_from_cstr_ns(cstr, &err);
  260. if ( tokenizer_is_next_id(tkn, str, out_tk, &err) == false ) {
  261. struct token tk = {0};
  262. tk = tokenizer_next_token(tkn, &err);
  263. if ( err != ERR_OK ) {
  264. fprintf(stderr, "Failed to get next token: %s\n",
  265. err2cstr(err));
  266. return false;
  267. }
  268. if ( tk.type != TK_ID ) {
  269. fprintf(stderr,
  270. "%s ERROR: Got wrong token, expected: TK_ID, got: %s\n",
  271. tokenizer_token_loc_temp(tkn, &tk, TLF_VIM, NULL),
  272. token_to_cstr(tk.type));
  273. return false;
  274. }
  275. fprintf(stderr, "%s ERROR: Got wrong id, expected: %s, got: %.*s\n",
  276. tokenizer_token_loc_temp(tkn, &tk, TLF_VIM, NULL),
  277. cstr, (int) tk.string.size, tk.string.data);
  278. return false;
  279. }
  280. return true;
  281. }
  282. bool
  283. tkn_parse_pp_directive(struct tokenizer *tkn, struct token *out_tk,
  284. enum err *out_err)
  285. {
  286. struct token tk = {0};
  287. enum err err = ERR_OK;
  288. enum err *perr = &err;
  289. LIB_ARG_IF_NOT_NULL_MUST_BE(out_err, ERR_OK, false);
  290. LIB_ARG_MUST_NOT_BE_NULL(tkn, out_err, false);
  291. if ( out_err != NULL ) {
  292. perr = out_err;
  293. }
  294. tk = tokenizer_next_token(tkn, perr);
  295. if ( *perr != ERR_OK ) {
  296. fprintf(stderr, "Failed to get next token: %s\n", err2cstr(*perr));
  297. return false;
  298. }
  299. if ( tk.type != TK_ID ) {
  300. fprintf(stderr, "%s Got wrong token, expected: TK_ID, got: %s\n",
  301. tokenizer_token_loc_temp(tkn, &tk, TLF_VIM, NULL),
  302. token_to_cstr(tk.type));
  303. return false;
  304. }
  305. if ( str_eq_cstr(tk.string, "define", 6) == true ) {
  306. struct token tk_def = {0};
  307. struct pp_def *def = NULL;
  308. def = malloc(sizeof(struct pp_def));
  309. if ( def == NULL ) {
  310. *perr = ERR_FAILED_ALLOC;
  311. goto def_exit_err;
  312. }
  313. memset(def, 0, sizeof(struct pp_def));
  314. if ( ! tkn_expect(tkn, TK_ID, &tk, perr) ) goto def_exit_err;
  315. tk_def.loc_start = tk.loc_start;
  316. def->name = str_dup(tk.string);
  317. tk = tokenizer_next_token(tkn, &err);
  318. if ( err != ERR_OK ) {
  319. fprintf(stderr, "Failed to get next token: %s\n",
  320. err2cstr(err));
  321. goto def_exit_err;
  322. }
  323. switch ( tk.type ) {
  324. case TK_ID:
  325. case TK_STR_LIT:
  326. case TK_NUM_LIT:
  327. break;
  328. case TK_NL: goto def_wout_value;
  329. default:
  330. fprintf(stderr,
  331. "%s Got wrong token, expected:"
  332. " TK_ID/TK_STR_LIT/TK_NUM_LIT, got: %s\n",
  333. tokenizer_token_loc_temp(tkn, &tk, TLF_VIM, NULL),
  334. token_to_cstr(tk.type));
  335. goto def_exit_err;
  336. }
  337. def->val = str_dup(tk.string);
  338. tk_def.loc_end = tk.loc_end;
  339. if ( ! tkn_expect(tkn, TK_NL, NULL, perr) ) goto def_exit_err;
  340. def_wout_value:
  341. tk_def.extra = def;
  342. if ( out_tk != NULL ) {
  343. *out_tk = tk_def;
  344. } else {
  345. PP_DEF_DESTROY(def);
  346. }
  347. return true;
  348. def_exit_err:
  349. PP_DEF_DESTROY(def);
  350. return false;
  351. }
  352. if ( str_eq_cstr(tk.string, "include", 7) == true ) {
  353. struct token tk_inc = {0};
  354. tk_inc.type = (enum token_type) TK_PP_INC;
  355. tk = tokenizer_next_token(tkn, &err);
  356. if ( err != ERR_OK ) {
  357. fprintf(stderr, "Failed to get next token: %s\n",
  358. err2cstr(err));
  359. return false;
  360. }
  361. if ( tk.type == TK_STR_LIT ) {
  362. tk_inc.loc_start = tk.loc_start;
  363. tk_inc.loc_end = tk.loc_end;
  364. tk_inc.string = str_dup(tk.string);
  365. goto inc_str_lit;
  366. } else if ( tk.type != TK_L_ANG_BRACKET) {
  367. fprintf(stderr,
  368. "%s Got wrong token, expected:"
  369. " TK_ID/TK_STR_LIT/TK_NUM_LIT, got: %s\n",
  370. tokenizer_token_loc_temp(tkn, &tk, TLF_VIM, NULL),
  371. token_to_cstr(tk.type));
  372. goto inc_exit_err;
  373. }
  374. if ( ! tkn_expect(tkn, TK_ID, &tk, perr) ) goto inc_exit_err;
  375. tk_inc.loc_start = tk.loc_start;
  376. tk_inc.loc_end = tk.loc_end;
  377. tk_inc.string = str_dup(tk.string);
  378. if ( ! tkn_expect(tkn, TK_DOT, NULL, perr) ) goto inc_exit_err;
  379. if ( ! tkn_expect_id(tkn, "h", NULL, perr) ) goto inc_exit_err;
  380. if ( ! tkn_expect(tkn, TK_R_ANG_BRACKET, NULL, perr) )
  381. goto inc_exit_err;
  382. if ( ! tkn_expect(tkn, TK_NL, NULL, perr) ) goto inc_exit_err;
  383. inc_str_lit:
  384. if ( out_tk != NULL ) {
  385. *out_tk = tk_inc;
  386. } else {
  387. STR_DESTROY(tk_inc.string);
  388. }
  389. return true;
  390. inc_exit_err:
  391. STR_DESTROY(tk_inc.string);
  392. return false;
  393. }
  394. if ( str_eq_cstr(tk.string, "if", 2) == true ) {
  395. return true;
  396. }
  397. if ( str_eq_cstr(tk.string, "ifdef", 2) == true ) {
  398. return true;
  399. }
  400. if ( str_eq_cstr(tk.string, "ifndef", 2) == true ) {
  401. return true;
  402. }
  403. *perr = -1;
  404. fprintf(stderr, "%s ERROR: Invalid Pre-Compiler directive `%.*s`\n",
  405. tokenizer_token_loc_temp(tkn, &tk, TLF_VIM, NULL),
  406. (int) tk.string.size, tk.string.data);
  407. return false;
  408. }
  409. bool
  410. tkn_parse_var(struct tokenizer *tkn, struct token *out_tk, enum err *out_err)
  411. {
  412. enum err err = ERR_OK;
  413. enum err *perr = &err;
  414. struct token tk = {0};
  415. struct var_decl *vd = NULL;
  416. struct {
  417. char *data;
  418. u64 size;
  419. u64 cap;
  420. } type = {0};
  421. LIB_ARG_IF_NOT_NULL_MUST_BE(out_err, ERR_OK, false);
  422. LIB_ARG_MUST_NOT_BE_NULL(tkn, out_err, false);
  423. if ( out_err != NULL ) {
  424. perr = out_err;
  425. }
  426. vd = malloc(sizeof(*vd));
  427. if ( vd == NULL ) {
  428. *perr = ERR_FAILED_ALLOC;
  429. goto exit_err;
  430. }
  431. memset(vd, 0, sizeof(*vd));
  432. if ( ! tkn_expect(tkn, TK_ID, &tk, perr) ) goto exit_err;
  433. DA_APPEND_DATA(type, tk.string.data, tk.string.size, perr);
  434. DA_APPEND(type, ' ', perr);
  435. while ( true ) {
  436. /* bool is_name = false;*/
  437. /*enum token_type ntt = tokenizer_peek_token_type(tkn, NULL);*/
  438. /*is_name = ( ntt == TK_COMMA ) || ( ntt == TK_SEMICOLON )
  439. || ( ntt == TK_ASTERISK ) || ( ntt == TK_EQUAL );*/
  440. tk = tokenizer_next_token(tkn, NULL);
  441. switch ( tk.type ) {
  442. case TK_ID: break;
  443. case TK_ASTERISK: break;
  444. case TK_COMMA: break;
  445. case TK_SEMICOLON: break;
  446. default:
  447. fprintf(stderr,
  448. "%s Got wrong token, expected:"
  449. " TK_ID/TK_ASTERISK/TK_COMMA/TK_SEMICOLON, got: %s\n",
  450. tokenizer_token_loc_temp(tkn, &tk, TLF_VIM, NULL),
  451. token_to_cstr(tk.type));
  452. goto exit_err;
  453. }
  454. }
  455. TODO("Rest of var decl!");
  456. if ( ! tkn_expect(tkn, TK_ID, &tk, perr) ) goto exit_err;
  457. vd->name = str_dup(tk.string);
  458. if ( ! tkn_expect(tkn, TK_COMMA, NULL, perr) ) goto exit_err;
  459. if ( out_tk != NULL ) {
  460. *out_tk = tk;
  461. }
  462. exit_err:
  463. LIB_FREE(vd);
  464. LIB_FREE(type.data);
  465. if ( *perr == ERR_OK ) *perr = ERR_GENERAL_ERROR;
  466. return false;
  467. }
  468. bool
  469. tkn_parse_decl(struct tokenizer *tkn, struct token *out_tk, enum err *out_err)
  470. {
  471. struct token tk = {0};
  472. struct token tk_type = {0};
  473. enum err err = ERR_OK;
  474. enum err *perr = &err;
  475. LIB_ARG_IF_NOT_NULL_MUST_BE(out_err, ERR_OK, false);
  476. LIB_ARG_MUST_NOT_BE_NULL(tkn, out_err, false);
  477. if ( out_err != NULL ) {
  478. perr = out_err;
  479. }
  480. tk_type = tkn->last;
  481. if ( ! tkn_expect(tkn, TK_ID, &tk, perr) ) return false;
  482. switch ( tokenizer_next_token_type(tkn, perr) ) {
  483. case TK_L_BRACES: {
  484. struct token tk_fd = {0};
  485. struct func_decl *fd = NULL;
  486. fd = malloc(sizeof(struct func_decl));
  487. if ( fd == NULL ) {
  488. *out_err = ERR_FAILED_ALLOC;
  489. goto func_decl_exit_err;
  490. }
  491. memset(fd, 0, sizeof(*fd));
  492. fd->args.cap = 32;
  493. fd->args.data = malloc(sizeof(*fd->args.data) * fd->args.cap);
  494. if ( fd->args.data == NULL ) {
  495. *out_err = ERR_FAILED_ALLOC;
  496. goto func_decl_exit_err;
  497. }
  498. memset(fd->args.data, 0, sizeof(*fd->args.data) * fd->args.cap);
  499. tk_fd.loc_start = tk_type.loc_start;
  500. fd->ret_type = str_dup(tk_type.string);
  501. fd->name = str_dup(tk.string);
  502. while ( true ) {
  503. struct token tk_vd = {0};
  504. struct var_decl *vd = NULL;
  505. tkn_parse_var(tkn, &tk_vd, perr);
  506. if ( *perr != ERR_OK ) goto func_decl_exit_err;
  507. vd = tk_vd.extra;
  508. DA_APPEND(fd->args, *vd, perr);
  509. };
  510. if ( out_tk != NULL ) {
  511. *out_tk = tk_fd;
  512. } else {
  513. func_decl_destroy(fd);
  514. }
  515. return true;
  516. func_decl_exit_err:
  517. func_decl_destroy(fd);
  518. return false;
  519. /*
  520. struct func_decl {
  521. struct str ret_type;
  522. struct str name;
  523. struct {
  524. struct str *data;
  525. u64 size;
  526. u64 cap;
  527. } args;
  528. };
  529. */
  530. } break;
  531. case TK_INVALID:
  532. fprintf(stderr, "Failed to get next token: %s\n", err2cstr(*perr));
  533. return false;
  534. default:
  535. fprintf(stderr,
  536. "%s Got wrong token, expected: TK_L_BRACES, got: %s\n",
  537. tokenizer_token_loc_temp(tkn, &tk, TLF_VIM, NULL),
  538. token_to_cstr(tk.type));
  539. }
  540. /*
  541. tk = tokenizer_next_token(tkn, perr);
  542. if ( *perr != ERR_OK ) {
  543. fprintf(stderr, "Failed to get next token: %s\n", err2cstr(*perr));
  544. return false;
  545. }
  546. if ( tk.type != TK_ID ) {
  547. fprintf(stderr, "%s Got wrong token, expected: TK_ID, got: %s\n",
  548. tokenizer_token_loc_temp(tkn, &tk, TLF_VIM, NULL),
  549. token_to_cstr(tk.type));
  550. return false;
  551. }
  552. */
  553. UNUSED(tk_type);
  554. UNUSED(out_tk);
  555. *perr = ERR_OK;
  556. fprintf(stderr, "%s ERROR: Invalid declaration id `%.*s`\n",
  557. tokenizer_token_loc_temp(tkn, &tkn->last, TLF_VIM, NULL),
  558. (int) tk.string.size, tk.string.data);
  559. return false;
  560. }
  561. /*
  562. int
  563. main(void)
  564. {
  565. }
  566. */