Anjuta token

## Anjuta token Anjuta token — Anjuta token |

## Stability Level

Unstable, unless otherwise indicated

## Synopsis

    #include <libanjuta/anjuta-token.h>

    enum                AnjutaTokenType;
    void                (*AnjutaTokenForeachFunc)           (AnjutaToken *token,
                                                             gpointer data);
    AnjutaToken *       anjuta_token_new_string             (AnjutaTokenType type,
                                                             const gchar *value);
    AnjutaToken *       anjuta_token_new_string_len         (AnjutaTokenType type,
                                                             gchar *value,
                                                             gsize length);
    AnjutaToken *       anjuta_token_new_static             (AnjutaTokenType type,
                                                             const gchar *value);
    AnjutaToken *       anjuta_token_new_static_len         (gint type,
                                                             const gchar *pos,
                                                             gsize length);
    AnjutaToken *       anjuta_token_free_children          (AnjutaToken *token);
    AnjutaToken *       anjuta_token_free                   (AnjutaToken *token);
    void                anjuta_token_set_type               (AnjutaToken *token,
                                                             gint type);
    void                anjuta_token_set_flags              (AnjutaToken *token,
                                                             gint flags);
    void                anjuta_token_clear_flags            (AnjutaToken *token,
                                                             gint flags);
    gint                anjuta_token_get_flags              (AnjutaToken *token);
    void                anjuta_token_set_string             (AnjutaToken *token,
                                                             const char *value,
                                                             gsize length);
    const gchar *       anjuta_token_get_string             (AnjutaToken *token);
    void                anjuta_token_set_length             (AnjutaToken *token,
                                                             gsize length);
    gsize               anjuta_token_get_length             (AnjutaToken *token);
    AnjutaToken *       anjuta_token_next                   (AnjutaToken *token);
    AnjutaToken *       anjuta_token_previous               (AnjutaToken *token);
    AnjutaToken *       anjuta_token_last                   (AnjutaToken *token);
    AnjutaToken *       anjuta_token_parent                 (AnjutaToken *token);
    AnjutaToken *       anjuta_token_list                   (AnjutaToken *token);
    AnjutaToken *       anjuta_token_next_after_children    (AnjutaToken *token);
    void                anjuta_token_foreach_content        (AnjutaToken *token,
                                                             AnjutaTokenForeachFunc func,
                                                             gpointer user_data);
    void                anjuta_token_foreach_token          (AnjutaToken *token,
                                                             AnjutaTokenForeachFunc func,
                                                             gpointer user_data);
    AnjutaToken *       anjuta_token_foreach_post_order     (AnjutaToken *token,
                                                             AnjutaTokenForeachFunc func,
                                                             gpointer user_data);
    AnjutaToken *       anjuta_token_first_item             (AnjutaToken *list);
    AnjutaToken *       anjuta_token_next_item              (AnjutaToken *item);
    AnjutaToken *       anjuta_token_previous_item          (AnjutaToken *item);
    AnjutaToken *       anjuta_token_last_item              (AnjutaToken *list);
    AnjutaToken *       anjuta_token_append_child           (AnjutaToken *parent,
                                                             AnjutaToken *children);
    AnjutaToken *       anjuta_token_prepend_child          (AnjutaToken *parent,
                                                             AnjutaToken *children);
    AnjutaToken *       anjuta_token_prepend_items          (AnjutaToken *list,
                                                             AnjutaToken *item);
    AnjutaToken *       anjuta_token_insert_after           (AnjutaToken *sibling,
                                                             AnjutaToken *list);
    AnjutaToken *       anjuta_token_insert_before          (AnjutaToken *sibling,
                                                             AnjutaToken *list);
    AnjutaToken *       anjuta_token_delete_parent          (AnjutaToken *parent);
    void                anjuta_token_remove_item            (AnjutaToken *item);
    AnjutaToken *       anjuta_token_merge                  (AnjutaToken *first,
                                                             AnjutaToken *end);
    AnjutaToken *       anjuta_token_merge_own_children     (AnjutaToken *first);
    AnjutaToken *       anjuta_token_merge_children         (AnjutaToken *first,
                                                             AnjutaToken *end);
    AnjutaToken *       anjuta_token_merge_previous         (AnjutaToken *list,
                                                             AnjutaToken *first);
    AnjutaToken *       anjuta_token_split                  (AnjutaToken *token,
                                                             guint size);
    AnjutaToken *       anjuta_token_cut                    (AnjutaToken *token,
                                                             guint pos,
                                                             guint size);
    AnjutaToken *       anjuta_token_concat                 (AnjutaToken *token);
    gchar *             anjuta_token_evaluate               (AnjutaToken *token);
    gchar *             anjuta_token_evaluate_name          (AnjutaToken *token);
    gboolean            anjuta_token_is_empty               (AnjutaToken *token);
    void                anjuta_token_dump                   (AnjutaToken *token);
    gboolean            anjuta_token_check                  (AnjutaToken *token);
    void                anjuta_token_dump_link              (AnjutaToken *token);
    gboolean            anjuta_token_compare                (AnjutaToken *tokena,
                                                             AnjutaToken *tokenb);
                        AnjutaToken;

