A very basic obicount
This commit is contained in:
@ -1,47 +0,0 @@
|
|||||||
/****************************************************************************
|
|
||||||
* OBIColumn header file *
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @file obicolumn.h
|
|
||||||
* @author Celine Mercier
|
|
||||||
* @date 12 May 2015
|
|
||||||
* @brief Header file for the shared elements of all the OBIColumn structures.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef OBICOLUMN_H_
|
|
||||||
#define OBICOLUMN_H_
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief enum OBIDataType for the data type of the OBIColumns.
|
|
||||||
*/
|
|
||||||
|
|
||||||
typedef enum OBIDataType {
|
|
||||||
OBI_VOID = 0, /**< data type not specified */
|
|
||||||
OBI_INT32, /**< type int32_t */
|
|
||||||
OBI_INT64, /**< type int64_t */
|
|
||||||
OBI_UINT32, /**< type uint32_t */
|
|
||||||
OBI_UNIT64, /**< type uint64_t */
|
|
||||||
OBI_STRING /**< type char* */
|
|
||||||
} OBIDataType_t, *OBIDataType_p;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief OBIColumnHeader structure.
|
|
||||||
*/
|
|
||||||
|
|
||||||
typedef struct OBIColumnHeader {
|
|
||||||
bool endyan_byte_order; /**< endyan byte order */
|
|
||||||
int header_size_value; /**< size of the header: a multiple of PAGESIZE */
|
|
||||||
int line_count; /**< number of lines of data */
|
|
||||||
OBIDataType_t data_type; /**< type of the data */
|
|
||||||
char* creation_date; /**< date of creation of the file */
|
|
||||||
int version; /**< version of the OBIColumn */
|
|
||||||
char* comments; /**< comments */>
|
|
||||||
} OBIIntColumn_t, *OBIIntColumn_p;
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* OBICOLUMN_H_ */
|
|
18
src/obicount/Makefile
Normal file
18
src/obicount/Makefile
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
CC = gcc
|
||||||
|
CFLAGS = -c -Wall
|
||||||
|
LDFLAGS =
|
||||||
|
SOURCES = obicount.c ../obidmscolumn.c
|
||||||
|
OBJECTS = $(SOURCES:.c=.o)
|
||||||
|
EXECUTABLE = obicount
|
||||||
|
|
||||||
|
all: $(SOURCES) $(EXECUTABLE)
|
||||||
|
|
||||||
|
$(EXECUTABLE): $(OBJECTS)
|
||||||
|
$(CC) $(LDFLAGS) $(OBJECTS) -o $@
|
||||||
|
|
||||||
|
.c.o:
|
||||||
|
$(CC) $(CFLAGS) $< -o $@
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm *o
|
||||||
|
rm $(EXECUTABLE)
|
87
src/obicount/obicount.c
Normal file
87
src/obicount/obicount.c
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <sys/mman.h> /* mmap() is defined in this header */
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
|
||||||
|
#include "../obitypes.h"
|
||||||
|
#include "../obidmscolumn.h"
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Computes the size to map.
|
||||||
|
*
|
||||||
|
* * @param OBIDMSColumn_file The file to map.
|
||||||
|
* @return The size to map.
|
||||||
|
*/
|
||||||
|
int get_size_to_map(int OBIDMSColumn_file)
|
||||||
|
// compute size to map : file size minus size of the header
|
||||||
|
{
|
||||||
|
int size;
|
||||||
|
struct stat s;
|
||||||
|
|
||||||
|
fstat(OBIDMSColumn_file, &s);
|
||||||
|
size = (s.st_size) - HEADER_SIZE;
|
||||||
|
return(size);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Computes and prints the total number of sequences by summing their counts.
|
||||||
|
*
|
||||||
|
* * @param The count file.
|
||||||
|
*/
|
||||||
|
int main(int argc, char const *argv[])
|
||||||
|
{
|
||||||
|
char* map;
|
||||||
|
int size;
|
||||||
|
int OBIDMSColumn_file;
|
||||||
|
int count;
|
||||||
|
char c;
|
||||||
|
char num_str[10] = "";
|
||||||
|
int num_int;
|
||||||
|
int i,j;
|
||||||
|
|
||||||
|
// initialize variables
|
||||||
|
OBIDMSColumn_file = open(argv[1], O_RDONLY); //read only
|
||||||
|
count = 0;
|
||||||
|
j = 0;
|
||||||
|
|
||||||
|
// compute size to map
|
||||||
|
size = get_size_to_map(OBIDMSColumn_file);
|
||||||
|
|
||||||
|
// map the data
|
||||||
|
map = obi_map_read_only(OBIDMSColumn_file, HEADER_SIZE, size);
|
||||||
|
|
||||||
|
// sum the counts
|
||||||
|
for (i=0; i<size; i++)
|
||||||
|
{
|
||||||
|
c = map[i];
|
||||||
|
|
||||||
|
if (c != SEPARATOR) // reading lines
|
||||||
|
{
|
||||||
|
num_str[j] = c;
|
||||||
|
j++;
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (c == SEPARATOR) // end of a line
|
||||||
|
{
|
||||||
|
num_int = atoi(num_str); // turn number from character string to int
|
||||||
|
count = count + num_int; // add the number to the sum
|
||||||
|
j = 0;
|
||||||
|
num_str[j] = '\0';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// print the final count of sequences
|
||||||
|
fprintf(stderr, "Sequence count = %d\n", count);
|
||||||
|
|
||||||
|
// unmap
|
||||||
|
obi_unmap(size);
|
||||||
|
|
||||||
|
// close file
|
||||||
|
close(OBIDMSColumn_file);
|
||||||
|
|
||||||
|
return(0);
|
||||||
|
}
|
46
src/obidmscolumn.c
Normal file
46
src/obidmscolumn.c
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
* OBIDMSColumn functions *
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file obidmscolumn.h
|
||||||
|
* @author Celine Mercier
|
||||||
|
* @date 22 May 2015
|
||||||
|
* @brief Functions for the shared elements of all the OBIColumn structures.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <sys/mman.h> /* mmap() is defined in this header */
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Reads a memory block from a file.
|
||||||
|
*
|
||||||
|
* * @param file The file that should be mapped.
|
||||||
|
* * @param size The number of bytes that should be mapped.
|
||||||
|
* * @param start The position at which the mapping should start.
|
||||||
|
* @return A pointer on the first element of the block.
|
||||||
|
*/
|
||||||
|
char* obi_map_read_only(int file, int start, int size)
|
||||||
|
{
|
||||||
|
char* map;
|
||||||
|
map = (char*) mmap(0, size, PROT_READ, MAP_PRIVATE, file, start);
|
||||||
|
if (map == MAP_FAILED)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "\nmmap read-only error\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
return(map);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Unmaps a memory block.
|
||||||
|
*
|
||||||
|
* * @param size The size of the block that should be unmapped.
|
||||||
|
*/
|
||||||
|
void obi_unmap(int size)
|
||||||
|
{
|
||||||
|
munmap(0, size);
|
||||||
|
}
|
63
src/obidmscolumn.h
Normal file
63
src/obidmscolumn.h
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
* OBIDMSColumn header file *
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file obidmscolumn.h
|
||||||
|
* @author Celine Mercier
|
||||||
|
* @date 12 May 2015
|
||||||
|
* @brief Header file for the shared elements of all the OBIColumn structures.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef OBIDMSCOLUMN_H_
|
||||||
|
#define OBIDMSCOLUMN_H_
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
#include "obitypes.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Value separator in OBIDMSColumn files.
|
||||||
|
*/
|
||||||
|
static const char SEPARATOR = '\n';
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Header size in OBIDMSColumn files.
|
||||||
|
*/
|
||||||
|
static const int HEADER_SIZE = 4096;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Number of bytes to map
|
||||||
|
*/
|
||||||
|
static const int BUFFER_SIZE = 4;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief OBIColumnHeader structure.
|
||||||
|
*/
|
||||||
|
|
||||||
|
typedef struct OBIDMSColumnHeader {
|
||||||
|
bool endyan_byte_order; /**< endyan byte order */
|
||||||
|
int header_size_value; /**< size of the header: a multiple of PAGESIZE */
|
||||||
|
bool file_status; /**< file status : 0 is Open and 1 is Closed */
|
||||||
|
pid_t PID; /**< PID of the process that created the file and is
|
||||||
|
the only one allowed to modify it if it is open */
|
||||||
|
int line_count; /**< number of lines of data */
|
||||||
|
OBIType_t data_type; /**< type of the data */
|
||||||
|
char* creation_date; /**< date of creation of the file */
|
||||||
|
int version; /**< version of the OBIColumn */
|
||||||
|
char* comments; /**< comments */
|
||||||
|
} OBIDMSColumnHeader_t, *OBIDMSColumnHeader_p;
|
||||||
|
|
||||||
|
|
||||||
|
char* obi_map_read_only(int file, int start, int size);
|
||||||
|
|
||||||
|
void obi_unmap(int size);
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* OBIDMSCOLUMN_H_ */
|
@ -1,81 +0,0 @@
|
|||||||
/****************************************************************************
|
|
||||||
* OBIIntColumn header file *
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @file obiintcolumn.h
|
|
||||||
* @author Celine Mercier
|
|
||||||
* @date 11 May 2015
|
|
||||||
* @brief Header file for the OBIIntColumn structure.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef OBIINTCOLUMN_H_
|
|
||||||
#define OBIINTCOLUMN_H_
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
#include "obicolumn.h"
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief OBIIntColumn stucture.
|
|
||||||
*/
|
|
||||||
|
|
||||||
typedef struct OBIIntcolumn {
|
|
||||||
|
|
||||||
} OBIIntColumn_t, *OBIIntColumn_p;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Reads a memory block from an OBIIntColumn file.
|
|
||||||
*
|
|
||||||
* @param OBIIntColumn The OBIColumn that should be read.
|
|
||||||
* @return A pointer on the first element of the block.
|
|
||||||
*/
|
|
||||||
|
|
||||||
int* readMemoryBlock(int* OBIIntcolumn, int startingPosition, int memoryBlockSize);
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Writes a memory block line by line at the end of a file.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void writeMemoryBlock(int* OBIIntcolumn, int memoryBlockSize, char* fileName);
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Returns one line of an OBIColumn.
|
|
||||||
*/
|
|
||||||
|
|
||||||
int readLine(int line);
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Creates a new file for a new version of the OBIColumn.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void newColumn(OBIIntcolumn* column);
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief malloc for OBIIntColumn.
|
|
||||||
*/
|
|
||||||
|
|
||||||
int* OBIIntMalloc();
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief realloc for OBIIntColumn.
|
|
||||||
*/
|
|
||||||
|
|
||||||
int* OBIIntRealloc();
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief free for OBIIntColumn.
|
|
||||||
*/
|
|
||||||
|
|
||||||
void OBIIntFree();
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* OBIINTCOLUMN_H_ */
|
|
50
src/obitypes.h
Normal file
50
src/obitypes.h
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
* OBITypes header file *
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file obitypes.h
|
||||||
|
* @author Celine Mercier
|
||||||
|
* @date 18 May 2015
|
||||||
|
* @brief Header file for the OBITypes.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef OBITYPES_H_
|
||||||
|
#define OBITYPES_H_
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#define OBIInt_NA (INT32_MIN)
|
||||||
|
#define OBIFloat_NA (NAN)
|
||||||
|
#define OBIIdx_NA (SIZE_MAX)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief enum for the boolean OBIType.
|
||||||
|
*/
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
FALSE = 0,
|
||||||
|
TRUE = 1,
|
||||||
|
OBIBool_NA = 2
|
||||||
|
} OBIBool_t, *OBIBool_p; /**< a boolean true/false value */
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief enum OBITypes for the data type of the OBIColumns.
|
||||||
|
*/
|
||||||
|
|
||||||
|
typedef enum OBIType {
|
||||||
|
OBI_VOID = 0, /**< data type not specified */
|
||||||
|
OBIInt_t, /**< a signed integer value (C type : int32_t) */
|
||||||
|
OBIFloat_t, /**< a floating value (C type : double) */
|
||||||
|
OBIChar_t, /**< a character (C type : char) */
|
||||||
|
OBIIdx_t /**< an index in a data structure (C type : size_t) */
|
||||||
|
} OBIType_t, *OBIType_p;
|
||||||
|
|
||||||
|
typedef int32_t obiint_t;
|
||||||
|
typedef double obifloat_t;
|
||||||
|
typedef char obichar_t;
|
||||||
|
typedef size_t obiidx_t;
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* OBITYPES_H_ */
|
Reference in New Issue
Block a user