+ size_t i = 0, n = 0;
+ bool stringify = false, paste = false;
+ struct psi_token *tok, **exp_tokens = calloc(psi_plist_count(tokens), sizeof(*exp_tokens));
+
+ while (psi_plist_get(tokens, i++, &tok)) {
+ struct psi_token *new_tok;
+
+ if (tok->type == PSI_T_EOL) {
+ continue;
+ }
+ if (tok->type == PSI_T_HASH) {
+ stringify = true;
+ continue;
+ }
+ if (tok->type == PSI_T_CPP_PASTE) {
+ paste = true;
+ continue;
+ }
+
+ if (paste && n > 0 && exp_tokens[n - 1]) {
+ struct psi_token *old_tok = exp_tokens[n - 1];
+
+ new_tok = psi_token_init(old_tok->type, "", 0,
+ target->col, target->line, target->file?:"");
+
+ new_tok = psi_token_cat(NULL, 2, new_tok, old_tok, tok);
+ free(old_tok);
+
+ exp_tokens[n - 1] = new_tok;
+ } else {
+ new_tok = psi_token_init(stringify ? PSI_T_QUOTED_STRING : tok->type,
+ tok->text, tok->size, target->col, target->line, target->file?:"");