rem: GLint length = size;
context: void glslAttachShaderFromMemory(GLSLprogram obj, const char* prog, size_t size, GLSL_ShaderType shaderType){	if (obj == 0) return;		/* check for right shader type */	if (shaderType != GLSL_VERTEX && shaderType != GLSL_FRAGMENT){		glslFillLastError(GLSL_ERR_WRONG_SHADER_TYPE);		glslCheckError(obj, 1);		return;			}	if (obj->program == 0){		glslFillLastError(GLSL_ERR_NOT_VALID_PROGRAM);		glslCheckError(obj, 1);		return;			}#if 0	/* read all attributes from the program */	GLSL_Attr* attr = 0;	int count = 0;	char* ndata = glslScanAttributes(obj, prog, &attr, &count);#endif		/* compile the source */	GLenum shType = shaderType == GLSL_VERTEX ? GL_VERTEX_SHADER_ARB : GL_FRAGMENT_SHADER_ARB;		GLint length = size;	GLhandleARB shader = glCreateShaderObjectARB(shType);	glShaderSourceARB(shader, 1, (const GLcharARB**)&prog, &size);	glCompileShaderARB(shader);	glAttachObjectARB(obj->program, shader);	glDeleteObjectARB(shader);#if 0	/* Now combine all used attributes and copy them to program object */	for (int i=0; i < count; i++){		glBindAttribLocationARB(obj->program, attr[i].index, attr[i].name);	}	free(ndata);#endif			glslCheckError(obj, 0);}