]> git.sesse.net Git - narabu/blob - util.cpp
Prepare for more flexible slices.
[narabu] / util.cpp
1 #include <string>
2 #include <string.h>
3 #include <stdlib.h>
4
5 #include "util.h"
6
7 using namespace std;
8
9 string read_file(const string &filename)
10 {
11         const string full_pathname = filename;
12
13         FILE *fp = fopen(full_pathname.c_str(), "r");
14         if (fp == NULL) {
15                 perror(full_pathname.c_str());
16                 exit(1);
17         }
18
19         int ret = fseek(fp, 0, SEEK_END);
20         if (ret == -1) {
21                 perror("fseek(SEEK_END)");
22                 exit(1);
23         }
24
25         int size = ftell(fp);
26
27         ret = fseek(fp, 0, SEEK_SET);
28         if (ret == -1) {
29                 perror("fseek(SEEK_SET)");
30                 exit(1);
31         }
32
33         string str;
34         str.resize(size);
35         ret = fread(&str[0], size, 1, fp);
36         if (ret == -1) {
37                 perror("fread");
38                 exit(1);
39         }
40         if (ret == 0) {
41                 fprintf(stderr, "Short read when trying to read %d bytes from %s\n",
42                                 size, full_pathname.c_str());
43                 exit(1);
44         }
45         fclose(fp);
46
47         return str;
48 }
49
50 GLuint compile_shader(const string &shader_src, GLenum type)
51 {
52         GLuint obj = glCreateShader(type);
53         const GLchar* source[] = { shader_src.data() };
54         const GLint length[] = { (GLint)shader_src.size() };
55         glShaderSource(obj, 1, source, length);
56         glCompileShader(obj);
57
58         GLchar info_log[4096];
59         GLsizei log_length = sizeof(info_log) - 1;
60         glGetShaderInfoLog(obj, log_length, &log_length, info_log);
61         info_log[log_length] = 0;
62         if (strlen(info_log) > 0) {
63                 fprintf(stderr, "Shader compile log: %s\n", info_log);
64         }
65
66         GLint status;
67         glGetShaderiv(obj, GL_COMPILE_STATUS, &status);
68         if (status == GL_FALSE) {
69                 fprintf(stderr, "Failed to compile shader: %s\n", shader_src.c_str());
70                 exit(1);
71         }
72
73         return obj;
74 }
75