Merge commit 'origin/master' into charset
[pspp-builds.git] / src / ui / gui / var-display.c
1 #include <config.h>
2 #include "var-display.h"
3
4 #include <data/variable.h>
5 #include <data/format.h>
6 #include <stdlib.h>
7 #include "psppire-dict.h"
8
9 #include <gettext.h>
10 #define _(msgid) gettext (msgid)
11 #define N_(msgid) msgid
12
13 #include "helper.h"
14 #include <libpspp/i18n.h>
15
16 static const gchar none[] = N_("None");
17
18
19 gchar *
20 measure_to_string (const struct variable *var, GError **err)
21 {
22   const gint measure = var_get_measure (var);
23
24   g_assert (measure < n_MEASURES);
25   return g_locale_to_utf8 (gettext (measures[measure]),
26                            -1, 0, 0, err);
27 }
28
29
30 gchar *
31 missing_values_to_string (const PsppireDict *dict, const struct variable *pv, GError **err)
32 {
33   const struct fmt_spec *fmt =  var_get_print_format (pv);
34   gchar *s;
35   const struct missing_values *miss = var_get_missing_values (pv);
36   if ( mv_is_empty (miss))
37     return g_locale_to_utf8 (gettext (none), -1, 0, 0, err);
38   else
39     {
40       if ( ! mv_has_range (miss))
41         {
42           GString *gstr = g_string_sized_new (10);
43           const int n = mv_n_values (miss);
44           gchar *mv[4] = {0,0,0,0};
45           gint i;
46           for (i = 0 ; i < n; ++i )
47             {
48               union value v;
49               mv_get_value (miss, &v, i);
50               mv[i] = value_to_text (v, *fmt);
51               if ( i > 0 )
52                 g_string_append (gstr, ", ");
53               g_string_append (gstr, mv[i]);
54               g_free (mv[i]);
55             }
56           s = recode_string (UTF8, psppire_dict_encoding (dict),
57                              gstr->str, gstr->len);
58           g_string_free (gstr, TRUE);
59         }
60       else
61         {
62           GString *gstr = g_string_sized_new (10);
63           gchar *l, *h;
64           union value low, high;
65           mv_get_range (miss, &low.f, &high.f);
66
67           l = value_to_text (low, *fmt);
68           h = value_to_text (high, *fmt);
69
70           g_string_printf (gstr, "%s - %s", l, h);
71           g_free (l);
72           g_free (h);
73
74           if ( mv_has_value (miss))
75             {
76               gchar *ss = 0;
77               union value v;
78               mv_get_value (miss, &v, 0);
79
80               ss = value_to_text (v, *fmt);
81
82               g_string_append (gstr, ", ");
83               g_string_append (gstr, ss);
84               free (ss);
85             }
86           s = recode_string (UTF8, psppire_dict_encoding (dict),
87                              gstr->str, gstr->len);
88           g_string_free (gstr, TRUE);
89         }
90
91       return s;
92     }
93 }