Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
0
/**
 * 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;
}
Ejemplo n.º 4
0
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);
}
Ejemplo n.º 5
0
/**
 * 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;
}
Ejemplo n.º 6
0
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;
}
Ejemplo n.º 7
0
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;
			}
		}
	}
}
Ejemplo n.º 8
0
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;
}
Ejemplo n.º 9
0
/**
 * 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;
}
Ejemplo n.º 10
0
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;
		}
	}
}
Ejemplo n.º 11
0
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;
}
Ejemplo n.º 12
0
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;
}
Ejemplo n.º 13
0
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;
}
Ejemplo n.º 14
0
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;
}
Ejemplo n.º 15
0
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;
}
Ejemplo n.º 16
0
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;
}
Ejemplo n.º 17
0
/**
 * 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;
}
Ejemplo n.º 18
0
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);
		}
	}
}
Ejemplo n.º 19
0
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;
		}
	}
}
Ejemplo n.º 20
0
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;
}
Ejemplo n.º 21
0
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;
}
Ejemplo n.º 22
0
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;
		}
	}
}