Correctly handle filename containing spaces for external resources. Fixes #74.

This commit is contained in:
Syoyo Fujita 2018-06-04 17:52:08 +09:00
parent 5307850555
commit 57f8e7ca3b
3 changed files with 55 additions and 4 deletions

15
experimental/README.md Normal file
View File

@ -0,0 +1,15 @@
# Python script which generates C++11 code from JSON schema.
## Requirements
* python3
* jsonref
## Generate
Run `gen.py` by specifing the path to glTF schema directory(from https://github.com/KhronosGroup/glTF.git)
```
$ python gen.py /path/to/glTF/specification/2.0/schema
```

34
experimental/gen.py Normal file
View File

@ -0,0 +1,34 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys, os
import subprocess
import json
from pprint import pprint
import jsonref
# glTF 2.0
schema_files = [
"glTF.schema.json"
]
def main():
if len(sys.argv) < 2:
print("Requires path to glTF scheme directory.")
sys.exit(-1)
gltf_schema_dir = sys.argv[1]
gltf_schema_filepath = os.path.join(gltf_schema_dir, schema_files[0])
if not os.path.exists(gltf_schema_filepath):
print("File not found: {}".format(gltf_schema_filepath))
sys.exit(-1)
gltf_schema_uri = 'file://{}/'.format(gltf_schema_dir)
with open(gltf_schema_filepath) as schema_file:
j = jsonref.loads(schema_file.read(), base_uri=gltf_schema_uri, jsonschema=True)
pprint(j)
main()

View File

@ -733,15 +733,17 @@ static std::string ExpandFilePath(const std::string &filepath) {
}
// char** w;
int ret = wordexp(filepath.c_str(), &p, 0);
// wrap filepath by quotes to avoid splitting file path when the path contains spaces(more precisely, $IFS environment variables).
std::string quoted_filepath = "\"" + filepath + "\"";
int ret = wordexp(quoted_filepath.c_str(), &p, 0);
if (ret) {
// err
s = filepath;
return s;
}
// Use first element only.
if (p.we_wordv) {
// Use first item.
s = std::string(p.we_wordv[0]);
wordfree(&p);
} else {
@ -902,7 +904,7 @@ static bool LoadExternalFile(std::vector<unsigned char> *out, std::string *err,
std::string filepath = FindFile(paths, filename);
if (filepath.empty()) {
if (err) {
(*err) += "File not found : " + filename + "\n";
(*err) += "File not found : \"" + filename + "\"\n";
}
return false;
}
@ -910,7 +912,7 @@ static bool LoadExternalFile(std::vector<unsigned char> *out, std::string *err,
std::ifstream f(filepath.c_str(), std::ifstream::binary);
if (!f) {
if (err) {
(*err) += "File open error : " + filepath + "\n";
(*err) += "File open error : \"" + filepath + "\"\n";
}
return false;
}