gboolean amp_module_node_delete_token (AmpProject *project, AmpModuleNode *module, GError **error) { AnjutaToken *token; token = amp_module_node_get_token (module); if (token != NULL) { AnjutaToken *eol; token = anjuta_token_list (token); anjuta_token_set_flags (token, ANJUTA_TOKEN_REMOVED); eol = anjuta_token_next_item (token); if (anjuta_token_get_type (eol) == ANJUTA_TOKEN_EOL) { anjuta_token_set_flags (eol, ANJUTA_TOKEN_REMOVED); } eol = anjuta_token_next_item (eol); if (anjuta_token_get_type (eol) == ANJUTA_TOKEN_EOL) { anjuta_token_set_flags (eol, ANJUTA_TOKEN_REMOVED); } amp_project_update_configure (project, token); } return TRUE; }
AnjutaToken* anjuta_token_remove_word (AnjutaToken *token) { AnjutaToken *next; anjuta_token_set_flags (token, ANJUTA_TOKEN_REMOVED); next = anjuta_token_next_item (token); if ((next != NULL) && (anjuta_token_list (token) == anjuta_token_list (next)) && (anjuta_token_get_type (next) == ANJUTA_TOKEN_NEXT)) { /* Remove following separator */ anjuta_token_set_flags (next, ANJUTA_TOKEN_REMOVED); } else { next = anjuta_token_previous_item (token); if ((next != NULL) && (anjuta_token_list (token) == anjuta_token_list (next)) && (anjuta_token_get_type (next) == ANJUTA_TOKEN_NEXT)) { /* Remove previous separator */ anjuta_token_set_flags (next, ANJUTA_TOKEN_REMOVED); } else { next = NULL; } } return next; }
/** * anjuta_token_stream_read: * @stream: a #AnjutaTokenStream object. * @buffer: a character buffer to fill with token data. * @max_size: the size of the buffer. * * Read token from the input stream and write the content as a C string in the * buffer passed as argument. * * Return value: The number of characters written in the buffer. */ gint anjuta_token_stream_read (AnjutaTokenStream *stream, gchar *buffer, gsize max_size) { gint result = 0; if (stream->token != NULL) { gsize length = anjuta_token_get_length (stream->token); if ((anjuta_token_get_type (stream->token) >= ANJUTA_TOKEN_PARSED) || (stream->pos >= length)) { for (;;) { /* Last token */ if (stream->token== stream->last) return 0; if (anjuta_token_get_type (stream->token) >= ANJUTA_TOKEN_PARSED) { stream->token = anjuta_token_next (stream->token); } else { stream->token = anjuta_token_next (stream->token); } if ((stream->token == NULL) || (anjuta_token_get_type (stream->token) == ANJUTA_TOKEN_EOV)) { /* Last token */ return 0; } else if ((anjuta_token_get_length (stream->token) != 0) && (anjuta_token_get_type (stream->token) < ANJUTA_TOKEN_PARSED)) { /* Find some data */ stream->pos = 0; length = anjuta_token_get_length (stream->token); break; } } } if (stream->pos < length) { const gchar *start = anjuta_token_get_string (stream->token); length -= stream->pos; if (length > max_size) length = max_size; memcpy (buffer, start + stream->pos, length); stream->pos += length; result = length; } } return result; }
void mkp_project_update_variable (MkpProject *project, AnjutaToken *variable) { AnjutaToken *arg; char *name = NULL; MakeTokenType assign = 0; AnjutaToken *value = NULL; //fprintf(stdout, "update variable"); //anjuta_token_dump (variable); arg = anjuta_token_first_item (variable); name = g_strstrip (anjuta_token_evaluate (arg)); arg = anjuta_token_next_item (arg); //g_message ("new variable %s", name); switch (anjuta_token_get_type (arg)) { case MK_TOKEN_EQUAL: case MK_TOKEN_IMMEDIATE_EQUAL: case MK_TOKEN_CONDITIONAL_EQUAL: case MK_TOKEN_APPEND: assign = anjuta_token_get_type (arg); break; default: break; } value = anjuta_token_next_item (arg); if (assign != 0) { MkpVariable *var; //g_message ("assign %d name %s value %s\n", assign, name, anjuta_token_evaluate (value)); var = (MkpVariable *)g_hash_table_lookup (project->variables, name); if (var != NULL) { var->assign = assign; var->value = value; } else { var = mkp_variable_new (name, assign, value); g_hash_table_insert (project->variables, var->name, var); } } //g_message ("update variable %s", name); if (name) g_free (name); }
/** * anjuta_token_first_word: * @list: a #AnjutaToken object being a list * * Get the first word of the list. A word is an item in the list which is not * a space or a separator. * * Return value: A #AnjutaToken representing the first word or %NULL. */ AnjutaToken * anjuta_token_first_word (AnjutaToken *list) { AnjutaToken *item; for (item = anjuta_token_first_item (list); item != NULL; item = anjuta_token_next_item (item)) { if (anjuta_token_list (item) != list) { item = NULL; break; } switch (anjuta_token_get_type (item)) { case ANJUTA_TOKEN_START: case ANJUTA_TOKEN_NEXT: continue; case ANJUTA_TOKEN_LAST: item = NULL; break; default: if (anjuta_token_is_empty (item) || (anjuta_token_get_flags(item) & ANJUTA_TOKEN_REMOVED)) continue; break; } break; } return item; }
AnjutaToken * anjuta_token_next_word (AnjutaToken *item) { AnjutaToken *next; for (next = anjuta_token_next_item (item); next != NULL; next = anjuta_token_next_item (next)) { if (anjuta_token_list (item) != anjuta_token_list (next)) { next = NULL; break; } switch (anjuta_token_get_type (next)) { case ANJUTA_TOKEN_START: case ANJUTA_TOKEN_NEXT: continue; case ANJUTA_TOKEN_LAST: next = NULL; break; default: if (anjuta_token_is_empty (next) || (anjuta_token_get_flags(next) & ANJUTA_TOKEN_REMOVED)) continue; break; } break; } return next; }
void anjuta_token_style_format (AnjutaTokenStyle *style, AnjutaToken *list) { AnjutaToken *item; AnjutaToken *last; AnjutaToken *text; AnjutaToken *prev; /* Find following tokens */ for (last = list; last != NULL; last = anjuta_token_next (last)) { /* Get all tokens in group */ last = anjuta_token_last (last); gint flags = anjuta_token_get_flags (last); if (!(flags & (ANJUTA_TOKEN_ADDED | ANJUTA_TOKEN_REMOVED))) break; } /* Find previous token */ for (prev = list; prev != NULL; prev = anjuta_token_previous (prev)) { gint flags = anjuta_token_get_flags (prev); if ((anjuta_token_get_length (prev) != 0) && !(flags & (ANJUTA_TOKEN_ADDED | ANJUTA_TOKEN_REMOVED))) break; list = prev; } for (item = list; (item != NULL) && (item != last); item = anjuta_token_next (item)) { if ((anjuta_token_get_flags (item) & ANJUTA_TOKEN_ADDED) && !(anjuta_token_get_flags (item) & ANJUTA_TOKEN_REMOVED)) { switch (anjuta_token_get_type (item)) { case ANJUTA_TOKEN_START: text = anjuta_token_style_lookup (style, ANJUTA_TOKEN_START, FALSE); anjuta_token_set_flags (text, ANJUTA_TOKEN_ADDED); anjuta_token_insert_after (item, text); anjuta_token_merge (item, text); item = text; break; case ANJUTA_TOKEN_NEXT: text = anjuta_token_style_lookup (style, ANJUTA_TOKEN_NEXT, FALSE); anjuta_token_set_flags (text, ANJUTA_TOKEN_ADDED); anjuta_token_insert_after (item, text); anjuta_token_merge (item, text); item = text; break; case ANJUTA_TOKEN_LAST: text = anjuta_token_style_lookup (style, ANJUTA_TOKEN_LAST, FALSE); anjuta_token_set_flags (text, ANJUTA_TOKEN_ADDED); anjuta_token_insert_after (item, text); anjuta_token_merge (item, text); item = text; break; default: break; } } } }
AnjutaToken * anjuta_token_insert_word_after (AnjutaToken *list, AnjutaToken *sibling, AnjutaToken *item) { AnjutaToken *token; if (list == NULL) list = anjuta_token_list (sibling); for (token = anjuta_token_first_item (list); token != NULL;) { AnjutaToken *next; next = anjuta_token_next_item (token); switch (anjuta_token_get_type (token)) { case ANJUTA_TOKEN_LAST: anjuta_token_insert_before (token, anjuta_token_new_static (ANJUTA_TOKEN_NEXT | ANJUTA_TOKEN_ADDED, NULL)); anjuta_token_insert_before (token, item); return item; case ANJUTA_TOKEN_START: if ((sibling == NULL) || (token == sibling)) { if (next != NULL) anjuta_token_insert_after (token, anjuta_token_new_static (ANJUTA_TOKEN_NEXT | ANJUTA_TOKEN_ADDED, NULL)); anjuta_token_insert_after (token, item); return item; } break; case ANJUTA_TOKEN_NEXT: if (token == sibling) { token = anjuta_token_insert_after (token, item); anjuta_token_insert_after (token, anjuta_token_new_static (ANJUTA_TOKEN_NEXT | ANJUTA_TOKEN_ADDED, NULL)); return item; } break; default: if (token == sibling) { token = anjuta_token_insert_after (token, anjuta_token_new_static (ANJUTA_TOKEN_NEXT | ANJUTA_TOKEN_ADDED, NULL)); anjuta_token_insert_after (token, item); return item; } break; } if (next == NULL) { token = anjuta_token_insert_after (token, anjuta_token_new_static (ANJUTA_TOKEN_NEXT | ANJUTA_TOKEN_ADDED, NULL)); anjuta_token_insert_after (token, item); return item; } token = next; } anjuta_token_prepend_items (list, item); return item; }
/** * anjuta_token_remove_list: * @token: a #AnjutaToken corresponding to a list * * Remove a complete list of token. * * Return value: A #AnjutaToken representing the following token */ AnjutaToken * anjuta_token_remove_list (AnjutaToken *list) { AnjutaToken *next; AnjutaToken *prev; if (!(anjuta_token_get_flags(list) & ANJUTA_TOKEN_REMOVED)) { anjuta_token_set_flags (list, ANJUTA_TOKEN_REMOVED); prev = anjuta_token_previous_item (list); if (prev != NULL) { if (anjuta_token_get_type (prev) == ANJUTA_TOKEN_EOL) { /* Remove line above if empty */ AnjutaToken *prev_prev = anjuta_token_previous_item (prev); if ((prev_prev == NULL) || (anjuta_token_get_type (prev_prev) == ANJUTA_TOKEN_EOL) || (anjuta_token_get_type (prev_prev) == ANJUTA_TOKEN_COMMENT)) { anjuta_token_set_flags (prev, ANJUTA_TOKEN_REMOVED); } } else if (anjuta_token_get_type (prev) == ANJUTA_TOKEN_COMMENT) { /* Remove comment above if there is an empty line after it */ do { prev = anjuta_token_previous_item (prev); } while ((prev != NULL) && (anjuta_token_get_type (prev) == ANJUTA_TOKEN_COMMENT)); if ((prev != NULL) && (anjuta_token_get_type (prev) == ANJUTA_TOKEN_EOL)) { prev = list; do { anjuta_token_set_flags (prev, ANJUTA_TOKEN_REMOVED); prev = anjuta_token_previous_item (prev); } while ((prev != NULL) && (anjuta_token_get_type (prev) == ANJUTA_TOKEN_COMMENT)); } } } } next = anjuta_token_next_item (list); if (next != NULL) { if (anjuta_token_get_type (next) == ANJUTA_TOKEN_EOL) { anjuta_token_set_flags (next, ANJUTA_TOKEN_REMOVED); } next = anjuta_token_next_item (next); } return next; }
AnjutaToken * anjuta_token_skip_comment (AnjutaToken *token) { if (token == NULL) return NULL; for (;;) { for (;;) { AnjutaToken *next = anjuta_token_next (token); if (next == NULL) return token; switch (anjuta_token_get_type (token)) { case ANJUTA_TOKEN_FILE: case ANJUTA_TOKEN_SPACE: token = next; continue; case ANJUTA_TOKEN_COMMENT: token = next; break; default: return token; } break; } for (;;) { AnjutaToken *next = anjuta_token_next (token); if (next == NULL) return token; token = next; if (anjuta_token_get_type (token) == ANJUTA_TOKEN_EOL) break; } } }
static AnjutaToken * amp_project_write_target (AmpGroupNode *group, gint type, const gchar *name, gboolean after, AnjutaToken* sibling) { AnjutaToken *pos = sibling; if (pos != NULL) { /* Find top level parent */ do { AnjutaTokenType type = anjuta_token_get_type (pos); if ((type >= AM_TOKEN_FIRST_ORDERED_MACRO) && (type <= AM_TOKEN_LAST_ORDERED_MACRO)) break; pos = anjuta_token_list (pos); } while (pos != NULL); if (pos != NULL) { /* Add target just near sibling target */ pos = anjuta_token_insert_token_list (after, pos, ANJUTA_TOKEN_EOL, "\n", NULL); pos = anjuta_token_insert_token_list (after, pos, ANJUTA_TOKEN_EOL, "\n", NULL); amp_group_node_update_makefile (group, pos); } } if (pos == NULL) { /* Find ordered position in Makefile.am */ pos = anjuta_token_find_group_property_position (group, type); } pos = anjuta_token_insert_token_list (after, pos, ANJUTA_TOKEN_LIST, NULL, type, name, ANJUTA_TOKEN_SPACE, " ", ANJUTA_TOKEN_OPERATOR, "=", ANJUTA_TOKEN_LIST, NULL, ANJUTA_TOKEN_SPACE, " ", NULL); pos = anjuta_token_last_item (pos); amp_group_node_update_makefile (group, pos); /* Return list token */ return pos; }
static AnjutaToken* find_tokens (AnjutaToken *list, AnjutaTokenType* types) { AnjutaToken *tok; for (tok = list; tok != NULL; tok = anjuta_token_next (tok)) { AnjutaTokenType *type; for (type = types; *type != 0; type++) { if (anjuta_token_get_type (tok) == *type) { return tok; } } } return NULL; }
AnjutaToken * anjuta_token_find_type (AnjutaToken *list, gint flags, AnjutaTokenType* types) { AnjutaToken *tok; AnjutaToken *last = NULL; for (tok = list; tok != NULL; tok = anjuta_token_next (tok)) { AnjutaTokenType *type; for (type = types; *type != 0; type++) { if (anjuta_token_get_type (tok) == *type) { last = tok; if (flags & ANJUTA_TOKEN_SEARCH_NOT) break; if (!(flags & ANJUTA_TOKEN_SEARCH_LAST)) break; } } if ((flags & ANJUTA_TOKEN_SEARCH_NOT) && (*type == 0)) break; } return last; }
AnjutaToken * anjuta_token_nth_word (AnjutaToken *list, guint n) { AnjutaToken *item; gboolean no_item = TRUE; for (item = anjuta_token_first_item (list); item != NULL; item = anjuta_token_next_item (item)) { if (anjuta_token_list (item) != list) { item = NULL; break; } switch (anjuta_token_get_type (item)) { case ANJUTA_TOKEN_START: break; case ANJUTA_TOKEN_NEXT: if (no_item) { if (n == 0) return NULL; n--; } no_item = TRUE; break; case ANJUTA_TOKEN_LAST: return NULL; default: if (n == 0) return item; n--; no_item = FALSE; break; } } return NULL; }
static AnjutaToken * anjuta_token_find_target_property_position (AmpTargetNode *target, AnjutaTokenType type) { AnjutaToken *pos = NULL; gboolean after = FALSE; GList *list; AmpGroupNode *group; AnjutaToken *makefile; group = AMP_GROUP_NODE (anjuta_project_node_parent_type (ANJUTA_PROJECT_NODE (target), ANJUTA_PROJECT_GROUP)); /* Try to find a better position */ /* 1. With the other properties of the target */ list = amp_target_node_get_all_token (target); if (list != NULL) { GList *link; AnjutaTokenType best = 0; for (link = list; link != NULL; link = g_list_next (link)) { AnjutaToken *token = (AnjutaToken *)link->data; AnjutaTokenType existing = anjuta_token_get_type (token); if ((existing < AM_TOKEN_FIRST_ORDERED_TARGET_MACRO) || (existing > AM_TOKEN_LAST_ORDERED_TARGET_MACRO)) { token = anjuta_token_list (token); if (token != NULL) existing = anjuta_token_get_type (token); } if ((existing >= AM_TOKEN_FIRST_ORDERED_TARGET_MACRO) && (existing <= AM_TOKEN_LAST_ORDERED_TARGET_MACRO)) { if (existing > type) { if ((best == 0) || ((existing - type) < best)) { best = existing - type; pos = token; after = FALSE; } } else { if ((best == 0) || ((type -existing) < best)) { best = type - existing; pos = token; after = TRUE; } } } } g_list_free (list); } /* 2. With properties of sibling targets */ if (pos == NULL) { AnjutaProjectNode *prev = ANJUTA_PROJECT_NODE (target); AnjutaProjectNode *next = ANJUTA_PROJECT_NODE (target); AmpTargetNode *sibling; AnjutaTokenFile *makefile; AnjutaToken *target_list = NULL; GList *link; link = amp_target_node_get_token (target, ANJUTA_TOKEN_ARGUMENT); if ((link != NULL) && (link->data != NULL)) { target_list = anjuta_token_list ((AnjutaToken *)link->data); } makefile = amp_group_node_get_make_token_file (group); if (makefile != NULL) { after = TRUE; while ((prev != NULL) || (next != NULL)) { /* Find sibling */ if (after) { while (prev != NULL) { prev = anjuta_project_node_prev_sibling (prev); if (anjuta_project_node_get_node_type (prev) == ANJUTA_PROJECT_TARGET) break; } sibling = AMP_TARGET_NODE (prev); } else { while (next != NULL) { next = anjuta_project_node_next_sibling (next); if (anjuta_project_node_get_node_type (next) == ANJUTA_PROJECT_TARGET) break; } sibling = AMP_TARGET_NODE (next); } list = sibling == NULL ? NULL : amp_target_node_get_all_token (sibling); /* Check that the target is in the same list */ if ((list != NULL) && (target_list != NULL)) { AnjutaToken *token; link = amp_target_node_get_token (sibling, ANJUTA_TOKEN_ARGUMENT); if ((link != NULL) && (link->data != NULL)) { token = anjuta_token_list ((AnjutaToken *)link->data); } if ((token != NULL) && (target_list != token)) { /* Target is in another list, do not use it, nor following ones */ list = NULL; if (after) { prev = NULL; } else { next = NULL; } } } if (list != NULL) { gsize best = 0; for (link = list; link != NULL; link = g_list_next (link)) { AnjutaToken *token = (AnjutaToken *)link->data; AnjutaTokenType existing = anjuta_token_get_type (token); if ((existing < AM_TOKEN_FIRST_ORDERED_TARGET_MACRO) || (existing > AM_TOKEN_LAST_ORDERED_TARGET_MACRO)) { token = anjuta_token_list (token); if (token != NULL) existing = anjuta_token_get_type (token); } if ((existing >= AM_TOKEN_FIRST_ORDERED_TARGET_MACRO) && (existing <= AM_TOKEN_LAST_ORDERED_TARGET_MACRO)) { gsize tpos; tpos = anjuta_token_file_get_token_position (makefile, token); if ((best == 0) || (after && (tpos > best)) || (!after && (tpos < best))) { pos = token; best = tpos; } } } g_list_free (list); list = NULL; if (best != 0) break; } after = after ? FALSE : TRUE; } } } /* 3. After target declaration */ if (pos == NULL) { list = amp_target_node_get_token (AMP_TARGET_NODE (target), ANJUTA_TOKEN_ARGUMENT); if (list != NULL) { pos = (AnjutaToken *)list->data; if (pos != NULL) { pos = anjuta_token_list (pos); if (pos != NULL) { pos = anjuta_token_list (pos); } } } after = TRUE; } /* 4. At the end of the file */ if (pos == NULL) { makefile = amp_group_node_get_makefile_token (group); for (pos = anjuta_token_first_item (makefile); (pos != NULL) && (anjuta_token_next_item (pos) != NULL); pos = anjuta_token_next_item (pos)); after = TRUE; } /* 5. Create new file */ if (pos == NULL) { /* Empty file */ pos = anjuta_token_new_string (ANJUTA_TOKEN_COMMENT | ANJUTA_TOKEN_ADDED, "## Process this file with automake to produce Makefile.in\n"); anjuta_token_append_child (makefile, pos); amp_group_node_update_makefile (group, pos); } /* Find end of line */ if (after) { while (pos != NULL) { if (anjuta_token_get_type (pos) == ANJUTA_TOKEN_EOL) break; if (anjuta_token_next (pos) == NULL) { pos = anjuta_token_insert_token_list (after, pos, ANJUTA_TOKEN_EOL, "\n", NULL); break; } pos = anjuta_token_next (pos); } } pos = anjuta_token_insert_token_list (after, pos, ANJUTA_TOKEN_EOL, "\n", NULL); pos = anjuta_token_insert_token_list (after, pos, ANJUTA_TOKEN_EOL, "\n", NULL); amp_group_node_update_makefile (group, pos); return pos; }
gboolean amp_target_node_delete_token (AmpProject *project, AmpTargetNode *target, GList *list, GError **error) { GList *item; GList *removed_dir = NULL; AmpGroupNode *parent; /* Get parent group */ parent = AMP_GROUP_NODE (anjuta_project_node_parent_type (ANJUTA_PROJECT_NODE (target), ANJUTA_PROJECT_GROUP)); /* Remove all associated token */ for (item = list; item != NULL; item = g_list_next (item)) { AnjutaToken *token = (AnjutaToken *)item->data; AnjutaTokenStyle *style; AnjutaToken *list; switch (anjuta_token_get_type (token)) { case ANJUTA_TOKEN_ARGUMENT: list = anjuta_token_list (token); /* Try to use the same style than the current target list */ style = anjuta_token_style_new_from_base (project->am_space_list); anjuta_token_style_update (style, list); anjuta_token_remove_word (token); anjuta_token_style_format (style, list); anjuta_token_style_free (style); /* Remove whole variable if empty */ if (anjuta_token_first_word (list) == NULL) { AnjutaToken *variable = anjuta_token_list (list); gchar *value; gint flags; gchar *install = NULL; value = anjuta_token_evaluate (anjuta_token_first_word (variable)); split_automake_variable (value, &flags, &install, NULL); if (install != NULL) { /* Mark all removed directory, normally only one */ removed_dir = g_list_prepend (removed_dir, g_strdup (install)); } g_free (value); anjuta_token_remove_list (variable); } amp_group_node_update_makefile (parent, list); break; case AM_TOKEN__SOURCES: case AM_TOKEN__DATA: case AM_TOKEN__HEADERS: case AM_TOKEN__LISP: case AM_TOKEN__MANS: case AM_TOKEN__PYTHON: case AM_TOKEN__JAVA: case AM_TOKEN__SCRIPTS: case AM_TOKEN__TEXINFOS: case AM_TOKEN_TARGET_LDFLAGS: case AM_TOKEN_TARGET_CPPFLAGS: case AM_TOKEN_TARGET_CFLAGS: case AM_TOKEN_TARGET_CXXFLAGS: case AM_TOKEN_TARGET_JAVACFLAGS: case AM_TOKEN_TARGET_VALAFLAGS: case AM_TOKEN_TARGET_FCFLAGS: case AM_TOKEN_TARGET_OBJCFLAGS: case AM_TOKEN_TARGET_LFLAGS: case AM_TOKEN_TARGET_YFLAGS: case AM_TOKEN_TARGET_DEPENDENCIES: case AM_TOKEN_TARGET_LIBADD: case AM_TOKEN_TARGET_LDADD: anjuta_token_remove_list (token); amp_group_node_update_makefile (parent, token); break; }; amp_target_node_remove_token (target, token); } /* Check if we need to remove dir variable */ for (item = removed_dir; item != NULL; item = g_list_next(item)) { gchar* dir = (gchar *)item->data; GList *list; /* Check if dir is used in another target */ for (list = amp_group_node_get_token (parent, AM_GROUP_TARGET); list != NULL; list = g_list_next (list)) { AnjutaToken *target_list = (AnjutaToken *)list->data; gchar *value; gint flags; gchar *install = NULL; gboolean same; value = anjuta_token_evaluate (anjuta_token_first_word (target_list)); /* value can be NULL if we have a list can has just been removed */ if (value != NULL) split_automake_variable (value, &flags, &install, NULL); same = g_strcmp0 (install, dir) == 0; g_free (value); if (same) { /* directory use elsewhere */ g_free (dir); dir = NULL; break; } } if (dir != NULL) { /* Directory is not used anymore, remove variable */ gchar* install = g_strconcat (dir, "dir", NULL); for (list = anjuta_project_node_get_properties (ANJUTA_PROJECT_NODE(parent)); list != NULL; list = g_list_next (list)) { AmpProperty *prop = (AmpProperty *)list->data; if ((((AmpPropertyInfo *)prop->base.info)->token_type == AM_TOKEN_DIR) && (g_strcmp0(prop->base.name, install) == 0)) { AnjutaProjectProperty *new_prop; new_prop = amp_node_map_property_set (ANJUTA_PROJECT_NODE (parent), prop->base.info->id, prop->base.name, NULL); amp_project_update_am_property (project, ANJUTA_PROJECT_NODE (parent), new_prop); } } g_free (install); g_free (dir); } } g_list_free (removed_dir); return TRUE; }
/** * anjuta_token_stream_tokenize: * @stream: a #AnjutaTokenStream object. * @type: a token type. * @length: the token length in character. * * Create a token of type from the last length characters previously read and * append it in the output stream. The characters are not copied in the output * stream, the new token uses the same characters. * * Return value: The created token. */ AnjutaToken* anjuta_token_stream_tokenize (AnjutaTokenStream *stream, gint type, gsize length) { AnjutaToken *frag; AnjutaToken *end; frag = anjuta_token_new_static (type, NULL); for (end = stream->start; end != NULL;) { if ((anjuta_token_get_type (end) < ANJUTA_TOKEN_PARSED) || (anjuta_token_get_length (end) == 0)) { gint toklen = anjuta_token_get_length (end); AnjutaToken *copy = anjuta_token_cut (end, stream->begin, length); if (toklen >= (length + stream->begin)) { if (end == stream->start) { /* Get whole token */ anjuta_token_free (frag); anjuta_token_set_type (copy, type); frag = copy; } else { /* Get several token */ anjuta_token_insert_after (frag, copy); anjuta_token_merge (frag, copy); } if (toklen == (length + stream->begin)) { stream->start = anjuta_token_next (end); stream->begin = 0; } else { stream->start = end; stream->begin += length; } break; } else { anjuta_token_insert_after (frag, copy); anjuta_token_merge (frag, copy); length -= toklen - stream->begin; end = anjuta_token_next (end); stream->begin = 0; } } else { end = anjuta_token_next (end); stream->begin = 0; } } anjuta_token_stream_append_token (stream, frag); return frag; }
void mkp_project_add_rule (MkpProject *project, AnjutaToken *group) { AnjutaToken *targ; AnjutaToken *dep; AnjutaToken *arg; gboolean double_colon = FALSE; //fprintf(stdout, "add rule\n"); //anjuta_token_dump (group); targ = anjuta_token_first_item (group); arg = anjuta_token_next_word (targ); if (anjuta_token_get_type (arg) == MK_TOKEN_DOUBLE_COLON) double_colon = TRUE; dep = anjuta_token_next_word (arg); for (arg = anjuta_token_first_word (targ); arg != NULL; arg = anjuta_token_next_word (arg)) { AnjutaToken *src = NULL; gchar *target = NULL; gboolean order = FALSE; gboolean no_token = TRUE; MkpRule *rule = NULL; switch (anjuta_token_get_type (arg)) { case MK_TOKEN__PHONY: for (src = anjuta_token_first_word (dep); src != NULL; src = anjuta_token_next_word (src)) { if (anjuta_token_get_type (src) != MK_TOKEN_ORDER) { target = anjuta_token_evaluate (src); rule = g_hash_table_lookup (project->rules, target); if (rule == NULL) { rule = mkp_rule_new (target, NULL); g_hash_table_insert (project->rules, rule->name, rule); } rule->phony = TRUE; //g_message (" with target %s", target); if (target != NULL) g_free (target); } } break; case MK_TOKEN__SUFFIXES: for (src = anjuta_token_first_word (dep); src != NULL; src = anjuta_token_next_word (src)) { if (anjuta_token_get_type (src) != MK_TOKEN_ORDER) { gchar *suffix; suffix = anjuta_token_evaluate (src); /* The pointer value must only be not NULL, it does not matter if it is * invalid */ g_hash_table_replace (project->suffix, suffix, suffix); //g_message (" with suffix %s", suffix); no_token = FALSE; } } if (no_token == TRUE) { /* Clear all suffix */ g_hash_table_remove_all (project->suffix); } break; case MK_TOKEN__DEFAULT: case MK_TOKEN__PRECIOUS: case MK_TOKEN__INTERMEDIATE: case MK_TOKEN__SECONDARY: case MK_TOKEN__SECONDEXPANSION: case MK_TOKEN__DELETE_ON_ERROR: case MK_TOKEN__IGNORE: case MK_TOKEN__LOW_RESOLUTION_TIME: case MK_TOKEN__SILENT: case MK_TOKEN__EXPORT_ALL_VARIABLES: case MK_TOKEN__NOTPARALLEL: /* Do nothing with these targets, just ignore them */ break; default: target = g_strstrip (anjuta_token_evaluate (arg)); if (*target == '\0') break; //g_message ("add rule =%s=", target); rule = g_hash_table_lookup (project->rules, target); if (rule == NULL) { rule = mkp_rule_new (target, group); g_hash_table_insert (project->rules, rule->name, rule); } else { rule->rule = group; } for (src = anjuta_token_first_word (dep); src != NULL; src = anjuta_token_next_word (src)) { gchar *src_name = anjuta_token_evaluate (src); if (src_name != NULL) { //g_message (" with source %s", src_name); if (anjuta_token_get_type (src) == MK_TOKEN_ORDER) { order = TRUE; } rule->prerequisite = g_list_prepend (rule->prerequisite, src_name); } } if (target != NULL) g_free (target); } } }
void anjuta_token_style_update (AnjutaTokenStyle *style, AnjutaToken *list) { AnjutaToken *token; AnjutaToken *next_token; guint prev = 0; guint next = 0; guint line_width = 0; guint sep_count = 0; /* Initialize first line width */ for (token = list; token != NULL; token = anjuta_token_previous (token)) { gchar *value; gchar *eol = NULL; gsize len = 0; value = anjuta_token_evaluate (token); if (value != NULL) { eol = strrchr (value, '\n'); len = strlen (value); g_free (value); } if (eol != NULL) { line_width = value + len - eol; break; } line_width += len; } for (token = anjuta_token_first_item (list); token != NULL; token = next_token) { gchar *value = NULL; const gchar *eol; gsize len; gint type; next_token = anjuta_token_next_item (token); type = anjuta_token_get_type (token); next = next_token == NULL ? 0 : anjuta_token_get_type (next_token); value = anjuta_token_evaluate (token); if (value == NULL) continue; len = strlen (value); eol = strrchr (value, '\n'); if (eol != NULL) len -= (eol - value); g_free (value); line_width += len; switch (type) { case ANJUTA_TOKEN_START: case ANJUTA_TOKEN_LAST: case ANJUTA_TOKEN_NEXT: break; default: if (eol != NULL) { line_width = len; sep_count = 0; } continue; } value = anjuta_token_evaluate (token); anjuta_token_style_insert_separator_between (style, 0, type, value); if (type == ANJUTA_TOKEN_NEXT) { anjuta_token_style_insert_separator_between (style, next, prev, value); anjuta_token_style_insert_separator_between (style, next, ANJUTA_TOKEN_ANY, value); anjuta_token_style_insert_separator_between (style, ANJUTA_TOKEN_ANY, prev, value); } g_free (value); if (eol == NULL) { sep_count++; } else { if ((sep_count > 1) && (line_width > style->max_width)) { style->max_width = line_width; } sep_count = 0; line_width = len; } } }
static AnjutaToken * anjuta_token_find_position (AnjutaToken *list, gboolean after, AnjutaTokenType type, AnjutaToken *sibling) { AnjutaToken *tok; AnjutaToken *pos = sibling; if (sibling == NULL) { AnjutaToken *last = NULL; gboolean found = FALSE; for (tok = list; tok != NULL; tok = anjuta_token_next (tok)) { AnjutaTokenType current = anjuta_token_get_type (tok); if ((current >= AC_TOKEN_FIRST_ORDERED_MACRO) && (current <= AC_TOKEN_LAST_ORDERED_MACRO)) { /* Find a valid position */ if (after) { /* 1. After the last similar macro * 2. After the last macro with a higher priority * 3. At the end of the file */ if (current == type) { pos = tok; found = TRUE; } else if (!found && (current < type)) { pos = tok; } } else { /* 1. Before the first similar macro * 2. Before the first macro with an lower priority * 3. At the beginning of the file */ if (current == type) { pos = tok; break; } else if (!found && (current > type)) { pos = tok; found = TRUE; } } } last = tok; } if (after && (pos == NULL)) pos = last; } if (after) { for (; pos != NULL; pos = anjuta_token_next (pos)) { AnjutaTokenType current = anjuta_token_get_type (pos); if (current == ANJUTA_TOKEN_EOL) break; } } return pos; }
static AnjutaToken * anjuta_token_find_group_property_position (AmpGroupNode *group, AnjutaTokenType type) { AnjutaToken *pos = NULL; gboolean after = FALSE; GList *list; AnjutaToken *makefile; /* Try to find a better position */ /* 1. With the other properties of the group */ list = amp_group_node_get_all_token (group); if (list != NULL) { GList *link; AnjutaTokenType best = 0; for (link = list; link != NULL; link = g_list_next (link)) { AnjutaToken *token = (AnjutaToken *)link->data; AnjutaTokenType existing = anjuta_token_get_type (token); if ((existing < AM_TOKEN_FIRST_ORDERED_TARGET_MACRO) || (existing > AM_TOKEN_LAST_ORDERED_TARGET_MACRO)) { token = anjuta_token_list (token); if (token != NULL) existing = anjuta_token_get_type (token); } if ((existing >= AM_TOKEN_FIRST_ORDERED_TARGET_MACRO) && (existing <= AM_TOKEN_LAST_ORDERED_TARGET_MACRO)) { if (existing > type) { if ((best == 0) || ((existing - type) < best)) { best = existing - type; pos = token; after = FALSE; } } else { if ((best == 0) || ((type -existing) < best)) { best = type - existing; pos = token; after = TRUE; } } } } g_list_free (list); } /* 2. At the end of the file */ if (pos == NULL) { makefile = amp_group_node_get_makefile_token (group); for (pos = anjuta_token_first_item (makefile); (pos != NULL) && (anjuta_token_next_item (pos) != NULL); pos = anjuta_token_next_item (pos)); after = TRUE; } /* makefile can be NULL for the root node if there isn't any corresponding Makefile.am */ if (makefile != NULL) { /* 3. Create new file */ if (pos == NULL) { /* Empty file */ pos = anjuta_token_new_string (ANJUTA_TOKEN_COMMENT | ANJUTA_TOKEN_ADDED, "## Process this file with automake to produce Makefile.in\n"); anjuta_token_append_child (makefile, pos); amp_group_node_update_makefile (group, pos); } /* Find end of line */ if (after) { while (pos != NULL) { if (anjuta_token_get_type (pos) == ANJUTA_TOKEN_EOL) break; if (anjuta_token_next (pos) == NULL) { pos = anjuta_token_insert_token_list (after, pos, ANJUTA_TOKEN_EOL, "\n", NULL); break; } pos = anjuta_token_next (pos); } } pos = anjuta_token_insert_token_list (after, pos, ANJUTA_TOKEN_EOL, "\n", NULL); pos = anjuta_token_insert_token_list (after, pos, ANJUTA_TOKEN_EOL, "\n", NULL); amp_group_node_update_makefile (group, pos); } return pos; }
AnjutaToken * anjuta_token_replace_nth_word (AnjutaToken *list, guint n, AnjutaToken *item) { AnjutaToken *token; gboolean no_item = TRUE; token = anjuta_token_first_item (list); if (token == NULL) { token = anjuta_token_insert_after (token, anjuta_token_new_static (ANJUTA_TOKEN_LAST | ANJUTA_TOKEN_ADDED, NULL)); anjuta_token_merge (list, token); } for (n++;;) { AnjutaToken *next; switch (anjuta_token_get_type (token)) { case ANJUTA_TOKEN_LAST: if (no_item) { n--; if (n == 0) { token = anjuta_token_insert_before (token, item); return token; } } token = anjuta_token_insert_before (token, anjuta_token_new_static (ANJUTA_TOKEN_NEXT | ANJUTA_TOKEN_ADDED, NULL)); no_item = TRUE; break; case ANJUTA_TOKEN_NEXT: if (no_item) { n--; if (n == 0) { token = anjuta_token_insert_before (token, item); return token; } } no_item = TRUE; break; case ANJUTA_TOKEN_ITEM: n--; if (n == 0) { anjuta_token_set_flags (token, ANJUTA_TOKEN_REMOVED); token = anjuta_token_insert_before (token, item); return token; } no_item = FALSE; break; default: break; } next = anjuta_token_next_item (token); if (next == NULL) { token = anjuta_token_insert_after (token, anjuta_token_new_static (ANJUTA_TOKEN_LAST | ANJUTA_TOKEN_ADDED, NULL)); anjuta_token_merge (list, token); } else { token = next; } } }