Fix a number of MINGW32 issues
[mesa.git] / src / mesa / main / shaders.c
index 73f27ed2d3ea9f71b1255f8f3e3c04df82230c71..7bf8808767002b6d40aca00d3a931c2c24b1376d 100644 (file)
@@ -83,7 +83,7 @@ _mesa_CreateShader(GLenum type)
 }
 
 
-GLhandleARB APIENTRY
+GLhandleARB GLAPIENTRY
 _mesa_CreateShaderObjectARB(GLenum type)
 {
    GET_CURRENT_CONTEXT(ctx);
@@ -99,7 +99,7 @@ _mesa_CreateProgram(void)
 }
 
 
-GLhandleARB APIENTRY
+GLhandleARB GLAPIENTRY
 _mesa_CreateProgramObjectARB(void)
 {
    GET_CURRENT_CONTEXT(ctx);
@@ -110,15 +110,17 @@ _mesa_CreateProgramObjectARB(void)
 void GLAPIENTRY
 _mesa_DeleteObjectARB(GLhandleARB obj)
 {
-   GET_CURRENT_CONTEXT(ctx);
-   if (ctx->Driver.IsProgram(ctx, obj)) {
-      ctx->Driver.DeleteProgram2(ctx, obj);
-   }
-   else if (ctx->Driver.IsShader(ctx, obj)) {
-      ctx->Driver.DeleteShader(ctx, obj);
-   }
-   else {
-      /* error? */
+   if (obj) {
+      GET_CURRENT_CONTEXT(ctx);
+      if (ctx->Driver.IsProgram(ctx, obj)) {
+         ctx->Driver.DeleteProgram2(ctx, obj);
+      }
+      else if (ctx->Driver.IsShader(ctx, obj)) {
+         ctx->Driver.DeleteShader(ctx, obj);
+      }
+      else {
+         /* error? */
+      }
    }
 }
 
@@ -126,16 +128,20 @@ _mesa_DeleteObjectARB(GLhandleARB obj)
 void GLAPIENTRY
 _mesa_DeleteProgram(GLuint name)
 {
-   GET_CURRENT_CONTEXT(ctx);
-   ctx->Driver.DeleteProgram2(ctx, name);
+   if (name) {
+      GET_CURRENT_CONTEXT(ctx);
+      ctx->Driver.DeleteProgram2(ctx, name);
+   }
 }
 
 
 void GLAPIENTRY
 _mesa_DeleteShader(GLuint name)
 {
-   GET_CURRENT_CONTEXT(ctx);
-   ctx->Driver.DeleteShader(ctx, name);
+   if (name) {
+      GET_CURRENT_CONTEXT(ctx);
+      ctx->Driver.DeleteShader(ctx, name);
+   }
 }
 
 
@@ -313,7 +319,7 @@ _mesa_GetUniformivARB(GLhandleARB program, GLint location, GLint * params)
 
 
 #if 0
-GLint APIENTRY
+GLint GLAPIENTRY
 _mesa_GetUniformLocation(GLuint program, const GLcharARB *name)
 {
    GET_CURRENT_CONTEXT(ctx);
@@ -330,7 +336,7 @@ _mesa_GetHandleARB(GLenum pname)
 }
 
 
-GLint APIENTRY
+GLint GLAPIENTRY
 _mesa_GetUniformLocationARB(GLhandleARB programObj, const GLcharARB *name)
 {
    GET_CURRENT_CONTEXT(ctx);
@@ -373,7 +379,7 @@ _mesa_ShaderSourceARB(GLhandleARB shaderObj, GLsizei count,
 {
    GET_CURRENT_CONTEXT(ctx);
    GLint *offsets;
-   GLsizei i;
+   GLsizei i, totalLength;
    GLcharARB *source;
 
    if (string == NULL) {
@@ -406,8 +412,12 @@ _mesa_ShaderSourceARB(GLhandleARB shaderObj, GLsizei count,
          offsets[i] += offsets[i - 1];
    }
 
-   source = (GLcharARB *) _mesa_malloc((offsets[count - 1] + 1) *
-                                       sizeof(GLcharARB));
+   /* Total length of source string is sum off all strings plus two.
+    * One extra byte for terminating zero, another extra byte to silence
+    * valgrind warnings in the parser/grammer code.
+    */
+   totalLength = offsets[count - 1] + 2;
+   source = (GLcharARB *) _mesa_malloc(totalLength * sizeof(GLcharARB));
    if (source == NULL) {
       _mesa_free((GLvoid *) offsets);
       _mesa_error(ctx, GL_OUT_OF_MEMORY, "glShaderSourceARB");
@@ -419,9 +429,12 @@ _mesa_ShaderSourceARB(GLhandleARB shaderObj, GLsizei count,
       _mesa_memcpy(source + start, string[i],
                    (offsets[i] - start) * sizeof(GLcharARB));
    }
-   source[offsets[count - 1]] = '\0';
+   source[totalLength - 1] = '\0';
+   source[totalLength - 2] = '\0';
 
    ctx->Driver.ShaderSource(ctx, shaderObj, source);
+
+   _mesa_free(offsets);
 }