summaryrefslogtreecommitdiff
path: root/source/luametatex/source/tex/texinserts.h
diff options
context:
space:
mode:
Diffstat (limited to 'source/luametatex/source/tex/texinserts.h')
-rw-r--r--source/luametatex/source/tex/texinserts.h101
1 files changed, 101 insertions, 0 deletions
diff --git a/source/luametatex/source/tex/texinserts.h b/source/luametatex/source/tex/texinserts.h
new file mode 100644
index 000000000..e91965e6f
--- /dev/null
+++ b/source/luametatex/source/tex/texinserts.h
@@ -0,0 +1,101 @@
+/*
+ See license.txt in the root of this project.
+*/
+
+# ifndef LMT_INSERTS_H
+# define LMT_INSERTS_H
+
+typedef struct insert_record {
+ halfword limit;
+ halfword multiplier;
+ halfword distance;
+ halfword content;
+ halfword initialized;
+ halfword options;
+ halfword penalty;
+ halfword maxdepth;
+} insert_record;
+
+typedef enum insert_modes {
+ unset_insert_mode,
+ index_insert_mode,
+ class_insert_mode,
+} insert_modes;
+
+typedef enum insert_class_options {
+ insert_option_storing = 0x1,
+ insert_option_penalty = 0x2,
+ insert_option_maxdepth = 0x4,
+} insert_class_options;
+
+typedef enum insert_storage_actions {
+ insert_storage_ignore,
+ insert_storage_delay,
+ insert_storage_inject,
+} insert_storage_actions;
+
+typedef enum saved_insert_items {
+ saved_insert_item_index = 0,
+ saved_insert_n_of_items = 1,
+} saved_insert_items;
+
+typedef struct insert_state_info {
+ insert_record *inserts;
+ memory_data insert_data;
+ int mode;
+ halfword storing;
+ halfword head;
+ halfword tail;
+} insert_state_info;
+
+extern insert_state_info lmt_insert_state;
+
+# define has_insert_option(a,b) (lmt_insert_state.mode == class_insert_mode && (lmt_insert_state.inserts[a].options & b) == b)
+# define set_insert_option(a,b) (lmt_insert_state.inserts[a].options |= b)
+# define unset_insert_option(a,b) (lmt_insert_state.inserts[a].options & ~(b))
+
+extern scaled tex_get_insert_limit (halfword i);
+extern halfword tex_get_insert_multiplier (halfword i);
+extern halfword tex_get_insert_penalty (halfword i);
+extern halfword tex_get_insert_distance (halfword i);
+extern halfword tex_get_insert_maxdepth (halfword i);
+extern scaled tex_get_insert_height (halfword i);
+extern scaled tex_get_insert_depth (halfword i);
+extern scaled tex_get_insert_width (halfword i);
+extern halfword tex_get_insert_content (halfword i);
+extern halfword tex_get_insert_storage (halfword i);
+
+extern void tex_set_insert_limit (halfword i, scaled v);
+extern void tex_set_insert_multiplier (halfword i, halfword v);
+extern void tex_set_insert_penalty (halfword i, halfword v);
+extern void tex_set_insert_distance (halfword i, halfword v);
+extern void tex_set_insert_maxdepth (halfword i, halfword v);
+extern void tex_set_insert_height (halfword i, scaled v);
+extern void tex_set_insert_depth (halfword i, scaled v);
+extern void tex_set_insert_width (halfword i, scaled v);
+extern void tex_set_insert_content (halfword i, halfword v);
+extern void tex_set_insert_storage (halfword i, halfword v);
+
+extern void tex_wipe_insert (halfword i);
+
+extern void tex_initialize_inserts (void);
+extern int tex_valid_insert_id (halfword n);
+extern void tex_dump_insert_data (dumpstream f);
+extern void tex_undump_insert_data (dumpstream f);
+
+extern halfword lmt_get_insert_distance (halfword i, int slot); /* callback */
+
+extern halfword tex_get_insert_progress (halfword i);
+
+extern void tex_insert_store (halfword i, halfword n);
+extern void tex_insert_restore (halfword n);
+extern int tex_insert_stored (void);
+
+extern halfword tex_scan_insert_index (void);
+extern void tex_set_insert_mode (halfword mode);
+extern int tex_insert_is_void (halfword i);
+
+extern void tex_run_insert (void);
+extern void tex_finish_insert_group (void);
+
+# endif