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_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; }
/** * 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; }
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); }
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_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_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; }
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; }
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; } } }
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_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; }
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; }