+ for (const BundledShader *shader = bundled_shaders; shader->filename != nullptr; ++shader) {
+ if (shader->filename == filename) {
+ return string(shader_bundle + shader->offset, shader->length);
+ }
+ }
+ return ""; // Not found.
+}
+
+string read_file(const string &filename)
+{
+ string contents_from_bundle = read_file_from_bundle(filename);
+
+ // If no data directory has been given, we read only from the bundle.
+ if (*movit_data_directory == "") {
+ if (contents_from_bundle.empty()) {
+ fprintf(stderr, "%s: Shader not compiled in, and no data directory has been given.\n", filename.c_str());
+ exit(1);
+ } else {
+ return contents_from_bundle;
+ }
+ }
+
+ // If we're given a data directory, we still support reading from the bundle,
+ // but a successful read from the file system takes priority.
+ const string full_pathname = *movit_data_directory + "/" + filename;
+
+ FILE *fp = fopen(full_pathname.c_str(), "r");
+ if (fp == nullptr) {
+ if (!contents_from_bundle.empty()) {
+ return contents_from_bundle;
+ }
+ perror(full_pathname.c_str());
+ exit(1);
+ }
+
+ int ret = fseek(fp, 0, SEEK_END);
+ if (ret == -1) {
+ if (!contents_from_bundle.empty()) {
+ fclose(fp);
+ return contents_from_bundle;
+ }
+ perror("fseek(SEEK_END)");
+ exit(1);
+ }
+
+ int size = ftell(fp);
+
+ ret = fseek(fp, 0, SEEK_SET);
+ if (ret == -1) {
+ if (!contents_from_bundle.empty()) {
+ fclose(fp);
+ return contents_from_bundle;
+ }
+ perror("fseek(SEEK_SET)");