summaryrefslogtreecommitdiff
path: root/src/glsl/main.cpp
diff options
context:
space:
mode:
authorJosé Fonseca <jfonseca@vmware.com>2011-01-12 16:31:07 +0000
committerJosé Fonseca <jfonseca@vmware.com>2011-01-12 16:54:25 +0000
commit0035d1d902f34a88ec745925284fe3b768fac261 (patch)
tree7ee065114cd7e0146ae34e18795eafdab2ab34f3 /src/glsl/main.cpp
parentf9bb5323eb96f47cfb4ab5f93165323df0a1fd61 (diff)
glsl: Make builtin_compiler portable for non-unices.
Diffstat (limited to 'src/glsl/main.cpp')
-rw-r--r--src/glsl/main.cpp59
1 files changed, 28 insertions, 31 deletions
diff --git a/src/glsl/main.cpp b/src/glsl/main.cpp
index c8fc2676253..847540ddd9f 100644
--- a/src/glsl/main.cpp
+++ b/src/glsl/main.cpp
@@ -24,11 +24,6 @@
#include <cstdio>
#include <getopt.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <unistd.h>
-
#include "ast.h"
#include "glsl_parser_extras.h"
#include "glsl_parser.h"
@@ -110,38 +105,40 @@ static char *
load_text_file(void *ctx, const char *file_name)
{
char *text = NULL;
- struct stat st;
- ssize_t total_read = 0;
- int fd = open(file_name, O_RDONLY);
+ size_t size;
+ size_t total_read = 0;
+ FILE *fp = fopen(file_name, "rb");
- if (fd < 0) {
+ if (!fp) {
return NULL;
}
- if (fstat(fd, & st) == 0) {
- text = (char *) talloc_size(ctx, st.st_size + 1);
- if (text != NULL) {
- do {
- ssize_t bytes = read(fd, text + total_read,
- st.st_size - total_read);
- if (bytes < 0) {
- free(text);
- text = NULL;
- break;
- }
-
- if (bytes == 0) {
- break;
- }
-
- total_read += bytes;
- } while (total_read < st.st_size);
-
- text[total_read] = '\0';
- }
+ fseek(fp, 0L, SEEK_END);
+ size = ftell(fp);
+ fseek(fp, 0L, SEEK_SET);
+
+ text = (char *) talloc_size(ctx, size + 1);
+ if (text != NULL) {
+ do {
+ size_t bytes = fread(text + total_read,
+ 1, size - total_read, fp);
+ if (bytes < size - total_read) {
+ free(text);
+ text = NULL;
+ break;
+ }
+
+ if (bytes == 0) {
+ break;
+ }
+
+ total_read += bytes;
+ } while (total_read < size);
+
+ text[total_read] = '\0';
}
- close(fd);
+ fclose(fp);
return text;
}