diff --git a/Makefile.am b/Makefile.am index 20de4b4..d8e1ee0 100644 --- a/Makefile.am +++ b/Makefile.am @@ -57,6 +57,7 @@ check_PROGRAMS = \ bin/check/ldouble \ bin/check/long \ bin/check/longlong \ + bin/check/meta \ bin/check/month \ bin/check/percent \ bin/check/person \ @@ -76,6 +77,7 @@ TESTS = \ bin/check/ldouble \ bin/check/long \ bin/check/longlong \ + bin/check/meta \ bin/check/month \ bin/check/percent \ bin/check/person \ @@ -106,6 +108,7 @@ bin_check_intmax_SOURCES = src/fmt.c test/intmax.c bin_check_ldouble_SOURCES = src/fmt.c test/ldouble.c bin_check_long_SOURCES = src/fmt.c test/long.c bin_check_longlong_SOURCES = src/fmt.c test/longlong.c +bin_check_meta_SOURCES = src/fmt.c test/meta.c bin_check_month_SOURCES = src/fmt.c test/month.c bin_check_percent_SOURCES = src/fmt.c test/percent.c bin_check_person_SOURCES = src/fmt.c test/person.c diff --git a/configure.ac b/configure.ac index 3c904a6..fe07f79 100644 --- a/configure.ac +++ b/configure.ac @@ -7,7 +7,7 @@ AC_PREREQ([2.68]) # Initialize package -AC_INIT([fmt], [3.0.6], [fmt@guillermo.in], [fmt], [https://github.com/guillermocalvo/fmt/]) +AC_INIT([fmt], [1.3], [fmt@guillermo.in], [fmt], [https://github.com/guillermocalvo/fmt/]) # Information on the package diff --git a/package.json b/package.json index 3d32fbc..3ee6ff9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "fmt", - "version": "1.2", + "version": "1.3", "description": "A tiny C string formatting library", "repo": "guillermocalvo/fmt", "license": "LGPL", diff --git a/src/fmt.c b/src/fmt.c index fdf1081..61d48a4 100644 --- a/src/fmt.c +++ b/src/fmt.c @@ -4,7 +4,7 @@ * * fmt source code file * - * @version 1.2 + * @version 1.3 * @author Copyright (c) 2017 Guillermo Calvo * */ @@ -32,6 +32,7 @@ # define PARAM_MARK '%' # define PARAM_BEGIN '{' +# define PARAM_META '@' # define PARAM_OPTIONS ':' # define PARAM_END '}' @@ -241,6 +242,11 @@ int fmt_vprint(struct fmt_stream * out, const char * format, va_list * arg){ case TYPE_PERCENT: result = PRINT_BUILTIN(out, param, arg, 0); break; } + }else if(*param.id == PARAM_META){ + /* print meta formatter */ + fmt_formatter meta = va_arg(*arg, fmt_formatter); + result = meta(out, param.id + 1, param.options, arg); + }else{ /* print extended parameter */ struct fmt_handler * handler = NULL; diff --git a/src/fmt.h b/src/fmt.h index 9040139..9aad813 100644 --- a/src/fmt.h +++ b/src/fmt.h @@ -4,7 +4,7 @@ * * fmt header file * - * @version 1.2 + * @version 1.3 * @author Copyright (c) 2017 Guillermo Calvo * */ diff --git a/test/meta.c b/test/meta.c new file mode 100644 index 0000000..f909750 --- /dev/null +++ b/test/meta.c @@ -0,0 +1,28 @@ + +# include "testing.h" + + +static char buffer[128]; + +int format_meta(struct fmt_stream * out, const char * id, const char * options, va_list * arg); + +/** + * Test print meta formatter + */ +TEST_CASE{ + + struct fmt_stream out = {0}; + + fmt_stream_buffer(&out, buffer, sizeof(buffer)); + + (void)fmt_print(&out, "TEST %{@META:OPTIONS} TEST", format_meta, 123); + + TEST_EQUALS("TEST (META/123/OPTIONS) TEST", buffer); +} + +int format_meta(struct fmt_stream * out, const char * id, const char * options, va_list * arg){ + + int number = va_arg(*arg, int); + + return( fmt_print_builtin(out, "(%s/%d/%s)", id, number, options) ); +}