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); } } }
void structWordList :: v_readBinary (FILE *f) { wchar *current, *p; int kar = 0; length = bingeti4 (f); if (length < 0) Melder_throw ("Wrong length ", length, "."); string = Melder_calloc (wchar, length + 1); p = current = string; if (length > 0) { /* * Read first word. */ for (;;) { if (p - string >= length - 1) break; kar = fgetc (f); if (kar == EOF) Melder_throw (L"Early end of file."); if (kar >= 128) break; *p ++ = kar; } *p ++ = '\n'; /* * Read following words. */ for (;;) { wchar *previous = current; int numberOfSame = kar - 128; current = p; wcsncpy (current, previous, numberOfSame); p += numberOfSame; for (;;) { if (p - string >= length - 1) break; kar = fgetc (f); if (kar == EOF) Melder_throw (L"Early end of file."); if (kar >= 128) break; *p ++ = kar; } *p ++ = '\n'; if (p - string >= length) break; } } *p = '\0'; if (p - string != length) Melder_throw ("Length in header (", length, ") does not match lenth of string (", (long) (p - string), ")."); }