int buildShaders(int foo, const char *vertexShaderSourceParam, const char *fragmentShaderSourceParam){
    printf("building shaders...\n");
        // build and compile our shader program
    // ------------------------------------

    // open file and convert it to string for vs:
    char * vbuffer = 0;
    long vlength;
    FILE * vertex_file = fopen (vertexShaderSourceParam, "rb");

    if (vertex_file)
    {
      fseek (vertex_file, 0, SEEK_END);
      vlength = ftell (vertex_file);
      fseek (vertex_file, 0, SEEK_SET);
      vbuffer = malloc (vlength + 1);
      if (vbuffer)
      {
        fread (vbuffer, 1, vlength, vertex_file);
      }
      fclose (vertex_file);
      vbuffer[vlength] = '\0';
    }

    char * fbuffer = 0;
    long flength;
    FILE * fragment_file = fopen (fragmentShaderSourceParam, "rb");

    if (fragment_file)
    {
      fseek (fragment_file, 0, SEEK_END);
      flength = ftell (fragment_file);
      fseek (fragment_file, 0, SEEK_SET);
      fbuffer = malloc (flength + 1);
      if (fbuffer)
      {
        fread (fbuffer, 1, flength, fragment_file);
      }
      fclose (fragment_file);
      fbuffer[flength] = '\0';
    }

    // vertex shader
    int vertexShader = glCreateShader(GL_VERTEX_SHADER);
    glShaderSource(vertexShader, 1, &vbuffer, NULL);
    glCompileShader(vertexShader);
    // check for shader compile errors
    int success;
    char infoLog[512];
    glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success);
    if (!success)
    {
        glGetShaderInfoLog(vertexShader, 512, NULL, infoLog);
        printf("ERROR::SHADER::VERTEX::COMPILATION_FAILED\n %s", infoLog);
        return 1;
    }
    // fragment shader
    int fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
    glShaderSource(fragmentShader, 1, &fbuffer, NULL);
    glCompileShader(fragmentShader);
    // check for shader compile errors
    glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success);
    if (!success)
    {
        glGetShaderInfoLog(fragmentShader, 512, NULL, infoLog);
        printf("ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n %s", infoLog);
        return 2;
    }
    // link shaders
    // int shaderProgram = glCreateProgram();
    glAttachShader(foo, vertexShader);
    glAttachShader(foo, fragmentShader);
    glLinkProgram(foo);
    // check for linking errors
    glGetProgramiv(foo, GL_LINK_STATUS, &success);
    if (!success) {
        glGetProgramInfoLog(foo, 512, NULL, infoLog);
        printf("ERROR::SHADER::PROGRAM::LINKING_FAILED\n %s", infoLog);
        return 3;
    }
    glDeleteShader(vertexShader);
    glDeleteShader(fragmentShader);
    return 0;
}
