#include "Util/utils.h" #include #include void free_work(Work_t* work) { free(work->inputFileName); free(work->ranks); free(work); } void free_result(Result_t* result) { free(result->medoids_ID); free(result->medoids_ranks); free(result); } char readInt(FILE* stream, int64_t* integer) { *integer = 0; char curChar = fgetc(stream); int sign = (curChar == '-' ? -1 : 1); while (curChar < '0' || curChar > '9') curChar = fgetc(stream); ungetc(curChar, stream); while ((curChar = fgetc(stream)) >= '0' && curChar <= '9') *integer = 10 * (*integer) + (int64_t) (curChar - '0'); (*integer) *= sign; return curChar; } char readReal(FILE* stream, float* real) { int64_t integerPart; char nextChar = readInt(stream, &integerPart); int64_t fractionalPart = 0; int countZeros = 0; if (nextChar == '.') { //need to count zeros while ((nextChar = fgetc(stream)) == '0') countZeros++; if (nextChar >= '0' && nextChar <= '9') { ungetc(nextChar, stream); nextChar = readInt(stream, &fractionalPart); } } int64_t exponent = 0; if (nextChar == 'e' || nextChar == 'E') nextChar = readInt(stream, &exponent); int64_t divisorForFractional = pow(10, floor(log10(fractionalPart > 0 ? fractionalPart : 1))+1); *real = ( (float)integerPart + (integerPart < 0 ? -1 : 1) * (float)fractionalPart/(divisorForFractional*pow(10,countZeros)) ) * pow(10,exponent); return nextChar; } // convert n-bytes binary integers to uint32_t uint32_t bInt_to_uint(Byte* pInteger) { uint32_t res; memcpy(&res, pInteger, 4); return res; } // serialize integers void write_int(uint32_t x, Byte* buffer) { union { uint32_t i; char bytes[4]; } u; u.i = x; for (size_t i = 0; i < 4; i++) buffer[i] = u.bytes[i]; } //WARNING: assuming float is 32bits... // convert 4-bytes binary float to float float bReal_to_float(Byte* pFloat) { float res; memcpy(&res, pFloat, 4); return res; } //WARNING: assuming float is 32bits... // serialize double with a NON-portable bytes order void write_real(float x, Byte* buffer) { union { float d; char bytes[4]; } u; u.d = x; for (size_t i = 0; i < 4; i++) buffer[i] = u.bytes[i]; } // Expected size of a Work message in bytes: uint32_t get_packedWork_length(uint32_t nbSeriesInChunk) { return NCHAR_FNAME + 4 + 4*nbSeriesInChunk + 4 + 4 + 4; } // Expected size of a Result message in bytes: (uint32_t is on 4 bytes) uint32_t get_packedResult_length(uint32_t nbClusters) { return 4 + 4 * nbClusters + 4 * nbClusters; } // get metadata: nbSeries uint32_t get_nbSeries(const char* ifileName) { FILE* ifile = fopen(ifileName, "rb"); fseek(ifile, 0, SEEK_SET); Byte binaryInt[4]; size_t lengthRead = fread(binaryInt, 4, 1, ifile); if (lengthRead != 1) fprintf(stderr,"Warning: getting nbSeries from truncated binary file.\n"); fclose(ifile); return bInt_to_uint(binaryInt); } // get metadata: tsLength uint32_t get_tsLength(const char* ifileName) { FILE* ifile = fopen(ifileName, "rb"); fseek(ifile, 4, SEEK_SET); Byte binaryInt[4]; size_t lengthRead = fread(binaryInt, 4, 1, ifile); if (lengthRead != 1) fprintf(stderr,"Warning: getting tsLength from truncated binary file.\n"); fclose(ifile); return bInt_to_uint(binaryInt); }