static gboolean
strip_find_next_block (const gchar    *original,
                       const gunichar  open_char,
                       const gunichar  close_char,
                       gint           *open_pos,
                       gint           *close_pos)
{
        const gchar *p1, *p2;

        if (open_pos) {
                *open_pos = -1;
        }

        if (close_pos) {
                *close_pos = -1;
        }

        p1 = g_utf8_strchr (original, -1, open_char);
        if (p1) {
                if (open_pos) {
                        *open_pos = p1 - original;
                }

                p2 = g_utf8_strchr (g_utf8_next_char (p1), -1, close_char);
                if (p2) {
                        if (close_pos) {
                                *close_pos = p2 - original;
                        }
                        
                        return TRUE;
                }
        }

        return FALSE;
}

gchar *
tracker_albumart_strip_invalid_entities (const gchar *original)
{
        GString         *str_no_blocks;
        gchar          **strv;
        gchar           *str;
        gboolean         blocks_done = FALSE;
        const gchar     *p;
        const gchar     *invalid_chars = "()[]<>{}_!@#$^&*+=|\\/\"'?~";
        const gchar     *invalid_chars_delimiter = "*";
        const gchar     *convert_chars = "\t";
        const gchar     *convert_chars_delimiter = " ";
        const gunichar   blocks[5][2] = {
                { '(', ')' },
                { '{', '}' }, 
                { '[', ']' }, 
                { '<', '>' }, 
                {  0,   0  }
        };

        str_no_blocks = g_string_new ("");

        p = original;

        while (!blocks_done) {
                gint pos1, pos2, i;

                pos1 = -1;
                pos2 = -1;
        
                for (i = 0; blocks[i][0] != 0; i++) {
                        gint start, end;
                        
                        /* Go through blocks, find the earliest block we can */
                        if (strip_find_next_block (p, blocks[i][0], blocks[i][1], &start, &end)) {
                                if (pos1 == -1 || start < pos1) {
                                        pos1 = start;
                                        pos2 = end;
                                }
                        }
                }
                
                /* If either are -1 we didn't find any */
                if (pos1 == -1) {
                        /* This means no blocks were found */
                        g_string_append (str_no_blocks, p);
                        blocks_done = TRUE;
                } else {
                        /* Append the test BEFORE the block */
                        if (pos1 > 0) {
                                g_string_append_len (str_no_blocks, p, pos1);
                        }

                        p = g_utf8_next_char (p + pos2);

                        /* Do same again for position AFTER block */
                        if (*p == '\0') {
                                blocks_done = TRUE;
                        }
                }       
        }

        str = g_string_free (str_no_blocks, FALSE);

        /* Now strip invalid chars */
        g_strdelimit (str, invalid_chars, *invalid_chars_delimiter);
        strv = g_strsplit (str, invalid_chars_delimiter, -1);
        g_free (str);
        str = g_strjoinv (NULL, strv);
        g_strfreev (strv);

        /* Now convert chars */
        g_strdelimit (str, convert_chars, *convert_chars_delimiter);
        strv = g_strsplit (str, convert_chars_delimiter, -1);
        g_free (str);
        str = g_strjoinv (convert_chars_delimiter, strv);
        g_strfreev (strv);

        /* Now remove double spaces */
        strv = g_strsplit (str, "  ", -1);
        g_free (str);
        str = g_strjoinv (" ", strv);
        g_strfreev (strv);
        
        /* Now strip leading/trailing white space */
        g_strstrip (str);

        return str;
}

DraftSpecs/MediaArtStorageSpec/SampleStripCodeInC (last edited 2013-12-02 17:53:48 by WilliamJonMcCann)