"Fossies" - the Fresh Open Source Software Archive

Member "mp3info-0.8.5a/textfunc.c" (6 Nov 2006, 11444 Bytes) of package /linux/misc/old/mp3info-0.8.5a.tgz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file. For more information about "textfunc.c" see the Fossies "Dox" file reference documentation.

    1 /*
    2     textfunc.c - Handles most console I/O and interface tasks
    3 
    4     Copyright (C) 2000-2006 Cedric Tefft <cedric@phreaker.net>
    5 
    6     This program is free software; you can redistribute it and/or modify
    7     it under the terms of the GNU General Public License as published by
    8     the Free Software Foundation; either version 2 of the License, or
    9     (at your option) any later version.
   10 
   11     This program is distributed in the hope that it will be useful,
   12     but WITHOUT ANY WARRANTY; without even the implied warranty of
   13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   14     GNU General Public License for more details.
   15 
   16     You should have received a copy of the GNU General Public License
   17     along with this program; if not, write to the Free Software
   18     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
   19 
   20   ***************************************************************************
   21 
   22   This program is based in part on MP3Info 0.5 by Ricardo Cerqueira <rmc@rccn.net>
   23 
   24 */
   25 
   26 #include "mp3info.h"
   27 
   28 char *layer_text[] = {
   29     "I", "II", "III"
   30 };
   31 
   32 /*
   33  * Name of this one is quite obvious...
   34  */
   35 
   36 void CenterText(int line, char *text) {
   37    mvprintw(line,(COLS/2)-((int)strlen(text)/2),text);
   38 }
   39 
   40 /* Convert hex digit to integer */
   41 
   42 int xtoi(char *string) {
   43     char chr=toupper(string[0]);
   44 
   45     if(chr > '9')
   46         return (int) (chr - 'A' + 10);
   47     else 
   48         return (int) (chr - '0');
   49 }
   50 
   51 
   52 
   53 /*
   54  * Another one with an obvious name :-)
   55  */
   56 
   57 void display_help() {
   58 
   59      printf("%s %s\n\nUSAGE:\n\n",VERSION,COPYRIGHT);
   60      printf("\tmp3info [ -h | -G ]\n"\
   61         "\n\tmp3info [-x] [-F] [-r a|m|v] [-p FORMAT_STRING] file(s)\n"\
   62         "\n\tmp3info [-d] file(s)\n"\
   63         "\n\tmp3info [-i]  [-t title] [-a artist] [-l album] [-y year]\n"\
   64         "\t\t[-c comment] [-n track] [-g genre] file(s)\n"\
   65         "\nOPTIONS\n"\
   66         "\t-a artist\tSpecify ID3 artist name\n"\
   67         "\t-c comment\tSpecify ID3 comment\n"\
   68         "\t-g genre\tSpecify ID3 genre (use -G for genre list)\n"\
   69         "\t-l album\tSpecify ID3 album name\n"\
   70         "\t-n track\tSpecify ID3 v1.1 track number\n"\
   71         "\t-t title\tSpecify ID3 track title\n"\
   72         "\t-y year\t\tSpecify ID3 copyright year\n\n"\
   73         "\t-G\t\tDisplay valid genres\n"\
   74         "\t-h\t\tDisplay this help page\n"\
   75         "\t-x\t\tDisplay technical attributes of the MP3 file\n"\
   76         "\t-r a|m|v\tReport bit rate of (VBR) files as:\n"\
   77         "\t\ta - Average bit rate (float)\n"\
   78         "\t\tm - Median bit rate (integer)\n"\
   79         "\t\tv - Simply  use  the  word 'Variable' (string) [default]\n\n"\
   80         "\t-i\t\tEdit ID3  tag  interactively\n"\
   81         "\t-d\t\tDelete ID3 tag (if one exists)\n"\
   82         "\t-f\t\tForce processing if file is not a standard MP3\n"\
   83         "\t-F\t\tFull Scan (see man page for details)\n"\
   84         "\n\n\t-p \"FORMAT_STRING\" Print FORMAT_STRING with substitutions\n"\
   85         "\n\t\tConversion Specifiers\n\n"\
   86         "\t\t%%f\tFilename without the path (string)\n"\
   87         "\t\t%%F\tFilename with the path (string)\n"\
   88         "\t\t%%k\tFile size in KB (integer)\n"\
   89         "\n\t\t%%a\tArtist (string)\n"\
   90         "\t\t%%c\tComment (string)\n"\
   91         "\t\t%%g\tMusical genre (string)\n"\
   92         "\t\t%%G\tMusical genre (integer)\n"\
   93         "\t\t%%l\tAlbum name (string)\n"\
   94         "\t\t%%n\tTrack (integer)\n"\
   95         "\t\t%%t\tTrack Title (string)\n"\
   96         "\t\t%%y\tYear (string)\n"\
   97         "\n\t\t%%C\tCopyright flag (string)\n"\
   98         "\t\t%%e\tEmphasis (string)\n"\
   99         "\t\t%%E\tCRC Error protection (string)\n"\
  100         "\t\t%%L\tMPEG Layer (string)\n"\
  101         "\t\t%%O\tOriginal material flag (string)\n"\
  102         "\t\t%%o\tStereo/mono mode (string)\n"\
  103         "\t\t%%p\tPadding (string)\n"\
  104         "\t\t%%v\tMPEG Version (float)\n"\
  105         "\n\t\t%%u\tNumber of good audio frames (integer)\n"\
  106         "\t\t%%b\tNumber of corrupt audio frames (integer)\n"\
  107         "\t\t%%Q\tSampling frequency in Hz (integer)\n"\
  108         "\t\t%%q\tSampling frequency in KHz (integer)\n"\
  109         "\t\t%%r\tBit  Rate  in  KB/s  (see also '-r')\n"\
  110         "\n\t\t%%m\tPlaying time: minutes only (integer)\n"\
  111         "\t\t%%s\tPlaying time: seconds only (integer)\n"\
  112         "\t\t%%S\tTotal playing time in seconds (integer)\n"\
  113         "\n\t\t%%%%\tA single percent sign\n"\
  114             "\n\t\tEscape Sequences\n\n"\
  115         "\t\t\\n\tNewline\n"\
  116         "\t\t\\t\tHorizontal tab\n"\
  117         "\t\t\\v\tVertical tab\n"\
  118         "\t\t\\b\tBackspace\n"\
  119         "\t\t\\r\tCarriage Return\n"\
  120         "\t\t\\f\tForm Feed\n"\
  121         "\t\t\\a\tAudible Alert (terminal bell)\n"\
  122         "\t\t\\xhh\tAny  arbitrary character specified by the\n"\
  123         "\t\t\thexidecimal number hh\n"\
  124         "\t\t\\ooo\tAny arbitrary character specified by  the\n"\
  125         "\t\t\toctal number ooo\n"\
  126         "\t\t\\\\\tA single backslash character\n\n"\
  127         "This help screen is only a summary of command-line switches\n"\
  128         "See the man page for complete documentation.\n\n");
  129 
  130 }
  131 
  132 void display_genres(int alphagenreindex[],char *typegenre[]) {
  133     int i,j,index;
  134     printf("Extended MP3 ID3 Genres\n=======================\n");
  135     for(i=0;i<GENREROWS;i++) {
  136        for(j=0;j<3;j++) {
  137           index=(GENREROWS*j)+i;
  138           if(index <= MAXGENRE) {
  139              printf("%3d %-21s ",alphagenreindex[index],typegenre[alphagenreindex[index]]);
  140               }
  141            }
  142        printf("\n");
  143     }
  144 }
  145 
  146 unsigned int get_genre (char *genre) {
  147     int num_genre=0;
  148 
  149         if(genre[0] == '\0') { return 255; }
  150 
  151     sscanf(genre,"%u",&num_genre);
  152     if(num_genre == 0) {
  153         if(genre[0] != '0') {
  154             while(num_genre++ <= MAXGENRE) {
  155                 if(!strcasecmp(genre,typegenre[num_genre-1])) {
  156                     return num_genre-1;
  157                 }
  158             }
  159             num_genre=256;
  160         }       
  161     }
  162 
  163     if(num_genre < 0 || num_genre > MAXGENRE) {
  164         num_genre=256;
  165     }
  166     return num_genre;
  167 }
  168 
  169 void text_genre(unsigned char *genre,char *buffer) {
  170    int genre_num = (int) genre[0];
  171 
  172    if(genre_num <= MAXGENRE) {
  173     sprintf(buffer,"%s",typegenre[genre_num]);
  174    } else if(genre_num < 255) {
  175     sprintf(buffer,"(UNKNOWN) [%d]",genre_num);
  176    } else {
  177     buffer[0]='\0';
  178    }
  179 }
  180 
  181 void determine_tasks (char *format_string,int *want_id3,int *scantype, int *fullscan_vbr,int vbr_report) {
  182 
  183     char *format=format_string;
  184     char *percent;
  185     while((percent=strchr(format,'%'))) {
  186         percent++;
  187         while(*percent && (percent[0] != '%' && !isalpha(*percent))) percent++;
  188         switch (percent[0]) {
  189             case 't':
  190             case 'a':
  191             case 'l':
  192             case 'y':
  193             case 'c':
  194             case 'n':
  195             case 'g':
  196             case 'G': *want_id3=1; break;
  197             case 'm':
  198             case 's':
  199             case 'u':
  200             case 'S': *fullscan_vbr=1;
  201             case 'r': if(vbr_report != VBR_VARIABLE) *fullscan_vbr=1;
  202             case 'q':
  203             case 'Q':
  204             case 'e':
  205             case 'E':
  206             case 'C':
  207             case 'O':
  208             case 'v':
  209             case 'L':
  210             case 'p':
  211             case 'o': if(*scantype != SCAN_FULL)
  212                     *scantype=SCAN_QUICK;
  213                   break;
  214             case 'b': *scantype=SCAN_FULL; break;
  215         }
  216         format=percent+1;
  217     }   
  218 }
  219 
  220 
  221 void format_output (char *format_string,mp3info *mp3, int vbr_report) {
  222 
  223     char genre[40]="";
  224     char mod[1000],*percent,*pos,*code;
  225     char *format=format_string;
  226     int modlen;
  227 
  228     while((percent=strchr(format,'%'))) {
  229         *percent=0;
  230         printf(format);
  231         *percent='%';
  232         code=percent+1;
  233         while(*code && (code[0] != '%' && !isalpha(*code))) code++;
  234 
  235         if(*code) {
  236             modlen=code-percent+1;
  237             if(modlen > 1000) {
  238                 printf("Format modifier beginning at position %d too long!\n",(int)(percent-format));
  239                 exit(5);
  240             }
  241             strncpy(mod,percent,modlen);
  242             mod[modlen]=0;
  243             mod[modlen-1]='s';
  244             switch (*code) {
  245                 case 't': printf(mod,mp3->id3.title); break;
  246                 case 'f': pos = (pos=strrchr(mp3->filename,'/')) ? 
  247                         pos+1 : mp3->filename;
  248                       printf(mod,pos); break;
  249                 case 'F': printf(mod,mp3->filename); break;
  250                 case 'a': printf(mod,mp3->id3.artist); break;
  251                 case 'l': printf(mod,mp3->id3.album); break;
  252                 case 'k': mod[modlen-1] = 'd'; printf(mod,mp3->datasize / 1024); break;
  253                 case 'y': printf(mod,mp3->id3.year); break;
  254                 case 'c': printf(mod,mp3->id3.comment); break;
  255                 case 'n': if(mp3->id3_isvalid && mp3->id3.track[0]) {
  256                         mod[modlen-1]='d';
  257                         printf(mod, (int) mp3->id3.track[0]);
  258                       }
  259                       break;
  260                 case 'g': if(mp3->id3_isvalid) {
  261                         text_genre(mp3->id3.genre,genre);
  262                         printf(mod,genre);
  263                       }
  264                       break;
  265                 case 'G': if(mp3->id3_isvalid) {
  266                         mod[modlen-1]='d';
  267                         printf(mod,(int) mp3->id3.genre[0]);
  268                       }
  269                       break;
  270                 case 'r': if(mp3->header_isvalid) {
  271                         if(mp3->vbr && (vbr_report == VBR_VARIABLE))
  272                             printf(mod,"Variable");
  273                         else if(vbr_report == VBR_AVERAGE) {
  274                             mod[modlen-1]='f';
  275                             printf(mod,mp3->vbr_average);
  276                         } else {
  277                             mod[modlen-1]='d';
  278                             printf(mod,header_bitrate(&mp3->header));
  279                         }
  280                       }
  281                       break;
  282                 case 'q': if(mp3->header_isvalid) {
  283                         mod[modlen-1]='d';
  284                         printf(mod,header_frequency(&mp3->header)/1000);
  285                       }
  286                       break;
  287                 case 'Q': if(mp3->header_isvalid) {
  288                         mod[modlen-1]='d';
  289                         printf(mod,header_frequency(&mp3->header));
  290                       }
  291                       break;
  292                 case 'e': if(mp3->header_isvalid) {
  293                         printf(mod,header_emphasis(&mp3->header));
  294                       }
  295                       break;
  296                 case 'E': if(mp3->header_isvalid) {
  297                         printf(mod,!mp3->header.crc ? "Yes" : "No");
  298                       }
  299                       break;
  300                 case 'C': if(mp3->header_isvalid) {
  301                         printf(mod,mp3->header.copyright ? "Yes" : "No");
  302                       }
  303                       break;
  304                 case 'O': if(mp3->header_isvalid) {
  305                         printf(mod,mp3->header.original ? "Yes" : "No");
  306                       }
  307                       break;
  308                 case 'm': if(mp3->header_isvalid) {
  309                         mod[modlen-1]='d';
  310                         printf(mod,mp3->seconds / 60);
  311                       }
  312                       break;
  313                 case 's': if(mp3->header_isvalid) {
  314                         mod[modlen-1]='d';
  315                         printf(mod,mp3->seconds % 60);
  316                       }
  317                       break;
  318                 case 'S': if(mp3->header_isvalid) {
  319                         mod[modlen-1]='d';
  320                         printf(mod,mp3->seconds);
  321                       }
  322                       break;
  323                 case 'v': if(mp3->header_isvalid) {
  324                         mod[modlen-1]='f';
  325                         printf(mod,mp3->header.version ? ((mp3->header.version==2) ? 2.5 : 1.0) : 2.0);
  326                       }
  327                       break;
  328                 case 'L': if(mp3->header_isvalid) {
  329                         printf(mod,layer_text[header_layer(&mp3->header)-1]);
  330                       }
  331                       break;
  332                 case 'o': if(mp3->header_isvalid) {
  333                         printf(mod,header_mode(&mp3->header));
  334                       }
  335                       break;
  336                 case 'p': if(mp3->header_isvalid) {
  337                         printf(mod,mp3->header.padding ? "Yes" : "No");
  338                       }
  339                       break;
  340                 case 'u': if(mp3->header_isvalid) {
  341                         mod[modlen-1]='d';
  342                         printf(mod,mp3->frames);
  343                       }
  344                       break;
  345                 case 'b': if(mp3->header_isvalid) {
  346                         mod[modlen-1]='d';
  347                         printf(mod,mp3->badframes);
  348                       }
  349                       break;
  350                     case '%': printf("%%"); break;
  351                 default:  printf("%%%c",*(code=percent+1)); break;
  352             }
  353             format=code+1;
  354         }
  355         
  356     }
  357     printf(format);
  358 }
  359 
  360 
  361 
  362 void translate_escapes (char *string) {
  363     char *read=string;
  364     char *write=string;
  365     int val;
  366 
  367     while(*read) {
  368         if(*read == '\\') {
  369             read++;
  370             switch (*read) {
  371                 case 'n': *(write++)='\n'; read++; break;
  372                 case 't': *(write++)='\t'; read++; break;
  373                 case 'v': *(write++)='\v'; read++; break;
  374                 case 'b': *(write++)='\b'; read++; break;
  375                 case 'r': *(write++)='\r'; read++; break;
  376                 case 'f': *(write++)='\f'; read++; break;
  377                 case 'a': *(write++)='\a'; read++; break;
  378                 case 'X':
  379                 case 'x': read++; /* HEX */
  380                       val=0;
  381                       if(isxdigit(*read)) val=xtoi(read++);
  382                       if(isxdigit(*read)) val=(val*16) + xtoi(read++);
  383                       *(write++)=(val % 256);
  384                 default:  if(*read <= '7' && *read >= '0') { /* octal */
  385                         val=xtoi(read++);
  386                         if(*read <= '7' && *read >= '0') val=(val*8) + xtoi(read++);
  387                         if(*read <= '7' && *read >= '0') val=(val*8) + xtoi(read++);
  388                         *(write++)=(val % 256);
  389                       } else {
  390                         *(write++)=*(read++); break;
  391                       }
  392             }
  393         } else {
  394             *write++=*read++;
  395         }
  396         
  397     }
  398     *write=0;
  399 }
  400