diff options
Diffstat (limited to '')
-rw-r--r-- | src/strfsong.c | 360 |
1 files changed, 165 insertions, 195 deletions
diff --git a/src/strfsong.c b/src/strfsong.c index df622a2bb..27eadb236 100644 --- a/src/strfsong.c +++ b/src/strfsong.c @@ -34,222 +34,192 @@ #include "support.h" #include "strfsong.h" -static gchar * -skip(gchar * p) +static gchar * +skip(gchar * p) { - gint stack = 0; - - while (*p != '\0') { - if(*p == '[') stack++; - if(*p == '#' && p[1] != '\0') { - /* skip escaped stuff */ - ++p; - } - else if(stack) { - if(*p == ']') stack--; - } - else { - if(*p == '&' || *p == '|' || *p == ']') { - break; - } - } - ++p; - } + gint stack = 0; + + while (*p != '\0') { + if(*p == '[') stack++; + if(*p == '#' && p[1] != '\0') { + /* skip escaped stuff */ + ++p; + } else if(stack) { + if(*p == ']') stack--; + } else { + if(*p == '&' || *p == '|' || *p == ']') { + break; + } + } + ++p; + } - return p; + return p; } static gsize -_strfsong(gchar *s, - gsize max, - const gchar *format, - mpd_Song *song, +_strfsong(gchar *s, + gsize max, + const gchar *format, + mpd_Song *song, gchar **last) { - gchar *p, *end; - gchar *temp; - gsize n, length = 0; - gboolean found = FALSE; - - memset(s, 0, max); - if( song==NULL ) - return 0; - - for( p=(gchar *) format; *p != '\0' && length<max; ) - { - /* OR */ - if (p[0] == '|') - { - ++p; - if(!found) - { - memset(s, 0, max); - length = 0; - } - else - { - p = skip(p); - } - continue; - } + gchar *p, *end; + gchar *temp; + gsize n, length = 0; + gboolean found = FALSE; + + memset(s, 0, max); + if( song==NULL ) + return 0; + + for (p = (gchar *)format; *p != '\0' && length<max;) { + /* OR */ + if (p[0] == '|') { + ++p; + if(!found) { + memset(s, 0, max); + length = 0; + } else { + p = skip(p); + } + continue; + } - /* AND */ - if (p[0] == '&') - { - ++p; - if(!found) - { - p = skip(p); - } - else - { - found = FALSE; - } - continue; - } + /* AND */ + if (p[0] == '&') { + ++p; + if(!found) { + p = skip(p); + } else { + found = FALSE; + } + continue; + } - /* EXPRESSION START */ - if (p[0] == '[') - { - temp = g_malloc0(max); - if( _strfsong(temp, max, p+1, song, &p) >0 ) - { - g_strlcat(s, temp, max); - length = strlen(s); - found = TRUE; - } - g_free(temp); - continue; - } + /* EXPRESSION START */ + if (p[0] == '[') { + temp = g_malloc0(max); + if( _strfsong(temp, max, p+1, song, &p) >0 ) { + g_strlcat(s, temp, max); + length = strlen(s); + found = TRUE; + } + g_free(temp); + continue; + } - /* EXPRESSION END */ - if (p[0] == ']') - { - if(last) *last = p+1; - if(!found && length) - { - memset(s, 0, max); - length = 0; - } - return length; - } + /* EXPRESSION END */ + if (p[0] == ']') { + if(last) *last = p+1; + if(!found && length) { + memset(s, 0, max); + length = 0; + } + return length; + } - /* pass-through non-escaped portions of the format string */ - if (p[0] != '#' && p[0] != '%' && length<max) - { - s[length++] = *p; - p++; - continue; - } + /* pass-through non-escaped portions of the format string */ + if (p[0] != '#' && p[0] != '%' && length<max) { + s[length++] = *p; + p++; + continue; + } - /* let the escape character escape itself */ - if (p[0] == '#' && p[1] != '\0' && length<max) - { - s[length++] = *(p+1); - p+=2; - continue; - } + /* let the escape character escape itself */ + if (p[0] == '#' && p[1] != '\0' && length<max) { + s[length++] = *(p+1); + p+=2; + continue; + } - /* advance past the esc character */ + /* advance past the esc character */ - /* find the extent of this format specifier (stop at \0, ' ', or esc) */ - temp = NULL; - end = p+1; - while(*end >= 'a' && *end <= 'z') - { - end++; - } - n = end - p + 1; - if(*end != '%') - n--; - else if (strncmp("%file%", p, n) == 0) - temp = utf8_to_locale(song->file); - else if (strncmp("%artist%", p, n) == 0) - temp = song->artist ? utf8_to_locale(song->artist) : NULL; - else if (strncmp("%title%", p, n) == 0) - temp = song->title ? utf8_to_locale(song->title) : NULL; - else if (strncmp("%album%", p, n) == 0) - temp = song->album ? utf8_to_locale(song->album) : NULL; - else if (strncmp("%shortalbum%", p, n) == 0) - { - temp = song->album ? utf8_to_locale(song->album) : NULL; - if (temp) - { - gchar *temp2 = g_strndup(temp, 25); - if (strlen(temp) > 25) - { - temp2[24] = '.'; - temp2[23] = '.'; - temp2[22] = '.'; + /* find the extent of this format specifier (stop at \0, ' ', or esc) */ + temp = NULL; + end = p+1; + while(*end >= 'a' && *end <= 'z') { + end++; } - g_free(temp); - temp = temp2; - } - } - else if (strncmp("%track%", p, n) == 0) - temp = song->track ? utf8_to_locale(song->track) : NULL; - else if (strncmp("%name%", p, n) == 0) - temp = song->name ? utf8_to_locale(song->name) : NULL; - else if (strncmp("%date%", p, n) == 0) - temp = song->date ? utf8_to_locale(song->date) : NULL; - else if (strncmp("%genre%", p, n) == 0) - temp = song->genre ? utf8_to_locale(song->genre) : NULL; - else if (strncmp("%shortfile%", p, n) == 0) - { - if( strstr(song->file, "://") ) - temp = utf8_to_locale(song->file); - else - temp = utf8_to_locale(basename(song->file)); - } - else if (strncmp("%time%", p, n) == 0) - { - if (song->time != MPD_SONG_NO_TIME) - { - if (song->time > 3600) - { - temp = g_strdup_printf("%d:%02d:%02d", - song->time / 3600, - (song->time % 3600) / 60, - song->time % 60); + n = end - p + 1; + if(*end != '%') + n--; + else if (strncmp("%file%", p, n) == 0) + temp = utf8_to_locale(song->file); + else if (strncmp("%artist%", p, n) == 0) + temp = song->artist ? utf8_to_locale(song->artist) : NULL; + else if (strncmp("%title%", p, n) == 0) + temp = song->title ? utf8_to_locale(song->title) : NULL; + else if (strncmp("%album%", p, n) == 0) + temp = song->album ? utf8_to_locale(song->album) : NULL; + else if (strncmp("%shortalbum%", p, n) == 0) { + temp = song->album ? utf8_to_locale(song->album) : NULL; + if (temp) { + gchar *temp2 = g_strndup(temp, 25); + if (strlen(temp) > 25) { + temp2[24] = '.'; + temp2[23] = '.'; + temp2[22] = '.'; + } + g_free(temp); + temp = temp2; + } } - else - { - temp = g_strdup_printf("%d:%02d", - song->time / 60, - song->time % 60); + else if (strncmp("%track%", p, n) == 0) + temp = song->track ? utf8_to_locale(song->track) : NULL; + else if (strncmp("%name%", p, n) == 0) + temp = song->name ? utf8_to_locale(song->name) : NULL; + else if (strncmp("%date%", p, n) == 0) + temp = song->date ? utf8_to_locale(song->date) : NULL; + else if (strncmp("%genre%", p, n) == 0) + temp = song->genre ? utf8_to_locale(song->genre) : NULL; + else if (strncmp("%shortfile%", p, n) == 0) { + if( strstr(song->file, "://") ) + temp = utf8_to_locale(song->file); + else + temp = utf8_to_locale(basename(song->file)); + } else if (strncmp("%time%", p, n) == 0) { + if (song->time != MPD_SONG_NO_TIME) { + if (song->time > 3600) { + temp = g_strdup_printf("%d:%02d:%02d", + song->time / 3600, + (song->time % 3600) / 60, + song->time % 60); + } else { + temp = g_strdup_printf("%d:%02d", + song->time / 60, + song->time % 60); + } + } } - } - } - - if( temp == NULL) - { - gsize templen=n; - /* just pass-through any unknown specifiers (including esc) */ - /* drop a null char in so printf stops at the end of this specifier, - but put the real character back in (pseudo-const) */ - if( length+templen > max ) - templen = max-length; - g_strlcat(s, p,max); - length+=templen; - } - else { - gsize templen = strlen(temp); - found = TRUE; - if( length+templen > max ) - templen = max-length; - g_strlcat(s, temp, max); - length+=templen; - g_free(temp); - } + if( temp == NULL) { + gsize templen=n; + /* just pass-through any unknown specifiers (including esc) */ + /* drop a null char in so printf stops at the end of this specifier, + but put the real character back in (pseudo-const) */ + if( length+templen > max ) + templen = max-length; + g_strlcat(s, p,max); + length+=templen; + } else { + gsize templen = strlen(temp); + + found = TRUE; + if( length+templen > max ) + templen = max-length; + g_strlcat(s, temp, max); + length+=templen; + g_free(temp); + } - /* advance past the specifier */ - p += n; - } + /* advance past the specifier */ + p += n; + } - if(last) *last = p; + if(last) *last = p; - return length; + return length; } gsize |