diff --git a/libc/src/__support/arg_list.h b/libc/src/__support/arg_list.h --- a/libc/src/__support/arg_list.h +++ b/libc/src/__support/arg_list.h @@ -12,6 +12,7 @@ #include "src/__support/common.h" #include +#include namespace __llvm_libc { namespace internal { @@ -32,6 +33,42 @@ template LIBC_INLINE T next_var() { return va_arg(vlist, T); } }; +// Used for testing things that use an ArgList. +class MockArgList { + size_t arg_counter = 0; + +public: + LIBC_INLINE MockArgList() = default; + LIBC_INLINE MockArgList(va_list vlist) { + // Copy the vlist to suppress "unused parameter" warnings. + va_list copy_vlist; + va_copy(copy_vlist, vlist); + va_end(copy_vlist); + } + LIBC_INLINE MockArgList(MockArgList &other) { + arg_counter = other.arg_counter; + } + LIBC_INLINE ~MockArgList() = default; + + LIBC_INLINE MockArgList &operator=(MockArgList &rhs) { + arg_counter = rhs.arg_counter; + return *this; + } + + template LIBC_INLINE T next_var() { + ++arg_counter; + return T(arg_counter); + } + + size_t read_count() const { return arg_counter; } +}; + +#ifndef LIBC_COPT_MOCK_ARG_LIST +using ArgProvider = ArgList; +#else // not defined LIBC_COPT_MOCK_ARG_LIST +using ArgProvider = MockArgList; +#endif // LIBC_COPT_MOCK_ARG_LIST + } // namespace internal } // namespace __llvm_libc diff --git a/libc/src/stdio/fprintf.cpp b/libc/src/stdio/fprintf.cpp --- a/libc/src/stdio/fprintf.cpp +++ b/libc/src/stdio/fprintf.cpp @@ -21,9 +21,9 @@ ...)) { va_list vlist; va_start(vlist, format); - internal::ArgList args(vlist); // This holder class allows for easier copying - // and pointer semantics, as well as handling - // destruction automatically. + internal::ArgProvider args(vlist); // This holder class allows for easier + // copying and pointer semantics, as well + // as handling destruction automatically. va_end(vlist); int ret_val = printf_core::vfprintf_internal(stream, format, args); return ret_val; diff --git a/libc/src/stdio/fscanf.cpp b/libc/src/stdio/fscanf.cpp --- a/libc/src/stdio/fscanf.cpp +++ b/libc/src/stdio/fscanf.cpp @@ -22,9 +22,9 @@ ...)) { va_list vlist; va_start(vlist, format); - internal::ArgList args(vlist); // This holder class allows for easier copying - // and pointer semantics, as well as handling - // destruction automatically. + internal::ArgProvider args(vlist); // This holder class allows for easier + // copying and pointer semantics, as well + // as handling destruction automatically. va_end(vlist); int ret_val = scanf_core::vfscanf_internal(stream, format, args); // This is done to avoid including stdio.h in the internals. On most systems diff --git a/libc/src/stdio/printf.cpp b/libc/src/stdio/printf.cpp --- a/libc/src/stdio/printf.cpp +++ b/libc/src/stdio/printf.cpp @@ -19,9 +19,9 @@ LLVM_LIBC_FUNCTION(int, printf, (const char *__restrict format, ...)) { va_list vlist; va_start(vlist, format); - internal::ArgList args(vlist); // This holder class allows for easier copying - // and pointer semantics, as well as handling - // destruction automatically. + internal::ArgProvider args(vlist); // This holder class allows for easier + // copying and pointer semantics, as well + // as handling destruction automatically. va_end(vlist); int ret_val = printf_core::vfprintf_internal( reinterpret_cast<::FILE *>(__llvm_libc::stdout), format, args); diff --git a/libc/src/stdio/printf_core/parser.h b/libc/src/stdio/printf_core/parser.h --- a/libc/src/stdio/printf_core/parser.h +++ b/libc/src/stdio/printf_core/parser.h @@ -24,20 +24,20 @@ const char *__restrict str; size_t cur_pos = 0; - internal::ArgList args_cur; + internal::ArgProvider args_cur; #ifndef LIBC_COPT_PRINTF_DISABLE_INDEX_MODE // args_start stores the start of the va_args, which is allows getting the // value of arguments that have already been passed. args_index is tracked so // that we know which argument args_cur is on. - internal::ArgList args_start; + internal::ArgProvider args_start; size_t args_index = 1; // Defined in printf_config.h static constexpr size_t DESC_ARR_LEN = LIBC_COPT_PRINTF_INDEX_ARR_LEN; - // desc_arr stores the sizes of the variables in the ArgList. This is used in - // index mode to reduce repeated string parsing. The sizes are stored as + // desc_arr stores the sizes of the variables in the ArgProvider. This is used + // in index mode to reduce repeated string parsing. The sizes are stored as // TypeDesc objects, which store the size as well as minimal type information. // This is necessary because some systems separate the floating point and // integer values in va_args. @@ -49,10 +49,12 @@ public: #ifndef LIBC_COPT_PRINTF_DISABLE_INDEX_MODE - LIBC_INLINE Parser(const char *__restrict new_str, internal::ArgList &args) + LIBC_INLINE Parser(const char *__restrict new_str, + internal::ArgProvider &args) : str(new_str), args_cur(args), args_start(args) {} #else - LIBC_INLINE Parser(const char *__restrict new_str, internal::ArgList &args) + LIBC_INLINE Parser(const char *__restrict new_str, + internal::ArgProvider &args) : str(new_str), args_cur(args) {} #endif // LIBC_COPT_PRINTF_DISABLE_INDEX_MODE @@ -111,7 +113,7 @@ return get_next_arg_value(); } - // the ArgList can only return the next item in the list. This function is + // the ArgProvider can only return the next item in the list. This function is // used in index mode when the item that needs to be read is not the next one. // It moves cur_args to the index requested so the the appropriate value may // be read. This may involve parsing the format string, and is in the worst diff --git a/libc/src/stdio/printf_core/printf_main.h b/libc/src/stdio/printf_core/printf_main.h --- a/libc/src/stdio/printf_core/printf_main.h +++ b/libc/src/stdio/printf_core/printf_main.h @@ -18,7 +18,7 @@ namespace printf_core { int printf_main(Writer *writer, const char *__restrict str, - internal::ArgList &args); + internal::ArgProvider &args); } // namespace printf_core } // namespace __llvm_libc diff --git a/libc/src/stdio/printf_core/printf_main.cpp b/libc/src/stdio/printf_core/printf_main.cpp --- a/libc/src/stdio/printf_core/printf_main.cpp +++ b/libc/src/stdio/printf_core/printf_main.cpp @@ -20,7 +20,7 @@ namespace printf_core { int printf_main(Writer *writer, const char *__restrict str, - internal::ArgList &args) { + internal::ArgProvider &args) { Parser parser(str, args); int result = 0; for (FormatSection cur_section = parser.get_next_section(); diff --git a/libc/src/stdio/printf_core/vfprintf_internal.h b/libc/src/stdio/printf_core/vfprintf_internal.h --- a/libc/src/stdio/printf_core/vfprintf_internal.h +++ b/libc/src/stdio/printf_core/vfprintf_internal.h @@ -17,7 +17,7 @@ namespace printf_core { int vfprintf_internal(::FILE *__restrict stream, const char *__restrict format, - internal::ArgList &args); + internal::ArgProvider &args); } // namespace printf_core } // namespace __llvm_libc diff --git a/libc/src/stdio/printf_core/vfprintf_internal.cpp b/libc/src/stdio/printf_core/vfprintf_internal.cpp --- a/libc/src/stdio/printf_core/vfprintf_internal.cpp +++ b/libc/src/stdio/printf_core/vfprintf_internal.cpp @@ -19,7 +19,7 @@ namespace printf_core { int vfprintf_internal(::FILE *__restrict stream, const char *__restrict format, - internal::ArgList &args) { + internal::ArgProvider &args) { FileWriter file_writer(stream); printf_core::Writer writer(reinterpret_cast(&file_writer), printf_core::FileWriter::write_str, diff --git a/libc/src/stdio/scanf.cpp b/libc/src/stdio/scanf.cpp --- a/libc/src/stdio/scanf.cpp +++ b/libc/src/stdio/scanf.cpp @@ -20,9 +20,9 @@ LLVM_LIBC_FUNCTION(int, scanf, (const char *__restrict format, ...)) { va_list vlist; va_start(vlist, format); - internal::ArgList args(vlist); // This holder class allows for easier copying - // and pointer semantics, as well as handling - // destruction automatically. + internal::ArgProvider args(vlist); // This holder class allows for easier + // copying and pointer semantics, as well + // as handling destruction automatically. va_end(vlist); int ret_val = scanf_core::vfscanf_internal( reinterpret_cast<::FILE *>(__llvm_libc::stdin), format, args); diff --git a/libc/src/stdio/scanf_core/parser.h b/libc/src/stdio/scanf_core/parser.h --- a/libc/src/stdio/scanf_core/parser.h +++ b/libc/src/stdio/scanf_core/parser.h @@ -23,22 +23,24 @@ const char *__restrict str; size_t cur_pos = 0; - internal::ArgList args_cur; + internal::ArgProvider args_cur; #ifndef LIBC_COPT_SCANF_DISABLE_INDEX_MODE // args_start stores the start of the va_args, which is used when a previous // argument is needed. In that case, we have to read the arguments from the // beginning since they don't support reading backwards. - internal::ArgList args_start; + internal::ArgProvider args_start; size_t args_index = 1; #endif // LIBC_COPT_SCANF_DISABLE_INDEX_MODE public: #ifndef LIBC_COPT_SCANF_DISABLE_INDEX_MODE - LIBC_INLINE Parser(const char *__restrict new_str, internal::ArgList &args) + LIBC_INLINE Parser(const char *__restrict new_str, + internal::ArgProvider &args) : str(new_str), args_cur(args), args_start(args) {} #else - LIBC_INLINE Parser(const char *__restrict new_str, internal::ArgList &args) + LIBC_INLINE Parser(const char *__restrict new_str, + internal::ArgProvider &args) : str(new_str), args_cur(args) {} #endif // LIBC_COPT_SCANF_DISABLE_INDEX_MODE @@ -84,7 +86,7 @@ return get_next_arg_value(); } - // the ArgList can only return the next item in the list. This function is + // the ArgProvider can only return the next item in the list. This function is // used in index mode when the item that needs to be read is not the next one. // It moves cur_args to the index requested so the the appropriate value may // be read. This may involve parsing the format string, and is in the worst diff --git a/libc/src/stdio/scanf_core/scanf_main.h b/libc/src/stdio/scanf_core/scanf_main.h --- a/libc/src/stdio/scanf_core/scanf_main.h +++ b/libc/src/stdio/scanf_core/scanf_main.h @@ -18,7 +18,7 @@ namespace scanf_core { int scanf_main(Reader *reader, const char *__restrict str, - internal::ArgList &args); + internal::ArgProvider &args); } // namespace scanf_core } // namespace __llvm_libc diff --git a/libc/src/stdio/scanf_core/scanf_main.cpp b/libc/src/stdio/scanf_core/scanf_main.cpp --- a/libc/src/stdio/scanf_core/scanf_main.cpp +++ b/libc/src/stdio/scanf_core/scanf_main.cpp @@ -20,7 +20,7 @@ namespace scanf_core { int scanf_main(Reader *reader, const char *__restrict str, - internal::ArgList &args) { + internal::ArgProvider &args) { Parser parser(str, args); int ret_val = READ_OK; int conversions = 0; diff --git a/libc/src/stdio/scanf_core/vfscanf_internal.h b/libc/src/stdio/scanf_core/vfscanf_internal.h --- a/libc/src/stdio/scanf_core/vfscanf_internal.h +++ b/libc/src/stdio/scanf_core/vfscanf_internal.h @@ -17,7 +17,7 @@ namespace scanf_core { int vfscanf_internal(::FILE *__restrict stream, const char *__restrict format, - internal::ArgList &args); + internal::ArgProvider &args); } // namespace scanf_core } // namespace __llvm_libc diff --git a/libc/src/stdio/scanf_core/vfscanf_internal.cpp b/libc/src/stdio/scanf_core/vfscanf_internal.cpp --- a/libc/src/stdio/scanf_core/vfscanf_internal.cpp +++ b/libc/src/stdio/scanf_core/vfscanf_internal.cpp @@ -19,7 +19,7 @@ namespace scanf_core { int vfscanf_internal(::FILE *__restrict stream, const char *__restrict format, - internal::ArgList &args) { + internal::ArgProvider &args) { FileReader file_reader(stream); scanf_core::Reader reader(&file_reader); return scanf_core::scanf_main(&reader, format, args); diff --git a/libc/src/stdio/snprintf.cpp b/libc/src/stdio/snprintf.cpp --- a/libc/src/stdio/snprintf.cpp +++ b/libc/src/stdio/snprintf.cpp @@ -23,9 +23,9 @@ const char *__restrict format, ...)) { va_list vlist; va_start(vlist, format); - internal::ArgList args(vlist); // This holder class allows for easier copying - // and pointer semantics, as well as handling - // destruction automatically. + internal::ArgProvider args(vlist); // This holder class allows for easier + // copying and pointer semantics, as well + // as handling destruction automatically. va_end(vlist); printf_core::StringWriter str_writer(buffer, (buffsz > 0 ? buffsz - 1 : 0)); printf_core::Writer writer(reinterpret_cast(&str_writer), diff --git a/libc/src/stdio/sprintf.cpp b/libc/src/stdio/sprintf.cpp --- a/libc/src/stdio/sprintf.cpp +++ b/libc/src/stdio/sprintf.cpp @@ -22,9 +22,9 @@ ...)) { va_list vlist; va_start(vlist, format); - internal::ArgList args(vlist); // This holder class allows for easier copying - // and pointer semantics, as well as handling - // destruction automatically. + internal::ArgProvider args(vlist); // This holder class allows for easier + // copying and pointer semantics, as well + // as handling destruction automatically. va_end(vlist); printf_core::StringWriter str_writer(buffer); printf_core::Writer writer(reinterpret_cast(&str_writer), diff --git a/libc/src/stdio/sscanf.cpp b/libc/src/stdio/sscanf.cpp --- a/libc/src/stdio/sscanf.cpp +++ b/libc/src/stdio/sscanf.cpp @@ -23,9 +23,9 @@ const char *__restrict format, ...)) { va_list vlist; va_start(vlist, format); - internal::ArgList args(vlist); // This holder class allows for easier copying - // and pointer semantics, as well as handling - // destruction automatically. + internal::ArgProvider args(vlist); // This holder class allows for easier + // copying and pointer semantics, as well + // as handling destruction automatically. va_end(vlist); scanf_core::StringReader string_reader(buffer); scanf_core::Reader reader(&string_reader); diff --git a/libc/test/src/__support/arg_list_test.cpp b/libc/test/src/__support/arg_list_test.cpp --- a/libc/test/src/__support/arg_list_test.cpp +++ b/libc/test/src/__support/arg_list_test.cpp @@ -13,7 +13,7 @@ int get_nth_int(int n, ...) { va_list vlist; va_start(vlist, n); - __llvm_libc::internal::ArgList v(vlist); + __llvm_libc::internal::ArgProvider v(vlist); va_end(vlist); for (int i = 0; i < n; ++i) { @@ -29,10 +29,10 @@ int sum_two_nums(int first, int second, ...) { va_list vlist; va_start(vlist, second); - __llvm_libc::internal::ArgList v1(vlist); + __llvm_libc::internal::ArgProvider v1(vlist); va_end(vlist); - __llvm_libc::internal::ArgList v2 = v1; + __llvm_libc::internal::ArgProvider v2 = v1; int first_val; for (int i = 0; i < first; ++i) { diff --git a/libc/test/src/stdio/printf_core/parser_test.cpp b/libc/test/src/stdio/printf_core/parser_test.cpp --- a/libc/test/src/stdio/printf_core/parser_test.cpp +++ b/libc/test/src/stdio/printf_core/parser_test.cpp @@ -21,7 +21,7 @@ void init(const char *__restrict str, ...) { va_list vlist; va_start(vlist, str); - __llvm_libc::internal::ArgList v(vlist); + __llvm_libc::internal::ArgProvider v(vlist); va_end(vlist); __llvm_libc::printf_core::Parser parser(str, v); @@ -31,7 +31,7 @@ const char *__restrict str, ...) { va_list vlist; va_start(vlist, str); - __llvm_libc::internal::ArgList v(vlist); + __llvm_libc::internal::ArgProvider v(vlist); va_end(vlist); __llvm_libc::printf_core::Parser parser(str, v); diff --git a/libc/test/src/stdio/scanf_core/parser_test.cpp b/libc/test/src/stdio/scanf_core/parser_test.cpp --- a/libc/test/src/stdio/scanf_core/parser_test.cpp +++ b/libc/test/src/stdio/scanf_core/parser_test.cpp @@ -22,7 +22,7 @@ void init(const char *__restrict str, ...) { va_list vlist; va_start(vlist, str); - __llvm_libc::internal::ArgList v(vlist); + __llvm_libc::internal::ArgProvider v(vlist); va_end(vlist); __llvm_libc::scanf_core::Parser parser(str, v); @@ -32,7 +32,7 @@ const char *__restrict str, ...) { va_list vlist; va_start(vlist, str); - __llvm_libc::internal::ArgList v(vlist); + __llvm_libc::internal::ArgProvider v(vlist); va_end(vlist); __llvm_libc::scanf_core::Parser parser(str, v);