home *** CD-ROM | disk | FTP | other *** search
/ Reverse Code Engineering RCE CD +sandman 2000 / ReverseCodeEngineeringRceCdsandman2000.iso / RCE / Mammon_ / h2enum.idc < prev    next >
Text File  |  2000-05-25  |  5KB  |  119 lines

  1.  
  2. //------------------------------------------------------------------------------------------------------
  3. //Strings.idc (rev 2.27): Imports #defines from a .h file, adds as enums
  4. //Note:  This script prompts the user for a header file (*.h), then parses the
  5. //       file looking for #define statements: these are then converted to members
  6. //       of enum "Defines".
  7. //Bugs: Only the first instance of any value will be preserved; all others will be
  8. //      discarded with an error as you can have only one instance of any value (or
  9. //      any name) in a single enumeration. A prompt has been added for the user to
  10. //      name the enumerations for the header file, so that any duplicate enum values
  11. //      can be added to a different file and enumerated under a different "enum name."
  12. //
  13. // code by mammon_ All rights reversed, use as you see fit.....
  14. //------------------------------------------------------------------------------------------------------
  15.  
  16. #include <idc.idc>
  17.  
  18. static strip_spaces( BytePtr, hHeaderFile){
  19.        auto tempc;
  20.        fseek( hHeaderFile, BytePtr, 0);
  21.        tempc = fgetc(hHeaderFile);
  22.        while ( tempc == 0x20) {
  23.         BytePtr = BytePtr + 1;
  24.         fseek( hHeaderFile, BytePtr, 0);
  25.         tempc = fgetc(hHeaderFile);
  26.        }
  27.        return BytePtr;
  28. }
  29.  
  30. static FindStringEnd( StrName ){
  31.     auto x, tempc;
  32.     for ( x = 1; x < strlen(StrName); x = x + 1) {
  33.         tempc = substr( StrName, x-1, x);
  34.         if ( tempc == " ") {
  35.             return substr( StrName, 0, x);
  36.         }
  37.     }
  38.     return substr( StrName, 0, strlen(StrName));
  39. }
  40.  
  41. static FixString( StrName ){
  42.     auto x, tempc, newname;
  43.     newname="def";    //set newname to type character
  44.     for ( x = 1; x < strlen(StrName); x = x + 1) {
  45.         tempc = substr( StrName, x-1, x);
  46.         if ( tempc != "_") {
  47.             newname = newname + tempc;
  48.         }
  49.     }
  50.     return newname;
  51. }
  52.  
  53. static main(){
  54.     auto HeaderFile, hHeaderFile, fLength, BytePtr, first_str, second_str, third_str, define_val;
  55.     auto enum_id, tempc1, x, y, errcode, define_name, FilePtr, define_str, enum_name;
  56.     FilePtr = 0;
  57.     Message("\nStart Conversion\n");
  58.     HeaderFile = AskFile( "*.h", "Choose a header file to parse:");
  59.     enum_name = AskStr("Defines", "Enter a name for the enumerations (alpha only, eg 'VMMDefines'):");
  60.     hHeaderFile = fopen( HeaderFile, "r");
  61.     fLength = filelength(hHeaderFile);
  62.     if( fLength == -1) Message( "Bad File Length!\n");
  63.     enum_id = AddEnum( GetEnumQty() + 1, enum_name, FF_0NUMH);
  64.     if ( enum_id == -1) {
  65.         enum_id = GetEnum( enum_name );
  66.         if(enum_id == -1) Message("Enum #Defines not created/not found\n");
  67.     }
  68.     SetEnumCmt( enum_id, "#define from " + HeaderFile, 1);
  69.     while(FilePtr < fLength ){
  70.         FilePtr = strip_spaces( FilePtr, hHeaderFile );
  71.         BytePtr = FilePtr;
  72.         errcode = fseek( hHeaderFile, BytePtr, 0 );
  73.         if ( errcode != 0) break;
  74.         first_str = readstr( hHeaderFile );
  75.         if ( first_str == -1 ) {
  76.             Message( "End of file! \n" );
  77.             break;
  78.         }
  79.         else if ( substr(first_str, 0, 7) == "#define" || substr( first_str, 0, 7) == "#DEFINE" ) {
  80.             FilePtr = FilePtr + strlen( first_str );
  81.             BytePtr = BytePtr + 7;
  82.             BytePtr = strip_spaces( BytePtr, hHeaderFile );
  83.             errcode = fseek( hHeaderFile, BytePtr, 0 );
  84.             if ( errcode != 0 ) break;
  85.             second_str = readstr( hHeaderFile );
  86.             if ( second_str == -1 ) {
  87.                 Message( "End of file after #define!\n" );
  88.                 break;
  89.             }
  90.             else {
  91.                 define_name = FindStringEnd( second_str );
  92.                 define_name = FixString( define_name );
  93.                 BytePtr = strip_spaces( BytePtr + strstr( second_str, " " ), hHeaderFile );
  94.                 errcode = fseek( hHeaderFile, BytePtr, 0);
  95.                 if ( errcode != 0 ) break;
  96.                 third_str = readstr( hHeaderFile);
  97.                 tempc1 = substr(third_str, 0, 2);
  98.                 if ( third_str == -1) {
  99.                     Message( "End of file before value!\n");
  100.                     break;
  101.                 }
  102.                 else if ( tempc1 == "0x" || tempc1 == "0X") {
  103.                   define_str = FindStringEnd( third_str );
  104.                     define_val = xtol( define_str );
  105.                     errcode = AddConst( enum_id, define_name, define_val);
  106.                     if ( errcode == 1 ) Message( "Name " + define_name + " bad or already used in program!\n");
  107.                     if ( errcode == 2 ) Message( "Value " + define_str + " already used in program!\n");
  108.                     if ( errcode == 3 ) Message( "Bad enumID!\n");
  109.                 }
  110.             }
  111.         }
  112.         else FilePtr = FilePtr + strlen( first_str);
  113.     }
  114.     Message("\nConversion finished!\n");
  115. }
  116.  
  117.  
  118.  
  119.