#ifndef LineAccessorF_h #define LineAccessorF_h #include "LineAccessorFFortTrans.h" #include "LineAccessor.h" #include #include using namespace std; /** * @file * This is a C interface that allows fortran code to call public methods of a LineAccessor object. * The functions name in fortran will be the same except for the suffix "_f" that needs to be removed. * Moreover each function "func(args)" will be invoked from fortran using the syntax: call func(args). * The correspondence between C and fortran data types is: * - uint64_t * <--> integer*8. * - char * <--> character*X (X integer number). * - int * <--> integer or integer*4. * @see LineAccessor.cpp **/ extern "C" { /** * Creates a LineAccessor object. The address of the object is stored in (*ptLineAccessor) and returned to fortran. Each subsequent call in fortran to access methods of this object needs to pass this value as first argument. * @param ptLineAccessor: the value (*ptLineAccessor) is the address of the LineAccessor object just created. **/ void getLineAccessorObject_f(uint64_t * ptLineAccessor); /** * Returns the endianness of the machine running the code. Does not require that initLineAccessor() be called * before execution. * @param ptLineAccessor the value (*ptLineAccessor) is the address of the LineAccessor object. * @param endian it is set to 'b' for big endian or 'l' for little endian. **/ void getMachineEndianness_f(uint64_t * ptLineAccessor, char * endian); /** * Initializes LineAccessor object. * @param ptLineAccessor the value (*ptLineAccessor) is the address of the LineAccessor object. * @param filename name of the file to be accessed. * @param filemode access mode of the file. * @param endianFile endiannes of the data stored in the file. Values are 'b' or 'B' for big endian and 'l' or 'L' for little endian. * @param type file data type. * @param row pointer to number of rows of the buffer tile. Set it to one if no tiling is desired. * @param col pointer to number of columns of the buffer tile. It must be equal to the number of columns of the associated file. * @see printAvailableDataTypesAndSizes_f(). * @see LineAccessor::AccessMode. * @see LineAccessor::FileDataType. **/ void initLineAccessor_f(uint64_t * ptLineAccessor, char * filename, char * filemode, char * endianFile, char * type, int * row, int * col, long int filenameLenght, long int filemodeLength, long int pass, long int typeLength); /** * Changes the file format from BandSchemeIn to BandSchemeOut. Possible formats are BSQ = 1 BIP = 2 and BIL = 3. Does not require that initLineAccessor() be called * before execution. * \note When calling the function from fortran only the parameters listed in the \b Parameters section need to be passed. * The remaining arguments are hidden parameters that correspond to the lengths of the char * passed. * @param ptLineAccessor the value (*ptLineAccessor) is the address of the LineAccessor object. * @param filein input filename. * @param fileout output filename. * @param type variable type (FLOAT, INT etc). * @param width pointer to number of columns in the file. * @param numBands pointer to number of bands for the interleaved schemes. * @param bandIn the value (*bandIn) is the input interleaved scheme. * @param bandOut the value (*bandOut) is the output interleaved scheme. * @see printAvailableDataTypesAndSizes_f(). * @see initLineAccessor_f(). **/ void changeBandScheme_f(uint64_t * ptLineAccessor, char * filein, char * fileout, char * type, int * width, int * numBands, int * bandIn, int * bandOut, long int fileinLength, long int fileoutLength, long int typeLength); /** * Changes the file endiannes. Does not require that initLineAccessor() be called * before execution. * \note When calling the function from fortran only the parameters listed in the \b Parameters section need to be passed. * The remaining arguments are hidden parameters that correspond to the lengths of the char * passed. * @param ptLineAccessor the value (*ptLineAccessor) is the address of the LineAccessor object. * @param filein input filename. * @param fileout output filename. * @param type variable type (FLOAT, INT etc). * @see printAvailableDataTypesAndSizes_f(). **/ void convertFileEndianness_f(uint64_t * ptLineAccessor,char * filein, char * fileout, char * type, long int fileinLength, long int fileoutLength, long int typeLength); /** * Always call this function if a LineAccessor object was created. It deletes the pointer to the object, closes the file associated with the object, frees memory and * possibly flushes unfilled buffer tiles to disk. * @param ptLineAccessor the value (*ptLineAccessor) is the address of the LineAccessor object. * @see getLineAccessorObject_f(). **/ void finalizeLineAccessor_f(uint64_t * ptLineAccessor); /** * For a file object opened in write or writeread mode it creates a blank file of size LineSize*(*lenght). * @param ptLineAccessor the value (*ptLineAccessor) is the address of the LineAccessor object. * @param length the value (*length) is the number of lines in the file. * @see LineAccessor::LineSize. **/ void createFile_f(uint64_t * ptLineAccessor,int * length); /** * Reset some class variable so that the image can be reused. If one wants to use the same image wit different access mode, then create a new object with the new access mode. * **/ void rewindImage_f(uint64_t * ptLineAccessor); /** * Set the initial line to use getLineSequential_f(). * @param ptLineAccessor the value (*ptLineAccessor) is the address of the LineAccessor object. * @param begLine the value (*begLine) is the initial line. Default is one. * @see getLineSequential_f(). **/ void initSequentialAccessor_f(uint64_t * ptLineAccessor, int * begLine); /** * Prints the available data types and their sizes. * Does not require that initLineAccessor_f() be called. * @param ptLineAccessor the value (*ptLineAccessor) is the address of the LineAccessor object. **/ void printAvailableDataTypesAndSizes_f(uint64_t * ptLineAccessor); /** * Provides the size of the file datatype. * \note When calling the function from fortran only the parameters listed in the \b Parameters section need to be passed. * The remaining arguments are hidden parameters that correspond to the lengths of the char * passed. * @param ptLineAccessor the value (*ptLineAccessor) is the address of the LineAccessor object. * @param type data type. * @param size the value (*size) contains the size of the data type. **/ void getTypeSize_f(uint64_t * ptLineAccessor, char * type, int * size, long int len); /** * Provides the number of columns of the file associated with the accessor object. * @param ptLineAccessor the value (*ptLineAccessor) is the address of the LineAccessor object. * @param lineWidth the value (*lineWidth) contains the file width. **/ void getFileWidth_f(uint64_t * ptLineAccessor, int * lineWidth); /** * Provides the number of lines of the file associated with the accessor object. * @param ptLineAccessor the value (*ptLineAccessor) is the address of the LineAccessor object. * @param length the value (*length) contains the file lenght. **/ void getFileLength_f(uint64_t * ptLineAccessor, int * length); /** * Prints a series of information related to the file associated with the accessor. * @param ptLineAccessor the value (*ptLineAccessor) is the address of the LineAccessor object. **/ void printObjectInfo_f(uint64_t * ptLineAccessor); /** For each call it sets a line from the dataLine character array to the associated file object starting from a given line. The starting line is * set using initSequentialAccessor(). The default starting line is one. * @param ptLineAccessor the value (*ptLineAccessor) is the address of the LineAccessor object. * @param dataLine character array containing the data to be set. * @see getLineSequential_f(). * @see initSequentialAccessor_f(). **/ void setLineSequential_f(uint64_t * ptLineAccessor, char * dataLine); /** * Gets the line at position (*row) from the associated file object and puts it in the * character array dataLine. * @param ptLineAccessor the value (*ptLineAccessor) is the address of the LineAccessor object. * @param dataLine character array where read data are put. * @param row the value (*row) is the line number in the file. If the line is out of bounds then (*row) = -1. **/ void getLine_f(uint64_t * ptLineAccessor,char * dataLine, int * row); /** * Sets (*numEl) elements from the associated file object. The first access is at the beginning of the file. All the subsequent accesses are * at the next element of the last one previously accessed. * @param dataLine character array where read data are put. * @param numEl at the function call the value (*numEl) is the number of elements to be read. * @see setSteamAtPos_f(). * @see getSteamAtPos_f(). * @see getSteam_f(). **/ void setStream_f(uint64_t * ptLineAccessor, char * dataLine, int * numEl); /** * Sets (*numEl) elements from the associated file object at position (*pos). The position is in unit of the FileDataType and NOT in bytes. * @param dataLine character array where read data are put. * @param numEl at the function call the value (*numEl) is the number of elements to be read. * @see setSteamAtPos_f(). * @see getSteamAtPos_f(). * @see getSteam_f(). * @see FileDataType. **/ void setStreamAtPos_f(uint64_t * ptLineAccessor, char * dataLine, int * pos, int * numEl); /** * Gets (*numEl) elements from the associated file object. The first access is at the beginning of the file. All the subsequent accesses are * at the next element of the last one previously accessed. * @param dataLine character array where read data are put. * @param numEl at the function call the value (*numEl) is the number of elements to be read. At the return from the function call it's * the number of elements actually read. Check if (*numEl) before and after the function call differs to know when the end of file is reached. * @see getSteamAtPos_f(). * @see setSteamAtPos_f(). * @see setSteam_f(). **/ void getStream_f(uint64_t * ptLineAccessor, char * dataLine, int * numEl); /** * Gets (*numEl) elements from the associated file object at position (*pos). The position is in unit of the FileDataType and NOT in bytes. * @param dataLine character array where read data are put. * @param numEl at the function call the value (*numEl) is the number of elements to be read. At the return from the function call it's * the number of elements actually read. Check if (*numEl) before and after the function call differs to know when the end of file is reached. * @see getSteamAtPos_f(). * @see setSteamAtPos_f(). * @see setSteam_F(). **/ void getStreamAtPos_f(uint64_t * ptLineAccessor, char * dataLine, int * pos, int * numEl); /** * Sets (*numEl) elements from the character array dataLine to the associated file object starting from the position column = (*col) and row = (*row). * If the full file is not accessed sequentially (i.e. random access), make sure that the file is already created using createFile_f() and that the access mode is "readwrite". * @param ptLineAccessor the value (*ptLineAccessor) is the address of the LineAccessor object. * @param dataLine character array where the data are. * @param row the value (*row) is the row position in the file. * @param col the value (*col) is the column position int the file. * @param numEl the value (*numEl) is the number of elements to be set. * @see getSequentialElements_f(). **/ void setSequentialElements_f(uint64_t * ptLineAccessor, char * dataLine, int * row, int * col, int * numEl); /** * Puts (*numEl) elements in dataLine in the associated file object at the positions column = col[i] and row = row[i] (for the i-th element). * Make sure that the file is already created using createFile_f() and that the access mode is "readwrite". * @param ptLineAccessor the value (*ptLineAccessor) is the address of the LineAccessor object. * @param dataLine character array containing the data. * @param row array with the row positions of the elements to be set. * @param col array with the column positions of the elements to be set. * @param numEl the value (*numEl) is the number of elements to be set. * @see getElements_f(). * @see createFile_f(). * @see LineAccessor::openFile(). **/ void setElements_f(uint64_t * ptLineAccessor, char * dataLine, int * row, int * col, int * numEl); /** * Sets a line at the position (*row). * If the full file is not accessed sequentially (i.e. random access), make sure that the file is already created using createFile() and that the access mode is "readwrite". * @param ptLineAccessor the value (*ptLineAccessor) is the address of the LineAccessor object. * @param dataLine character array where the data are. * @param row the value (*row) is the line number in the file. **/ void setLine_f(uint64_t * ptLineAccessor,char * dataLine, int * row); /** * For each call it gets a line from the associated file object and puts it in the character array dataLine starting from a given line. The starting * line is set using initSequentialAccessor(). The default starting line is one. * @param ptLineAccessor the value (*ptLineAccessor) is the address of the LineAccessor object. * @param dataLine character array where read data are put. * @param eof the value (*eof) is set to -1 when the end of file is reached otherwise it give the position of the line just read. * @see setLineSequential_f(). * @see initSequentialAccessor_f(). **/ void getLineSequential_f(uint64_t * ptLineAccessor, char * dataLine, int * eof); /** * Gets (*numEl) elements from the associated file object starting from the position column = (*col) and row = (*row) and puts them in the * character array dataLine. Note the (*numEl) and (*col) refer to the particular FileDataType. Reading (*numEl) elements correspond to reading * (*numEl)*(sizeof(FileDataType)) bytes. An element at colomn (*col) starts at the byte position (*col)*(sizeof(FileDataType)) of a given row. * @param ptLineAccessor the value (*ptLineAccessor) is the address of the LineAccessor object. * @param dataLine character array where read data are put. * @param row the value (*row) is the row position. * @param col the value (*col) is the column position. * @param numEl at the function call the value (*numEl) is the number of elements to be read. At the return from the function call it's * the number of elements actually read. Check if (*numEl) before and after the function call differs to know when the end of file is reached. * @see setSequentialElements_f(). * @see LineAccessor::FileDataType. **/ void getSequentialElements_f(uint64_t * ptLineAccessor, char * dataLine, int * row, int * col, int * numEl); /** * Gets (*numEl) elements from the associated file object whose positions are at column = col[i] and row = row[i] (for the i-th element) * and puts it in the character array dataLine. Note the (*numEl) and (*col) refer to the particular FileDataType. Reading (*numEl) * elements corresponds to reading (*numEl)*(sizeof(FileDataType)) bytes. An element at colomn col[i] starts at the byte position * col[i]*(sizeof(FileDataType)) of a given row. * @param ptLineAccessor the value (*ptLineAccessor) is the address of the LineAccessor object. * @param dataLine character array where read data are put. * @param row array with the row positions of the elements to be read. * @param col array with the column positions of the elements to be read. * @param numEl at the function call the value (*numEl) is the number of elements to be read. At the return from the function call * it's the number of elements actually read. Check if (*numEl) before and after the function call differs to know when the end of file is reached. * @see setElements_f(). * @see LineAccessor::FileDataType. **/ void getElements_f(uint64_t * ptLineAccessor, char * dataLine, int * row, int * col, int * numEl); } /** Since the char * is passed from fortran where the array is not NULL terminated, it reads it up to the first blank encountered and put it into a C string. \note This function is not meant to be called from fortran. @param word character array. @param len length of the character array as decleared in the fortran code. @return \c string the array word with trailing blank removed. **/ string getString(char * word, long int len); /** Converts an integer type to the corresponding BandSchemeType. \note This function is not meant to be called from fortran. @param band band interleaved scheme of integer type. @return \c BandSchemeType band interleaved scheme of enum type. @see changeBandScheme_f(). @see BandSchemeType. **/ BandSchemeType convertIntToBandSchemeType(int band); #endif //LineAccessorF_h