aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/qreg.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/qreg.h')
-rw-r--r--src/qreg.h68
1 files changed, 48 insertions, 20 deletions
diff --git a/src/qreg.h b/src/qreg.h
index 1eb2cf8..cbd6b2c 100644
--- a/src/qreg.h
+++ b/src/qreg.h
@@ -54,9 +54,15 @@ extern teco_view_t *teco_qreg_view;
* FIXME: We can probably get rid of all the separate undo callbacks/methods.
*/
typedef const struct {
+ /*
+ * FIXME: perhaps there should only be a set_number() callback with some
+ * teco_qreg_set_integer() shortcut.
+ */
/* already pushes undo tokens */
- gboolean (*set_integer)(teco_qreg_t *qreg, teco_int_t value, GError **error);
- gboolean (*get_integer)(teco_qreg_t *qreg, teco_int_t *ret, GError **error);
+ gboolean (*set_number)(teco_qreg_t *qreg, teco_number_t value,
+ gboolean is_float, GError **error);
+ gboolean (*get_number)(teco_qreg_t *qreg, teco_number_t *ret,
+ gboolean *is_float, GError **error);
gboolean (*set_string)(teco_qreg_t *qreg, const gchar *str, gsize len,
guint codepage, GError **error);
@@ -100,26 +106,48 @@ struct teco_qreg_t {
teco_qreg_vtable_t *vtable;
- teco_int_t integer;
+ teco_number_t number;
teco_doc_t string;
- /**
- * Whether to generate undo tokens (unnecessary for registers
- * in local qreg tables in macro invocations).
- *
- * @fixme Every QRegister has this field, but it only differs
- * between local and global QRegisters. This wastes space.
- * Or by deferring any decision about undo token creation to a layer
- * that knows which table it is accessing.
- * On the other hand, we will need another flag like
- * teco_qreg_current_must_undo.
- *
- * Otherwise, it might be possible to use a least significant bit
- * in one of the pointers...
- */
- gboolean must_undo;
+ struct teco_qreg_flags_t {
+ /**
+ * Whether to generate undo tokens (unnecessary for registers
+ * in local qreg tables in macro invocations).
+ *
+ * @fixme Every QRegister has this field, but it only differs
+ * between local and global QRegisters. This wastes space.
+ * Or by deferring any decision about undo token creation to a layer
+ * that knows which table it is accessing.
+ * On the other hand, we will need another flag like
+ * teco_qreg_current_must_undo.
+ *
+ * Otherwise, it might be possible to use a least significant bit
+ * in one of the pointers...
+ */
+ guint must_undo : 1;
+ /** whether the number cell is integer or float_val */
+ guint is_float : 1;
+ } flags;
};
+static inline gboolean
+teco_qreg_set_integer(teco_qreg_t *qreg, teco_int_t value, GError **error)
+{
+ return qreg->vtable->set_number(qreg, (teco_number_t){.i = value}, FALSE, error);
+}
+
+static inline gboolean
+teco_qreg_get_integer(teco_qreg_t *qreg, teco_int_t *ret, GError **error)
+{
+ teco_number_t number;
+ gboolean is_float;
+
+ if (!qreg->vtable->get_number(qreg, &number, &is_float, error))
+ return FALSE;
+ *ret = is_float ? (teco_int_t)number.f : number.i;
+ return TRUE;
+}
+
teco_qreg_t *teco_qreg_plain_new(const gchar *name, gsize len);
teco_qreg_t *teco_qreg_dot_new(void);
teco_qreg_t *teco_qreg_bufferinfo_new(void);
@@ -175,7 +203,7 @@ void teco_qreg_table_init_locals(teco_qreg_table_t *table, gboolean must_undo);
static inline teco_qreg_t *
teco_qreg_table_insert(teco_qreg_table_t *table, teco_qreg_t *qreg)
{
- qreg->must_undo = table->must_undo; // FIXME
+ qreg->flags.must_undo = table->must_undo; // FIXME
return (teco_qreg_t *)teco_rb3str_insert(&table->tree, TRUE, &qreg->head);
}
@@ -242,7 +270,7 @@ teco_qreg_table_get_integer(teco_qreg_table_t *table, const gchar *name,
return FALSE;
}
- return reg->vtable->get_integer(reg, ret, error);
+ return teco_qreg_get_integer(reg, ret, error);
}
teco_qreg_t *teco_qreg_table_edit_name(teco_qreg_table_t *table, const gchar *name,