+ if (!builtin->func(cpp, target, arg_tokens_list, &res)) {
+ struct psi_token *zero = psi_token_init(PSI_T_NUMBER, "0", 1,
+ target->col, target->line, target->file);
+ psi_cpp_tokiter_add(cpp, zero);
+ } else if (!res) {
+ struct psi_token *one = psi_token_init(PSI_T_NUMBER, "1", 1,
+ target->col, target->line, target->file);
+ psi_cpp_tokiter_add(cpp, one);
+ } else {
+ psi_cpp_tokiter_expand_tokens(cpp, target, res);
+ psi_plist_free(res);
+ }
+}
+
+static inline bool psi_cpp_tokiter_expand_builtin(struct psi_cpp *cpp,
+ struct psi_token *target, struct psi_builtin *builtin)
+{
+ size_t start = psi_cpp_tokiter_index(cpp), argc = 0;
+ struct psi_plist **arg_tokens_list = NULL;
+
+ if (builtin->decl->sig) {
+ argc = psi_plist_count(builtin->decl->sig);
+ /* read in tokens, until we have balanced parens */
+ arg_tokens_list = psi_cpp_tokiter_read_call_tokens(cpp, argc);
+ if (!arg_tokens_list) {
+ psi_cpp_tokiter_seek(cpp, start);
+ return false;
+ }
+ } else {
+ psi_cpp_tokiter_next(cpp);
+ }
+
+ psi_cpp_tokiter_expand_builtin_tokens(cpp, target, builtin, arg_tokens_list);
+ if (arg_tokens_list) {
+ psi_cpp_tokiter_free_call_tokens(arg_tokens_list, argc, true);
+ }