Blame gcr/gcr-util.c

Packit b00eeb
/*
Packit b00eeb
 * gnome-keyring
Packit b00eeb
 *
Packit b00eeb
 * Copyright (C) 2011 Collabora Ltd
Packit b00eeb
 *
Packit b00eeb
 * This program is free software; you can redistribute it and/or modify
Packit b00eeb
 * it under the terms of the GNU Lesser General Public License as
Packit b00eeb
 * published by the Free Software Foundation; either version 2.1 of
Packit b00eeb
 * the License, or (at your option) any later version.
Packit b00eeb
 *
Packit b00eeb
 * This program is distributed in the hope that it will be useful, but
Packit b00eeb
 * WITHOUT ANY WARRANTY; without even the implied warranty of
Packit b00eeb
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit b00eeb
 * Lesser General Public License for more details.
Packit b00eeb
 *
Packit b00eeb
 * You should have received a copy of the GNU Lesser General Public
Packit b00eeb
 * License along with this program; if not, see <http://www.gnu.org/licenses/>.
Packit b00eeb
 *
Packit b00eeb
 * Author: Stef Walter <stefw@collabora.co.uk>
Packit b00eeb
 */
Packit b00eeb
Packit b00eeb
#include "config.h"
Packit b00eeb
Packit b00eeb
#include "gcr-util.h"
Packit b00eeb
Packit b00eeb
#include <string.h>
Packit b00eeb
Packit b00eeb
/**
Packit b00eeb
 * _gcr_util_parse_lines:
Packit b00eeb
 * @string: The string to parse lines from, will be modified
Packit b00eeb
 * @last_line: Whether or not we should run for last line or not
Packit b00eeb
 * @callback: Call for each line
Packit b00eeb
 * @user_data: Data for callback
Packit b00eeb
 *
Packit b00eeb
 * Calls callback for each line. If last_line, also sends the remainder
Packit b00eeb
 * data that comes after the last line break. \n and \r\n are line separators.
Packit b00eeb
 * Neither are included in data passed to callback.
Packit b00eeb
 */
Packit b00eeb
void
Packit b00eeb
_gcr_util_parse_lines (GString *string, gboolean last_line,
Packit b00eeb
                       GcrLineCallback callback, gpointer user_data)
Packit b00eeb
{
Packit b00eeb
	gchar *ptr;
Packit b00eeb
	gchar *prev;
Packit b00eeb
Packit b00eeb
	g_return_if_fail (string);
Packit b00eeb
	g_return_if_fail (callback);
Packit b00eeb
Packit b00eeb
	/* Print all stderr lines as messages */
Packit b00eeb
	while ((ptr = strchr (string->str, '\n')) != NULL) {
Packit b00eeb
		*ptr = '\0';
Packit b00eeb
		if (ptr != string->str) {
Packit b00eeb
			prev = ptr - 1;
Packit b00eeb
			if (*prev == '\r')
Packit b00eeb
				*prev = '\0';
Packit b00eeb
		}
Packit b00eeb
Packit b00eeb
		(callback) (string->str, user_data);
Packit b00eeb
		g_string_erase (string, 0, ptr - string->str + 1);
Packit b00eeb
	}
Packit b00eeb
Packit b00eeb
	if (last_line && string->len) {
Packit b00eeb
		(callback) (string->str, user_data);
Packit b00eeb
		g_string_erase (string, 0, string->len);
Packit b00eeb
	}
Packit b00eeb
}