diff options
| author | 2026-01-09 19:19:17 +0100 | |
|---|---|---|
| committer | 2026-01-09 19:24:41 +0100 | |
| commit | 95301a8b8ece4b6d823e84bcff8a67d518840491 (patch) | |
| tree | 11b0aba86ae26b5b3330a01c9d082dc92405a3b2 | |
| parent | 0355a01d205983737d0fe1bcb1d542be6b12491e (diff) | |
cpp: fix pasting ident+keyword
| -rw-r--r-- | c/lex.c | 11 | ||||
| -rw-r--r-- | test/07-pp.c | 16 |
2 files changed, 23 insertions, 4 deletions
@@ -281,6 +281,7 @@ readstrchrlit(struct lexer *lx, struct token *tk, char delim, int wide) span.sl.len = lx->chridx - span.sl.off; error(&span, "hex escape sequence out of range"); } + c = n; break; default: if (aisodigit(c)) { /* octal */ @@ -749,6 +750,8 @@ ppskipline(struct lexer *lx) } } +#define isppident(tk) in_range((tk).t, TKIDENT, TKWEND_) + static bool tokpaste(struct lexer *lx, struct token *dst, const struct token *l, const struct token *r) { @@ -756,10 +759,10 @@ tokpaste(struct lexer *lx, struct token *dst, const struct token *l, const struc dst->span = l->span; if (dst->span.ex.file == r->span.ex.file && dst->span.ex.off < r->span.ex.off) joinspan(&dst->span.ex, r->span.ex); - if (l->t == TKIDENT && (r->t == TKIDENT || r->t == TKNUMLIT)) { + if (isppident(*l) && (isppident(*r) || r->t == TKNUMLIT)) { /* foo ## bar ; foo ## 123 */ dst->t = TKIDENT; - } else if (l->t == TKNUMLIT && (r->t == TKIDENT || r->t == TKNUMLIT)) { + } else if (l->t == TKNUMLIT && (isppident(*r) || r->t == TKNUMLIT)) { /* 0x ## abc ; 213 ## 456 */ dst->t = TKNUMLIT; } else if (l->t && !r->t) { @@ -790,11 +793,11 @@ tokpaste(struct lexer *lx, struct token *dst, const struct token *l, const struc char buf[200]; dst->len = l->len + r->len; - char *s = (dst->t == TKIDENT && dst->len + 1 < sizeof buf) ? buf : alloc(lx->tmparena, dst->len + 1, 1); + char *s = (isppident(*dst) && dst->len + 1 < sizeof buf) ? buf : alloc(lx->tmparena, dst->len + 1, 1); memcpy(s, l->s, l->len); memcpy(s + l->len, r->s, r->len); s[dst->len] = 0; - if (dst->t == TKIDENT) { + if (isppident(*dst)) { dst->blue = 0; dst->name = intern(s); } else { diff --git a/test/07-pp.c b/test/07-pp.c index 071b359..14bef33 100644 --- a/test/07-pp.c +++ b/test/07-pp.c @@ -34,6 +34,22 @@ s #define gnu_ext(a, c...) a(c) +# define STACK_OF(type) struct stack_st_##type + +/* Helper macro for internal use */ +# define SKM_DEFINE_STACK_OF_INTERNAL(t1, t2, t3) \ + STACK_OF(t1); \ + typedef int (*sk_##t1##_compfunc)(const t3 * const *a, const t3 *const *b); \ + typedef void (*sk_##t1##_freefunc)(t3 *a); \ + typedef t3 * (*sk_##t1##_copyfunc)(const t3 *a); \ + +struct crypto_ex_data_st { + void *ctx; + STACK_OF(void) *sk; +}; + +SKM_DEFINE_STACK_OF_INTERNAL(void, void, void) + #ifdef CMD_WORKING int main(V) |