Fix assertion for proper Huffman merge pattern: 0 == 1 modulo 1.
[pspp] / src / format.h
1 /* PSPP - computes sample statistics.
2    Copyright (C) 1997-9, 2000 Free Software Foundation, Inc.
3    Written by Ben Pfaff <blp@gnu.org>.
4
5    This program is free software; you can redistribute it and/or
6    modify it under the terms of the GNU General Public License as
7    published by the Free Software Foundation; either version 2 of the
8    License, or (at your option) any later version.
9
10    This program is distributed in the hope that it will be useful, but
11    WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    General Public License for more details.
14
15    You should have received a copy of the GNU General Public License
16    along with this program; if not, write to the Free Software
17    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
18    02111-1307, USA. */
19
20 #if !format_h
21 #define format_h 1
22
23 /* Display format types. */
24 /* See the definitions of these functions and variables when modifying
25    this list:
26    misc.c:convert_fmt_ItoO()
27    sfm-read.c:parse_format_spec()
28    data-in.c:parse_string_as_format() */
29 #define DEFFMT(LABEL, NAME, N_ARGS, IMIN_W, IMAX_W, OMIN_W, OMAX_W,     \
30                CAT, OUTPUT, SPSS_FMT)                                   \
31         LABEL,
32 enum
33   {
34 #include "format.def"
35     FMT_NUMBER_OF_FORMATS
36   };
37 #undef DEFFMT
38
39 /* Describes one of the display formats above. */
40 struct fmt_desc
41   {
42     char name[9];               /* `DATETIME' is the longest name. */
43     int n_args;                 /* 1=width; 2=width.decimals. */
44     int Imin_w, Imax_w;         /* Bounds on input width. */
45     int Omin_w, Omax_w;         /* Bounds on output width. */
46     int cat;                    /* Categories. */
47     int output;                 /* Output format. */
48     int spss;                   /* Equivalent SPSS output format. */
49   };
50
51 /* Display format categories. */
52 enum
53   {
54     FCAT_BLANKS_SYSMIS = 001,   /* 1=All-whitespace means SYSMIS. */
55     FCAT_EVEN_WIDTH = 002,      /* 1=Width must be even. */
56     FCAT_STRING = 004,          /* 1=String input/output format. */
57     FCAT_SHIFT_DECIMAL = 010,   /* 1=Automatically shift decimal point
58                                    on output--used for fixed-point
59                                    formats. */
60     FCAT_OUTPUT_ONLY = 020      /* 1=This is not an input format. */
61   };
62
63 /* Display format. */
64 struct fmt_spec
65   {
66     int type;                   /* One of the above constants. */
67     int w;                      /* Width. */
68     int d;                      /* Number of implied decimal places. */
69   };
70
71 /* Descriptions of all the display formats above. */
72 extern struct fmt_desc formats[];
73
74 union value;
75
76 /* Maximum length of formatted value, in character. */
77 #define MAX_FORMATTED_LEN 256
78
79 int parse_format_specifier (struct fmt_spec *input, int allow_xt);
80 int parse_format_specifier_name (const char **cp, int allow_xt);
81 int check_input_specifier (const struct fmt_spec *spec);
82 int check_output_specifier (const struct fmt_spec *spec);
83 int check_string_specifier (const struct fmt_spec *spec, int min_len);
84 void convert_fmt_ItoO (const struct fmt_spec *input, struct fmt_spec *output);
85 int get_format_var_width (const struct fmt_spec *);
86 int parse_string_as_format (const char *s, int len, const struct fmt_spec *fp,
87                             int fc, union value *v);
88 int translate_fmt (int spss);
89 void data_out (char *s, const struct fmt_spec *fp, const union value *v);
90 char *fmt_to_string (const struct fmt_spec *);
91 void num_to_string (double v, char *s, int w, int d);
92
93 #endif /* !format_h */