+/* The current syntax state */
+struct syntax_cache syntax_cache;
+
+
+/*
+ Update syntax_cache to an appropriate setting for position POS
+
+ The sign of COUNT gives the relative position of POS wrt the
+ previously valid interval. (not currently used)
+
+ `syntax_cache.*_change' are the next and previous positions at
+ which syntax_code and c_s_t will need to be recalculated.
+
+ #### Currently this code uses 'get-char-property', which will
+ return the "last smallest" extent at a given position. In cases
+ where overlapping extents are defined, this code will simply use
+ whatever is returned by get-char-property.
+
+ It might be worth it at some point to merge provided syntax tables
+ outward to the current buffer. */
+
+void
+update_syntax_cache (int pos, int count, int init)
+{
+ Lisp_Object tmp_table;
+
+ if (init)
+ {
+ syntax_cache.prev_change = -1;
+ syntax_cache.next_change = -1;
+ }
+
+ if (pos > syntax_cache.prev_change &&
+ pos < syntax_cache.next_change)
+ {
+ /* do nothing */
+ }
+ else
+ {
+ if (NILP (syntax_cache.object) || EQ (syntax_cache.object, Qt))
+ {
+ int get_change_before = pos + 1;
+
+ tmp_table = Fget_char_property (make_int(pos), Qsyntax_table,
+ make_buffer (syntax_cache.buffer), Qnil);
+ syntax_cache.next_change =
+ XINT (Fnext_extent_change (make_int (pos > 0 ? pos : 1),
+ make_buffer (syntax_cache.buffer)));
+
+ if (get_change_before < 1)
+ get_change_before = 1;
+ else if (get_change_before > BUF_ZV (syntax_cache.buffer))
+ get_change_before = BUF_ZV (syntax_cache.buffer);
+
+ syntax_cache.prev_change =
+ XINT (Fprevious_extent_change (make_int (get_change_before),
+ make_buffer (syntax_cache.buffer)));
+ }
+ else
+ {
+ int get_change_before = pos + 1;
+
+ tmp_table = Fget_char_property (make_int(pos), Qsyntax_table,
+ syntax_cache.object, Qnil);
+ syntax_cache.next_change =
+ XINT (Fnext_extent_change (make_int (pos >= 0 ? pos : 0),
+ syntax_cache.object));
+
+ if (get_change_before < 0)
+ get_change_before = 0;
+ else if (get_change_before > XSTRING_LENGTH(syntax_cache.object))
+ get_change_before = XSTRING_LENGTH(syntax_cache.object);
+
+ syntax_cache.prev_change =
+ XINT (Fprevious_extent_change (make_int (pos >= 0 ? pos : 0),
+ syntax_cache.object));
+ }
+
+ if (EQ (Fsyntax_table_p (tmp_table), Qt))
+ {
+ syntax_cache.use_code = 0;
+ syntax_cache.current_syntax_table =
+ XCHAR_TABLE (tmp_table)->mirror_table;
+ }
+ else if (CONSP (tmp_table) && INTP (XCAR (tmp_table)))
+ {
+ syntax_cache.use_code = 1;
+ syntax_cache.syntax_code = XINT (XCAR(tmp_table));
+ }
+ else
+ {
+ syntax_cache.use_code = 0;
+ syntax_cache.current_syntax_table =
+ syntax_cache.buffer->mirror_syntax_table;
+ }
+ }
+}
+\f