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"."); } }
Daata Data_readFromTextFile (MelderFile file) { try { autoMelderReadText text = MelderReadText_createFromFile (file); char32 *line = MelderReadText_readLine (text.peek()); if (! line) Melder_throw (U"No lines."); char32 *end = str32str (line, U"ooTextFile"); // oo format? autoDaata me; int formatVersion; if (end) { autostring32 klas = texgetw2 (text.peek()); me.reset (static_cast <Daata> (Thing_newFromClassName (klas.peek(), & formatVersion))); } else { end = str32str (line, U"TextFile"); if (! end) Melder_throw (U"Not an old-type text file; should not occur."); *end = U'\0'; me.reset (static_cast <Daata> (Thing_newFromClassName (line, nullptr))); formatVersion = -1; // old version } MelderFile_getParentDir (file, & Data_directoryBeingRead); Data_readText (me.peek(), text.peek(), formatVersion); file -> format = structMelderFile :: Format :: text; return me.transfer(); } catch (MelderError) { Melder_throw (U"Data not read from text file ", file, U"."); } }
Any Data_readFromTextFile (MelderFile file) { try { autoMelderReadText text = MelderReadText_createFromFile (file); wchar_t *line = MelderReadText_readLine (text.peek()); if (line == NULL) Melder_throw ("No lines."); wchar_t *end = wcsstr (line, L"ooTextFile"); // oo format? autoData me = NULL; if (end) { autostring klas = texgetw2 (text.peek()); me.reset ((Data) Thing_newFromClassName (klas.peek())); } else { end = wcsstr (line, L"TextFile"); if (end == NULL) Melder_throw ("Not an old-type text file; should not occur."); *end = '\0'; me.reset ((Data) Thing_newFromClassName (line)); Thing_version = -1; // old version: override version number, which was set to 0 by newFromClassName } MelderFile_getParentDir (file, & Data_directoryBeingRead); Data_readText (me.peek(), text.peek()); return me.transfer(); } catch (MelderError) { Melder_throw ("Data not read from text file ", file, "."); } }
void _CollectionOfDaata_v_readText (_CollectionOfDaata* me, MelderReadText text, int formatVersion) { if (formatVersion < 0) { long l_size; autostring8 line = Melder_32to8 (MelderReadText_readLine (text)); if (! line.peek() || ! sscanf (line.peek(), "%ld", & l_size) || l_size < 0) Melder_throw (U"Collection::readText: cannot read size."); my _grow (l_size); for (long i = 1; i <= l_size; i ++) { long itemNumberRead; int n = 0, length, stringsRead; char klas [200], nameTag [2000]; do { line.reset (Melder_32to8 (MelderReadText_readLine (text))); if (! line.peek()) Melder_throw (U"Missing object line."); } while (strncmp (line.peek(), "Object ", 7)); stringsRead = sscanf (line.peek(), "Object %ld: class %s %s%n", & itemNumberRead, klas, nameTag, & n); if (stringsRead < 2) Melder_throw (U"Collection::readText: cannot read header of object ", i, U"."); if (itemNumberRead != i) Melder_throw (U"Collection::readText: read item number ", itemNumberRead, U" while expecting ", i, U"."); if (stringsRead == 3 && ! strequ (nameTag, "name")) Melder_throw (U"Collection::readText: wrong header at object ", i, U"."); my at [i] = (Daata) Thing_newFromClassName (Melder_peek8to32 (klas), nullptr).releaseToAmbiguousOwner(); my size ++; if (! Thing_isa (my at [i], classDaata) || ! Data_canReadText (my at [i])) Melder_throw (U"Cannot read item of class ", Thing_className (my at [i]), U" in collection."); Data_readText (my at [i], text, -1); if (stringsRead == 3) { if (line [n] == U' ') n ++; // skip space character length = strlen (line.peek()+n); if (length > 0 && (line.peek()+n) [length - 1] == '\n') (line.peek()+n) [length - 1] = '\0'; Thing_setName (my at [i], Melder_peek8to32 (line.peek()+n)); } } } else { int32_t l_size = texgeti4 (text); my _grow (l_size); for (int32_t i = 1; i <= l_size; i ++) { autostring32 className = texgetw2 (text); int elementFormatVersion; my at [i] = (Daata) Thing_newFromClassName (className.peek(), & elementFormatVersion).releaseToAmbiguousOwner(); my size ++; if (! Thing_isa (my at [i], classDaata) || ! Data_canReadText (my at [i])) Melder_throw (U"Cannot read item of class ", Thing_className (my at [i]), U" in collection."); autostring32 objectName = texgetw2 (text); Thing_setName (my at [i], objectName.peek()); Data_readText (my at [i], text, elementFormatVersion); } } }
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); } } }