/*
 * recenteditor_data.c
 *
 * A programmers editor
 *
 * Structures to hold the current file contents.
 *
 * HEADER FILE
 *
 * Author: Dario Rodriguez dario@softhome.net
 * This program is licensed under the terms of GNU GPL v2.1+
 */

#include <limits.h>

typedef struct whatin_t {
        int nlcount;
} whatin_t;

typedef struct rechunk_t {
        whatin_t whatin;
        int whatin_fresh;
        int useddata;
        unsigned char data[1];
} rechunk_t;

typedef struct undo_t {
        char type[5];
        int off;
        int len;
} undo_t;

typedef struct redata_t {
        /* data */
        int chunkdatasize;
        int sizechunks;
        rechunk_t **chunks;
        int available;
        rechunk_t *tmpchunk;
        /* undo */
        int sizeundo;
        int usedundo;
        int curundo;
        undo_t *undo;
        int sizeundobuf;
        int usedundobuf;
        char *undobuf;
        /* unsaved (for recovery when the program closes unexpectedly) */
        char filename[PATH_MAX];
        char initialhash[129];
        int unsavedfd;
        int flag_unsaveddata;
} redata_t;

#warning TODO: undo operations log/buffer, add/remove/move text funtions

redata_t *redata_init(void);
void redata_free(redata_t *redata);

int redata_config_chunkdatasize(redata_t *redata, int chunkdatasize);

int redata_getsize(redata_t *redata);
int redata_getused(redata_t *redata);
int redata_getavailable(redata_t *redata);
int redata_getused(redata_t *redata);
int redata_getposptr(redata_t *redata, int pos, int *numchunk, int *offset);

int redata_wipe(redata_t *redata);
int redata_preallocate(redata_t *redata, int size);
int redata_chunk_movedata(redata_t *redata, int chunkfrom, int posfrom, int chunkto, int posto, int size);
int redata_fill_whatin(redata_t *redata, int chunkno);
int redata_fix_nl(redata_t *redata, int chunkno);

int redata_unsaved_exists(redata_t *redata, char *filename);
int redata_unsaved_check(redata_t *redata, char *filename);
int redata_unsaved_loadappend(redata_t *redata);
int redata_unsaved_unlink(redata_t *redata);
int redata_unsaved_trunc(redata_t *redata);
int redata_unsaved_add(redata_t *redata, undo_t *undo);
int redata_unsaved_unadd(redata_t *redata, undo_t *undo);

int redata_load(redata_t *redata, char *filename, int use_unsaved);
int redata_save(redata_t *redata, char *filename);

int redata_op_add(redata_t *redata, char *buf, int sizebuf, int pos);
int redata_op_del(redata_t *redata, int pos, int size);
int redata_op_move(redata_t *redata, int posorig, int size, int posdest);
int redata_op_undo(redata_t *redata);
int redata_op_redo(redata_t *redata);

int redata_commit_unsaved(redata_t *redata);

int redata_hash(redata_t *redata, char *resbuf129bytes);
int redata_filehash(redata_t *redata, char *filename, char *resbuf129bytes);
int redata_memhash(redata_t *redata, char *buf, int buflen, char *resbuf129bytes);