* Add support for extented variable for M_[F]PRINT
* Update documentation * Add test.
This commit is contained in:
1 parent
3c83e4088c
commit
36003b6bb3
4 files changed
+51
-21
No files matched your search
@@ -5868,13 +5868,17 @@ Return the printf format associated to the type of 'x'.
|
|||||||
|
|
||||||
##### M\_PRINT\_ARG(x)
|
##### M\_PRINT\_ARG(x)
|
||||||
|
|
||||||
Print using printf the variable 'x'. The format of 'x' is deduced provided that it is a standard numerical C type.
|
Print using printf the variable 'x'.
|
||||||
If m-string is included, it supports also the type 'string\_t'.
|
|
||||||
|
The format of 'x' is deduced provided that it is a standard numerical C type.
|
||||||
|
If m-string is included, it supports also the type 'string\_t' natively.
|
||||||
|
If the argument is extended (i.e. in the format '(var, optype)' with optype being either an oplist or a type
|
||||||
|
with a globally registered oplist), then it will call the OUT\_STR method of the oplist on the variable 'var'.
|
||||||
|
|
||||||
##### M\_FPRINT\_ARG(file, x)
|
##### M\_FPRINT\_ARG(file, x)
|
||||||
|
|
||||||
Print into a file 'file' using fprintf the variable 'x'. The format of 'x' is deduced provided that it is a standard numerical C type.
|
Print into a file 'file' using fprintf the variable 'x'.
|
||||||
If m-string is included, it supports also the type 'string\_t'.
|
See M\_PRINT\_ARG for details on the supported variable.
|
||||||
|
|
||||||
##### M\_GET\_STRING\_ARG(string,x,append)
|
##### M\_GET\_STRING\_ARG(string,x,append)
|
||||||
|
|
||||||
@@ -5887,14 +5891,12 @@ It supports also the type 'string\_t'.
|
|||||||
##### M\_PRINT(args...)
|
##### M\_PRINT(args...)
|
||||||
|
|
||||||
Print using printf all the variable in 'args'.
|
Print using printf all the variable in 'args'.
|
||||||
The format of the arguments are deduced provided that it is a standard numerical C type.
|
See M\_PRINT\_ARG for details on the supported variable.
|
||||||
If m-string is included, it supports also the type 'string\_t'.
|
|
||||||
|
|
||||||
##### M\_FPRINT(file, args...)
|
##### M\_FPRINT(file, args...)
|
||||||
|
|
||||||
Print into a file 'file' using fprintf all the variables in 'args'.
|
Print into a file 'file' using fprintf all the variables in 'args'.
|
||||||
The format of the arguments are deduced provided that it is a standard numerical C type.
|
See M\_PRINT\_ARG for details on the supported variable.
|
||||||
If m-string is included, it supports also the type 'string\_t'.
|
|
||||||
|
|
||||||
##### M\_AS\_TYPE(type, x)
|
##### M\_AS\_TYPE(type, x)
|
||||||
|
|
||||||
|
|||||||
@@ -5,20 +5,21 @@
|
|||||||
#include "m-serial-json.h"
|
#include "m-serial-json.h"
|
||||||
#include "m-string.h"
|
#include "m-string.h"
|
||||||
|
|
||||||
/* Define the employee */
|
/* Define the employee class */
|
||||||
TUPLE_DEF2(employee,
|
TUPLE_DEF2(employee,
|
||||||
(name, string_t),
|
(name, string_t),
|
||||||
(age, int),
|
(age, int),
|
||||||
(idnum, int))
|
(idnum, int))
|
||||||
|
/* Register globaly the employee_t oplist */
|
||||||
#define M_OPL_employee_t() TUPLE_OPLIST(employee, STRING_OPLIST, M_DEFAULT_OPLIST, M_DEFAULT_OPLIST)
|
#define M_OPL_employee_t() TUPLE_OPLIST(employee, STRING_OPLIST, M_DEFAULT_OPLIST, M_DEFAULT_OPLIST)
|
||||||
|
|
||||||
/* Define an array of employee and some algorithms on it */
|
/* Define an array of employee, register the oplist and define further algorithms on it */
|
||||||
ARRAY_DEF(vector_employee, employee_t)
|
ARRAY_DEF(vector_employee, employee_t)
|
||||||
#define M_OPL_vector_employee_t() ARRAY_OPLIST(vector_employee, M_OPL_employee_t())
|
#define M_OPL_vector_employee_t() ARRAY_OPLIST(vector_employee, M_OPL_employee_t())
|
||||||
ALGO_DEF(vector_employee, vector_employee_t)
|
ALGO_DEF(vector_employee, vector_employee_t)
|
||||||
|
|
||||||
/* Define the function object to select the sort order
|
/* Define the function object to select the sort order.
|
||||||
* named 'compare_by' which is an instance of the interface
|
* It is named 'compare_by' and is an instance of the interface
|
||||||
* 'vector_employee_cmp_obj' created by ALGO_DEF.
|
* 'vector_employee_cmp_obj' created by ALGO_DEF.
|
||||||
*/
|
*/
|
||||||
FUNC_OBJ_INS_DEF(compare_by /* name of the instance */,
|
FUNC_OBJ_INS_DEF(compare_by /* name of the instance */,
|
||||||
@@ -75,15 +76,12 @@ int main(void)
|
|||||||
// Sort the database by employee ID number
|
// Sort the database by employee ID number
|
||||||
M_LET( (cmp, STRING_CTE("idnum")), compare_by_t )
|
M_LET( (cmp, STRING_CTE("idnum")), compare_by_t )
|
||||||
vector_employee_sort_fo(emps, compare_by_as_interface(cmp));
|
vector_employee_sort_fo(emps, compare_by_as_interface(cmp));
|
||||||
printf("Employees sorted by idnum are: ");
|
M_PRINT("Employees sorted by idnum are: ", (emps, vector_employee_t), "\n" );
|
||||||
vector_employee_out_str(stdout, emps);
|
|
||||||
|
|
||||||
// Sort the database by employee name
|
// Sort the database by employee name
|
||||||
M_LET( (cmp, STRING_CTE("name")), compare_by_t )
|
M_LET( (cmp, STRING_CTE("name")), compare_by_t )
|
||||||
vector_employee_sort_fo(emps, compare_by_as_interface(cmp));
|
vector_employee_sort_fo(emps, compare_by_as_interface(cmp));
|
||||||
printf("\nEmployees sorted by name are: ");
|
M_PRINT("Employees sorted by name are: ", (emps, vector_employee_t), "\n" );
|
||||||
vector_employee_out_str(stdout, emps);
|
|
||||||
printf("\n");
|
|
||||||
|
|
||||||
// End
|
// End
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2005,11 +2005,27 @@ m_core_fopen(const char filename[], const char opt[])
|
|||||||
/* Can be overloaded by m-string to support string output too */
|
/* Can be overloaded by m-string to support string output too */
|
||||||
#define M_CORE_PRINTF_ARG(x) x
|
#define M_CORE_PRINTF_ARG(x) x
|
||||||
|
|
||||||
/* Print a C variable if it is a standard type to stdout.*/
|
/* Print a C variable if it is a standard type (or extension) to stdout
|
||||||
#define M_PRINT_ARG(x) printf(M_PRINTF_FORMAT(x), M_CORE_PRINTF_ARG(x) )
|
If a variable is extended (i.e. like (x, type) ) it will use the
|
||||||
|
method associated to the OUT_STR operator.
|
||||||
|
*/
|
||||||
|
#define M_PRINT_ARG(x) \
|
||||||
|
M_IF(M_PARENTHESIS_P(x)) \
|
||||||
|
( M_FPRINT_ARG_OUT_STR(stdout, M_PAIR_2 x, M_PAIR_1 x), \
|
||||||
|
printf(M_PRINTF_FORMAT(x), M_CORE_PRINTF_ARG(x) ) )
|
||||||
|
|
||||||
/* Print a C variable if it is a standard type to the given file 'f'.*/
|
/* Print a C variable if it is a standard type to the given file 'f'.
|
||||||
#define M_FPRINT_ARG(f, x) fprintf(f, M_PRINTF_FORMAT(x), M_CORE_PRINTF_ARG(x))
|
If a variable is extended (i.e. like (x, type) ) it will use the
|
||||||
|
method associated to the OUT_STR operator.
|
||||||
|
*/
|
||||||
|
#define M_FPRINT_ARG(f, x) \
|
||||||
|
M_IF(M_PARENTHESIS_P(x)) \
|
||||||
|
( M_FPRINT_ARG_OUT_STR(f, M_PAIR_2 x, M_PAIR_1 x), \
|
||||||
|
fprintf(f, M_PRINTF_FORMAT(x), M_CORE_PRINTF_ARG(x) ) )
|
||||||
|
|
||||||
|
/* Internal macro to call the OUT_STR method */
|
||||||
|
#define M_FPRINT_ARG_OUT_STR(file, oplist, var) \
|
||||||
|
M_CALL_OUT_STR( M_GLOBAL_OPLIST(oplist) , file, var)
|
||||||
|
|
||||||
/* Get a C variable if it is a standard type from the given file 'f'.*/
|
/* Get a C variable if it is a standard type from the given file 'f'.*/
|
||||||
#define M_FSCAN_ARG(xptr, f) \
|
#define M_FSCAN_ARG(xptr, f) \
|
||||||
|
|||||||
@@ -271,6 +271,20 @@ static void test_mpz(void)
|
|||||||
assert (list_mpz_equal_p (v, list2));
|
assert (list_mpz_equal_p (v, list2));
|
||||||
list_mpz_clear(list2);
|
list_mpz_clear(list2);
|
||||||
|
|
||||||
|
// Print using M_FPRINT
|
||||||
|
f = m_core_fopen ("a-mlist.dat", "wt");
|
||||||
|
if (!f) abort();
|
||||||
|
M_FPRINT(f, (v, LIST_OPLIST(list_mpz, TESTOBJ_OPLIST)) );
|
||||||
|
fclose (f);
|
||||||
|
|
||||||
|
list_mpz_init(list2);
|
||||||
|
f = m_core_fopen ("a-mlist.dat", "rt");
|
||||||
|
b = list_mpz_in_str (list2, f);
|
||||||
|
assert (b == true);
|
||||||
|
fclose(f);
|
||||||
|
assert (list_mpz_equal_p (v, list2));
|
||||||
|
list_mpz_clear(list2);
|
||||||
|
|
||||||
list_mpz_clean(v);
|
list_mpz_clean(v);
|
||||||
list_mpz_init(list2);
|
list_mpz_init(list2);
|
||||||
M_LET(str, STRING_OPLIST) {
|
M_LET(str, STRING_OPLIST) {
|
||||||
|
|||||||
Reference in new issue
Block a user