Home | History | Annotate | Download | only in src
      1 #include <sys/types.h>
      2 #include <sys/stat.h>
      3 #include <unistd.h>
      4 #include <fcntl.h>
      5 #include <dlfcn.h>
      6 #include <stdio.h>
      7 #include <string.h>
      8 #include <stdlib.h>
      9 #include <dirent.h>
     10 
     11 #define MAX_STRING_LENGTH 255
     12 
     13 
     14 bool IsEnd(int handler)
     15 {
     16     int nPos;
     17 
     18     nPos = lseek(handler,0,SEEK_CUR);
     19 
     20     if ( nPos < 0 )
     21         return true; // means some error
     22 
     23     struct stat st;
     24     if(fstat(handler, &st) < 0)
     25        return true;
     26 
     27     if ( st.st_size == nPos )
     28         return true;
     29     else
     30         return false;
     31 }
     32 
     33 
     34 char* ReadLine(int handler, char* s, int size )
     35 {
     36 
     37     char c = 0;
     38     int nPos = 0;
     39 
     40     while ( read(handler, &c, 1 ) != -1 && !IsEnd(handler) )
     41     {
     42         s[nPos] = c;
     43         nPos++;
     44 
     45         if ( c == '\n' )
     46             break;
     47     }
     48     s[nPos] = 0;
     49     return s;
     50 }
     51 
     52 
     53 void ConvertFile(const char * pPath, const char * pFileName, const char * pExtension, bool bTextFile)
     54 {
     55 
     56 
     57     char full_path_in[MAX_STRING_LENGTH];
     58     char full_path_out_c[MAX_STRING_LENGTH];
     59     char full_path_out_h[MAX_STRING_LENGTH];
     60     char signature[MAX_STRING_LENGTH];
     61     char str[MAX_STRING_LENGTH];
     62     char str_size[20];
     63     int size;
     64 
     65     int len = pExtension == NULL ? 0 : strlen(pExtension)+1;
     66 
     67     strcpy(full_path_in,pPath);
     68     strcat(full_path_in,"/");
     69     strcat(full_path_in,pFileName);
     70 
     71     memset(signature,0,MAX_STRING_LENGTH);
     72     memset(str,0,MAX_STRING_LENGTH);
     73 
     74     strncpy(signature,pFileName,strlen(pFileName)-len);
     75 
     76     int file_handler_in;
     77     file_handler_in = open(full_path_in, O_RDONLY, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP );
     78     if ( file_handler_in == -1 )
     79     {
     80         printf("Unable open file %s\n",full_path_in);
     81         return;
     82     }
     83 
     84     struct stat st;
     85     if(fstat(file_handler_in, &st) < 0)
     86     {
     87        printf("Unable get size of file %s\n",full_path_in);
     88        return;
     89     }
     90 
     91     size = st.st_size;
     92 
     93     if ( pExtension )
     94     {
     95        strcat(signature,"_");
     96        strcat(signature,pExtension);
     97     }
     98 
     99     strcpy(full_path_out_c,signature);
    100     strcpy(full_path_out_h,signature);
    101 
    102     strcat(full_path_out_c,".c");
    103     strcat(full_path_out_h,".h");
    104 
    105     strcpy(str,"#include \"");
    106     strcat(str,signature);
    107     strcat(str,".h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n");
    108     strcat(str,"static UINT8 ");
    109     strcat(str,signature);
    110     strcat(str,"[] = {\n");
    111 
    112     int file_handler_c;
    113     int file_handler_h;
    114 
    115     file_handler_c = open(full_path_out_c, O_WRONLY | O_TRUNC | O_CREAT, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP );
    116     if ( file_handler_c == -1 )
    117     {
    118         printf("Unable open file %s\n",full_path_out_c);
    119         return;
    120     }
    121 
    122 
    123     file_handler_h = open(full_path_out_h, O_WRONLY | O_TRUNC | O_CREAT, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP );
    124     if ( file_handler_h == -1 )
    125     {
    126         printf("Unable open file %s\n",full_path_out_h);
    127         return;
    128     }
    129 
    130     write(file_handler_c,str,strlen(str));
    131 
    132     int current_byte_in_line = 0;
    133     int current_byte = 0;
    134     char hex_byte[20];
    135     int i;
    136 
    137     if ( pExtension && strcmp(pExtension,"bmdf") == 0  )
    138     {
    139         int value = 0;
    140         unsigned char value1[4];
    141 
    142         read(file_handler_in,(unsigned char*)value1,4);
    143         if ( value1[0] == '[' && (value1[1] == '/' || value1[2] == '.') )
    144         {
    145             printf("BMDF: file %s not recognized as a bmdf file\n",full_path_in);
    146             return;
    147         }
    148 
    149         for (i=0; i<4; i++)
    150         {
    151            value |= value1[i] << (i*8);
    152         }
    153         if ( value != size )
    154         {
    155             printf("corrupted mdf file %s ,size %d\n",full_path_in,value);
    156             return;
    157         }
    158         printf("mdf file %s ,size %d\n",full_path_in,value);
    159         lseek(file_handler_in,0,SEEK_SET);
    160     }
    161 
    162 
    163     if ( bTextFile == true )
    164     {
    165         char line[300];
    166         int new_size = 0;
    167         int line_len = 0;
    168         while ( !IsEnd(file_handler_in) )
    169         {
    170            ReadLine(file_handler_in,line,300);
    171            if ( line[0] == '#' )
    172              continue;
    173 
    174            line_len = strlen(line);
    175            while ( line_len > 0 &&  (line[line_len-1]=='\r' || line[line_len-1]=='\n' ||
    176                                      line[line_len-1]==' ' || line[line_len-1]=='\t' ) )
    177               line[--line_len]='\0';
    178 
    179            if ( line_len == 0 )
    180                 continue;
    181 
    182            char * new_line = line;
    183 
    184            while ( ( *new_line == ' ' || *new_line == '\t') && *new_line != '\0' )
    185              new_line ++;
    186 
    187            line_len = strlen(new_line);
    188 
    189            if ( line_len == 0 )
    190                 continue;
    191 
    192            line[line_len] = '\0';
    193            for (i = 0; i<=line_len; i++)
    194            {
    195                if ( line[i] == '\t' )
    196                  line[i] = ' ';
    197                current_byte_in_line++;
    198                new_size++;
    199                if ( i < line_len )
    200                {
    201                       if ( current_byte_in_line != 30 )
    202                         sprintf(hex_byte,"%#4x,",line[i]);
    203                       else
    204                       {
    205                         sprintf(hex_byte,"%#4x,\n",line[i]);
    206                         current_byte_in_line = 0;
    207                       }
    208                }
    209                else
    210                {
    211                     if ( IsEnd(file_handler_in) )
    212                         sprintf(hex_byte,"%#4x\n",line[i]);
    213                     else
    214                     {
    215                       if ( current_byte_in_line != 30 )
    216                         sprintf(hex_byte,"%#4x,",line[i]);
    217                       else
    218                       {
    219                         sprintf(hex_byte,"%#4x,\n",line[i]);
    220                         current_byte_in_line = 0;
    221                       }
    222                     }
    223                }
    224                write(file_handler_c,hex_byte,strlen(hex_byte));
    225            }
    226         }
    227         size = new_size;
    228     }
    229     else
    230     {
    231 
    232       for (int i=0; i<size; i++)
    233       {
    234            read(file_handler_in,&current_byte,1);
    235            current_byte_in_line++;
    236            if ( i != size - 1 )
    237            {
    238               if ( current_byte_in_line != 30 )
    239                 sprintf(hex_byte,"%#4x,",current_byte);
    240               else
    241               {
    242                 sprintf(hex_byte,"%#4x,\n",current_byte);
    243                 current_byte_in_line = 0;
    244               }
    245            }
    246            else
    247               sprintf(hex_byte,"%#4x\n",current_byte);
    248            write(file_handler_c,hex_byte,strlen(hex_byte));
    249         }
    250     }
    251 
    252     strcpy(str,"};\n\n");
    253 
    254     write(file_handler_c,str,strlen(str));
    255 
    256     sprintf(str_size,"%d",size);
    257 
    258     strcpy(str,"#ifndef ");
    259     strcat(str,signature);
    260     strcat(str,"_H\n#define ");
    261     strcat(str,signature);
    262     strcat(str,"_H\n\n#include \"xpl_Types.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n");
    263 
    264     write(file_handler_h,str,strlen(str));
    265 
    266 
    267     strcpy(str,"const UINT8 * dmGet_");
    268     strcat(str,signature);
    269     strcat(str,"(UINT32 * size)");
    270 
    271     write(file_handler_h,str,strlen(str));
    272     write(file_handler_c,str,strlen(str));
    273 
    274     strcpy(str,";\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n\n");
    275 
    276     write(file_handler_h,str,strlen(str));
    277 
    278     strcpy(str,"\n{\n    if ( size )\n    {\n       *size = ");
    279     strcat(str,str_size);
    280     strcat(str,";\n       return ");
    281     strcat(str,signature);
    282     strcat(str,";\n    }\n    else\n    {\n       return NULL;\n    }\n}\n\n#ifdef __cplusplus\n}\n#endif\n\n");
    283 
    284     write(file_handler_c,str,strlen(str));
    285 
    286     close(file_handler_c);
    287     close(file_handler_h);
    288     close(file_handler_in);
    289 
    290 }
    291 
    292 
    293 void ConvertFiles(const char * pPath, const char * pExtension, bool bTextFile)
    294 {
    295 
    296   DIR *dir = NULL;
    297   struct dirent *de = NULL;
    298 
    299 
    300   dir = opendir(pPath);
    301   if ( dir == NULL )
    302   {
    303     printf("cannot open dir : %s\n",pPath);
    304     return;
    305   }
    306 
    307   int nExtensionLen = pExtension == NULL ? 0 : strlen(pExtension);
    308   while ( de = readdir(dir) )
    309   {
    310      int nNameLen = strlen(de->d_name);
    311      if (nNameLen > nExtensionLen && !strncmp((de->d_name + nNameLen - nExtensionLen), pExtension, nExtensionLen))
    312      {
    313        ConvertFile(pPath,de->d_name,pExtension,bTextFile);
    314      }
    315   }
    316   closedir(dir);
    317 
    318 }
    319 
    320 int main(int argc, char** argv)
    321 {
    322 
    323 
    324   char * settings_path = getenv("dm_setting_root");
    325   char * plugin_path = getenv("dm_setting_plugin");
    326 
    327   if ( settings_path == NULL && plugin_path == NULL )
    328   {
    329     printf("env variables are not set :dm_setting_root, dm_setting_plugin\n");
    330     return 0;
    331   }
    332 
    333   if ( settings_path )
    334   {
    335       printf("dm settings : %s\n",settings_path);
    336 
    337       char * s = (char*)strchr( (const char *)settings_path, ':' );
    338       if ( s )
    339         s = '\0';
    340 
    341       ConvertFiles(settings_path,"bmdf",false);
    342       ConvertFile(settings_path,"fstab",NULL,true);
    343   }
    344   if ( plugin_path )
    345   {
    346       printf("plugin settings : %s\n",plugin_path );
    347       ConvertFiles(plugin_path,"ini",true);
    348   }
    349   return 0;
    350 }
    351