WiscSort / utils / offsetParser.cc
offsetParser.cc
Raw
#include <unistd.h>
#include <stdint.h>
#include <iostream>
#include <fcntl.h>
#include <sys/stat.h>
#include <assert.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <algorithm>
#include <cstring>

#define INDEX_SIZE 5

// Prints if an offset is not alligned to 100B


uint64_t ConvertHexToRoff(uint8_t *bytes)
{
    uint64_t tmp = 0;
    for (int i = INDEX_SIZE - 1; i >= 0; --i)
    {
        tmp |= (uint64_t(bytes[i]) << i * 8);
    }
    return tmp;
}

int main(int argc, char** argv)
{
    int fd = open(argv[1], O_RDWR | O_DIRECT);
    if (fd < 0)
    {
        printf("Couldn't open input file %s: %s\n", argv[1], strerror(errno));
        exit(1);
    }
    struct stat st;
    stat(argv[1], &st);

    char* mapped_buffer = (char *)mmap(NULL, st.st_size, PROT_READ,
                                       MAP_SHARED, fd, 0);
    if (mapped_buffer == MAP_FAILED)
    {
        printf("Failed to mmap read file of size %lu: %s\n",
               st.st_size, strerror(errno));
        return -1;
    }

    for(size_t idx = 0; idx < st.st_size; idx+= 15)
    {
        size_t tmp = ConvertHexToRoff((uint8_t *) (mapped_buffer + idx + 10));
        if (tmp % 100) {
            for(int i=0; i<10; i++)
                printf("%x ", mapped_buffer[idx+i]);
            printf(" = ");
            for(int i =10; i< 15; i++)
                printf("%x ", mapped_buffer[idx+i]);
            printf(" = ");
            printf("%lu \n", tmp);
        }
    }
}