Ejemplo n.º 1
0
ID3v2_tag* load_tag(const char* file_name)
{
    // Declaration
    FILE* file;
    ID3v2_tag* tag;
    ID3v2_frame_list* frame_list;
    ID3v2_header* tag_header;
    
    // Initialization
    tag = new_tag();
    tag_header = get_tag_header(file_name);
    
    if(tag_header == NULL || 
       get_tag_version(tag_header) == NO_COMPATIBLE_TAG)
    {
        // No compatible ID3 tag in the file, or we got some problem opening the file
        free_tag(tag);
        return NULL;
    }
    
    // Associations
    tag->tag_header = tag_header;
    file = fopen(file_name, "rb");
    if(file == NULL)
    {
        perror("Error opening file");
        free_tag(tag);
        return NULL;
    }
    
    tag->raw = (char*) malloc(tag->tag_header->tag_size * sizeof(char));
    fseek(file, 10, SEEK_SET);
    fread(tag->raw, tag->tag_header->tag_size, 1, file);
    fclose(file);
    
    int offset = 0;
    while(offset < tag->tag_header->tag_size)
    {
        ID3v2_frame* frame;
        frame = parse_frame(tag->raw, offset, get_tag_version(tag_header));

        if(frame != NULL)
        {
            offset += frame->size + 10;
            add_to_list(tag->frames, frame);
        }
        else
        {
            break;
        }
    }
    
    return tag;
}
Ejemplo n.º 2
0
WavpackContext *WavpackCloseFile (WavpackContext *wpc)
{
    if (wpc->streams) {
        free_streams (wpc);

        if (wpc->streams [0])
            free (wpc->streams [0]);

        free (wpc->streams);
    }

#ifndef VER4_ONLY
    if (wpc->stream3)
        free_stream3 (wpc);
#endif

    if (wpc->reader && wpc->reader->close && wpc->wv_in)
        wpc->reader->close (wpc->wv_in);

    if (wpc->reader && wpc->reader->close && wpc->wvc_in)
        wpc->reader->close (wpc->wvc_in);

    WavpackFreeWrapper (wpc);

    if (wpc->channel_reordering)
        free (wpc->channel_reordering);

#ifndef NO_TAGS
    free_tag (&wpc->m_tag);
#endif

    free (wpc);

    return NULL;
}
Ejemplo n.º 3
0
Archivo: cover.c Proyecto: rbong/jmc
// internal functions
SDL_Surface *load_embedded (const char *file)
{
    if (file == NULL)
        return NULL;

    if (access (file, F_OK) == -1)
    {
        fprintf (stderr,"%s: file '%s' does not exist\n", prog, file);
        return NULL;
    }
    if (access (file, R_OK) == -1)
    {
        fprintf (stderr,"%s: file '%s' cannot be read\n", prog, file);
        return NULL;
    }

    ID3v2_tag *tag = load_tag  (file);

    if (tag == NULL)
    {
        return NULL;
    }

    ID3v2_frame *frame = tag_get_album_cover (tag);

    if (frame == NULL)
    {
        free_tag (tag);
        return NULL;
    }

    ID3v2_frame_apic_content *album_content = parse_apic_frame_content (frame);

    if (album_content == NULL)
    {
        free_tag  (tag);
        return NULL;
    }

    SDL_Surface *sur =
        load_img_sdl (album_content->data, album_content->picture_size);
    free_tag (tag);
    free_apic_content (album_content);
    return sur;
}
Ejemplo n.º 4
0
Archivo: tag.c Proyecto: nellynette/dex
void free_tags(struct ptr_array *tags)
{
	int i;
	for (i = 0; i < tags->count; i++) {
		struct tag *t = tags->ptrs[i];
		free_tag(t);
		free(t);
	}
	free(tags->ptrs);
	clear(tags);
}
Ejemplo n.º 5
0
void    free_tag_dict( gtentry * * dict )
{
    gtentry     *   gtw;
    gtentry     *   gtwn;

    gtw = *dict;
    while( gtw != NULL ) {
        gtwn = gtw->next;;
        free_tag( dict, gtw );
        gtw = gtwn;
    }
    return;
}
Ejemplo n.º 6
0
Archivo: tag.c Proyecto: nellynette/dex
void collect_tags(const char *prefix)
{
	struct tag t;
	size_t pos = 0;
	char *prev = NULL;

	if (!load_tag_file())
		return;

	while (next_tag(tag_file, &pos, prefix, 0, &t)) {
		if (!prev || strcmp(prev, t.name)) {
			add_completion(t.name);
			prev = t.name;
			t.name = NULL;
		}
		free_tag(&t);
	}
}
static void
free_tag_group (TagGroup *tag_group)
{
	GList *l;

	pluma_debug_message (DEBUG_PLUGINS, "Tag group: %s", tag_group->name);

	g_return_if_fail (tag_group != NULL);

	free (tag_group->name);

	for (l = tag_group->tags; l != NULL; l = g_list_next (l))
	{
		free_tag ((Tag *) l->data);
	}

	g_list_free (tag_group->tags);
	g_free (tag_group);

	pluma_debug_message (DEBUG_PLUGINS, "END");
}
Ejemplo n.º 8
0
void    scr_gt( void )
{
    char        *   p;
    char        *   pn;
    char            savetag;
    int             k;
    int             len;
    char            macname[MAC_NAME_LENGTH + 1];
    condcode        cc;
    gtentry     *   wk;
    gtflags         tag_flags;
    enum {
        f_add       = 1,
        f_change,
        f_delete,
        f_off,
        f_on,
        f_print
    } function;

    garginit();                         // find end of CW

    /***********************************************************************/
    /*  isolate tagname   or use previous if tagname *                     */
    /***********************************************************************/

    cc = getarg();                      // Tagname

    if( cc == omit ) {
        // no operands
        tag_name_missing_err();
        return;
    }

    p = tok_start;

    if( *p == '*' ) {                   // single * as tagname
        if( arg_flen > 1 ) {
            xx_err( err_tag_name_inv );
            return;
        }
        savetag = '*';         // remember for possible global delete / print
        if( GlobalFlags.firstpass && input_cbs->fmflags & II_research ) {
            if( tag_entry != NULL ) {
                out_msg("  using tagname %s %s\n", tagname, tag_entry->name );
            }
        }
    } else {
        savetag = ' ';               // no global function for delete / print

        init_tag_att();            // forget previous values for quick access
        attname[0] = '*';

        pn      = tagname;
        len     = 0;

        while( *p && is_macro_char( *p ) ) {
            if( len < TAG_NAME_LENGTH ) {
                *pn++ = tolower( *p++ );// copy lowercase tagname
                *pn   = '\0';
            } else {
                break;
            }
            len++;
        }
        for( k = len; k < TAG_NAME_LENGTH; k++ ) {
            tagname[k] = '\0';
        }
        tagname[TAG_NAME_LENGTH] = '\0';

        if( len < arg_flen ) {
            xx_err( err_tag_name_inv );
            return;
        }
    }


    /***********************************************************************/
    /* get function operand  add, change, ...                              */
    /***********************************************************************/

    cc = getarg();

    if( cc == omit ) {
        xx_err( err_tag_func_inv );
        return;
    }

    p = tok_start;
    function = 0;
    switch( tolower( *p ) ) {
    case   'a':
        if( !strnicmp( "ADD ", p, 4 ) ) {

            function = f_add;
        }
        break;
    case 'c' :
        if( (arg_flen > 2) && (arg_flen < 7)
            && !strnicmp( "CHANGE", p, arg_flen ) ) {

            function = f_change;
        }
        break;
    case 'o' :
        if( !strnicmp( "OFF", p, 3 ) ) {

            function = f_off;
        } else {
            if( !strnicmp( "ON", p, 2 ) ) {

                function = f_on;
            }
        }
        break;
    case 'd' :
        if( (arg_flen > 2) && (arg_flen < 7)
            && !strnicmp( "DELETE", p, arg_flen ) ) {

            function = f_delete;
        }
        break;
    case 'p' :
        if( (arg_flen > 1) && (arg_flen < 6)
            && !strnicmp( "PRINT", p, arg_flen ) ) {

            function = f_print;
        }
        break;
    default:
        // nothing
        break;
    }
    if( function == 0 ) {               // no valid function specified
        xx_err( err_tag_func_inv );
        return;
    }

    cc = getarg();                      // get possible next parm

    /***********************************************************************/
    /*  for add and change    get macroname                                */
    /***********************************************************************/

    if( function == f_add || function == f_change ) {   // need macroname
        if( cc == omit ) {
            xx_err( err_tag_mac_name );
            return;
        }
        p = tok_start;

        pn      = macname;
        len     = 0;

        while( *p && is_macro_char( *p ) ) {
            if( len < MAC_NAME_LENGTH ) {
                *pn++ = tolower( *p++ );    // copy lowercase macroname
                *pn   = '\0';
            } else {
                break;
            }
            len++;
        }
        for( k = len; k < MAC_NAME_LENGTH; k++ ) {
            macname[k] = '\0';
        }
        macname[MAC_NAME_LENGTH] = '\0';

        tag_flags = 0;

        if( function == f_add ) {       // collect tag options
            cc = scan_tag_options( &tag_flags );
            if( cc != omit ) {          // not all processed error
               xx_err( err_tag_opt_inv );
            }
            tag_entry = add_tag( &tag_dict, tagname, macname, tag_flags );  // add to dictionary
            // if tag_entry is now NULL, error (+ msg) was output in add_tag
        } else {                        // is function change
            tag_entry = change_tag( &tag_dict, tagname, macname );
        }
    } else {

    /***********************************************************************/
    /*  after delete, off, on, print nothing allowed                       */
    /***********************************************************************/

        if( cc != omit ) {
            xx_err( err_tag_toomany );  // nothing more allowed
        }

        switch( function ) {
        case f_print :
            if( savetag == '*' ) {
                print_tag_dict( tag_dict );
            } else {
                print_tag_entry( find_tag( &tag_dict, tagname ) );
            }
            break;
        case f_delete :
            if( savetag == '*' ) {
                free_tag_dict( &tag_dict );
            } else {
                free_tag( &tag_dict, find_tag( &tag_dict, tagname ) );
            }
            break;
        case f_off :
            if( savetag == '*' && tag_entry != NULL ) {// off for last defined
                tag_entry->tagflags |= tag_off;
            } else {
                wk = find_tag( &tag_dict, tagname );
                if( wk != NULL ) {
                    wk->tagflags |= tag_off;
                }
            }
            break;
        case f_on :
            if( savetag == '*' && tag_entry != NULL ) {// on for last defined
                tag_entry->tagflags |= tag_off;
            } else {
                wk = find_tag( &tag_dict, tagname );
                if( wk != NULL ) {
                    wk->tagflags &= ~tag_off;
                }
            }
            break;
        default:
            break;
        }
    }
    scan_restart = scan_stop +1;
    return;
}
static gboolean
parse_tag_group (TagGroup *tg, const gchar* fn, xmlDocPtr doc,
		 xmlNsPtr ns, xmlNodePtr cur, gboolean sort)
{
	pluma_debug_message (DEBUG_PLUGINS, "Parse TagGroup: %s", tg->name);

	/* We don't care what the top level element name is */
    	cur = cur->xmlChildrenNode;

	while (cur != NULL)
	{
		if ((xmlStrcmp (cur->name, (const xmlChar *) "Tag")) || (cur->ns != ns))
		{
			g_warning ("The tag list file '%s' is of the wrong type, "
				   "was '%s', 'Tag' expected.", fn, cur->name);

			return FALSE;
		}
		else
		{
			Tag *tag;

			tag = g_new0 (Tag, 1);

			/* Get Tag name */
			tag->name = xmlGetProp (cur, (const xmlChar *) "name");

			if (tag->name == NULL)
			{
				/* Error: No name */
				g_warning ("The tag list file '%s' is of the wrong type, "
				   "Tag without name.", fn);

				g_free (tag);

				return FALSE;
			}
			else
			{
				/* Parse Tag */
				if (parse_tag (tag, doc, ns, cur))
				{
					/* Prepend Tag to TagGroup */
					tg->tags = g_list_prepend (tg->tags, tag);
				}
				else
				{
					/* Error parsing Tag */
					g_warning ("The tag list file '%s' is of the wrong type, "
			   		   	   "error parsing Tag '%s' in TagGroup '%s'.",
					   	   fn, tag->name, tg->name);

					free_tag (tag);

					return FALSE;
				}
			}
		}

		cur = cur->next;
	}

	if (sort)
		tg->tags = g_list_sort (tg->tags, tags_cmp);
	else
		tg->tags = g_list_reverse (tg->tags);

	return TRUE;
}