summaryrefslogtreecommitdiff
path: root/src/project.cpp
diff options
context:
space:
mode:
authorJonathan Bradley <jcb@pikum.xyz>2025-03-20 15:56:35 -0400
committerJonathan Bradley <jcb@pikum.xyz>2025-03-21 11:06:05 -0400
commitcae76dd98e301a4560bb46ecb59b5952dff04149 (patch)
tree8e85d17234c6838fd24925889cd784296df56956 /src/project.cpp
parent9f036b05d36203465ca481f39d2cd51233e82b9e (diff)
pke: cleanup std stream usage
Diffstat (limited to 'src/project.cpp')
-rw-r--r--src/project.cpp138
1 files changed, 80 insertions, 58 deletions
diff --git a/src/project.cpp b/src/project.cpp
index ce9ba58..e8679c8 100644
--- a/src/project.cpp
+++ b/src/project.cpp
@@ -44,7 +44,7 @@ const char* const PKE_PROJ_FILE_ASSET_BASE_PATH = "Asset::BasePath: ";
const char* const PKE_PROJ_FILE_ASSET_TYPE = "Asset::Type: ";
/*
-void Proj_SerializeProjectSettings(std::ofstream &stream) {
+void Proj_SerializeProjectSettings(std::ostream &stream) {
PkeProjectSettings ps{};
if (strncmp(ps.defaultSceneName, pkeProjectSettings.defaultSceneName, strlen(pkeProjectSettings.defaultSceneName)) != 0) {
stream << PKE_PROJ_FILE_PROJ_SETTINGS_DEFAULT_SCENE_NAME << ps.defaultSceneName << std::endl;
@@ -64,7 +64,7 @@ void Proj_SerializeProjectSettings(std::ofstream &stream) {
}
*/
-void Proj_SerializeEntityType(std::ofstream &stream, const EntityType &et) {
+void Proj_SerializeEntityType(std::ostream &stream, const EntityType &et) {
NULL_CHAR_ARR(handleStr, 23);
NULL_CHAR_ARR(modelAssetKey, AssetKeyLength + 1);
NULL_CHAR_ARR(textureAssetKey, AssetKeyLength + 1);
@@ -104,7 +104,7 @@ void Proj_SerializeEntityType(std::ofstream &stream, const EntityType &et) {
}
}
-void Proj_SerializeAsset(std::ofstream &stream, const Asset &asset) {
+void Proj_SerializeAsset(std::ostream &stream, const Asset &asset) {
NULL_CHAR_ARR(keyStr, AssetKeyLength + 1);
snprintf(keyStr, AssetKeyLength + 1, "%s", asset.key);
Asset a{};
@@ -120,7 +120,7 @@ void Proj_SerializeAsset(std::ofstream &stream, const Asset &asset) {
}
/*
-void Proj_DeserializeProjectSettings(std::ifstream &stream) {
+void Proj_DeserializeProjectSettings(std::istream &stream) {
while (memset(projReadLine, 0, projReadLineLength), stream.getline(projReadLine, projReadLineLength)) {
if (strcmp(PKE_PROJ_FILE_OBJ_END, projReadLine) == 0) {
return;
@@ -157,7 +157,7 @@ void Proj_DeserializeProjectSettings(std::ifstream &stream) {
}
*/
-void Proj_DeserializeEntityType(std::ifstream &stream) {
+void Proj_DeserializeEntityType(std::istream &stream) {
char collisionSig[CallbackSignatureLength + 1];
collisionSig[0] = '\0';
char createInstanceSig[CallbackSignatureLength + 1];
@@ -276,7 +276,7 @@ void Proj_DeserializeEntityType(std::ifstream &stream) {
}
}
-void Proj_DeserializeAssset(std::ifstream &stream) {
+void Proj_DeserializeAssset(std::istream &stream) {
char keyStr[AssetKeyLength + 1];
keyStr[AssetKeyLength] = '\0';
char basePath[256];
@@ -344,68 +344,90 @@ void PkeProject_Load(const char *filePath) {
}
void PkeProject_Save(const char *filePath) {
- const char *safeFilePath = filePath == nullptr ? PKE_PROJ_DEFAULT_FILENAME : filePath;
- std::ofstream f(safeFilePath);
- if (!f.is_open()) {
- fprintf(stderr, "While attempting to save project file, failed to open requested file for writing: %s", safeFilePath);
- return;
- }
+ bool failed = false;
+ const char *saveFilePath = filePath == nullptr ? PKE_PROJ_DEFAULT_FILENAME : filePath;
+ std::ostringstream stream{};
- f << PKE_PROJ_FILE_BEGIN << std::endl;
- f << PKE_PROJ_FILE_VERSION << std::endl;
- f << "" << std::endl;
+ try {
- /*
- f << PKE_PROJ_FILE_OBJ_PROJECT_SETTINGS << std::endl;
- Proj_SerializeProjectSettings(f);
- f << PKE_PROJ_FILE_OBJ_END << std::endl;
- */
+ stream << PKE_PROJ_FILE_BEGIN << std::endl;
+ stream << PKE_PROJ_FILE_VERSION << std::endl;
+ stream << "" << std::endl;
- pk_handle_bucket_index_T assetB = AM_GetBucketCount();
- for (pk_handle_bucket_index_T b = 0; b < assetB; ++b) {
- pk_handle_item_index_T assetI = 0;
- auto *assets = AM_GetAssets(b, assetI);
- for (pk_handle_item_index_T i = 0; i < assetI; ++i) {
- bool isGlobalAsset = false;
- for (long k = 0; k < EngineDefinedAssetCount; ++k) {
- if (strncmp(EngineDefinedAssets[k], assets[i].key, AssetKeyLength) == 0) {
- isGlobalAsset = true;
- break;
+ /*
+ f << PKE_PROJ_FILE_OBJ_PROJECT_SETTINGS << std::endl;
+ Proj_SerializeProjectSettings(f);
+ f << PKE_PROJ_FILE_OBJ_END << std::endl;
+ */
+
+ pk_handle_bucket_index_T assetB = AM_GetBucketCount();
+ for (pk_handle_bucket_index_T b = 0; b < assetB; ++b) {
+ pk_handle_item_index_T assetI = 0;
+ auto *assets = AM_GetAssets(b, assetI);
+ for (pk_handle_item_index_T i = 0; i < assetI; ++i) {
+ bool isGlobalAsset = false;
+ for (long k = 0; k < EngineDefinedAssetCount; ++k) {
+ if (strncmp(EngineDefinedAssets[k], assets[i].key, AssetKeyLength) == 0) {
+ isGlobalAsset = true;
+ break;
+ }
}
+ if (isGlobalAsset) continue;
+ stream << PKE_PROJ_FILE_OBJ_ASSET << std::endl;
+ Proj_SerializeAsset(stream, assets[i]);
+ stream << PKE_PROJ_FILE_OBJ_END << std::endl;
}
- if (isGlobalAsset) continue;
- f << PKE_PROJ_FILE_OBJ_ASSET << std::endl;
- Proj_SerializeAsset(f, assets[i]);
- f << PKE_PROJ_FILE_OBJ_END << std::endl;
}
- }
- const auto entBucketCount = EntityType_GetBucketCount();
- for (pk_handle_bucket_index_T b = 0; b < entBucketCount; ++b) {
- pk_handle_item_index_T itemCount = 0;
- auto *entities = EntityType_GetEntityTypes(b, itemCount);
- for (pk_handle_item_index_T i = 0; i < itemCount; ++i) {
- if (entities[i].modelAssetKey[0] == '\0') {
- continue;
+ const auto entBucketCount = EntityType_GetBucketCount();
+ for (pk_handle_bucket_index_T b = 0; b < entBucketCount; ++b) {
+ pk_handle_item_index_T itemCount = 0;
+ auto *entities = EntityType_GetEntityTypes(b, itemCount);
+ for (pk_handle_item_index_T i = 0; i < itemCount; ++i) {
+ if (entities[i].modelAssetKey[0] == '\0') {
+ continue;
+ }
+ stream << PKE_PROJ_FILE_OBJ_ENTITY_TYPE << std::endl;
+ Proj_SerializeEntityType(stream, entities[i]);
+ stream << PKE_PROJ_FILE_OBJ_END << std::endl;
}
- f << PKE_PROJ_FILE_OBJ_ENTITY_TYPE << std::endl;
- Proj_SerializeEntityType(f, entities[i]);
- f << PKE_PROJ_FILE_OBJ_END << std::endl;
}
- }
- FontTypeIndex font_count;
- FontType *fonts = FontType_GetFonts(font_count);
- for (FontTypeIndex b = FontTypeIndex{0}; b < font_count; ++b) {
- FontType *ft = &fonts[(FontTypeIndex_T)b];
- if (ft->title.val == nullptr) continue;
- f << PKE_PROJ_FILE_OBJ_FONT << std::endl;
- FontType_Serialize(f, ft);
- f << PKE_PROJ_FILE_OBJ_END << std::endl;
- }
+ FontTypeIndex font_count;
+ FontType *fonts = FontType_GetFonts(font_count);
+ for (FontTypeIndex b = FontTypeIndex{0}; b < font_count; ++b) {
+ FontType *ft = &fonts[(FontTypeIndex_T)b];
+ if (ft->title.val == nullptr) continue;
+ stream << PKE_PROJ_FILE_OBJ_FONT << std::endl;
+ FontType_Serialize(stream, ft);
+ stream << PKE_PROJ_FILE_OBJ_END << std::endl;
+ }
- f << PKE_PROJ_FILE_END << std::endl;
+ stream << PKE_PROJ_FILE_END << std::endl;
+ } catch (...) {
+ failed = false;
+ }
- f.flush();
- f.close();
+ if (failed == false) {
+ std::ofstream f(saveFilePath);
+ if (!f.is_open()) {
+ failed = true;
+ }
+ f.flush();
+ f.close();
+ }
+ if (failed) {
+ NULL_CHAR_ARR(errFileName, 256);
+ strncpy(errFileName, saveFilePath, 256);
+ strncpy(errFileName + strlen(saveFilePath), ".err", 256 - strlen(saveFilePath));
+ std::ofstream errF(saveFilePath);
+ if (errF.is_open()) {
+ errF << stream.str();
+ errF.flush();
+ errF.close();
+ fprintf(stderr, "Failed to save Projection file '%s', partial output saved to '%s'\n", saveFilePath, errFileName);
+ } else {
+ fprintf(stderr, "Failed to save Projection file '%s' and also failed to write failed output\n", saveFilePath);
+ }
+ }
}