+++ /dev/null
---- mp3gain.c.old 2004-12-23 15:47:04.000000000 -0500
-+++ mp3gain.c 2006-03-13 22:15:28.000000000 -0500
-@@ -46,7 +46,8 @@
- \r
- #include <stdio.h>\r
- #include <stdlib.h>\r
--#include <math.h>\r
-+#include <math.h>
-+#include <ctype.h>\r
- #include "apetag.h"\r
- \r
- #ifndef WIN32\r
-@@ -1181,10 +1182,11 @@
- static\r
- void errUsage(char *progname) {\r
- showVersion(progname);\r
-- fprintf(stderr,"copyright(c) 2001-2004 by Glen Sawyer\n");\r
-+ fprintf(stderr,"copyright(c) 2001-2004 by Glen Sawyer\n");
-+ fprintf(stderr,"portions copyright(c) 2006 by Stephan Sokolow\n");\r
- fprintf(stderr,"uses mpglib, which can be found at http://www.mpg123.de\n");\r
- fprintf(stderr,"Usage: %s [options] <infile> [<infile 2> ...]\n",progname);\r
-- fprintf(stderr," --use %c? or %ch for a full list of options\n",SWITCH_CHAR,SWITCH_CHAR);\r
-+ fprintf(stderr," --use %c?, %ch, or --help for a full list of options\n",SWITCH_CHAR,SWITCH_CHAR);\r
- fclose(stdout);\r
- fclose(stderr);\r
- exit(1);\r
-@@ -1195,7 +1197,8 @@
- static\r
- void fullUsage(char *progname) {\r
- showVersion(progname);\r
-- fprintf(stderr,"copyright(c) 2001-2004 by Glen Sawyer\n");\r
-+ fprintf(stderr,"copyright(c) 2001-2004 by Glen Sawyer\n");
-+ fprintf(stderr,"portions copyright(c) 2006 by Stephan Sokolow\n");\r
- fprintf(stderr,"uses mpglib, which can be found at http://www.mpg123.de\n");\r
- fprintf(stderr,"Usage: %s [options] <infile> [<infile 2> ...]\n",progname);\r
- fprintf(stderr,"options:\n");\r
-@@ -1227,9 +1230,14 @@
- fprintf(stderr,"\t%cs d - delete stored tag info (no other processing)\n",SWITCH_CHAR);\r
- fprintf(stderr,"\t%cs s - skip (ignore) stored tag info (do not read or write tags)\n",SWITCH_CHAR);\r
- fprintf(stderr,"\t%cs r - force re-calculation (do not read tag info)\n",SWITCH_CHAR);\r
-- fprintf(stderr,"\t%cu - undo changes made by mp3gain (based on stored tag info)\n",SWITCH_CHAR);\r
-- fprintf(stderr,"\t%cw - \"wrap\" gain change if gain+change > 255 or gain+change < 0\n",SWITCH_CHAR);\r
-- fprintf(stderr,"\t (use \"%c? wrap\" switch for a complete explanation)\n",SWITCH_CHAR);\r
-+ fprintf(stderr,"\t%cu - undo changes made by mp3gain (based on stored tag info)\n",SWITCH_CHAR);
-+ fprintf(stderr,"\t%cw - \"wrap\" gain change if gain+change > 255 or gain+change < 0\n",SWITCH_CHAR);
-+ fprintf(stderr,"\t (use \"%c? wrap\" switch for a complete explanation)\n",SWITCH_CHAR);
-+ fprintf(stderr,"\t-- - force everything beyond this point to be treated as arguments.\n");
-+ fprintf(stderr,"long options:\n");
-+ fprintf(stderr,"\t--auto - same as %cr %ck %cp\n", SWITCH_CHAR, SWITCH_CHAR, SWITCH_CHAR);
-+ fprintf(stderr,"\t--help - show this message\n");
-+ fprintf(stderr,"\t--recursive - TODO\n");\r
- fprintf(stderr,"If you specify %cr and %ca, only the second one will work\n",SWITCH_CHAR,SWITCH_CHAR);\r
- fprintf(stderr,"If you do not specify %cc, the program will stop and ask before\n applying gain change to a file that might clip\n",SWITCH_CHAR);\r
- fclose(stdout);\r
-@@ -1245,7 +1253,20 @@
- fprintf(stderr, "haveTrackPeak %d trackPeak %f\n",info->haveTrackPeak, info->trackPeak);\r
- fprintf(stderr, "haveMinMaxGain %d min %d max %d\n",info->haveMinMaxGain, info->minGain, info->maxGain);\r
- }\r
--\r
-+
-+void showHelp(int argc, char **argv, int i) {
-+ if ((argv[i][2] == 'w')||(argv[i][2] == 'W')) {
-+ wrapExplanation();
-+ } else {
-+ if (i+1 < argc) {
-+ if ((argv[i+1][0] == 'w')||(argv[i+1][0] =='W'))
-+ wrapExplanation();
-+ } else {
-+ fullUsage(argv[0]);
-+ }
-+ }
-+ fullUsage(argv[0]);
-+}
- \r
- #ifdef WIN32\r
- int __cdecl main(int argc, char **argv) { /*make sure this one is standard C declaration*/\r
-@@ -1282,7 +1303,7 @@
- int fileStart;\r
- int numFiles;\r
- int databaseFormat = 0;\r
-- int i;\r
-+ int i, j;\r
- int *fileok;\r
- int goAhead;\r
- int directGain = 0;\r
-@@ -1303,7 +1324,10 @@
- double curAlbumPeak = 0;\r
- unsigned char curAlbumMinGain = 0;\r
- unsigned char curAlbumMaxGain = 0;\r
-- char chtmp;\r
-+ char chtmp;
-+
-+ /* Variables used in the improved option parser */
-+ int parseOptions = !0;\r
- \r
- gSuccess = 1;\r
- \r
-@@ -1316,28 +1340,28 @@
- fileStart = 1;\r
- numFiles = 0;\r
- \r
-- for (i = 1; i < argc; i++) {\r
--#ifdef WIN32\r
-- if ((argv[i][0] == '/')||((argv[i][0] == '-') && (strlen(argv[i])==2))) { /* don't need to force single-character command parameters */\r
--#else\r
-- if (((argv[i][0] == '/')||(argv[i][0] == '-'))&&\r
-- (strlen(argv[i])==2)) {\r
--#endif\r
-- fileStart++;\r
-- switch(argv[i][1]) {\r
-- case 'a':\r
-- case 'A':\r
-+ for (i = 1; i < argc; i++) {
-+ /*
-+ TODO: Implement support for:
-+ - consider including the glob-parsing support from vorbisgain's so-called recursive support.
-+ */
-+ if ((parseOptions) && (argv[i][0] == SWITCH_CHAR) && (strlen(argv[i]) >= 2) ) {\r
-+ fileStart++;
-+
-+ if (!strcmp(argv[i],"--")) { /* Support for the standard "--" option to force the end of the option parsing. */
-+ parseOptions = 0;
-+ continue;
-+ } else if (argv[i][1] != '-') { /* Ensure that this isn't a long option. */
-+ for (j = 1; j < strlen(argv[i]); j++) {
-+ switch(tolower(argv[i][j])) {\r
-+ case 'a':\r
- applyTrack = 0;\r
- applyAlbum = !0;\r
- break;\r
--\r
-- case 'c':\r
-- case 'C':\r
-+ case 'c':\r
- ignoreClipWarning = !0;\r
- break;\r
--\r
-- case 'd':\r
-- case 'D':\r
-+ case 'd':\r
- if (argv[i][2] != '\0') {\r
- dBGainMod = atof(argv[i]+2);\r
- }\r
-@@ -1352,14 +1376,10 @@
- }\r
- }\r
- break;\r
--\r
-- case 'f':\r
-- case 'F':\r
-+ case 'f':\r
- Reckless = 1;\r
- break;\r
--\r
-- case 'g':\r
-- case 'G':\r
-+ case 'g':\r
- directGain = !0;\r
- directSingleChannelGain = 0;\r
- if (argv[i][2] != '\0') {\r
-@@ -1376,32 +1396,14 @@
- }\r
- }\r
- break;\r
--\r
-- case 'h':\r
-- case 'H':\r
-- case '?':\r
-- if ((argv[i][2] == 'w')||(argv[i][2] == 'W')) {\r
-- wrapExplanation();\r
-- }\r
-- else {\r
-- if (i+1 < argc) {\r
-- if ((argv[i+1][0] == 'w')||(argv[i+1][0] =='W'))\r
-- wrapExplanation();\r
-- }\r
-- else {\r
-- fullUsage(argv[0]);\r
-- }\r
-- }\r
-- fullUsage(argv[0]);\r
-- break;\r
--\r
-- case 'k':\r
-- case 'K':\r
-- autoClip = !0;\r
-- break;\r
--\r
-- case 'l':\r
-- case 'L':\r
-+ case 'h':\r
-+ case '?':\r
-+ showHelp(argc, argv, i);
-+ break;\r
-+ case 'k':\r
-+ autoClip = !0;\r
-+ break;\r
-+ case 'l':\r
- directSingleChannelGain = !0;\r
- directGain = 0;\r
- if (argv[i][2] != '\0') {\r
-@@ -1429,9 +1431,7 @@
- }\r
- }\r
- break;\r
--\r
-- case 'm':\r
-- case 'M':\r
-+ case 'm':\r
- if (argv[i][2] != '\0') {\r
- mp3GainMod = atoi(argv[i]+2);\r
- }\r
-@@ -1446,30 +1446,20 @@
- }\r
- }\r
- break;\r
--\r
-- case 'o':\r
-- case 'O':\r
-+ case 'o':\r
- databaseFormat = !0;\r
- break;\r
--\r
-- case 'p':\r
-- case 'P':\r
-+ case 'p':\r
- saveTime = !0;\r
- break;\r
--\r
-- case 'q':\r
-- case 'Q':\r
-+ case 'q':\r
- QuietMode = !0;\r
- break;\r
--\r
-- case 'r':\r
-- case 'R':\r
-+ case 'r':\r
- applyTrack = !0;\r
- applyAlbum = 0;\r
- break;\r
--\r
-- case 's':\r
-- case 'S':\r
-+ case 's':\r
- chtmp = 0;\r
- if (argv[i][2] == '\0') {\r
- if (i+1 < argc) {\r
-@@ -1482,59 +1472,56 @@
- } else {\r
- chtmp = argv[i][2];\r
- }\r
-- switch (chtmp) {\r
-- case 'c':\r
-- case 'C':\r
-- checkTagOnly = !0;\r
-- break;\r
-- case 'd':\r
-- case 'D':\r
-- deleteTag = !0;\r
-- break;\r
-- case 's':\r
-- case 'S':\r
-- skipTag = !0;\r
-- break;\r
-- case 'r':\r
-- case 'R':\r
-- forceRecalculateTag = !0;\r
-- break;\r
-- default:\r
-- errUsage(argv[0]);\r
-- }\r
--\r
-- break;\r
--\r
-- case 't':\r
-- case 'T':\r
-+ switch (tolower(chtmp)) {\r
-+ case 'c':\r
-+ checkTagOnly = !0;\r
-+ break;\r
-+ case 'd':\r
-+ deleteTag = !0;\r
-+ break;\r
-+ case 's':\r
-+ skipTag = !0;\r
-+ break;\r
-+ case 'r':\r
-+ forceRecalculateTag = !0;\r
-+ break;\r
-+ default:\r
-+ errUsage(argv[0]);\r
-+ }\r
-+ break;\r
-+ case 't':\r
- UsingTemp = !0;\r
- break;\r
--\r
-- case 'u':\r
-- case 'U':\r
-+ case 'u':\r
- undoChanges = !0;\r
- break;\r
--\r
-- case 'v':\r
-- case 'V':\r
-+ case 'v':\r
- showVersion(argv[0]);\r
-- fclose(stdout);\r
-- fclose(stderr);\r
-+ fclose(stdout);\r
-+ fclose(stderr);\r
- exit(0);\r
-- \r
-- case 'w':\r
-- case 'W':\r
-+ case 'w':\r
- wrapGain = !0;\r
- break;\r
--\r
-- case 'x':\r
-- case 'X':\r
-+ case 'x':\r
- maxAmpOnly = !0;\r
- break;\r
--\r
-- default:\r
-- fprintf(stderr,"I don't recognize option %s\n",argv[i]);\r
-- }\r
-+ default:\r
-+ fprintf(stderr,"I don't recognize option %s\n",argv[i]);
-+ }
-+ }\r
-+ } else if (!strncmp(argv[i],"--",2)) { /* This is a long option and must be parsed as such */
-+ if (!strcasecmp(argv[i],"--auto")) {
-+ autoClip = !0; /* -k */
-+ saveTime = !0; /* -p */
-+ applyTrack = !0; /* -r */
-+ applyAlbum = 0; /* -r */
-+ } else if (!strcasecmp(argv[i],"--help")) {
-+ showHelp(argc, argv, i);
-+ } else if (!strcasecmp(argv[i],"--recursive")) {
-+ fprintf(stderr,"Sorry, --recursive has not been implemented yet.\n\t However, the following command seems to be equivalent:\n\t`find /path/to/mp3s -iname \"*.mp3\" -exec mp3gain -r {} \\;`\n\tThe use of --auto in place of -r is recommended.\n");
-+ }
-+ }\r
- }\r
- }\r
- /* now stored in tagInfo--- maxsample = malloc(sizeof(Float_t) * argc); */\r