You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
gnucash/lib/goffice/split/value.h

207 lines
7.2 KiB

#ifndef GNUMERIC_VALUE_H
#define GNUMERIC_VALUE_H
#include <glib.h>
#include "gnumeric.h"
#include "position.h"
#include "numbers.h"
typedef enum {
/* Use magic values to act as a signature
* DO NOT CHANGE THESE NUMBERS
* As of version 0.57 they are using as keys
* in the xml
*/
VALUE_EMPTY = 10,
VALUE_BOOLEAN = 20, /* Keep bool < int < float */
VALUE_INTEGER = 30,
VALUE_FLOAT = 40,
VALUE_ERROR = 50,
VALUE_STRING = 60,
VALUE_CELLRANGE = 70,
VALUE_ARRAY = 80
} GnmValueType;
typedef struct {
GnmValueType const type;
GnmFormat *fmt;
} GnmValueAny;
struct _GnmValueBool {
GnmValueType const type;
GnmFormat *fmt;
gboolean val;
};
struct _GnmValueInt {
GnmValueType const type;
GnmFormat *fmt;
int val;
};
struct _GnmValueFloat {
GnmValueType const type;
GnmFormat *fmt;
gnm_float val;
};
struct _GnmValueErr {
GnmValueType const type;
GnmFormat *fmt;
GnmString *mesg;
/* Currently unused. Intended to support audit functions */
GnmEvalPos src;
};
struct _GnmValueStr {
GnmValueType const type;
GnmFormat *fmt;
GnmString *val;
};
struct _GnmValueRange {
GnmValueType const type;
GnmFormat *fmt;
GnmRangeRef cell;
};
struct _GnmValueArray {
GnmValueType const type;
GnmFormat *fmt;
int x, y;
GnmValue ***vals; /* Array [x][y] */
};
/* FIXME */
union _GnmValue {
GnmValueType const type;
GnmValueAny v_any;
GnmValueBool v_bool;
GnmValueInt v_int;
GnmValueFloat v_float;
GnmValueErr v_err;
GnmValueStr v_str;
GnmValueRange v_range;
GnmValueArray v_array;
};
#define VALUE_TYPE(v) ((v)->v_any.type)
#define VALUE_FMT(v) ((v)->v_any.fmt)
#define VALUE_IS_EMPTY(v) (((v) == NULL) || ((v)->type == VALUE_EMPTY))
#define VALUE_IS_EMPTY_OR_ERROR(v) (VALUE_IS_EMPTY(v) || (v)->type == VALUE_ERROR)
#define VALUE_IS_STRING(v) ((v)->type == VALUE_STRING)
#define VALUE_IS_NUMBER(v) (((v)->type == VALUE_INTEGER) || \
((v)->type == VALUE_FLOAT) || \
((v)->type == VALUE_BOOLEAN))
typedef enum {
IS_EQUAL,
IS_LESS,
IS_GREATER,
TYPE_MISMATCH
} GnmValDiff;
GnmValue *value_new_empty (void);
GnmValue *value_new_bool (gboolean b);
GnmValue *value_new_int (int i);
GnmValue *value_new_float (gnm_float f);
GnmValue *value_new_error (GnmEvalPos const *pos, char const *mesg);
GnmValue *value_new_error_str (GnmEvalPos const *pos, GnmString *mesg);
GnmValue *value_new_error_std (GnmEvalPos const *pos, GnmStdError err);
GnmValue *value_new_error_NULL (GnmEvalPos const *pos);
GnmValue *value_new_error_DIV0 (GnmEvalPos const *pos);
GnmValue *value_new_error_VALUE (GnmEvalPos const *pos);
GnmValue *value_new_error_REF (GnmEvalPos const *pos);
GnmValue *value_new_error_NAME (GnmEvalPos const *pos);
GnmValue *value_new_error_NUM (GnmEvalPos const *pos);
GnmValue *value_new_error_NA (GnmEvalPos const *pos);
GnmValue *value_new_error_RECALC (GnmEvalPos const *pos);
GnmValue *value_new_string (char const *str);
GnmValue *value_new_string_nocopy (char *str);
GnmValue *value_new_string_str (GnmString *str);
GnmValue *value_new_cellrange_unsafe (GnmCellRef const *a, GnmCellRef const *b);
GnmValue *value_new_cellrange (GnmCellRef const *a, GnmCellRef const *b,
int eval_col, int eval_row);
GnmValue *value_new_cellrange_r (Sheet *sheet, GnmRange const *r);
GnmValue *value_new_array (guint cols, guint rows);
GnmValue *value_new_array_empty (guint cols, guint rows);
GnmValue *value_new_array_non_init (guint cols, guint rows);
GnmValue *value_new_from_string (GnmValueType t, char const *str,
GnmFormat *sf, gboolean translated);
void value_release (GnmValue *v);
void value_set_fmt (GnmValue *v, GnmFormat const *fmt);
void value_dump (GnmValue const *v);
GnmValue *value_dup (GnmValue const *v);
gnm_float value_diff (GnmValue const *a, GnmValue const *b);
GnmValDiff value_compare (GnmValue const *a, GnmValue const *b,
gboolean case_sensitive);
int value_cmp (void const *ptr_a, void const *ptr_b);
int value_cmp_reverse (void const *ptr_a, void const *ptr_b);
gint value_equal (GnmValue const *a, GnmValue const *b);
guint value_hash (GnmValue const *v);
char const *value_peek_string (GnmValue const *v);
char *value_get_as_string (GnmValue const *v);
void value_get_as_gstring (GnmValue const *v, GString *target,
GnmExprConventions const *conv);
int value_get_as_int (GnmValue const *v);
gnm_float value_get_as_float (GnmValue const *v);
GnmValue *value_coerce_to_number (GnmValue *v, gboolean *valid,
GnmEvalPos const *ep);
GnmValue *value_error_set_pos (GnmValueErr *err, GnmEvalPos const *pos);
GnmStdError value_error_classify (GnmValue const *v);
char const *value_error_name (GnmStdError err, gboolean translated);
gboolean value_get_as_bool (GnmValue const *v, gboolean *err);
gboolean value_get_as_checked_bool (GnmValue const *v);
GnmRangeRef const *value_get_rangeref (GnmValue const *v);
/* Area functions ( works on VALUE_RANGE or VALUE_ARRAY */
/* The GnmEvalPos provides a Sheet context; this allows
calculation of relative references. 'x','y' give the position */
typedef GnmValue *(*ValueAreaFunc) (GnmValue const *v, GnmEvalPos const *ep,
int x, int y, gpointer user);
GnmValue *value_area_foreach (GnmValue const *v, GnmEvalPos const *ep,
CellIterFlags flags,
ValueAreaFunc func, gpointer user);
int value_area_get_width (GnmValue const *v, GnmEvalPos const *ep);
int value_area_get_height (GnmValue const *v, GnmEvalPos const *ep);
GnmValue const *value_area_fetch_x_y (GnmValue const *v, int x, int y,
GnmEvalPos const *ep);
GnmValue const *value_area_get_x_y (GnmValue const *v, int x, int y,
GnmEvalPos const *ep);
/* A zero integer, not to be freed or changed. */
extern GnmValue const *value_zero;
extern GnmValueErr const value_terminate_err;
#define VALUE_TERMINATE ((GnmValue *)&value_terminate_err)
void value_array_set (GnmValue *array, int col, int row, GnmValue *v);
void value_array_resize (GnmValue *v, int width, int height);
/* FIXME: this stuff below ought to go elsewhere. */
typedef struct {
int row;
GSList *conditions;
} database_criteria_t;
typedef gboolean (*criteria_test_fun_t) (GnmValue const *x, GnmValue const *y);
typedef struct {
criteria_test_fun_t fun;
GnmValue *x;
int column;
} func_criteria_t;
void parse_criteria (GnmValue *criteria,
criteria_test_fun_t *fun,
GnmValue **test_value,
CellIterFlags *iter_flags,
GnmDateConventions const *date_conv);
void free_criterias (GSList *criterias);
GSList *find_rows_that_match (Sheet *sheet, int first_col,
int first_row, int last_col, int last_row,
GSList *criterias, gboolean unique_only);
GSList *parse_database_criteria (GnmEvalPos const *ep, GnmValue *database, GnmValue *criteria);
int find_column_of_field (GnmEvalPos const *ep, GnmValue *database, GnmValue *field);
/* Protected */
void value_init (void);
void value_shutdown (void);
#endif /* GNUMERIC_VALUE_H */