csstokenizer: Add save() and restore()

We'll need that to check if property values contain variables.
This commit is contained in:
Alice Mikhaylenko
2024-03-20 22:05:13 +04:00
parent 3323f08c75
commit 63f489dc64
2 changed files with 38 additions and 0 deletions

View File

@@ -36,8 +36,15 @@ struct _GtkCssTokenizer
const char *end;
GtkCssLocation position;
GArray *saved_states;
};
typedef struct
{
GtkCssLocation position;
const char *data;
} GtkCssTokenizerSavedState;
void
gtk_css_token_clear (GtkCssToken *token)
{
@@ -580,6 +587,7 @@ gtk_css_tokenizer_new (GBytes *bytes)
tokenizer->end = tokenizer->data + g_bytes_get_size (bytes);
gtk_css_location_init (&tokenizer->position);
tokenizer->saved_states = g_array_new (FALSE, FALSE, sizeof (GtkCssTokenizerSavedState));
return tokenizer;
}
@@ -601,6 +609,7 @@ gtk_css_tokenizer_unref (GtkCssTokenizer *tokenizer)
g_string_free (tokenizer->name_buffer, TRUE);
g_bytes_unref (tokenizer->bytes);
g_array_unref (tokenizer->saved_states);
g_free (tokenizer);
}
@@ -1484,3 +1493,29 @@ gtk_css_tokenizer_read_token (GtkCssTokenizer *tokenizer,
}
}
void
gtk_css_tokenizer_save (GtkCssTokenizer *tokenizer)
{
GtkCssTokenizerSavedState state;
state.position = tokenizer->position;
state.data = tokenizer->data;
g_array_append_val (tokenizer->saved_states, state);
}
void
gtk_css_tokenizer_restore (GtkCssTokenizer *tokenizer)
{
GtkCssTokenizerSavedState state;
int index = tokenizer->saved_states->len - 1;
g_assert (index >= 0);
state = g_array_index (tokenizer->saved_states, GtkCssTokenizerSavedState, index);
g_array_remove_index_fast (tokenizer->saved_states, index);
tokenizer->position = state.position;
tokenizer->data = state.data;
}

View File

@@ -148,5 +148,8 @@ gboolean gtk_css_tokenizer_read_token (GtkCssTokenizer
GtkCssToken *token,
GError **error);
void gtk_css_tokenizer_save (GtkCssTokenizer *tokenizer);
void gtk_css_tokenizer_restore (GtkCssTokenizer *tokenizer);
G_END_DECLS