## Description

A AnjutaToken represents a token. It is a sequence of characters associated with a type representing its meaning. By example, a token can represent a keyword, a comment, a variable...

The token can own the string or has only a pointer on some data allocated somewhere else with a length.

A token is linked with other tokens using three double linked lists.

The first list using next and prev fields is used to keep the token in the order where there are in the file. The first character of the first token is the first character in the file.

A second list is used to represent included files. Such file is represented by a special token in the first list which has a pointer, named children to a token list. Each token in this secondary list has a pointer to its parent, it means the token representing the file where is the token. It looks like a tree. In fact, every file is represented by a special token, so the root node is normally a file token and has as children all the token representing the file content. This parent/child list is used for expanded variable too.

A third list is used to group several tokens. A token can have a pointer to another last token. It means that this token is a group starting from this token to the one indicated by the last field. In addition each token in this group has a pointer on the first token of the group. This grouping is independent of the parent/child list. So a group can start in one file and end in another included file. The grouping can be nested too. Typically we can have a group representing a command, a sub group representing the arguments and then one sub group for each argument.

## Details

### enum AnjutaTokenType

    typedef enum {
    	ANJUTA_TOKEN_NONE 							= 0,
    	ANJUTA_TOKEN_EOL								= '\n',
    	ANJUTA_TOKEN_COMMA								= 0x2C,		/* glib-genmarshal doesn't like ',' */

    	ANJUTA_TOKEN_TYPE 							= 0xFFFF,

    	ANJUTA_TOKEN_FIRST								= 16384,
    	ANJUTA_TOKEN_FILE,
    	ANJUTA_TOKEN_MACRO,
    	ANJUTA_TOKEN_CONTENT,
    	ANJUTA_TOKEN_ARGUMENT,
    	ANJUTA_TOKEN_VALUE,
    	ANJUTA_TOKEN_EOV, /* 16390 */
    	ANJUTA_TOKEN_PARSED,
    	ANJUTA_TOKEN_KEYWORD,
    	ANJUTA_TOKEN_OPERATOR,
    	ANJUTA_TOKEN_NAME,
    	ANJUTA_TOKEN_VARIABLE,
    	ANJUTA_TOKEN_DEFINITION,
    	ANJUTA_TOKEN_STATEMENT,
    	ANJUTA_TOKEN_NUMBER,
    	ANJUTA_TOKEN_JUNK,
    	ANJUTA_TOKEN_COMMENT, /* 16400 */
    	ANJUTA_TOKEN_OPEN_QUOTE,
    	ANJUTA_TOKEN_CLOSE_QUOTE,
    	ANJUTA_TOKEN_ESCAPE,
    	ANJUTA_TOKEN_FUNCTION,
    	ANJUTA_TOKEN_SPACE,
    	ANJUTA_TOKEN_START,
    	ANJUTA_TOKEN_NEXT,
    	ANJUTA_TOKEN_LAST,
    	ANJUTA_TOKEN_ITEM,
    	ANJUTA_TOKEN_STRING, /* 16410 */
    	ANJUTA_TOKEN_ERROR,
    	ANJUTA_TOKEN_WORD,
    	ANJUTA_TOKEN_LIST,
    	ANJUTA_TOKEN_ANY,
    	ANJUTA_TOKEN_USER,

    	ANJUTA_TOKEN_FLAGS 							= 0xFFFF << 16,

    	ANJUTA_TOKEN_PUBLIC_FLAGS 				= 0x00FF << 16,

    	ANJUTA_TOKEN_IRRELEVANT 					= 1 << 16,
    	ANJUTA_TOKEN_OPEN 							= 1 << 17,
    	ANJUTA_TOKEN_CLOSE 							= 1 << 18,
    	ANJUTA_TOKEN_SIGNIFICANT					= 1 << 20,

    	ANJUTA_TOKEN_PRIVATE_FLAGS 			= 0x00FF << 24,

    	ANJUTA_TOKEN_CASE_INSENSITIVE 		= 1 << 24,
    	ANJUTA_TOKEN_STATIC 							= 1 << 25,
    	ANJUTA_TOKEN_REMOVED						= 1 << 26,
    	ANJUTA_TOKEN_ADDED							= 1 << 27
    } AnjutaTokenType;

