Daata Data_readFromBinaryFile (MelderFile file) { try { autofile f = Melder_fopen (file, "rb"); char line [200]; int n = fread (line, 1, 199, f); line [n] = '\0'; char *end = strstr (line, "ooBinaryFile"); autoDaata me; int formatVersion; if (end) { fseek (f, strlen ("ooBinaryFile"), 0); autostring8 klas = bingets1 (f); me.reset (static_cast <Daata> (Thing_newFromClassName (Melder_peek8to32 (klas.peek()), & formatVersion))); } else { end = strstr (line, "BinaryFile"); if (! end) { Melder_throw (U"File ", file, U" is not a Data binary file."); } *end = '\0'; me.reset (static_cast <Daata> (Thing_newFromClassName (Melder_peek8to32 (line), nullptr))); formatVersion = -1; // old version: override version number, which was set to 0 by newFromClassName rewind (f); fread (line, 1, end - line + strlen ("BinaryFile"), f); } MelderFile_getParentDir (file, & Data_directoryBeingRead); Data_readBinary (me.peek(), f, formatVersion); file -> format = structMelderFile :: Format :: binary; f.close (file); return me.transfer(); } catch (MelderError) { Melder_throw (U"Data not read from binary file ", file, U"."); } }
Any Data_readFromBinaryFile (MelderFile file) { try { autofile f = Melder_fopen (file, "rb"); char line [200]; int n = fread (line, 1, 199, f); line [n] = '\0'; char *end = strstr (line, "ooBinaryFile"); autoData me = NULL; if (end) { fseek (f, strlen ("ooBinaryFile"), 0); autostring8 klas = bingets1 (f); me.reset ((Data) Thing_newFromClassNameA (klas.peek())); } else { end = strstr (line, "BinaryFile"); if (! end) { Melder_throw ("File ", file, " is not a Data binary file."); } *end = '\0'; me.reset ((Data) Thing_newFromClassNameA (line)); Thing_version = -1; // old version: override version number, which was set to 0 by newFromClassName rewind (f); fread (line, 1, end - line + strlen ("BinaryFile"), f); } MelderFile_getParentDir (file, & Data_directoryBeingRead); Data_readBinary (me.peek(), f); f.close (file); return me.transfer(); } catch (MelderError) { Melder_throw ("Data not read from binary file ", file, "."); } }
void _CollectionOfDaata_v_readBinary (_CollectionOfDaata* me, FILE *f, int formatVersion) { if (formatVersion < 0) { int32 l_size = bingeti4 (f); if (l_size < 0) Melder_throw (U"Empty collection."); my _grow (l_size); for (int32_t i = 1; i <= l_size; i ++) { char klas [200], name [2000]; if (fscanf (f, "%s%s", klas, name) < 2) // BUG Melder_throw (U"Cannot read class and name."); my at [i] = (Daata) Thing_newFromClassName (Melder_peek8to32 (klas), nullptr).releaseToAmbiguousOwner(); my size ++; if (! Thing_isa (my at [i], classDaata)) Melder_throw (U"Cannot read item of class ", Thing_className (my at [i]), U"."); if (fgetc (f) != ' ') Melder_throw (U"Cannot read space."); Data_readBinary (my at [i], f, -1); if (strcmp (name, "?")) Thing_setName (my at [i], Melder_peek8to32 (name)); } } else { int32_t l_size = bingeti4 (f); if (Melder_debug == 44) Melder_casual (U"structCollection :: v_readBinary: Reading ", l_size, U" objects"); my _grow (l_size); for (int32_t i = 1; i <= l_size; i ++) { autostring8 klas = bingets1 (f); if (Melder_debug == 44) Melder_casual (U"structCollection :: v_readBinary: Reading object of type ", Melder_peek8to32 (klas.peek())); int elementFormatVersion; my at [i] = (Daata) Thing_newFromClassName (Melder_peek8to32 (klas.peek()), & elementFormatVersion).releaseToAmbiguousOwner(); my size ++; if (! Thing_isa (my at [i], classDaata) || ! Data_canReadBinary (my at [i])) Melder_throw (U"Objects of class ", Thing_className (my at [i]), U" cannot be read."); autostring32 name = bingetw2 (f); if (Melder_debug == 44) Melder_casual (U"structCollection :: v_readBinary: Reading object with name ", name.peek()); Thing_setName (my at [i], name.peek()); Data_readBinary (my at [i], f, elementFormatVersion); } } }