/*
 * libdpkg - Debian packaging suite library routines
 * string.c - string handling routines
 *
 * Copyright © 1995 Ian Jackson <ian@chiark.greenend.org.uk>
 * Copyright © 2008, 2009 Guillem Jover <guillem@debian.org>
 *
 * This is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

#include <config.h>
#include <compat.h>

#include <string.h>

#include <dpkg/string.h>
#include <dpkg/dpkg.h>

/**
 * Escape format characters from a string.
 *
 * @param dst The destination string.
 * @param src The source string.
 * @param n The size of the destination buffer.
 *
 * @return The end of the destination string.
 */
char *
str_escape_fmt(char *dst, const char *src, size_t n)
{
	char *d = dst;
	const char *s = src;

	if (n == 0)
		return d;

	while (*s) {
		if (*s == '%') {
			if (n-- <= 2)
				break;
			*d++ = '%';
		}
		if (n-- <= 1)
			break;
		*d++ = *s++;
	}

	*d = '\0';

	return d;
}

/**
 * Quote shell metacharacters in a string.
 *
 * This function allows passing strings to commands without splitting the
 * arguments, like in system(3)
 *
 * @param src The source string to escape.
 *
 * @return The new allocated string.
 */
char *
str_quote_meta(const char *src)
{
	char *new_dst, *dst;

	new_dst = dst = m_malloc(strlen(src) * 2);

	while (*src) {
		if (!cisdigit(*src) && !cisalpha(*src))
			*dst++ = '\\';

		*dst++ = *src++;
	}

	*dst = '\0';

	return new_dst;
}

/**
 * Check and strip possible surrounding quotes in string.
 *
 * @param str The string to act on.
 *
 * @return A pointer to str or NULL if the quotes were unbalanced.
 */
char *
str_strip_quotes(char *str)
{
	if (str[0] == '"' || str[0] == '\'') {
		size_t str_len = strlen(str);

		if (str[0] != str[str_len - 1])
			return NULL;

		/* Remove surrounding quotes. */
		str[str_len - 1] = '\0';
		str++;
	}

	return str;
}
