void ApkFile::read(void* buffer, size_t size) { CE_ASSERT_NOT_NULL(buffer); size_t bytes_read = (size_t) AAsset_read(_asset, buffer, size); CE_ASSERT(bytes_read == size, "AAsset_read: requested: %lu, read: %lu", size, bytes_read); CE_UNUSED(bytes_read); }
void parse_array(const char* json, JsonArray& array) { CE_ASSERT_NOT_NULL(json); if (*json == '[') { json = skip_spaces(++json); if (*json == ']') return; while (*json) { array::push_back(array, json); json = skip_value(json); json = skip_spaces(json); if (*json == ']') return; json = skip_spaces(json); } } CE_FATAL("Bad array"); }
void parse_array(const char* json, Array<const char*>& array) { CE_ASSERT_NOT_NULL(json); if (*json == '[') { json = next(json, '['); json = skip_spaces(json); if (*json == ']') { json = next(json, ']'); return; } while (*json) { array::push_back(array, json); json = skip_value(json); json = skip_spaces(json); if (*json == ']') { json = next(json, ']'); return; } json = next(json, ','); json = skip_spaces(json); } } CE_FATAL("Bad array"); }
static const char* skip_comments(const char* json) { CE_ASSERT_NOT_NULL(json); if (*json == '/') { ++json; if (*json == '/') { json = next(json, '/'); while (*json && *json != '\n') ++json; } else if (*json == '*') { ++json; while (*json && *json != '*') ++json; json = next(json, '*'); json = next(json, '/'); } else CE_FATAL("Bad comment"); } return json; }
bool parse_bool(const char* json) { CE_ASSERT_NOT_NULL(json); switch (*json) { case 't': { json = next(json, 't'); json = next(json, 'r'); json = next(json, 'u'); json = next(json, 'e'); return true; } case 'f': { json = next(json, 'f'); json = next(json, 'a'); json = next(json, 'l'); json = next(json, 's'); json = next(json, 'e'); return false; } default: { CE_FATAL("Bad boolean"); return false; } } }
//-------------------------------------------------------------------------- ResourceId JSONElement::to_resource_id(const char* type) const { CE_ASSERT_NOT_NULL(type); // TempAllocator1024 alloc; DynamicString str(default_allocator()); json::parse_string(m_at, str); return ResourceId(type, str.c_str()); }
File* DiskFilesystem::open(const char* path, FileOpenMode mode) { CE_ASSERT_NOT_NULL(path); TempAllocator256 alloc; DynamicString abs_path(alloc); get_absolute_path(path, abs_path); return CE_NEW(default_allocator(), DiskFile)(mode, abs_path.c_str()); }
void DiskFilesystem::list_files(const char* path, Vector<DynamicString>& files) { CE_ASSERT_NOT_NULL(path); TempAllocator256 alloc; DynamicString abs_path(alloc); get_absolute_path(path, abs_path); os::list_files(abs_path.c_str(), files); }
void DiskFilesystem::delete_directory(const char* path) { CE_ASSERT_NOT_NULL(path); TempAllocator256 alloc; DynamicString abs_path(alloc); get_absolute_path(path, abs_path); os::delete_directory(abs_path.c_str()); }
bool DiskFilesystem::is_file(const char* path) { CE_ASSERT_NOT_NULL(path); TempAllocator256 alloc; DynamicString abs_path(alloc); get_absolute_path(path, abs_path); return os::is_file(abs_path.c_str()); }
void parse(const char* json, JsonObject& object) { CE_ASSERT_NOT_NULL(json); json = skip_spaces(json); if (*json == '{') parse_object(json, object); else parse_root_object(json, object); }
static const char* next(const char* json, const char c = 0) { CE_ASSERT_NOT_NULL(json); if (c && c != *json) { CE_ASSERT(false, "Expected '%c' got '%c'", c, *json); } return ++json; }
void BundleCompiler::register_resource_compiler(StringId64 type, u32 version, CompileFunction compiler) { CE_ASSERT(!sort_map::has(_compilers, type), "Type already registered"); CE_ASSERT_NOT_NULL(compiler); ResourceTypeData rtd; rtd.version = version; rtd.compiler = compiler; sort_map::set(_compilers, type, rtd); sort_map::sort(_compilers); }
f64 parse_number(const char* json) { CE_ASSERT_NOT_NULL(json); TempAllocator512 alloc; Array<char> number(alloc); if (*json == '-') { array::push_back(number, '-'); ++json; } while (isdigit(*json)) { array::push_back(number, *json); ++json; } if (*json == '.') { array::push_back(number, '.'); while (*++json && isdigit(*json)) { array::push_back(number, *json); } } if (*json == 'e' || *json == 'E') { array::push_back(number, *json); ++json; if (*json == '-' || *json == '+') { array::push_back(number, *json); ++json; } while (isdigit(*json)) { array::push_back(number, *json); ++json; } } array::push_back(number, '\0'); f64 val; int ok = sscanf(array::begin(number), "%lf", &val); CE_ASSERT(ok == 1, "Failed to parse f64: %s", array::begin(number)); CE_UNUSED(ok); return val; }
static const char* skip_spaces(const char* json) { CE_ASSERT_NOT_NULL(json); while (*json) { if (*json == '/') json = skip_comments(json); else if (isspace(*json) || *json == ',') ++json; else break; } return json; }
JsonValueType::Enum type(const char* json) { CE_ASSERT_NOT_NULL(json); switch (*json) { case '"': return JsonValueType::STRING; case '{': return JsonValueType::OBJECT; case '[': return JsonValueType::ARRAY; case '-': return JsonValueType::NUMBER; default: return (isdigit(*json)) ? JsonValueType::NUMBER : (*json == 'n' ? JsonValueType::NIL : JsonValueType::BOOL); } }
static const char* skip_value(const char* json) { CE_ASSERT_NOT_NULL(json); switch (*json) { case '"': json = skip_string(json); break; case '[': json = skip_block(json, '[', ']'); break; case '{': json = skip_block(json, '{', '}'); break; default: for (; *json != '\0' && *json != ',' && *json != '\n' && *json != ' ' && *json != '}' && *json != ']'; ++json) ; break; } return json; }
double parse_number(const char* json) { CE_ASSERT_NOT_NULL(json); TempAllocator512 alloc; Array<char> number(alloc); if (*json == '-') { array::push_back(number, '-'); json = next(json, '-'); } while (isdigit(*json)) { array::push_back(number, *json); json = next(json); } if (*json == '.') { array::push_back(number, '.'); while ((*(json = next(json))) && isdigit(*json)) { array::push_back(number, *json); } } if (*json == 'e' || *json == 'E') { array::push_back(number, *json); json = next(json); if (*json == '-' || *json == '+') { array::push_back(number, *json); json = next(json); } while (isdigit(*json)) { array::push_back(number, *json); json = next(json); } } // Ensure null terminated array::push_back(number, '\0'); return parse_double(array::begin(number)); }
void parse_object(const char* json, Map<DynamicString, const char*>& object) { CE_ASSERT_NOT_NULL(json); if (*json == '{') { json = next(json, '{'); json = skip_spaces(json); if (*json == '}') { next(json, '}'); return; } while (*json) { TempAllocator256 ta; DynamicString key(ta); parse_string(json, key); json = skip_string(json); json = skip_spaces(json); json = next(json, ':'); json = skip_spaces(json); map::set(object, key, json); json = skip_value(json); json = skip_spaces(json); if (*json == '}') { next(json, '}'); return; } json = next(json, ','); json = skip_spaces(json); } } CE_FATAL("Bad object"); }
void parse_string(const char* json, DynamicString& string) { CE_ASSERT_NOT_NULL(json); if (*json == '"') { while (*++json) { // Empty string if (*json == '"') { ++json; return; } else if (*json == '\\') { ++json; switch (*json) { case '"': string += '"'; break; case '\\': string += '\\'; break; case '/': string += '/'; break; case 'b': string += '\b'; break; case 'f': string += '\f'; break; case 'n': string += '\n'; break; case 'r': string += '\r'; break; case 't': string += '\t'; break; default: { CE_FATAL("Bad escape character"); break; } } } else { string += *json; } } } CE_FATAL("Bad string"); }
static const char* skip_string(const char* json) { CE_ASSERT_NOT_NULL(json); bool escaped = false; while (*++json) { if (*json == '"' && !escaped) { ++json; return json; } else if (*json == '\\') escaped = true; else escaped = false; } return json; }
static const char* parse_key(const char* json, DynamicString& key) { CE_ASSERT_NOT_NULL(json); if (*json == '"') { parse_string(json, key); return skip_string(json); } while (true) { if (isspace(*json) || *json == '=' || *json == ':') return json; key += *json++; } CE_FATAL("Bad key"); return NULL; }
void parse_object(const char* json, JsonObject& object) { CE_ASSERT_NOT_NULL(json); if (*json == '{') { json = skip_spaces(++json); if (*json == '}') return; while (*json) { const char* key_begin = *json == '"' ? (json + 1) : json; TempAllocator256 ta; DynamicString key(ta); json = parse_key(json, key); FixedString fs_key(key_begin, key.length()); json = skip_spaces(json); json = next(json, (*json == '=') ? '=' : ':'); json = skip_spaces(json); map::set(object, fs_key, json); json = skip_value(json); json = skip_spaces(json); if (*json == '}') return; json = skip_spaces(json); } } CE_FATAL("Bad object"); }
static void parse_root_object(const char* json, JsonObject& object) { CE_ASSERT_NOT_NULL(json); while (*json) { const char* key_begin = *json == '"' ? (json + 1) : json; TempAllocator256 ta; DynamicString key(ta); json = parse_key(json, key); FixedString fs_key(key_begin, key.length()); json = skip_spaces(json); json = next(json, (*json == '=') ? '=' : ':'); json = skip_spaces(json); map::set(object._map, fs_key, json); json = skip_value(json); json = skip_spaces(json); } }
void unload(Allocator& a, void* res) { CE_ASSERT_NOT_NULL(res); a.deallocate(res); }
//-------------------------------------------------------------------------- JSONParser::JSONParser(const char* s) : m_file(false) , m_document(s) { CE_ASSERT_NOT_NULL(s); }
void DiskFilesystem::close(File* file) { CE_ASSERT_NOT_NULL(file); CE_DELETE(default_allocator(), file); }
void StringId64::hash(const char* str, u32 len) { CE_ASSERT_NOT_NULL(str); _id = murmur64(str, len, 0); }
DiskFilesystem::DiskFilesystem(const char* root_path) { CE_ASSERT_NOT_NULL(root_path); string::strncpy(m_root_path, root_path, MAX_PATH_LENGTH); }