autoDaata Data_readFromFile (MelderFile file) { int nread, i; char header [513]; autofile f = Melder_fopen (file, "rb"); nread = fread (& header [0], 1, 512, f); f.close (file); header [nread] = 0; /***** 1. Is this file a text file as defined in Data.cpp? *****/ if (nread > 11) { char *p = strstr (header, "TextFile"); if (p && p - header < nread - 8 && p - header < 40) return Data_readFromTextFile (file); } if (nread > 22) { char headerCopy [101]; memcpy (headerCopy, header, 100); headerCopy [100] = '\0'; for (i = 0; i < 100; i ++) if (headerCopy [i] == '\0') headerCopy [i] = '\001'; char *p = strstr (headerCopy, "T\001e\001x\001t\001F\001i\001l\001e"); if (p && p - headerCopy < nread - 15 && p - headerCopy < 80) return Data_readFromTextFile (file); } /***** 2. Is this file a binary file as defined in Data.cpp? *****/ if (nread > 13) { char *p = strstr (header, "BinaryFile"); if (p && p - header < nread - 10 && p - header < 40) return Data_readFromBinaryFile (file); } /***** 3. Is this file of a type for which a recognizer has been installed? *****/ MelderFile_getParentDir (file, & Data_directoryBeingRead); for (i = 1; i <= numFileTypeRecognizers; i ++) { autoDaata object = fileTypeRecognizers [i] (nread, header, file); if (object) { if (object -> classInfo == classDaata) // dummy object? the recognizer could have had a side effect, such as drawing a picture return autoDaata (); return object; } } /***** 4. Is this a common text file? *****/ for (i = 0; i < nread; i ++) if (header [i] < 32 || header [i] > 126) // not ASCII? break; if (i >= nread) return Data_readFromTextFile (file); Melder_throw (U"File ", file, U" not recognized."); }
Any Data_readFromFile (MelderFile file) { int nread, i; char header [513]; autofile f = Melder_fopen (file, "rb"); nread = fread (& header [0], 1, 512, f); f.close (file); header [nread] = 0; /***** 1. Is this file a text file as defined in Data.cpp? *****/ if (nread > 11) { char *p = strstr (header, "TextFile"); if (p != NULL && p - header < nread - 8 && p - header < 40) return Data_readFromTextFile (file); } if (nread > 22) { char headerCopy [101]; memcpy (headerCopy, header, 100); headerCopy [100] = '\0'; for (i = 0; i < 100; i ++) if (headerCopy [i] == '\0') headerCopy [i] = '\001'; char *p = strstr (headerCopy, "T\001e\001x\001t\001F\001i\001l\001e"); if (p != NULL && p - headerCopy < nread - 15 && p - headerCopy < 80) return Data_readFromTextFile (file); } /***** 2. Is this file a binary file as defined in Data.cpp? *****/ if (nread > 13) { char *p = strstr (header, "BinaryFile"); if (p != NULL && p - header < nread - 10 && p - header < 40) return Data_readFromBinaryFile (file); } /***** 3. Is this file of a type for which a recognizer has been installed? *****/ MelderFile_getParentDir (file, & Data_directoryBeingRead); for (i = 1; i <= numFileTypeRecognizers; i ++) { Data object = (Data) fileTypeRecognizers [i] (nread, header, file); if (object == (Data) 1) return NULL; if (object) return object; } /***** 4. Is this a common text file? *****/ for (i = 0; i < nread; i ++) if (header [i] < 32 || header [i] > 126) /* Not ASCII? */ break; if (i >= nread) return Data_readFromTextFile (file); Melder_throw ("File ", file, " not recognized."); }