[iortcw] 37/152: All: More informative warnings with line numbers in shader checking

Simon McVittie smcv at debian.org
Fri Sep 8 10:39:55 UTC 2017


This is an automated email from the git hooks/post-receive script.

smcv pushed a commit to annotated tag 1.5a
in repository iortcw.

commit af101ee8d822ac3134a468f02ecd174342a82459
Author: MAN-AT-ARMS <M4N4T4RMS at gmail.com>
Date:   Sun Feb 21 21:00:41 2016 -0500

    All: More informative warnings with line numbers in shader checking
---
 MP/code/qcommon/q_shared.c   |  8 +++---
 MP/code/qcommon/q_shared.h   |  3 +--
 MP/code/rend2/tr_shader.c    | 59 +++++++++++++++++++++++++++-----------------
 MP/code/renderer/tr_shader.c | 59 +++++++++++++++++++++++++++-----------------
 SP/code/game/g_func_decs.h   |  2 +-
 SP/code/qcommon/q_shared.c   | 19 +++++++-------
 SP/code/qcommon/q_shared.h   |  2 +-
 SP/code/rend2/tr_shader.c    | 48 ++++++++++++++++++++++++++---------
 SP/code/renderer/tr_shader.c | 54 +++++++++++++++++++++++++++++-----------
 9 files changed, 166 insertions(+), 88 deletions(-)