`ANJUTA_TOKEN_NONE` |
`ANJUTA_TOKEN_EOL` |
`ANJUTA_TOKEN_COMMA` |
`ANJUTA_TOKEN_TYPE` |
`ANJUTA_TOKEN_FIRST` |
`ANJUTA_TOKEN_FILE` |
`ANJUTA_TOKEN_MACRO` |
`ANJUTA_TOKEN_CONTENT` |
`ANJUTA_TOKEN_ARGUMENT` |
`ANJUTA_TOKEN_VALUE` |
`ANJUTA_TOKEN_EOV` |
`ANJUTA_TOKEN_PARSED` |
`ANJUTA_TOKEN_KEYWORD` |
`ANJUTA_TOKEN_OPERATOR` |
`ANJUTA_TOKEN_NAME` |
`ANJUTA_TOKEN_VARIABLE` |
`ANJUTA_TOKEN_DEFINITION` |
`ANJUTA_TOKEN_STATEMENT` |
`ANJUTA_TOKEN_NUMBER` |
`ANJUTA_TOKEN_JUNK` |
`ANJUTA_TOKEN_COMMENT` |
`ANJUTA_TOKEN_OPEN_QUOTE` |
`ANJUTA_TOKEN_CLOSE_QUOTE` |
`ANJUTA_TOKEN_ESCAPE` |
`ANJUTA_TOKEN_FUNCTION` |
`ANJUTA_TOKEN_SPACE` |
`ANJUTA_TOKEN_START` |
`ANJUTA_TOKEN_NEXT` |
`ANJUTA_TOKEN_LAST` |
`ANJUTA_TOKEN_ITEM` |
`ANJUTA_TOKEN_STRING` |
`ANJUTA_TOKEN_ERROR` |
`ANJUTA_TOKEN_WORD` |
`ANJUTA_TOKEN_LIST` |
`ANJUTA_TOKEN_ANY` |
`ANJUTA_TOKEN_USER` |
`ANJUTA_TOKEN_FLAGS` |
`ANJUTA_TOKEN_PUBLIC_FLAGS` |
`ANJUTA_TOKEN_IRRELEVANT` |
`ANJUTA_TOKEN_OPEN` |
`ANJUTA_TOKEN_CLOSE` |
`ANJUTA_TOKEN_SIGNIFICANT` |
`ANJUTA_TOKEN_PRIVATE_FLAGS` |
`ANJUTA_TOKEN_CASE_INSENSITIVE` |
`ANJUTA_TOKEN_STATIC` |
`ANJUTA_TOKEN_REMOVED` |
`ANJUTA_TOKEN_ADDED` |

