#include <fcntl.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/mman.h>
#include <unistd.h>

// r file memory
typedef struct rfm_t {
    char path[4096];
    void *data;
    size_t size;
    long ptr;
    FILE *f;
    int fd;
} rfm_t;

rfm_t rfm;
bool _initialized = false;

void rfm_destroy(rfm_t *r) {
    if (munmap(r->data, r->size) == -1) {
        perror("munmap");
        exit(EXIT_FAILURE);
    }
    close(rfm.fd);
}

void *falloc(size_t s) {
    rfm_t *rr = &rfm;

    printf("hier\n");
    char *data = (char *)rr->data + rfm.ptr;
    // data+= rfm.ptr;
    rfm.ptr += s;
    return data;
}

void *finit(char *path, size_t size) {

    printf("HIERR\n");
    if (!_initialized) {
        rfm.ptr = 0;
        _initialized = true;
        rfm.size = size;

        printf("HIERR\n");
        memset(&rfm, 0, sizeof(rfm_t));
        rfm.size = size;
        rfm.ptr = 0;

        printf("HIERR\n");
        // rfm.fd = open(path, O_RDWR);
        // ftruncate(rfm.fd, size);

        if (path) {
            printf("HIERR\n");
            rfm.path[0] = 0;
            strcpy(rfm.path, path);
            // creat(path,F_)
            rfm.fd = open(path, O_RDWR);
            printf("OPEN %s\n", path);
        }
        if (!path) {
            rfm.f = tmpfile();
            rfm.fd = fileno(rfm.f);
        }
        // if (ftruncate(rfm.fd, size) == -1)
        // {
        //    perror("ftruncate");
        //        exit(EXIT_FAILURE);
        //   }
        // rfensurefile(path,1024*1024);
        rfm.data = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, rfm.fd, 0);
        printf("HIERR\n");
    }
    /*
    if (rfm.data == MAP_FAILED)
    {
        perror("mmap");
        exit(EXIT_FAILURE);
    }
    char *data = (char *)rfm.data;
    printf(data);
    if (munmap(rfm.data, size) == -1)
    {
        perror("munmap");
        exit(EXIT_FAILURE);
    }
    fclose(rfm.f);
    */
}
int main() {
    // Step 1: Create a temporary file
    finit("tast.dat", 1024 * 1024 * 100);
    printf("gaa\n");
    char *data = (char *)falloc(10);
    strcpy(data, "ab");
    char *data2 = (char *)falloc(30);
    strcpy(data2, "ff\n");

    // for(int i = 0; i < 333333; i++)
    //  strcat(data,"ggggggggggggggggg");

    printf("%s\n", data);

    // printf("%s\n",data);;

    // strcpy(data2,"aaaa");

    return 0;
}