libanjuta: bgo #696984 - Fix function argument name typos in documentation comments
[anjuta.git] / libanjuta / anjuta-token-list.c
blobc80214b1b99c3348e157861c5d9848bf03063f07
1 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
2 /*
3 * anjuta-token-list.c
4 * Copyright (C) Sébastien Granjoux 2009 <seb.sfo@free.fr>
6 * This program is free software: you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License as published by the
8 * Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14 * See the GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License along
17 * with this program. If not, see <http://www.gnu.org/licenses/>.
20 #include "anjuta-token-list.h"
22 #include "libanjuta/anjuta-debug.h"
24 #include <string.h>
25 #include <stdio.h>
27 /* Type definition
28 *---------------------------------------------------------------------------*/
30 typedef struct _AnjutaTokenStyleSeparator AnjutaTokenStyleSeparator;
32 struct _AnjutaTokenStyleSeparator
34 guint count;
35 gchar *value;
36 gboolean eol;
39 struct _AnjutaTokenStyle
41 guint max_width;
42 GHashTable *separator;
43 AnjutaTokenStyle *base;
46 /* Private functions
47 *---------------------------------------------------------------------------*/
49 static void
50 free_separator (AnjutaTokenStyleSeparator *sep, gpointer user_data)
52 g_free (sep->value);
53 g_slice_free (AnjutaTokenStyleSeparator, sep);
56 static void
57 free_separator_list (guint key, GList *value, gpointer user_data)
59 /* Free list elements */
60 g_list_foreach (value, (GFunc)free_separator, NULL);
61 g_list_free (value);
64 static AnjutaTokenStyleSeparator*
65 anjuta_token_style_insert_separator (AnjutaTokenStyle *style, guint key, const gchar *value)
67 GList *list;
68 GList *last = NULL;
69 GList *sibling = NULL;
70 AnjutaTokenStyleSeparator *sep;
73 /* Look the separator is already registered */
74 list = (GList *)g_hash_table_lookup (style->separator, GINT_TO_POINTER (key));
75 if (list != NULL)
77 for (sibling = list; sibling != NULL; sibling = g_list_next(sibling))
79 sep = (AnjutaTokenStyleSeparator *)sibling->data;
81 /* Keep the first separator with count = 1, to insert the new one if
82 * not found */
83 if ((last == NULL) && (sep->count == 1)) last = sibling;
85 if (value == NULL)
87 if (sep->value == NULL)
89 sep->count++;
90 break;
93 else if ((sep->value != NULL) && (strcmp (sep->value, value) == 0))
95 sep->count++;
96 break;
101 if (sibling != NULL)
103 /* Increment the separator count, Move it if needed */
104 for (last = g_list_previous (sibling); last != NULL; last = g_list_previous (sibling))
106 if (((AnjutaTokenStyleSeparator *)sibling->data)->count >= ((AnjutaTokenStyleSeparator *)last->data)->count)
108 last->next = sibling->next;
109 sibling->next = last;
110 sibling->prev = last->prev;
111 last->prev = sibling;
113 else
115 break;
119 if (last == NULL)
121 /* Update the list head */
122 list = sibling;
123 g_hash_table_replace (style->separator, GINT_TO_POINTER (key), list);
126 return (AnjutaTokenStyleSeparator *)sibling->data;
128 else
130 /* Create a new separator */
131 sep = g_slice_new0 (AnjutaTokenStyleSeparator);
132 sep->count = 1;
133 sep->value = g_strdup (value);
134 sep->eol = value == NULL ? FALSE : strchr (value, '\n') != NULL;
135 list = g_list_insert_before (list, last, sep);
136 g_hash_table_replace (style->separator, GINT_TO_POINTER (key), list);
138 return sep;
142 static AnjutaTokenStyleSeparator*
143 anjuta_token_style_insert_separator_between (AnjutaTokenStyle *style, gint next, gint prev, const gchar *value)
145 return anjuta_token_style_insert_separator (style, ((guint)prev & 0xFFFF) | (((guint)next & 0xFFFF) << 16), value);
148 static AnjutaToken*
149 anjuta_token_style_lookup (AnjutaTokenStyle *style, AnjutaTokenType type, gboolean eol)
151 GList *list;
153 list = g_hash_table_lookup (style->separator, GINT_TO_POINTER (type));
154 if ((list == NULL) && (style->base != NULL))
156 return anjuta_token_style_lookup (style->base, type, eol);
158 else
160 return anjuta_token_new_string (ANJUTA_TOKEN_NAME, ((AnjutaTokenStyleSeparator *)list->data)->value);
164 /* Public style functions
165 *---------------------------------------------------------------------------*/
167 void
168 anjuta_token_style_update (AnjutaTokenStyle *style, AnjutaToken *list)
170 AnjutaToken *token;
171 AnjutaToken *next_token;
172 guint prev = 0;
173 guint next = 0;
174 guint line_width = 0;
175 guint sep_count = 0;
177 /* Initialize first line width */
178 for (token = list; token != NULL; token = anjuta_token_previous (token))
180 gchar *value;
181 gchar *eol = NULL;
182 gsize len = 0;
184 value = anjuta_token_evaluate (token);
185 if (value != NULL)
187 eol = strrchr (value, '\n');
188 len = strlen (value);
189 g_free (value);
192 if (eol != NULL)
194 line_width = value + len - eol;
195 break;
198 line_width += len;
201 for (token = anjuta_token_first_item (list); token != NULL; token = next_token)
203 gchar *value = NULL;
204 const gchar *eol;
205 gsize len;
206 gint type;
208 next_token = anjuta_token_next_item (token);
209 type = anjuta_token_get_type (token);
210 next = next_token == NULL ? 0 : anjuta_token_get_type (next_token);
212 value = anjuta_token_evaluate (token);
213 if (value == NULL) continue;
215 len = strlen (value);
216 eol = strrchr (value, '\n');
217 if (eol != NULL) len -= (eol - value);
218 g_free (value);
220 line_width += len;
222 switch (type)
224 case ANJUTA_TOKEN_START:
225 case ANJUTA_TOKEN_LAST:
226 case ANJUTA_TOKEN_NEXT:
227 break;
228 default:
229 if (eol != NULL)
231 line_width = len;
232 sep_count = 0;
234 continue;
237 value = anjuta_token_evaluate (token);
238 anjuta_token_style_insert_separator_between (style, 0, type, value);
239 if (type == ANJUTA_TOKEN_NEXT)
241 anjuta_token_style_insert_separator_between (style, next, prev, value);
242 anjuta_token_style_insert_separator_between (style, next, ANJUTA_TOKEN_ANY, value);
243 anjuta_token_style_insert_separator_between (style, ANJUTA_TOKEN_ANY, prev, value);
245 g_free (value);
247 if (eol == NULL)
249 sep_count++;
251 else
253 if ((sep_count > 1) && (line_width > style->max_width))
255 style->max_width = line_width;
257 sep_count = 0;
258 line_width = len;
263 void
264 anjuta_token_style_format (AnjutaTokenStyle *style, AnjutaToken *list)
266 AnjutaToken *item;
267 AnjutaToken *last;
268 AnjutaToken *text;
269 AnjutaToken *prev;
271 /* Find following tokens */
272 for (last = list; last != NULL; last = anjuta_token_next (last))
274 /* Get all tokens in group */
275 last = anjuta_token_last (last);
277 gint flags = anjuta_token_get_flags (last);
278 if (!(flags & (ANJUTA_TOKEN_ADDED | ANJUTA_TOKEN_REMOVED))) break;
281 /* Find previous token */
282 for (prev = list; prev != NULL; prev = anjuta_token_previous (prev))
284 gint flags = anjuta_token_get_flags (prev);
285 if ((anjuta_token_get_length (prev) != 0) && !(flags & (ANJUTA_TOKEN_ADDED | ANJUTA_TOKEN_REMOVED))) break;
286 list = prev;
289 for (item = list; (item != NULL) && (item != last); item = anjuta_token_next (item))
291 if ((anjuta_token_get_flags (item) & ANJUTA_TOKEN_ADDED) &&
292 !(anjuta_token_get_flags (item) & ANJUTA_TOKEN_REMOVED))
294 switch (anjuta_token_get_type (item))
296 case ANJUTA_TOKEN_START:
297 text = anjuta_token_style_lookup (style, ANJUTA_TOKEN_START, FALSE);
298 anjuta_token_set_flags (text, ANJUTA_TOKEN_ADDED);
299 anjuta_token_insert_after (item, text);
300 anjuta_token_merge (item, text);
301 item = text;
302 break;
303 case ANJUTA_TOKEN_NEXT:
304 text = anjuta_token_style_lookup (style, ANJUTA_TOKEN_NEXT, FALSE);
305 anjuta_token_set_flags (text, ANJUTA_TOKEN_ADDED);
306 anjuta_token_insert_after (item, text);
307 anjuta_token_merge (item, text);
308 item = text;
309 break;
310 case ANJUTA_TOKEN_LAST:
311 text = anjuta_token_style_lookup (style, ANJUTA_TOKEN_LAST, FALSE);
312 anjuta_token_set_flags (text, ANJUTA_TOKEN_ADDED);
313 anjuta_token_insert_after (item, text);
314 anjuta_token_merge (item, text);
315 item = text;
316 break;
317 default:
318 break;
324 /* Word functions
325 *---------------------------------------------------------------------------*/
328 * anjuta_token_first_word:
329 * @list: a #AnjutaToken object being a list
331 * Get the first word of the list. A word is an item in the list which is not
332 * a space or a separator.
334 * Return value: A #AnjutaToken representing the first word or NULL.
336 AnjutaToken *
337 anjuta_token_first_word (AnjutaToken *list)
339 AnjutaToken *item;
341 for (item = anjuta_token_first_item (list); item != NULL; item = anjuta_token_next_item (item))
343 if (anjuta_token_list (item) != list)
345 item = NULL;
346 break;
348 switch (anjuta_token_get_type (item))
350 case ANJUTA_TOKEN_START:
351 case ANJUTA_TOKEN_NEXT:
352 continue;
353 case ANJUTA_TOKEN_LAST:
354 item = NULL;
355 break;
356 default:
357 if (anjuta_token_is_empty (item) || (anjuta_token_get_flags(item) & ANJUTA_TOKEN_REMOVED)) continue;
358 break;
360 break;
363 return item;
366 AnjutaToken *
367 anjuta_token_next_word (AnjutaToken *item)
369 AnjutaToken *next;
371 for (next = anjuta_token_next_item (item); next != NULL; next = anjuta_token_next_item (next))
373 if (anjuta_token_list (item) != anjuta_token_list (next))
375 next = NULL;
376 break;
378 switch (anjuta_token_get_type (next))
380 case ANJUTA_TOKEN_START:
381 case ANJUTA_TOKEN_NEXT:
382 continue;
383 case ANJUTA_TOKEN_LAST:
384 next = NULL;
385 break;
386 default:
387 if (anjuta_token_is_empty (next) || (anjuta_token_get_flags(next) & ANJUTA_TOKEN_REMOVED)) continue;
388 break;
390 break;
393 return next;
396 AnjutaToken *
397 anjuta_token_nth_word (AnjutaToken *list, guint n)
399 AnjutaToken *item;
400 gboolean no_item = TRUE;
402 for (item = anjuta_token_first_item (list); item != NULL; item = anjuta_token_next_item (item))
404 if (anjuta_token_list (item) != list)
406 item = NULL;
407 break;
409 switch (anjuta_token_get_type (item))
411 case ANJUTA_TOKEN_START:
412 break;
413 case ANJUTA_TOKEN_NEXT:
414 if (no_item)
416 if (n == 0) return NULL;
417 n--;
419 no_item = TRUE;
420 break;
421 case ANJUTA_TOKEN_LAST:
422 return NULL;
423 default:
424 if (n == 0) return item;
425 n--;
426 no_item = FALSE;
427 break;
431 return NULL;
434 AnjutaToken *
435 anjuta_token_replace_nth_word (AnjutaToken *list, guint n, AnjutaToken *item)
437 AnjutaToken *token;
438 gboolean no_item = TRUE;
440 token = anjuta_token_first_item (list);
441 if (token == NULL)
443 token = anjuta_token_insert_after (token, anjuta_token_new_static (ANJUTA_TOKEN_LAST | ANJUTA_TOKEN_ADDED, NULL));
444 anjuta_token_merge (list, token);
447 for (n++;;)
449 AnjutaToken *next;
451 switch (anjuta_token_get_type (token))
453 case ANJUTA_TOKEN_LAST:
454 if (no_item)
456 n--;
457 if (n == 0)
459 token = anjuta_token_insert_before (token, item);
460 return token;
463 token = anjuta_token_insert_before (token, anjuta_token_new_static (ANJUTA_TOKEN_NEXT | ANJUTA_TOKEN_ADDED, NULL));
464 no_item = TRUE;
465 break;
466 case ANJUTA_TOKEN_NEXT:
467 if (no_item)
469 n--;
470 if (n == 0)
472 token = anjuta_token_insert_before (token, item);
473 return token;
476 no_item = TRUE;
477 break;
478 case ANJUTA_TOKEN_ITEM:
479 n--;
480 if (n == 0)
482 anjuta_token_set_flags (token, ANJUTA_TOKEN_REMOVED);
483 token = anjuta_token_insert_before (token, item);
484 return token;
486 no_item = FALSE;
487 break;
488 default:
489 break;
492 next = anjuta_token_next_item (token);
493 if (next == NULL)
495 token = anjuta_token_insert_after (token, anjuta_token_new_static (ANJUTA_TOKEN_LAST | ANJUTA_TOKEN_ADDED, NULL));
496 anjuta_token_merge (list, token);
498 else
500 token = next;
505 AnjutaToken *
506 anjuta_token_insert_word_before (AnjutaToken *list, AnjutaToken *sibling, AnjutaToken *item)
508 AnjutaToken *token;
510 if (list == NULL) list = anjuta_token_list (sibling);
512 for (token = anjuta_token_first_item (list); token != NULL;)
514 AnjutaToken *next;
516 switch (anjuta_token_get_type (token))
518 case ANJUTA_TOKEN_LAST:
519 anjuta_token_insert_before (token, anjuta_token_new_static (ANJUTA_TOKEN_NEXT | ANJUTA_TOKEN_ADDED, NULL));
520 anjuta_token_insert_before (token, item);
521 return item;
522 case ANJUTA_TOKEN_START:
523 if (token == sibling)
525 anjuta_token_insert_after (token, anjuta_token_new_static (ANJUTA_TOKEN_NEXT | ANJUTA_TOKEN_ADDED, NULL));
526 anjuta_token_insert_after (token, item);
527 return item;
529 break;
530 case ANJUTA_TOKEN_NEXT:
531 if (token == sibling)
533 token = anjuta_token_insert_before (token, item);
534 anjuta_token_insert_before (token, anjuta_token_new_static (ANJUTA_TOKEN_NEXT | ANJUTA_TOKEN_ADDED, NULL));
535 return item;
537 break;
538 default:
539 if (token == sibling)
541 anjuta_token_insert_before (token, item);
542 anjuta_token_insert_before (token, anjuta_token_new_static (ANJUTA_TOKEN_NEXT | ANJUTA_TOKEN_ADDED, NULL));
543 return item;
545 break;
548 next = anjuta_token_next_item (token);
549 if (next == NULL)
551 token = anjuta_token_insert_after (token, anjuta_token_new_static (ANJUTA_TOKEN_NEXT | ANJUTA_TOKEN_ADDED, NULL));
552 anjuta_token_insert_after (token, item);
553 return item;
555 token = next;
558 anjuta_token_prepend_items (list, item);
560 return item;
563 AnjutaToken *
564 anjuta_token_insert_word_after (AnjutaToken *list, AnjutaToken *sibling, AnjutaToken *item)
566 AnjutaToken *token;
568 if (list == NULL) list = anjuta_token_list (sibling);
570 for (token = anjuta_token_first_item (list); token != NULL;)
572 AnjutaToken *next;
574 next = anjuta_token_next_item (token);
576 switch (anjuta_token_get_type (token))
578 case ANJUTA_TOKEN_LAST:
579 anjuta_token_insert_before (token, anjuta_token_new_static (ANJUTA_TOKEN_NEXT | ANJUTA_TOKEN_ADDED, NULL));
580 anjuta_token_insert_before (token, item);
581 return item;
582 case ANJUTA_TOKEN_START:
583 if ((sibling == NULL) || (token == sibling))
585 if (next != NULL) anjuta_token_insert_after (token, anjuta_token_new_static (ANJUTA_TOKEN_NEXT | ANJUTA_TOKEN_ADDED, NULL));
586 anjuta_token_insert_after (token, item);
587 return item;
589 break;
590 case ANJUTA_TOKEN_NEXT:
591 if (token == sibling)
593 token = anjuta_token_insert_after (token, item);
594 anjuta_token_insert_after (token, anjuta_token_new_static (ANJUTA_TOKEN_NEXT | ANJUTA_TOKEN_ADDED, NULL));
595 return item;
597 break;
598 default:
599 if (token == sibling)
601 token = anjuta_token_insert_after (token, anjuta_token_new_static (ANJUTA_TOKEN_NEXT | ANJUTA_TOKEN_ADDED, NULL));
602 anjuta_token_insert_after (token, item);
603 return item;
605 break;
608 if (next == NULL)
610 token = anjuta_token_insert_after (token, anjuta_token_new_static (ANJUTA_TOKEN_NEXT | ANJUTA_TOKEN_ADDED, NULL));
611 anjuta_token_insert_after (token, item);
612 return item;
614 token = next;
617 anjuta_token_prepend_items (list, item);
619 return item;
622 AnjutaToken*
623 anjuta_token_remove_word (AnjutaToken *token)
625 AnjutaToken *next;
627 anjuta_token_set_flags (token, ANJUTA_TOKEN_REMOVED);
628 next = anjuta_token_next_item (token);
629 if ((next != NULL) && (anjuta_token_list (token) == anjuta_token_list (next)) && (anjuta_token_get_type (next) == ANJUTA_TOKEN_NEXT))
631 /* Remove following separator */
632 anjuta_token_set_flags (next, ANJUTA_TOKEN_REMOVED);
634 else
636 next = anjuta_token_previous_item (token);
637 if ((next != NULL) && (anjuta_token_list (token) == anjuta_token_list (next)) && (anjuta_token_get_type (next) == ANJUTA_TOKEN_NEXT))
639 /* Remove previous separator */
640 anjuta_token_set_flags (next, ANJUTA_TOKEN_REMOVED);
642 else
644 next = NULL;
648 return next;
652 * anjuta_token_remove_list:
653 * @token: a #AnjutaToken corresponding to a list
655 * Remove a complete list of token.
657 * Return value: A #AnjutaToken representing the following token
659 AnjutaToken *
660 anjuta_token_remove_list (AnjutaToken *list)
662 AnjutaToken *next;
663 AnjutaToken *prev;
665 if (!(anjuta_token_get_flags(list) & ANJUTA_TOKEN_REMOVED))
667 anjuta_token_set_flags (list, ANJUTA_TOKEN_REMOVED);
669 prev = anjuta_token_previous_item (list);
670 if (prev != NULL)
672 if (anjuta_token_get_type (prev) == ANJUTA_TOKEN_EOL)
674 /* Remove line above if empty */
675 AnjutaToken *prev_prev = anjuta_token_previous_item (prev);
677 if ((prev_prev == NULL) || (anjuta_token_get_type (prev_prev) == ANJUTA_TOKEN_EOL) || (anjuta_token_get_type (prev_prev) == ANJUTA_TOKEN_COMMENT))
679 anjuta_token_set_flags (prev, ANJUTA_TOKEN_REMOVED);
682 else if (anjuta_token_get_type (prev) == ANJUTA_TOKEN_COMMENT)
684 /* Remove comment above if there is an empty line after it */
687 prev = anjuta_token_previous_item (prev);
689 while ((prev != NULL) && (anjuta_token_get_type (prev) == ANJUTA_TOKEN_COMMENT));
691 if ((prev != NULL) && (anjuta_token_get_type (prev) == ANJUTA_TOKEN_EOL))
693 prev = list;
696 anjuta_token_set_flags (prev, ANJUTA_TOKEN_REMOVED);
697 prev = anjuta_token_previous_item (prev);
699 while ((prev != NULL) && (anjuta_token_get_type (prev) == ANJUTA_TOKEN_COMMENT));
705 next = anjuta_token_next_item (list);
706 if (next != NULL)
708 if (anjuta_token_get_type (next) == ANJUTA_TOKEN_EOL)
710 anjuta_token_set_flags (next, ANJUTA_TOKEN_REMOVED);
712 next = anjuta_token_next_item (next);
715 return next;
718 AnjutaToken *
719 anjuta_token_insert_token_list (gboolean after, AnjutaToken *pos,...)
721 AnjutaToken *first = NULL;
722 GList *group = NULL;
723 va_list args;
724 gint type;
726 va_start (args, pos);
728 for (type = va_arg (args, gint); type != 0; type = va_arg (args, gint))
730 gchar *string = va_arg (args, gchar *);
731 AnjutaToken *token;
733 if (pos == NULL)
735 pos = token = anjuta_token_new_string (type | ANJUTA_TOKEN_ADDED, string);
736 after = TRUE;
738 else
740 if (after)
742 pos = token = anjuta_token_insert_after (pos, anjuta_token_new_string (type | ANJUTA_TOKEN_ADDED, string));
744 else
746 token = anjuta_token_insert_before (pos, anjuta_token_new_string (type | ANJUTA_TOKEN_ADDED, string));
749 if (first == NULL) first = token;
751 if (group != NULL)
753 anjuta_token_merge ((AnjutaToken *)group->data, token);
756 if (string == NULL)
758 switch (type)
760 case ANJUTA_TOKEN_LIST:
761 break;
762 default:
763 group = g_list_delete_link (group, group);
764 break;
766 group = g_list_prepend (group, token);
769 g_list_free (group);
771 va_end (args);
773 return first;
776 AnjutaToken *
777 anjuta_token_find_type (AnjutaToken *list, gint flags, AnjutaTokenType* types)
779 AnjutaToken *tok;
780 AnjutaToken *last = NULL;
782 for (tok = list; tok != NULL; tok = anjuta_token_next (tok))
784 AnjutaTokenType *type;
785 for (type = types; *type != 0; type++)
787 if (anjuta_token_get_type (tok) == *type)
789 last = tok;
790 if (flags & ANJUTA_TOKEN_SEARCH_NOT) break;
791 if (!(flags & ANJUTA_TOKEN_SEARCH_LAST)) break;
794 if ((flags & ANJUTA_TOKEN_SEARCH_NOT) && (*type == 0)) break;
797 return last;
800 AnjutaToken *
801 anjuta_token_skip_comment (AnjutaToken *token)
803 if (token == NULL) return NULL;
805 for (;;)
807 for (;;)
809 AnjutaToken *next = anjuta_token_next (token);
811 if (next == NULL) return token;
813 switch (anjuta_token_get_type (token))
815 case ANJUTA_TOKEN_FILE:
816 case ANJUTA_TOKEN_SPACE:
817 token = next;
818 continue;
819 case ANJUTA_TOKEN_COMMENT:
820 token = next;
821 break;
822 default:
823 return token;
825 break;
828 for (;;)
830 AnjutaToken *next = anjuta_token_next (token);
832 if (next == NULL) return token;
833 token = next;
834 if (anjuta_token_get_type (token) == ANJUTA_TOKEN_EOL) break;
839 /* Constructor & Destructor
840 *---------------------------------------------------------------------------*/
842 AnjutaTokenStyle *
843 anjuta_token_style_new (const gchar *start, const gchar *next, const gchar *eol, const gchar *last, guint max_width)
845 AnjutaTokenStyle *style;
847 style = g_slice_new0 (AnjutaTokenStyle);
848 style->max_width = max_width;
850 style->separator = g_hash_table_new (g_direct_hash, NULL);
851 anjuta_token_style_insert_separator (style, ANJUTA_TOKEN_START, start);
852 anjuta_token_style_insert_separator (style, ANJUTA_TOKEN_NEXT, next);
853 anjuta_token_style_insert_separator (style, ANJUTA_TOKEN_NEXT, eol);
854 anjuta_token_style_insert_separator (style, ANJUTA_TOKEN_LAST, last);
856 return style;
859 AnjutaTokenStyle *
860 anjuta_token_style_new_from_base (AnjutaTokenStyle *base)
862 AnjutaTokenStyle *style;
864 style = g_slice_new0 (AnjutaTokenStyle);
865 style->max_width = base->max_width;
866 style->base = base;
868 style->separator = g_hash_table_new (g_direct_hash, NULL);
870 return style;
873 void
874 anjuta_token_style_free (AnjutaTokenStyle *style)
876 g_hash_table_foreach (style->separator, (GHFunc)free_separator_list, NULL);
877 g_hash_table_destroy (style->separator);
878 g_slice_free (AnjutaTokenStyle, style);