+#include "program.hpp"
+#include <fstream>
+#include <sstream>
+#include <iostream>
+
+using namespace std;
+
+void attachShader(GLuint progId, string filePath, GLenum type) {
+ GLuint shader = glCreateShader(type);
+
+ if (!shader) {
+ cerr << "error creating shader" << endl;
+ exit(1);
+ }
+
+ ifstream file(filePath);
+ stringstream buffer;
+ buffer << file.rdbuf();
+ string str = buffer.str();
+ const char* contents = str.c_str();
+
+ glShaderSource(shader, 1, (const GLchar**)&contents, NULL);
+ glCompileShader(shader);
+ GLint success;
+ glGetShaderiv(shader, GL_COMPILE_STATUS, &success);
+ if (!success) {
+ GLchar log[1024];
+ glGetShaderInfoLog(shader, 1024, NULL, log);
+ fprintf(stderr, "error: %s\n", log);
+ exit(1);
+ }
+ glAttachShader(progId, shader);
+}
+
+Program::Program(const string vertexShader, const string fragmentShader) {
+ progId = glCreateProgram();
+
+ attachShader(progId, vertexShader, GL_VERTEX_SHADER);
+ attachShader(progId, fragmentShader, GL_FRAGMENT_SHADER);
+
+ glLinkProgram(progId);
+ GLint success = 0;
+ glGetProgramiv(progId, GL_LINK_STATUS, &success);
+ if (!success) {
+ GLchar log[1024];
+ glGetProgramInfoLog(progId, sizeof(log), NULL, log);
+ fprintf(stderr, "error linking: %s\n", log);
+ exit(1);
+ }
+}