diff --git a/MP/code/qcommon/q_shared.c b/MP/code/qcommon/q_shared.c
index aa53348..6c9bf5a 100644
--- a/MP/code/qcommon/q_shared.c
+++ b/MP/code/qcommon/q_shared.c
@@ -605,16 +605,14 @@ void COM_MatchToken( char **buf_p, char *match ) {
 =================
 SkipBracedSection
 
-The next token should be an open brace.
+The next token should be an open brace or set depth to 1 if already parsed it.
 Skips until a matching close brace is found.
 Internal brace depths are properly skipped.
 =================
 */
-void SkipBracedSection (char **program) {
+qboolean SkipBracedSection (char **program, int depth) {
 	char			*token;
-	int				depth;
 
-	depth = 0;
 	do {
 		token = COM_ParseExt( program, qtrue );
 		if( token[1] == 0 ) {
@@ -626,6 +624,8 @@ void SkipBracedSection (char **program) {
 			}
 		}
 	} while( depth && *program );
+
+	return ( depth == 0 );
 }
 
 /*
diff --git a/MP/code/qcommon/q_shared.h b/MP/code/qcommon/q_shared.h
index 05feac0..1127b81 100644
--- a/MP/code/qcommon/q_shared.h
+++ b/MP/code/qcommon/q_shared.h
@@ -840,8 +840,7 @@ typedef struct pc_token_s
 
 void    COM_MatchToken( char**buf_p, char *match );
 
-void SkipBracedSection( char **program );
-void SkipBracedSection_Depth( char **program, int depth ); // start at given depth if already matching stuff
+qboolean SkipBracedSection( char **program, int depth );
 void SkipRestOfLine( char **data );
 
 void Parse1DMatrix( char **buf_p, int x, float *m );
diff --git a/MP/code/rend2/tr_shader.c b/MP/code/rend2/tr_shader.c
index 060371e..4caba04 100644
--- a/MP/code/rend2/tr_shader.c
+++ b/MP/code/rend2/tr_shader.c
@@ -39,21 +39,8 @@ static shader_t shader;
 static texModInfo_t texMods[MAX_SHADER_STAGES][TR_MAX_TEXMODS];
 
 #define FILE_HASH_SIZE      4096
-
 static shader_t*       hashTable[FILE_HASH_SIZE];
 
-// Ridah
-// Table containing string indexes for each shader found in the scripts, referenced by their checksum
-// values.
-typedef struct shaderStringPointer_s
-{
-	char *pStr;
-	struct shaderStringPointer_s *next;
-} shaderStringPointer_t;
-//
-shaderStringPointer_t shaderChecksumLookup[FILE_HASH_SIZE];
-// done.
-
 /*
 ================
 return a hash value for the filename
@@ -3170,8 +3157,7 @@ static char *FindShaderInShaderText( const char *shadername ) {
 
 		if ( token[0] == '{' ) {
 			// skip the definition
-//			SkipBracedSection_Depth( &p, 1 );
-			SkipBracedSection( &p );
+			SkipBracedSection( &p, 0 );
 		} else if ( !Q_stricmp( token, shadername ) ) {
 			return p;
 		} else {
@@ -3671,7 +3657,9 @@ static void ScanAndLoadShaderFiles( void ) {
 	char *p;
 	int numShaderFiles;
 	int i;
-	char *oldp, *token, *textEnd;
+	char *token, *textEnd;
+	char shaderName[MAX_QPATH];
+	int shaderLine;
 
 	long sum = 0, summand;
 	// scan for shader files
@@ -3713,26 +3701,51 @@ static void ScanAndLoadShaderFiles( void ) {
 
 		// Do a simple check on the shader structure in that file to make sure one bad shader file cannot fuck up all other shaders.
 		p = buffers[i];
+		COM_BeginParseSession(filename);
 		while(1)
 		{
 			token = COM_ParseExt(&p, qtrue);
 			
 			if(!*token)
 				break;
-			
-			oldp = p;
-			
+
+			Q_strncpyz(shaderName, token, sizeof(shaderName));
+			shaderLine = COM_GetCurrentParseLine();
+
 			token = COM_ParseExt(&p, qtrue);
-			if(token[0] != '{' && token[1] != '\0')
+			if( !Q_stricmp( shaderName, token ) ) {
+				ri.Printf(PRINT_WARNING, "WARNING: In shader file %s...Invalid shader name \"%s\" on line %d.\n",
+							filename, shaderName, shaderLine);
+				break;
+			}
+
+			if(token[0] != '{' || token[1] != '\0')
 			{
-				ri.Printf(PRINT_WARNING, "WARNING: Bad shader file %s has incorrect syntax.\n", filename);
+				ri.Printf(PRINT_WARNING, "WARNING: In shader file %s...Shader \"%s\" on line %d is missing opening brace",
+							filename, shaderName, shaderLine);
+				if (token[0])
+				{
+					ri.Printf(PRINT_WARNING, " (found \"%s\" on line %d)", token, COM_GetCurrentParseLine());
+				}
+				ri.Printf(PRINT_WARNING, "...Ignored\n");
 				ri.FS_FreeFile(buffers[i]);
 				buffers[i] = NULL;
 				break;
 			}
 
-			SkipBracedSection(&oldp);
-			p = oldp;
+			if(!SkipBracedSection(&p, 1))
+			{
+				ri.Printf(PRINT_WARNING, "WARNING: In shader file %s...Shader \"%s\" on line %d is missing closing brace",
+							filename, shaderName, shaderLine);
+				if( !Q_stricmp( filename, "common.shader" ) ) { // HACK...Broken shader in pak0.pk3
+					ri.Printf(PRINT_WARNING, "...Ignored\n");
+					ri.FS_FreeFile(buffers[i]);
+					buffers[i] = NULL;
+					break;
+				} else {
+					ri.Printf(PRINT_WARNING, ".\n");
+				}
+			}
 		}
 
 		if (buffers[i])
diff --git a/MP/code/renderer/tr_shader.c b/MP/code/renderer/tr_shader.c
index 0ba56ee..eb16488 100644
--- a/MP/code/renderer/tr_shader.c
+++ b/MP/code/renderer/tr_shader.c
@@ -39,21 +39,8 @@ static shader_t shader;
 static texModInfo_t texMods[MAX_SHADER_STAGES][TR_MAX_TEXMODS];
 
 #define FILE_HASH_SIZE      4096
-
 static shader_t*       hashTable[FILE_HASH_SIZE];
 
-// Ridah
-// Table containing string indexes for each shader found in the scripts, referenced by their checksum
-// values.
-typedef struct shaderStringPointer_s
-{
-	char *pStr;
-	struct shaderStringPointer_s *next;
-} shaderStringPointer_t;
-//
-shaderStringPointer_t shaderChecksumLookup[FILE_HASH_SIZE];
-// done.
-
 /*
 ================
 return a hash value for the filename
@@ -2471,8 +2458,7 @@ static char *FindShaderInShaderText( const char *shadername ) {
 
 		if ( token[0] == '{' ) {
 			// skip the definition
-//			SkipBracedSection_Depth( &p, 1 );
-			SkipBracedSection( &p );
+			SkipBracedSection( &p, 0 );
 		} else if ( !Q_stricmp( token, shadername ) ) {
 			return p;
 		} else {
@@ -2995,7 +2981,9 @@ static void ScanAndLoadShaderFiles( void ) {
 	char *p;
 	int numShaderFiles;
 	int i;
-	char *oldp, *token, *textEnd;
+	char *token, *textEnd;
+	char shaderName[MAX_QPATH];
+	int shaderLine;
 
 	long sum = 0, summand;
 	// scan for shader files
@@ -3024,26 +3012,51 @@ static void ScanAndLoadShaderFiles( void ) {
 
 		// Do a simple check on the shader structure in that file to make sure one bad shader file cannot fuck up all other shaders.
 		p = buffers[i];
+		COM_BeginParseSession(filename);
 		while(1)
 		{
 			token = COM_ParseExt(&p, qtrue);
 			
 			if(!*token)
 				break;
-			
-			oldp = p;
-			
+
+			Q_strncpyz(shaderName, token, sizeof(shaderName));
+			shaderLine = COM_GetCurrentParseLine();
+
 			token = COM_ParseExt(&p, qtrue);
-			if(token[0] != '{' && token[1] != '\0')
+			if( !Q_stricmp( shaderName, token ) ) {
+				ri.Printf(PRINT_WARNING, "WARNING: In shader file %s...Invalid shader name \"%s\" on line %d.\n",
+							filename, shaderName, shaderLine);
+				break;
+			}
+
+			if(token[0] != '{' || token[1] != '\0')
 			{
-				ri.Printf(PRINT_WARNING, "WARNING: Bad shader file %s has incorrect syntax.\n", filename);
+				ri.Printf(PRINT_WARNING, "WARNING: In shader file %s...Shader \"%s\" on line %d is missing opening brace",
+							filename, shaderName, shaderLine);
+				if (token[0])
+				{
+					ri.Printf(PRINT_WARNING, " (found \"%s\" on line %d)", token, COM_GetCurrentParseLine());
+				}
+				ri.Printf(PRINT_WARNING, "...Ignored\n");
 				ri.FS_FreeFile(buffers[i]);
 				buffers[i] = NULL;
 				break;
 			}
 
-			SkipBracedSection(&oldp);
-			p = oldp;
+			if(!SkipBracedSection(&p, 1))
+			{
+				ri.Printf(PRINT_WARNING, "WARNING: In shader file %s...Shader \"%s\" on line %d is missing closing brace",
+							filename, shaderName, shaderLine);
+				if( !Q_stricmp( filename, "common.shader" ) ) { // HACK...Broken shader in pak0.pk3
+					ri.Printf(PRINT_WARNING, "...Ignored\n");
+					ri.FS_FreeFile(buffers[i]);
+					buffers[i] = NULL;
+					break;
+				} else {
+					ri.Printf(PRINT_WARNING, ".\n");
+				}
+			}
 		}
 
 		if (buffers[i])
diff --git a/SP/code/game/g_func_decs.h b/SP/code/game/g_func_decs.h
index 5fd9377..00921ff 100644
--- a/SP/code/game/g_func_decs.h
+++ b/SP/code/game/g_func_decs.h
@@ -69,7 +69,7 @@ extern void Parse3DMatrix ( char * * buf_p , int z , int y , int x , float * m )
 extern void Parse2DMatrix ( char * * buf_p , int y , int x , float * m ) ;
 extern void Parse1DMatrix ( char * * buf_p , int x , float * m ) ;
 extern void SkipRestOfLine ( char * * data ) ;
-extern void SkipBracedSection ( char * * program ) ;
+extern qboolean SkipBracedSection ( char * * program , int depth ) ;
 extern void COM_MatchToken ( char * * buf_p , char * match ) ;
 extern char * COM_ParseExt ( char * * data_p , qboolean allowLineBreaks ) ;
 extern int COM_Compress ( char * data_p ) ;
diff --git a/SP/code/qcommon/q_shared.c b/SP/code/qcommon/q_shared.c
index 2aefbf9..ca356c0 100644
--- a/SP/code/qcommon/q_shared.c
+++ b/SP/code/qcommon/q_shared.c
@@ -644,26 +644,27 @@ void COM_MatchToken( char **buf_p, char *match ) {
 =================
 SkipBracedSection
 
-The next token should be an open brace.
+The next token should be an open brace or set depth to 1 if already parsed it.
 Skips until a matching close brace is found.
 Internal brace depths are properly skipped.
 =================
 */
-void SkipBracedSection( char **program ) {
-	char            *token;
-	int depth;
+qboolean SkipBracedSection (char **program, int depth) {
+	char			*token;
 
-	depth = 0;
 	do {
 		token = COM_ParseExt( program, qtrue );
-		if ( token[1] == 0 ) {
-			if ( token[0] == '{' ) {
+		if( token[1] == 0 ) {
+			if( token[0] == '{' ) {
 				depth++;
-			} else if ( token[0] == '}' )     {
+			}
+			else if( token[0] == '}' ) {
 				depth--;
 			}
 		}
-	} while ( depth && *program );
+	} while( depth && *program );
+
+	return ( depth == 0 );
 }
 
 /*
diff --git a/SP/code/qcommon/q_shared.h b/SP/code/qcommon/q_shared.h
index 25469eb..f37ca78 100644
--- a/SP/code/qcommon/q_shared.h
+++ b/SP/code/qcommon/q_shared.h
@@ -852,7 +852,7 @@ typedef struct pc_token_s
 
 void    COM_MatchToken( char**buf_p, char *match );
 
-void SkipBracedSection( char **program );
+qboolean SkipBracedSection( char **program, int depth );
 void SkipRestOfLine( char **data );
 
 void Parse1DMatrix( char **buf_p, int x, float *m );
diff --git a/SP/code/rend2/tr_shader.c b/SP/code/rend2/tr_shader.c
index f593fdc..eb4ccae 100644
--- a/SP/code/rend2/tr_shader.c
+++ b/SP/code/rend2/tr_shader.c
@@ -3200,7 +3200,6 @@ static char *FindShaderInShaderText( const char *shadername ) {
 			pShaderString = pShaderString->next;
 		}
 	}
-
 	// done.
 
 	/*
@@ -3215,7 +3214,7 @@ static char *FindShaderInShaderText( const char *shadername ) {
 
 		if ( token[0] == '{' ) {
 			// skip the definition
-			SkipBracedSection( &p );
+			SkipBracedSection( &p, 0 );
 		} else if ( !Q_stricmp( token, shadername ) ) {
 			return p;
 		} else {
@@ -3742,7 +3741,7 @@ static void BuildShaderChecksumLookup( void ) {
 
 		if ( !Q_stricmp( token, "{" ) ) {
 			// skip braced section
-			SkipBracedSection( &p );
+			SkipBracedSection( &p, 0 );
 			continue;
 		}
 
@@ -3785,7 +3784,9 @@ static void ScanAndLoadShaderFiles( void ) {
 	char *p;
 	int numShaderFiles;
 	int i;
-	char *oldp, *token, *textEnd;
+	char *token, *textEnd;
+	char shaderName[MAX_QPATH];
+	int shaderLine;
 
 	long sum = 0, summand;
 	// scan for shader files
@@ -3827,26 +3828,51 @@ static void ScanAndLoadShaderFiles( void ) {
 
 		// Do a simple check on the shader structure in that file to make sure one bad shader file cannot fuck up all other shaders.
 		p = buffers[i];
+		COM_BeginParseSession(filename);
 		while(1)
 		{
 			token = COM_ParseExt(&p, qtrue);
 			
 			if(!*token)
 				break;
-			
-			oldp = p;
-			
+
+			Q_strncpyz(shaderName, token, sizeof(shaderName));
+			shaderLine = COM_GetCurrentParseLine();
+
 			token = COM_ParseExt(&p, qtrue);
-			if(token[0] != '{' && token[1] != '\0')
+			if( !Q_stricmp( shaderName, token ) ) {
+				ri.Printf(PRINT_WARNING, "WARNING: In shader file %s...Invalid shader name \"%s\" on line %d.\n",
+							filename, shaderName, shaderLine);
+				break;
+			}
+
+			if(token[0] != '{' || token[1] != '\0')
 			{
-				ri.Printf(PRINT_WARNING, "WARNING: Bad shader file %s has incorrect syntax.\n", filename);
+				ri.Printf(PRINT_WARNING, "WARNING: In shader file %s...Shader \"%s\" on line %d is missing opening brace",
+							filename, shaderName, shaderLine);
+				if (token[0])
+				{
+					ri.Printf(PRINT_WARNING, " (found \"%s\" on line %d)", token, COM_GetCurrentParseLine());
+				}
+				ri.Printf(PRINT_WARNING, "...Ignored\n");
 				ri.FS_FreeFile(buffers[i]);
 				buffers[i] = NULL;
 				break;
 			}
 
-			SkipBracedSection(&oldp);
-			p = oldp;
+			if(!SkipBracedSection(&p, 1))
+			{
+				ri.Printf(PRINT_WARNING, "WARNING: In shader file %s...Shader \"%s\" on line %d is missing closing brace",
+							filename, shaderName, shaderLine);
+				if( !Q_stricmp( filename, "common.shader" ) ) { // HACK...Broken shader in pak0.pk3
+					ri.Printf(PRINT_WARNING, "...Ignored\n");
+					ri.FS_FreeFile(buffers[i]);
+					buffers[i] = NULL;
+					break;
+				} else {
+					ri.Printf(PRINT_WARNING, ".\n");
+				}
+			}
 		}
 
 		if (buffers[i])
diff --git a/SP/code/renderer/tr_shader.c b/SP/code/renderer/tr_shader.c
index d205e19..dd05d4b 100644
--- a/SP/code/renderer/tr_shader.c
+++ b/SP/code/renderer/tr_shader.c
@@ -2496,7 +2496,6 @@ static char *FindShaderInShaderText( const char *shadername ) {
 			pShaderString = pShaderString->next;
 		}
 	}
-
 	// done.
 
 	/*
@@ -2511,7 +2510,7 @@ static char *FindShaderInShaderText( const char *shadername ) {
 
 		if ( token[0] == '{' ) {
 			// skip the definition
-			SkipBracedSection( &p );
+			SkipBracedSection( &p, 0 );
 		} else if ( !Q_stricmp( token, shadername ) ) {
 			return p;
 		} else {
@@ -3060,7 +3059,7 @@ static void BuildShaderChecksumLookup( void ) {
 
 		if ( !Q_stricmp( token, "{" ) ) {
 			// skip braced section
-			SkipBracedSection( &p );
+			SkipBracedSection( &p, 0 );
 			continue;
 		}
 
@@ -3103,7 +3102,9 @@ static void ScanAndLoadShaderFiles( void ) {
 	char *p;
 	int numShaderFiles;
 	int i;
-	char *oldp, *token, *textEnd;
+	char *token, *textEnd;
+	char shaderName[MAX_QPATH];
+	int shaderLine;
 
 	long sum = 0, summand;
 	// scan for shader files
@@ -3129,33 +3130,58 @@ static void ScanAndLoadShaderFiles( void ) {
 		
 		if ( !buffers[i] )
 			ri.Error( ERR_DROP, "Couldn't load %s", filename );
-
+		
 		// Do a simple check on the shader structure in that file to make sure one bad shader file cannot fuck up all other shaders.
 		p = buffers[i];
+		COM_BeginParseSession(filename);
 		while(1)
 		{
 			token = COM_ParseExt(&p, qtrue);
 			
 			if(!*token)
 				break;
-			
-			oldp = p;
-			
+
+			Q_strncpyz(shaderName, token, sizeof(shaderName));
+			shaderLine = COM_GetCurrentParseLine();
+
 			token = COM_ParseExt(&p, qtrue);
-			if(token[0] != '{' && token[1] != '\0')
+			if( !Q_stricmp( shaderName, token ) ) {
+				ri.Printf(PRINT_WARNING, "WARNING: In shader file %s...Invalid shader name \"%s\" on line %d.\n",
+							filename, shaderName, shaderLine);
+				break;
+			}
+
+			if(token[0] != '{' || token[1] != '\0')
 			{
-				ri.Printf(PRINT_WARNING, "WARNING: Bad shader file %s has incorrect syntax.\n", filename);
+				ri.Printf(PRINT_WARNING, "WARNING: In shader file %s...Shader \"%s\" on line %d is missing opening brace",
+							filename, shaderName, shaderLine);
+				if (token[0])
+				{
+					ri.Printf(PRINT_WARNING, " (found \"%s\" on line %d)", token, COM_GetCurrentParseLine());
+				}
+				ri.Printf(PRINT_WARNING, "...Ignored\n");
 				ri.FS_FreeFile(buffers[i]);
 				buffers[i] = NULL;
 				break;
 			}
 
-			SkipBracedSection(&oldp);
-			p = oldp;
+			if(!SkipBracedSection(&p, 1))
+			{
+				ri.Printf(PRINT_WARNING, "WARNING: In shader file %s...Shader \"%s\" on line %d is missing closing brace",
+							filename, shaderName, shaderLine);
+				if( !Q_stricmp( filename, "common.shader" ) ) { // HACK...Broken shader in pak0.pk3
+					ri.Printf(PRINT_WARNING, "...Ignored\n");
+					ri.FS_FreeFile(buffers[i]);
+					buffers[i] = NULL;
+					break;
+				} else {
+					ri.Printf(PRINT_WARNING, ".\n");
+				}
+			}
 		}
-
+		
 		if (buffers[i])
-			sum += summand;
+			sum += summand;		
 	}
 
 	// build single large buffer

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-games/iortcw.git



More information about the Pkg-games-commits mailing list