1d8e784debb3bd4e1aa3065015c2ef094dd81307cflorian#ifndef DFP_UTILS_H
2d8e784debb3bd4e1aa3065015c2ef094dd81307cflorian#define DFP_UTILS_H
3d8e784debb3bd4e1aa3065015c2ef094dd81307cflorian
4ef9c8ad79a35557e80bc327a75ba7f8fddfafdc7florian#include <stddef.h>      /* size_t */
5ef9c8ad79a35557e80bc327a75ba7f8fddfafdc7florian#include <stdio.h>       /* printf */
6ef9c8ad79a35557e80bc327a75ba7f8fddfafdc7florian
7d8e784debb3bd4e1aa3065015c2ef094dd81307cflorian/* convinience macros to print DFP values to avoid linking libdfp to
8d8e784debb3bd4e1aa3065015c2ef094dd81307cflorian   DFP testcases */
9d8e784debb3bd4e1aa3065015c2ef094dd81307cflorian
10d8e784debb3bd4e1aa3065015c2ef094dd81307cflorian#define DFP_VAL_PRINT(op, type)                                         \
11d8e784debb3bd4e1aa3065015c2ef094dd81307cflorian  {                                                                     \
12d8e784debb3bd4e1aa3065015c2ef094dd81307cflorian    size_t n = sizeof(type);                                            \
13ef9c8ad79a35557e80bc327a75ba7f8fddfafdc7florian    if (n == 4)                                                         \
14ef9c8ad79a35557e80bc327a75ba7f8fddfafdc7florian      printf("%x", *((unsigned int *) &op));                            \
15ef9c8ad79a35557e80bc327a75ba7f8fddfafdc7florian    else if (n == 8)                                                    \
16d8e784debb3bd4e1aa3065015c2ef094dd81307cflorian      printf("%lx", *((unsigned long *) &op));                          \
17d8e784debb3bd4e1aa3065015c2ef094dd81307cflorian    else                                                                \
18d8e784debb3bd4e1aa3065015c2ef094dd81307cflorian      printf("%lx%08lx", *((unsigned long *) &op),                      \
19d8e784debb3bd4e1aa3065015c2ef094dd81307cflorian             *(((unsigned long *) &op) + 1));                           \
20d8e784debb3bd4e1aa3065015c2ef094dd81307cflorian  }
21d8e784debb3bd4e1aa3065015c2ef094dd81307cflorian
22d8e784debb3bd4e1aa3065015c2ef094dd81307cflorian#define DFP_BINOP_PRINT(op1, op2, result, type, op, cc)                 \
23d8e784debb3bd4e1aa3065015c2ef094dd81307cflorian  {                                                                     \
24d8e784debb3bd4e1aa3065015c2ef094dd81307cflorian    DFP_VAL_PRINT(op1, type);                                           \
25d8e784debb3bd4e1aa3065015c2ef094dd81307cflorian    printf(" "op" ");                                                   \
26d8e784debb3bd4e1aa3065015c2ef094dd81307cflorian    DFP_VAL_PRINT(op2, type);                                           \
27d8e784debb3bd4e1aa3065015c2ef094dd81307cflorian    printf(" = ");                                                      \
28d8e784debb3bd4e1aa3065015c2ef094dd81307cflorian    DFP_VAL_PRINT(result, type);                                        \
29d8e784debb3bd4e1aa3065015c2ef094dd81307cflorian    printf(" cc = %d\n", cc);                                           \
30d8e784debb3bd4e1aa3065015c2ef094dd81307cflorian  }
31d8e784debb3bd4e1aa3065015c2ef094dd81307cflorian
32d8e784debb3bd4e1aa3065015c2ef094dd81307cflorian#endif /* DFP_UTILS_H */
33