From e8068fbe25c84e62299495fab1b1b1475e35ef56 Mon Sep 17 00:00:00 2001 From: nsfisis Date: Thu, 8 May 2025 23:36:33 +0900 Subject: support ellipsis in functiion parameters --- justfile | 4 +--- main.c | 21 ++++++++++++++++++--- tests/045.sh | 10 ++++++---- 3 files changed, 25 insertions(+), 10 deletions(-) diff --git a/justfile b/justfile index 5ba42a6..86a53e3 100644 --- a/justfile +++ b/justfile @@ -1,11 +1,9 @@ -CFLAGS := "-Wno-builtin-declaration-mismatch" - all: build build N="1": #!/usr/bin/env bash if [[ {{N}} = 1 ]]; then - gcc -g -O0 -o ducc main.c {{CFLAGS}} + gcc -g -O0 -o ducc main.c else if [[ {{N}} = 2 ]]; then prev="" diff --git a/main.c b/main.c index 146c93a..671595e 100644 --- a/main.c +++ b/main.c @@ -9,8 +9,8 @@ int isalpha(int); int isdigit(int); int isspace(int); void* memcpy(void*, void*, size_t); -int printf(); -int sprintf(); +int printf(const char*, ...); +int sprintf(char*, const char*, ...); int strcmp(const char*, const char*); char* strstr(const char*, const char*); @@ -54,6 +54,7 @@ enum TokenKind { TokenKind_bracket_r, TokenKind_comma, TokenKind_dot, + TokenKind_ellipsis, TokenKind_eq, TokenKind_ge, TokenKind_gt, @@ -173,7 +174,17 @@ Token* tokenize(char* src) { } else if (c == '%') { tok->kind = TokenKind_percent; } else if (c == '.') { - tok->kind = TokenKind_dot; + if (src[pos] == '.') { + ++pos; + if (src[pos] == '.') { + ++pos; + tok->kind = TokenKind_ellipsis; + } else { + fatal_error("unknown token: .."); + } + } else { + tok->kind = TokenKind_dot; + } } else if (c == '!') { if (src[pos] == '=') { ++pos; @@ -1418,6 +1429,10 @@ AstNode* parse_param_list(Parser* p) { int has_void = 0; AstNode* list = ast_new_list(6); while (peek_token(p)->kind != TokenKind_paren_r) { + if (peek_token(p)->kind == TokenKind_ellipsis) { + next_token(p); + break; + } AstNode* param = parse_param(p); has_void = has_void || param->ty->kind == TypeKind_void; ast_append(list, param); diff --git a/tests/045.sh b/tests/045.sh index 18f8e76..f788b62 100644 --- a/tests/045.sh +++ b/tests/045.sh @@ -3,17 +3,19 @@ set -e cat <<'EOF' > expected EOF bash ../../test_diff.sh <<'EOF' +typedef long size_t; + int atoi(const char*); -void* calloc(long, long); +void* calloc(size_t, size_t); void exit(int); int getchar(void); int isalnum(int); int isalpha(int); int isdigit(int); int isspace(int); -void* memcpy(void*, void*, long); -int printf(); -int sprintf(); +void* memcpy(void*, void*, size_t); +int printf(const char*, ...); +int sprintf(char*, const char*, ...); int strcmp(const char*, const char*); char* strstr(const char*, const char*); -- cgit v1.2.3-70-g09d2