Проблема решена:
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include <getopt.h>
#include <string.h>
#include <mysql/mysql.h>
#include "all.h"
extern MYSQL open_mp3db(const char*, const char*, const char*);
extern int close_mp3db(MYSQL);
extern int add_id3_to_table(MYSQL, ID3_DATA);
void print_usage(FILE*, int);
int read_file(const char*, ID3_DATA);
int main(int, char*[]);
const char* const genre_id3v1[255] = {
"Blues",
.......
};
int read_file(const char* input_filename, ID3_DATA IDD)
{
FILE* f;
void* idtag;
unsigned char i[1];
f = fopen (input_filename, "r");
if (f == NULL)
{
fprintf (stderr, "Error reading file: %s!\n", input_filename);
return 1;
}
idtag = malloc (4);
fseek(f, -128, SEEK_END);
fread (idtag, 4, 1, f);
if (!strncmp((char*)idtag, "TAG", 3))
{
fseek(f, -1, SEEK_CUR);
fread (IDD.SONG, 1, 30, f);
fread (IDD.ARTIST, 1, 30, f);
fread (IDD.ALBUM, 1, 30, f);
fread (IDD.YEAR, 1, 4, f);
fread (i, 1, 1, f);
printf("i = %d\n%s\n", i[0], genre_id3v1[i[0]]);
/* IDD.GENRE = genre_id3v1 [i[0]]; */
}
else
{
fprintf (stderr, "No ID3v1 tag info!\n");
free(idtag);
fclose(f);
return 1;
};
free(idtag);
fclose(f);
printf("__%s__\n__%s__\n__%s__\n__%s__\n__%s__\n", IDD.SONG, IDD.ARTIST, IDD.ALBUM, IDD.YEAR, IDD.GENRE);
return 0;
}
int main(int argc, char *argv[])
{
int next_option;
const char* const short_options = "ho:i:n:v";
const struct option long_options[] = {
{ "help", 0, NULL, 'h'},
{ "output", 1, NULL, 'o'},
{ "input", 1, NULL, 'i'},
{ "name", 1, NULL, 'n'},
{ "verbose", 0, NULL, 'v'},
{ NULL, 0, NULL, 0 }
};
const char* output_filename = NULL;
const char* input_filename = NULL;
const char* song_name = NULL;
int verbose = 0;
ID3_DATA IDD;
MYSQL mysql;
program_name = argv[0];
do {
next_option = getopt_long (argc, argv, short_options, long_options, NULL);
switch (next_option)
{
case 'h':
print_usage (stdout, 0);
case 'o':
output_filename = optarg;
break;
case 'i':
input_filename = optarg;
break;
case 'n':
song_name = optarg;
break;
case 'v':
verbose = 1;
break;
case '?':
print_usage (stderr, 1);
case -1:
break;
default:
abort ();
}
}
while (next_option != -1);
if (!read_file(input_filename, IDD))
{
printf("__%s__\n__%s__\n__%s__\n__%s__\n__%s__\n", IDD.SONG, IDD.ARTIST, IDD.ALBUM, IDD.YEAR, IDD.GENRE);
}
else
{
exit(0);
}
mysql = open_mp3db("localhost", "root :)", "не скажу :)");
add_id3_to_table(mysql, IDD);
close_mp3db(mysql);
return EXIT_SUCCESS;
}
all.h :
const char* program_name;
struct MM_HEAD
{
char* MM_TYPE;
int BITRATE;
int SAMPLERATE;
int COPYRIGHT;
int ORIGINAL;
int FRAMES;
int DATA_SIZE;
};
struct ID3
{
char GENRE[30];
char ARTIST[30];
char ALBUM[30];
char SONG[30];
int TRACK;
char YEAR[4];
char COMMENT[30];
struct MM_HEAD mm_headers;
};
typedef struct ID3 ID3_DATA;
Но почему -то когда я говорю напечаать компоненты структуры во второй раз он печатает какую-то муть, а в функции read_file он все правильно выводит :(