Package: vorbis-tools Version: 1.2.0-5rafael1 Severity: wishlist Tags: patch
When vorbiscomment reads from a file, it would be nice if it could use a delimiter other than newline. That way a metadata field value could have a newline (which is the case for lyrics, for instance). I wrote a patch that does just that. I tested it on version 1.2, but it seems that version 1.4 of vorbiscommand doesn't change anything significant. Feel free to send it upstream, apply to debian package or just ignore it :P. -- System Information: Debian Release: 5.0.6 APT prefers stable APT policy: (500, 'stable') Architecture: amd64 (x86_64) Kernel: Linux 2.6.26-2-amd64 (SMP w/2 CPU cores) Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8) Shell: /bin/sh linked to /bin/bash Versions of packages vorbis-tools depends on: ii libao2 0.8.8-4 Cross Platform Audio Output Librar ii libc6 2.7-18lenny4 GNU C Library: Shared libraries ii libcurl3-gnutls 7.18.2-8lenny4 Multi-protocol file transfer libra ii libflac8 1.2.1-1.2 Free Lossless Audio Codec - runtim ii libogg0 1.1.3-4 Ogg Bitstream Library ii libspeex1 1.2~rc1-1 The Speex codec runtime library ii libvorbis0a 1.2.0.dfsg-3.1+lenny1 The Vorbis General Audio Compressi ii libvorbisenc2 1.2.0.dfsg-3.1+lenny1 The Vorbis General Audio Compressi ii libvorbisfile3 1.2.0.dfsg-3.1+lenny1 The Vorbis General Audio Compressi vorbis-tools recommends no packages. vorbis-tools suggests no packages. -- no debconf information
diff -ur vorbis-tools-1.2.0.old/vorbiscomment/vcomment.c new/vorbis-tools-1.2.0/vorbiscomment/vcomment.c --- vorbis-tools-1.2.0.old/vorbiscomment/vcomment.c 2008-03-03 02:37:25.000000000 -0300 +++ vorbis-tools-1.2.0.new/vorbiscomment/vcomment.c 2010-10-24 16:15:37.000000000 -0200 @@ -49,6 +49,7 @@ /* mode and flags */ int mode; int raw; + char delimiter; /* file names and handles */ char *infilename, *outfilename; @@ -69,7 +70,7 @@ /* prototypes */ void usage(void); void print_comments(FILE *out, vorbis_comment *vc, int raw); -int add_comment(char *line, vorbis_comment *vc, int raw); +int add_comment(char *line, vorbis_comment *vc, char delim, int raw); param_t *new_param(void); void free_param(param_t *param); @@ -78,7 +79,7 @@ void close_files(param_t *p, int output_written); char * -read_line (FILE *input) +read_line (FILE *input, char delim) { /* Construct a list of buffers. Each buffer will hold 1024 bytes. If * more is required, it is easier to extend the list than to extend @@ -94,7 +95,7 @@ while (1) { - char *retval; + int retval; /* Increase the max buffer count in increments of 10 */ if (buffer_count == max_buffer_count) @@ -103,15 +104,27 @@ buffers = realloc (buffers, sizeof (char *) * max_buffer_count); } - buffer = malloc (sizeof (char) * (buffer_size + 1)); - retval = fgets (buffer, (buffer_size + 1), input); + buffer = calloc (sizeof (char), buffer_size + 1); + { + int i; + for (i = 0; i < buffer_size-1; ++i) { + retval = fgetc(input); + if (retval == EOF) { + break; + } else if (retval == delim) { + buffer[i] = delim; + break; + } + buffer[i] = retval; + } + } - if (retval) + if (retval != EOF) { buffers[buffer_count] = buffer; buffer_count++; - if (retval[strlen (retval) - 1] == '\n') + if (buffer[strlen(buffer) - 1] == delim) { /* End of the line */ break; @@ -231,7 +244,7 @@ for(i=0; i < param->commentcount; i++) { - if(add_comment(param->comments[i], vc, param->raw) < 0) + if(add_comment(param->comments[i], vc, param->delimiter, param->raw) < 0) fprintf(stderr, _("Bad comment: \"%s\"\n"), param->comments[i]); } @@ -240,9 +253,9 @@ { char *comment; - while ((comment = read_line (param->com))) + while ((comment = read_line (param->com, param->delimiter))) { - if (add_comment (comment, vc, param->raw) < 0) + if (add_comment (comment, vc, param->delimiter, param->raw) < 0) { fprintf (stderr, _("bad comment: \"%s\"\n"), comment); @@ -311,14 +324,14 @@ ***********/ -int add_comment(char *line, vorbis_comment *vc, int raw) +int add_comment(char *line, vorbis_comment *vc, char delim, int raw) { char *mark, *value, *utf8_value; /* strip any terminal newline */ { int len = strlen(line); - if (line[len-1] == '\n') line[len-1] = '\0'; + if (line[len-1] == delim) line[len-1] = '\0'; } /* validation: basically, we assume it's a tag @@ -401,6 +414,7 @@ " When listing, write comments to the specified file.\n" " When editing, read comments from the specified file.\n")); printf (_(" -R, --raw Read and write comments in UTF-8\n")); + printf (_(" -d Delimiter for field separation.\n")); printf ("\n"); printf (_(" -h, --help Display this help\n")); @@ -448,6 +462,7 @@ /* mode and flags */ param->mode = MODE_LIST; param->raw = 0; + param->delimiter = '\n'; /* filenames */ param->infilename = NULL; @@ -482,7 +497,7 @@ setlocale(LC_ALL, ""); - while ((ret = getopt_long(argc, argv, "alwhqVc:t:R", + while ((ret = getopt_long(argc, argv, "alwhqVc:t:d:R", long_options, &option_index)) != -1) { switch (ret) { case 0: @@ -520,6 +535,9 @@ (param->commentcount+1)*sizeof(char *)); param->comments[param->commentcount++] = strdup(optarg); break; + case 'd': + param->delimiter = optarg[0]; + break; default: usage(); exit(1);