static AnjutaToken * amp_target_add_in_list (AmpProject *project, AnjutaToken *list, AnjutaProjectNode *target, gboolean after, AnjutaToken* sibling) { AnjutaTokenStyle *style; AnjutaToken *token; AmpGroupNode *parent; g_return_val_if_fail (list != NULL, NULL); /* Get parent target */ parent = AMP_GROUP_NODE (anjuta_project_node_parent_type (target, ANJUTA_PROJECT_GROUP)); style = anjuta_token_style_new_from_base (project->am_space_list); anjuta_token_style_update (style, list); token = anjuta_token_new_string (ANJUTA_TOKEN_ARGUMENT | ANJUTA_TOKEN_ADDED, anjuta_project_node_get_name (target)); if (after) { anjuta_token_insert_word_after (list, sibling, token); } else { anjuta_token_insert_word_before (list, sibling, token); } /* Try to use the same style than the current target list */ anjuta_token_style_format (style, list); anjuta_token_style_free (style); amp_group_node_update_makefile (parent, token); amp_target_node_add_token (AMP_TARGET_NODE (target), ANJUTA_TOKEN_ARGUMENT, token); return token; }
static AnjutaToken * amp_project_write_config_file (AmpProject *project, AnjutaToken *list, gboolean after, AnjutaToken *sibling, const gchar *filename) { AnjutaToken *token; token = anjuta_token_new_string (ANJUTA_TOKEN_NAME | ANJUTA_TOKEN_ADDED, filename); //fprintf (stdout, "Dump config list:\n"); //anjuta_token_dump (list); if (after) { anjuta_token_insert_word_after (list, sibling, token); } else { anjuta_token_insert_word_before (list, sibling, token); } //fprintf (stdout, "Dump config list after insertion:\n"); //anjuta_token_dump (list); anjuta_token_style_format (project->ac_space_list, list); //fprintf (stdout, "Dump config list after format:\n"); //anjuta_token_dump (list); amp_project_update_configure (project, list); return token; }
gboolean amp_group_node_create_token (AmpProject *project, AmpGroupNode *group, GError **error) { GFile *directory; GFile *makefile; AnjutaToken *list; gchar *basename; AnjutaTokenFile* tfile; AnjutaProjectNode *sibling; AmpGroupNode *parent; gboolean after; const gchar *name; /* Get parent target */ name = anjuta_project_node_get_name (ANJUTA_PROJECT_NODE (group)); parent = AMP_GROUP_NODE (anjuta_project_node_parent_type(ANJUTA_PROJECT_NODE (group), ANJUTA_PROJECT_GROUP)); if (parent != NULL) { directory = g_file_get_child (anjuta_project_node_get_file (ANJUTA_PROJECT_NODE (parent)), name); } else { /* Used only when adding root group (a group named . in an empty project) */ parent = group; directory = g_object_ref (anjuta_project_node_get_file (ANJUTA_PROJECT_NODE (parent))); } /* Find a sibling if possible */ after = TRUE; for (sibling = anjuta_project_node_prev_sibling (ANJUTA_PROJECT_NODE (group)); sibling != NULL; sibling = anjuta_project_node_prev_sibling (sibling)) { if (anjuta_project_node_get_node_type (sibling) == ANJUTA_PROJECT_GROUP) break; } if (sibling == NULL) { after = FALSE; for (sibling = anjuta_project_node_next_sibling (ANJUTA_PROJECT_NODE (group)); sibling != NULL; sibling = anjuta_project_node_next_sibling (sibling)) { if (anjuta_project_node_get_node_type (sibling) == ANJUTA_PROJECT_GROUP) break; } } if (sibling == NULL) after = TRUE; /* Create Makefile.am */ basename = amp_group_node_get_makefile_name (parent); if (basename != NULL) { makefile = g_file_get_child (directory, basename); g_free (basename); } else { makefile = g_file_get_child (directory, "Makefile.am"); } /* Add in configure */ list = NULL; if (sibling) list = amp_group_node_get_first_token (AMP_GROUP_NODE (sibling), AM_GROUP_TOKEN_CONFIGURE); if (list == NULL) list= amp_group_node_get_first_token (parent, AM_GROUP_TOKEN_CONFIGURE); if (list != NULL) list = anjuta_token_list (list); if (list == NULL) { list = amp_project_write_config_list (project); list = anjuta_token_next (list); } if (list != NULL) { gchar *relative_make; gchar *ext; AnjutaToken *prev = NULL; AnjutaToken *token; if (sibling) { prev = amp_group_node_get_first_token (AMP_GROUP_NODE (sibling), AM_GROUP_TOKEN_CONFIGURE); /*if ((prev != NULL) && after) { prev = anjuta_token_next_word (prev); }*/ } //prev_token = (AnjutaToken *)token_list->data; relative_make = g_file_get_relative_path (anjuta_project_node_get_file (ANJUTA_PROJECT_NODE (project)), makefile); ext = relative_make + strlen (relative_make) - 3; if (strcmp (ext, ".am") == 0) { *ext = '\0'; } token = amp_project_write_config_file (project, list, after, prev, relative_make); amp_group_node_add_token (AMP_GROUP_NODE (group), token, AM_GROUP_TOKEN_CONFIGURE); g_free (relative_make); } /* Add in Makefile.am */ if (sibling == NULL) { list = anjuta_token_find_group_property_position (parent, AM_TOKEN_SUBDIRS); if (list != NULL) { list = anjuta_token_insert_token_list (FALSE, list, AM_TOKEN_SUBDIRS, "SUBDIRS", ANJUTA_TOKEN_SPACE, " ", ANJUTA_TOKEN_OPERATOR, "=", ANJUTA_TOKEN_LIST, NULL, ANJUTA_TOKEN_LAST, NULL, NULL); list = anjuta_token_next (anjuta_token_next ( anjuta_token_next (list))); } } else { AnjutaToken *prev; prev = amp_group_node_get_first_token (AMP_GROUP_NODE (sibling), AM_GROUP_TOKEN_SUBDIRS); list = anjuta_token_list (prev); } if (list != NULL) { AnjutaToken *token; AnjutaToken *prev; AnjutaTokenStyle *style; style = anjuta_token_style_new_from_base (project->am_space_list); anjuta_token_style_update (style, list); if (sibling) { prev = amp_group_node_get_first_token (AMP_GROUP_NODE (sibling), AM_GROUP_TOKEN_SUBDIRS); } token = anjuta_token_new_string (ANJUTA_TOKEN_NAME | ANJUTA_TOKEN_ADDED, name); if (after) { anjuta_token_insert_word_after (list, prev, token); } else { anjuta_token_insert_word_before (list, prev, token); } /* Try to use the same style than the current group list */ anjuta_token_style_format (style, list); anjuta_token_style_free (style); amp_group_node_update_makefile (parent, token); amp_group_node_add_token (group, token, AM_GROUP_TOKEN_SUBDIRS); } tfile = amp_group_node_set_makefile (group, makefile, project); amp_project_add_file (project, makefile, tfile); return TRUE; }
gboolean amp_project_update_am_property (AmpProject *project, AnjutaProjectNode *node, AnjutaProjectProperty *property) { AnjutaProjectNode *group; AnjutaToken *args; /* Find group of the property */ if (anjuta_project_node_get_node_type (node) == ANJUTA_PROJECT_GROUP) { group = node; } else { group = anjuta_project_node_parent_type (node, ANJUTA_PROJECT_GROUP); } if (property->value == NULL) { /* Remove property */ if (((AmpPropertyInfo *)property->info)->token_type == AM_TOKEN__PROGRAMS) { /* Properties added in the target name */ args = amp_property_rename_target (project, node); } else { /* Other properties having their own variable */ args = amp_property_delete_token (project, ((AmpProperty *)property)->token); } anjuta_project_node_remove_property (node, property); } else { if (((AmpPropertyInfo *)property->info)->token_type == AM_TOKEN__PROGRAMS) { /* Properties added in the target name */ args = amp_property_rename_target (project, node); } else { /* Other properties having their own variable */ GString *new_value; AnjutaToken *arg; AnjutaToken *token; const gchar *value; AnjutaTokenStyle *style; args = ((AmpProperty *)property)->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, args); if (args == NULL) { args = amp_project_write_property_list (AMP_GROUP_NODE (group), node, (AmpPropertyInfo *)property->info); ((AmpProperty *)property)->token = args; } switch (property->info->type) { case ANJUTA_PROJECT_PROPERTY_LIST: new_value = g_string_new (property->value); g_string_assign (new_value, ""); value = property->value; for (arg = anjuta_token_first_word (args); arg != NULL;) { gchar *arg_value = anjuta_token_evaluate_name (arg); while (isspace (*value)) value++; if (*value == '\0') { AnjutaToken *next; next = anjuta_token_next_word (arg); anjuta_token_remove_word (arg); arg = next; } else { const gchar *end; gchar *name; for (end = value; !isspace (*end) && (*end != '\0'); end++); name = g_strndup (value, end - value); if (strcmp (arg_value, name) != 0) { /* New argument in property list */ AnjutaToken *token; token = anjuta_token_new_string (ANJUTA_TOKEN_NAME | ANJUTA_TOKEN_ADDED, name); anjuta_token_insert_word_before (args, arg, token); } else { arg = anjuta_token_next_word (arg); } value = end; if (arg_value != NULL) { if (new_value->len != 0) g_string_append_c (new_value, ' '); g_string_append (new_value, name); } } g_free (arg_value); } while (*value != '\0') { AnjutaToken *token; const gchar *end; gchar *name; while (isspace (*value)) value++; if (*value == '\0') break; for (end = value; !isspace (*end) && (*end != '\0'); end++); name = g_strndup (value, end - value); token = anjuta_token_new_string (ANJUTA_TOKEN_NAME | ANJUTA_TOKEN_ADDED, name); anjuta_token_insert_word_before (args, NULL, token); if (new_value->len != 0) g_string_append_c (new_value, ' '); g_string_append (new_value, name); g_free (name); value = end; } anjuta_token_style_format (style, args); anjuta_token_style_free (style); g_free (property->value); property->value = g_string_free (new_value, FALSE); break; case ANJUTA_PROJECT_PROPERTY_MAP: token = anjuta_token_new_string (ANJUTA_TOKEN_NAME | ANJUTA_TOKEN_ADDED, property->value); anjuta_token_insert_word_after (args, NULL, token); for (token = anjuta_token_next_word (token); token != NULL; token = anjuta_token_next_word (token)) { anjuta_token_remove_word (token); } break; default: break; } } } if (args != NULL) amp_group_node_update_makefile (AMP_GROUP_NODE (group), args); return args != NULL ? TRUE : FALSE; }
gboolean amp_source_node_create_token (AmpProject *project, AmpSourceNode *source, GError **error) { AmpGroupNode *group; AmpTargetNode *target; AnjutaProjectNode *sibling; gboolean after; AnjutaToken *token; AnjutaToken *prev; AnjutaToken *args; gchar *relative_name; /* Get parent target */ target = AMP_TARGET_NODE (anjuta_project_node_parent_type (ANJUTA_PROJECT_NODE (source), ANJUTA_PROJECT_TARGET)); if (target == NULL) return FALSE; group = AMP_GROUP_NODE (anjuta_project_node_parent_type (ANJUTA_PROJECT_NODE (target), ANJUTA_PROJECT_GROUP)); relative_name = get_relative_path (anjuta_project_node_get_file (ANJUTA_PROJECT_NODE (group)), anjuta_project_node_get_file (ANJUTA_PROJECT_NODE (source))); /* Add in Makefile.am */ /* Find a sibling if possible */ after = TRUE; for (sibling = anjuta_project_node_prev_sibling (ANJUTA_PROJECT_NODE (source)); sibling != NULL; sibling = anjuta_project_node_prev_sibling (sibling)) { if (anjuta_project_node_get_node_type (sibling) == ANJUTA_PROJECT_SOURCE) { break; } else if (anjuta_project_node_get_node_type (sibling) == ANJUTA_PROJECT_OBJECT) { sibling = anjuta_project_node_first_child (sibling); break; } } if (sibling == NULL) { after = FALSE; for (sibling = anjuta_project_node_next_sibling (ANJUTA_PROJECT_NODE (source)); sibling != NULL; sibling = anjuta_project_node_next_sibling (sibling)) { if (anjuta_project_node_get_node_type (sibling) == ANJUTA_PROJECT_SOURCE) { break; } else if (anjuta_project_node_get_node_type (sibling) == ANJUTA_PROJECT_OBJECT) { sibling = anjuta_project_node_first_child (sibling); break; } } } if (sibling == NULL) { after = TRUE; prev = NULL; args = NULL; } else { prev = amp_source_node_get_token (AMP_SOURCE_NODE (sibling)); args = anjuta_token_list (prev); } /* Check if a valid source variable is already defined */ if (args == NULL) { GList *last; for (last = amp_target_node_get_token (target, AM_TOKEN__SOURCES); last != NULL; last = g_list_next (last)) { args = anjuta_token_last_item ((AnjutaToken *)last->data); break; } if (last == NULL) { for (last = amp_target_node_get_token (target, AM_TOKEN__DATA); last != NULL; last = g_list_next (last)) { args = anjuta_token_last_item ((AnjutaToken *)last->data); break; } } } if (args == NULL) { gchar *target_var; gchar *canon_name; AnjutaToken *var; canon_name = canonicalize_automake_variable (anjuta_project_node_get_name (ANJUTA_PROJECT_NODE (target))); target_var = g_strconcat (canon_name, "_SOURCES", NULL); var = anjuta_token_find_target_property_position (target, AM_TOKEN__SOURCES); if (var == NULL) var = anjuta_token_find_target_property_position (target, AM_TOKEN__DATA); args = anjuta_token_insert_token_list (FALSE, var, ANJUTA_TOKEN_LIST, NULL, ANJUTA_TOKEN_NAME, target_var, ANJUTA_TOKEN_SPACE, " ", ANJUTA_TOKEN_OPERATOR, "=", ANJUTA_TOKEN_LIST, NULL, ANJUTA_TOKEN_SPACE, " ", NULL); args = anjuta_token_last_item (args); g_free (target_var); } if (args != NULL) { AnjutaTokenStyle *style; style = anjuta_token_style_new_from_base (project->am_space_list); anjuta_token_style_update (style, args); token = anjuta_token_new_string (ANJUTA_TOKEN_NAME | ANJUTA_TOKEN_ADDED, relative_name); if (after) { anjuta_token_insert_word_after (args, prev, token); } else { anjuta_token_insert_word_before (args, prev, token); } /* Try to use the same style than the current target list */ anjuta_token_style_format (style, args); anjuta_token_style_free (style); amp_group_node_update_makefile (group, token); amp_source_node_add_token (source, token); } return TRUE; }
gboolean amp_package_node_create_token (AmpProject *project, AmpPackageNode *package, GError **error) { AmpModuleNode *module; AnjutaProjectNode *sibling; gboolean after; AnjutaToken *token; AnjutaToken *prev; AnjutaToken *args; /* Get parent module */ module = AMP_MODULE_NODE (anjuta_project_node_parent_type (ANJUTA_PROJECT_NODE (package), ANJUTA_PROJECT_MODULE)); if (module == NULL) return FALSE; /* Add in configure.ac */ /* Find a sibling if possible */ if ((sibling = anjuta_project_node_prev_sibling (ANJUTA_PROJECT_NODE (package))) != NULL) { prev = amp_package_node_get_token (AMP_PACKAGE_NODE (sibling)); after = TRUE; args = anjuta_token_list (prev); } else if ((sibling = anjuta_project_node_next_sibling (ANJUTA_PROJECT_NODE (package))) != NULL) { prev = amp_package_node_get_token (AMP_PACKAGE_NODE (sibling)); after = FALSE; args = anjuta_token_list (prev); } else { prev = NULL; args = NULL; } /* Check if a valid source variable is already defined */ if (args == NULL) { args = amp_module_node_get_token (module); } if (args != NULL) { AnjutaTokenStyle *style; const gchar *name; name = anjuta_project_node_get_name (ANJUTA_PROJECT_NODE (package)); style = anjuta_token_style_new_from_base (project->ac_space_list); //anjuta_token_style_update (style, args); token = anjuta_token_new_string (ANJUTA_TOKEN_NAME | ANJUTA_TOKEN_ADDED, name); if (after) { anjuta_token_insert_word_after (args, prev, token); } else { anjuta_token_insert_word_before (args, prev, token); } /* Try to use the same style than the current target list */ anjuta_token_style_format (style, args); anjuta_token_style_free (style); amp_project_update_configure (project, token); amp_package_node_add_token (package, token); } return TRUE; }