### AnjutaTokenForeachFunc ()

    void                (*AnjutaTokenForeachFunc)           (AnjutaToken *token,
                                                             gpointer data);

### anjuta_token_new_string ()

    AnjutaToken *       anjuta_token_new_string             (AnjutaTokenType type,
                                                             const gchar *value);

### anjuta_token_new_string_len ()

    AnjutaToken *       anjuta_token_new_string_len         (AnjutaTokenType type,
                                                             gchar *value,
                                                             gsize length);

### anjuta_token_new_static ()

    AnjutaToken *       anjuta_token_new_static             (AnjutaTokenType type,
                                                             const gchar *value);

### anjuta_token_new_static_len ()

    AnjutaToken *       anjuta_token_new_static_len         (gint type,
                                                             const gchar *pos,
                                                             gsize length);

### anjuta_token_free_children ()

    AnjutaToken *       anjuta_token_free_children          (AnjutaToken *token);

### anjuta_token_free ()

    AnjutaToken *       anjuta_token_free                   (AnjutaToken *token);

### anjuta_token_set_type ()

    void                anjuta_token_set_type               (AnjutaToken *token,
                                                             gint type);

### anjuta_token_set_flags ()

    void                anjuta_token_set_flags              (AnjutaToken *token,
                                                             gint flags);

### anjuta_token_clear_flags ()

    void                anjuta_token_clear_flags            (AnjutaToken *token,
                                                             gint flags);

### anjuta_token_get_flags ()

    gint                anjuta_token_get_flags              (AnjutaToken *token);

### anjuta_token_set_string ()

    void                anjuta_token_set_string             (AnjutaToken *token,
                                                             const char *value,
                                                             gsize length);

### anjuta_token_get_string ()

    const gchar *       anjuta_token_get_string             (AnjutaToken *token);

### anjuta_token_set_length ()

    void                anjuta_token_set_length             (AnjutaToken *token,
                                                             gsize length);

### anjuta_token_get_length ()

    gsize               anjuta_token_get_length             (AnjutaToken *token);

### anjuta_token_next ()

    AnjutaToken *       anjuta_token_next                   (AnjutaToken *token);

### anjuta_token_previous ()

    AnjutaToken *       anjuta_token_previous               (AnjutaToken *token);

### anjuta_token_last ()

    AnjutaToken *       anjuta_token_last                   (AnjutaToken *token);

### anjuta_token_parent ()

    AnjutaToken *       anjuta_token_parent                 (AnjutaToken *token);

### anjuta_token_list ()

    AnjutaToken *       anjuta_token_list                   (AnjutaToken *token);

### anjuta_token_next_after_children ()

    AnjutaToken *       anjuta_token_next_after_children    (AnjutaToken *token);

### anjuta_token_foreach_content ()

    void                anjuta_token_foreach_content        (AnjutaToken *token,
                                                             AnjutaTokenForeachFunc func,
                                                             gpointer user_data);

### anjuta_token_foreach_token ()

    void                anjuta_token_foreach_token          (AnjutaToken *token,
                                                             AnjutaTokenForeachFunc func,
                                                             gpointer user_data);

### anjuta_token_foreach_post_order ()

    AnjutaToken *       anjuta_token_foreach_post_order     (AnjutaToken *token,
                                                             AnjutaTokenForeachFunc func,
                                                             gpointer user_data);

### anjuta_token_first_item ()

    AnjutaToken *       anjuta_token_first_item             (AnjutaToken *list);

### anjuta_token_next_item ()

    AnjutaToken *       anjuta_token_next_item              (AnjutaToken *item);

### anjuta_token_previous_item ()

    AnjutaToken *       anjuta_token_previous_item          (AnjutaToken *item);

### anjuta_token_last_item ()

    AnjutaToken *       anjuta_token_last_item              (AnjutaToken *list);

### anjuta_token_append_child ()

    AnjutaToken *       anjuta_token_append_child           (AnjutaToken *parent,
                                                             AnjutaToken *children);

