static void CompileShaders() { GLuint ShaderProgram = glCreateProgram(); if (ShaderProgram == 0) { fprintf(stderr, "glCreateProgram() error\n"); exit(1); } std::string vs, fs; if (!Util_ReadFile(pVSFileName, vs)) { fprintf(stderr, "ReadFile(VS) fail, file = %s\n", pVSFileName); exit(1); } if (!Util_ReadFile(pFSFileName, fs)) { fprintf(stderr, "ReadFile(FS) fail, file = %s\n", pFSFileName); exit(1); } AddShader(ShaderProgram, vs.c_str(), GL_VERTEX_SHADER); AddShader(ShaderProgram, fs.c_str(), GL_FRAGMENT_SHADER); GLint success = 0; GLchar log[1024] = { 0 }; glLinkProgram(ShaderProgram); glGetProgramiv(ShaderProgram, GL_LINK_STATUS, &success); if (success == 0) { glGetProgramInfoLog(ShaderProgram, sizeof(log), NULL, log); fprintf(stderr, "glLinkProgram fail: '%s'\n", log); exit(1); } glValidateProgram(ShaderProgram); glGetProgramiv(ShaderProgram, GL_VALIDATE_STATUS, &success); if (success == 0) { glGetProgramInfoLog(ShaderProgram, sizeof(log), NULL, log); fprintf(stderr, "glValidateProgram fail: '%s'\n", log); exit(1); } glUseProgram(ShaderProgram); gWorldLocation = glGetUniformLocation(ShaderProgram, "gWorld"); assert(gWorldLocation != 0xFFFFFFFF); }
int CONFLoad(const char* fileName) { int i; int rv = CONF_OK; char* line = NULL; int length = 0; char* buffer = NULL; void* vbuffer = NULL; char* savePtr = NULL; LOG_DEBUG("CONFLoad %s", fileName); if (fileName == NULL) { LOG_ERROR("fileName = NULL"); rv = CONF_ERROR_PARAMETER; goto out; } if (__confInit == 0) { LOG_ERROR("libconf not initialized"); rv = CONF_ERROR_INIT; goto out; } LOG_INFO("Reading configuration from %s", fileName); length = Util_ReadFile(fileName, &vbuffer, 1); if (length < 0) { if (length == VPL_ERR_NOENT) { LOG_INFO("%s does not exist; skipping", fileName); } else { LOG_ERROR("Util_ReadFile(%s) failed: %d", fileName, length); } rv = length; goto out; } buffer = vbuffer; // Add a null-terminator so strtok doesn't read past the end of the buffer. buffer[length] = '\0'; line = safe_strtok(buffer, "\n", &savePtr); while (line != NULL) { CONFVariable var; size_t lineLen = strlen(line); if (lineLen < 2 || (line[0] == '/' && line[1] == '/')) { goto skip; } memset(&var, 0, sizeof(var)); sscanf(line, "%"VPL_STRING(CONF_MAX_STR_LENGTH)"s = %"VPL_STRING(CONF_MAX_STR_LENGTH)"s\n", var.name, var.value); LOG_DEBUG("name,value = '%s','%s'", var.name, var.value); // Check if the length of name and value are less than buffer size. // 3 is the length of ' = ' in configuration format. // Still regard as success but put an error in log. // Add 3 (instead of subtracting 3) to avoid wrapping around if lineLen == strlen(var.name), // which can happen if there is no ' = ' in the line. if ( (lineLen - strlen(var.name) > CONF_MAX_STR_LENGTH + 3) || (lineLen - strlen(var.value) > CONF_MAX_STR_LENGTH + 3) ) { LOG_ERROR("Configuration exceeds buffer size: '%s'", line); } for (i = 0; i < CONF_MAX_LENGTH; i++) { var.name[i] = tolower(var.name[i]); } // overwrite duplicate entries if (CONFOverWriteDuplicate(&var) == CONF_ERROR_NOT_FOUND) { memcpy(&__confVars[__confFilled], &var, sizeof(var)); __confFilled++; } // grow array if (__confFilled >= __confSize) { CONFVariable* tempVars; __confSize *= 2; tempVars = __confVars; __confVars = (CONFVariable*)malloc(__confSize * sizeof(CONFVariable)); memset(__confVars, 0, __confSize * sizeof(CONFVariable)); memcpy(__confVars, tempVars, __confFilled * sizeof(CONFVariable)); free(tempVars); } skip: line = safe_strtok(NULL, "\n", &savePtr); } qsort(__confVars, __confFilled, sizeof(CONFVariable), CONFCompare); out: free(buffer); return rv; }