]> git.xonotic.org Git - xonotic/netradiant.git/blobdiff - radiant/shaders.cpp
radiant: bump the commands (shortcuts) version
[xonotic/netradiant.git] / radiant / shaders.cpp
index d6748c0704f8f803fd8df7cb4b225845b07e4097..6612c335d6f6da83f3bcb60a4ae850552b89db02 100644 (file)
@@ -27,7 +27,7 @@
 
 #include "gtkdlgs.h"
 
-void ViewShader( const char *pFile, const char *pName ){
+void ViewShader( const char *pFile, const char *pName, bool external_editor ){
        char* pBuff = 0;
        //int nSize =
        vfsLoadFile( pFile, reinterpret_cast<void**>( &pBuff ) );
@@ -39,17 +39,66 @@ void ViewShader( const char *pFile, const char *pName ){
        StringOutputStream strFind( string_length( pName ) );
        strFind << LowerCase( pName );
        StringOutputStream strLook( string_length( pBuff ) );
-       strFind << LowerCase( pBuff );
+       strLook << LowerCase( pBuff );
        // offset used when jumping over commented out definitions
+       int length = string_length( pBuff );
        std::size_t nOffset = 0;
-       while ( true )
-       {
-               const char* substr = strstr( strFind.c_str() + nOffset, strFind.c_str() );
+       bool startOK = false;
+       bool endOK = false;
+       while ( !startOK || !endOK ){
+               const char* substr = strstr( strLook.c_str() + nOffset, strFind.c_str() );
                if ( substr == 0 ) {
                        break;
                }
                std::size_t nStart = substr - strLook.c_str();
-               // we have found something, maybe it's a commented out shader name?
+               startOK = endOK = false;
+               if ( nStart == 0 ){
+                       startOK = true;
+               }
+               //validate found one...
+               for ( const char* i = substr - 1; i > strLook.c_str(); i-- ){
+                       if( (strncmp( i, "\t", 1 ) == 0) || (strncmp( i, " ", 1 ) == 0) ){
+                               startOK = true;
+                               continue;
+                       }
+                       else if ( (strncmp( i, "\n", 1 ) == 0) || (strncmp( i, "\r", 1 ) == 0) ){
+                               startOK = true;
+                               break;
+                       }
+                       else{
+                               startOK = false;
+                               break;
+                       }
+               }
+               const char* b = strLook.c_str() + strlen( strLook.c_str() );
+               for ( const char* i = substr + strlen( strFind.c_str() ); i < b; i++ ){
+                       if( (strncmp( i, "\t", 1 ) == 0) || (strncmp( i, " ", 1 ) == 0) ){
+                               endOK = true;
+                               continue;
+                       }
+                       else if ( (strncmp( i, "\n", 1 ) == 0) || (strncmp( i, "\r", 1 ) == 0) || (strncmp( i, "{", 1 ) == 0) || (strncmp( i, ":q3map", 6 ) == 0) ){
+                               endOK = true;
+                               break;
+                       }
+                       else{
+                               endOK = false;
+                               break;
+                       }
+               }
+               if( !startOK || !endOK ){
+                       nOffset = nStart + 1;
+               }
+               else{
+                       //globalErrorStream() << "Validated successfully" << "\n";
+                       nOffset = nStart;
+                       //fix cr+lf
+                       for ( const char* i = strLook.c_str(); i < substr ; i++ ){
+                               if ( (strncmp( i, "\r\n", 2 ) == 0) ){
+                               nOffset--;
+                               }
+                       }
+               }
+               /*// we have found something, maybe it's a commented out shader name?
                char *strCheck = new char[string_length( strLook.c_str() ) + 1];
                strcpy( strCheck, strLook.c_str() );
                strCheck[nStart] = 0;
@@ -62,10 +111,17 @@ void ViewShader( const char *pFile, const char *pName ){
                }
                delete[] strCheck;
                nOffset = nStart;
-               break;
+               break;*/
+       }
+       //fix up length
+       const char* b = strLook.c_str() + strlen( strLook.c_str() ) - 1;
+       for ( const char* i = strLook.c_str(); i < b; i++ ){
+               if ( (strncmp( i, "\r\n", 2 ) == 0) ){
+               length--;
+               }
        }
        // now close the file
        vfsFreeFile( pBuff );
 
-       DoTextEditor( pFile, static_cast<int>( nOffset ) );
+       DoTextEditor( pFile, static_cast<int>( nOffset ), length, external_editor );
 }