Mercurial > audlegacy
view src/audacious/formatter.c @ 2668:d5da5d37ec8b trunk
[svn] - unlock many playlist operations that do not really need locking
- information retrieval should not be atomic
- add code to expose potentially unnecessary playlist locks
- now playlists with remote URIs can mostly be probed in the background
author | nenolod |
---|---|
date | Tue, 10 Apr 2007 11:12:56 -0700 |
parents | 193bae6b2c8f |
children | 3b6d316f8b09 |
line wrap: on
line source
/* Audacious * Copyright (C) 2005-2007 Audacious team * * XMMS - Cross-platform multimedia player * Copyright (C) 1998-2003 Peter Alm, Mikael Alm, Olle Hallnas, * Thomas Nilsson and 4Front Technologies * Copyright (C) 1999-2003 Haavard Kvaalen * * This program 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; under version 2 of the License. * * This program 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include <glib.h> #include <string.h> #include "formatter.h" /** * formatter_new: * * Factory for #Formatter objects. * * Return value: A #Formatter object. **/ Formatter * formatter_new(void) { Formatter *formatter = g_new0(Formatter, 1); formatter_associate(formatter, '%', "%"); return formatter; } /** * formatter_destroy: * @formatter: A #Formatter object to destroy. * * Destroys #Formatter objects. **/ void formatter_destroy(Formatter * formatter) { int i; for (i = 0; i < 256; i++) if (formatter->values[i]) g_free(formatter->values[i]); g_free(formatter); } /** * formatter_associate: * @formatter: A #Formatter object to use. * @id: The character to use for replacement. * @value: The value to replace with. * * Adds a id->replacement set to the formatter's stack. **/ void formatter_associate(Formatter * formatter, guchar id, char *value) { formatter_dissociate(formatter, id); formatter->values[id] = g_strdup(value); } /** * formatter_dissociate: * @formatter: A #Formatter object to use. * @id: The id to remove the id->replacement mapping for. * * Removes an id->replacement mapping from the formatter's stack. **/ void formatter_dissociate(Formatter * formatter, guchar id) { if (formatter->values[id]) g_free(formatter->values[id]); formatter->values[id] = 0; } /** * formatter_format: * @formatter: A #Formatter object to use. * @format: A string to format. * * Performs id->replacement substitution on a string. * * Returns: The formatted string. **/ gchar * formatter_format(Formatter * formatter, char *format) { char *p, *q, *buffer; int len; for (p = format, len = 0; *p; p++) if (*p == '%') { if (formatter->values[(int) *++p]) len += strlen(formatter->values[(int) *p]); else if (!*p) { len += 1; p--; } else len += 2; } else len++; buffer = g_malloc(len + 1); for (p = format, q = buffer; *p; p++) if (*p == '%') { if (formatter->values[(int) *++p]) { strcpy(q, formatter->values[(int) *p]); q += strlen(q); } else { *q++ = '%'; if (*p != '\0') *q++ = *p; else p--; } } else *q++ = *p; *q = 0; return buffer; }