Insert all tokens in children as the last children of the given parent.

`parent` : | a AnjutaToken object used as parent.
`children` : | a AnjutaToken object.
Returns : | The first token append.

### anjuta_token_prepend_child ()

    AnjutaToken *       anjuta_token_prepend_child          (AnjutaToken *parent,
                                                             AnjutaToken *children);

Insert all tokens in children as the first children of the given parent.

`parent` : | a AnjutaToken object used as parent.
`children` : | a AnjutaToken object.
Returns : | The first token append.

### anjuta_token_prepend_items ()

    AnjutaToken *       anjuta_token_prepend_items          (AnjutaToken *list,
                                                             AnjutaToken *item);

Insert all tokens in item as item of the given list.

`list` : | a AnjutaToken object used as list.
`item` : | a AnjutaToken object.
Returns : | The first token append.

### anjuta_token_insert_after ()

    AnjutaToken *       anjuta_token_insert_after           (AnjutaToken *sibling,
                                                             AnjutaToken *list);

Insert all tokens after sibling.

`sibling` : | a AnjutaToken object.
`list` : | a AnjutaToken object.
Returns : | The first token inserted.

### anjuta_token_insert_before ()

    AnjutaToken *       anjuta_token_insert_before          (AnjutaToken *sibling,
                                                             AnjutaToken *list);

Insert all tokens before sibling.

`sibling` : | a AnjutaToken object.
`list` : | a AnjutaToken object.
Returns : | The first token inserted.

### anjuta_token_delete_parent ()

    AnjutaToken *       anjuta_token_delete_parent          (AnjutaToken *parent);

Delete only the parent token.

`parent` : | a AnjutaToken object used as parent.
Returns : | the first children

### anjuta_token_remove_item ()

    void                anjuta_token_remove_item            (AnjutaToken *item);

### anjuta_token_merge ()

    AnjutaToken *       anjuta_token_merge                  (AnjutaToken *first,
                                                             AnjutaToken *end);

### anjuta_token_merge_own_children ()

    AnjutaToken *       anjuta_token_merge_own_children     (AnjutaToken *first);

### anjuta_token_merge_children ()

    AnjutaToken *       anjuta_token_merge_children         (AnjutaToken *first,
                                                             AnjutaToken *end);

### anjuta_token_merge_previous ()

    AnjutaToken *       anjuta_token_merge_previous         (AnjutaToken *list,
                                                             AnjutaToken *first);

If the list token is not already linked with first, it is inserted just before first. If the list token is already linked, it must be in the same list after first token. It it possible to have several tokens beweent list and first.

`list` : | a AnjutaToken object representing a list
`first` : | a AnjutaToken object for the new beginning of the list
Returns : | the new list

### anjuta_token_split ()

    AnjutaToken *       anjuta_token_split                  (AnjutaToken *token,
                                                             guint size);

### anjuta_token_cut ()

    AnjutaToken *       anjuta_token_cut                    (AnjutaToken *token,
                                                             guint pos,
                                                             guint size);

### anjuta_token_concat ()

    AnjutaToken *       anjuta_token_concat                 (AnjutaToken *token);

### anjuta_token_evaluate ()

    gchar *             anjuta_token_evaluate               (AnjutaToken *token);

### anjuta_token_evaluate_name ()

    gchar *             anjuta_token_evaluate_name          (AnjutaToken *token);

### anjuta_token_is_empty ()

    gboolean            anjuta_token_is_empty               (AnjutaToken *token);

### anjuta_token_dump ()

    void                anjuta_token_dump                   (AnjutaToken *token);

### anjuta_token_check ()

    gboolean            anjuta_token_check                  (AnjutaToken *token);

### anjuta_token_dump_link ()

    void                anjuta_token_dump_link              (AnjutaToken *token);

### anjuta_token_compare ()

    gboolean            anjuta_token_compare                (AnjutaToken *tokena,
                                                             AnjutaToken *tokenb);

### AnjutaToken

    typedef struct _AnjutaToken AnjutaToken;