Now I am near a solution, something like this:

(doesnot yet have error checking everywhere, no get_line() so far, ...)


somewhere in program:

#include "preload.h"

int n_preload_file1, n_preload_file2;
int data = 0;

n_preload_file1 = preload_file("file1.txt");
n_preload_file2 = preload_file("file2.txt");


printf("file0: n=%d s=%ld\n", n_preload_file1, preload_get_size(n_preload_file1)); printf("file1: n=%d s=%ld\n", n_preload_file2, preload_get_size(n_preload_file2));

while(data != EOF) {
    data = preload_get_byte(n_preload_file1);
    printf("%c", (char)data);
}

preload_free_all();



PRELOAD.H:
#ifndef __PRELOAD_H__
#define __PRELOAD_H__

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <inttypes.h>
#include <fcntl.h>
#include <io.h>

int preload_file(char *filename);
void preload_free_all(void);

int preload_get_byte(int file_n);
void preload_rewind(int file_n);
int32_t preload_get_size(int file_n);

#endif // __PRELOAD_H__



PRELOAD.C:
#include "preload.h"

/* maximum number of preloaded files */
#define PRELOAD_MAX 32

/* here we store preloaded files + status information */
static uint8_t *preload_ptr[PRELOAD_MAX];
static uint32_t preload_ptr_position[PRELOAD_MAX];
static int32_t  preload_file_size[PRELOAD_MAX];
static int      next_preload_ptr = 0;

static int32_t filesize(char *filename);

int preload_get_byte(int file_n) {
    uint8_t data;
    uint32_t pos;

    /* is memory pointer already at end of buffer? */
    if(preload_file_size[file_n] == preload_ptr_position[file_n]) {
        return EOF;
    }

    pos = preload_ptr_position[file_n];
    data = preload_ptr[file_n][pos];

    preload_ptr_position[file_n]++;

    return data;
}

int preload_file(char *filename) {
    FILE *f;
    int data = 0;
    int32_t fs = -1, i = 0;

    fs = filesize(filename);
    if(fs == -1) {  // error opening file
        return -1;
    }

    preload_ptr[next_preload_ptr] = (uint8_t *)malloc((size_t)fs);
    if(preload_ptr[next_preload_ptr] == NULL) {     // error requesting memory
        return -2;
    }

    /* copy file to memory */
    f = fopen(filename, "r");
    while(data != EOF) {
        data = fgetc(f);
        preload_ptr[next_preload_ptr][i] = (uint8_t)data;
        i++;
    }
    fclose(f);

    preload_ptr_position[next_preload_ptr] = 0;
    preload_file_size[next_preload_ptr] = fs;

    next_preload_ptr++;

    /* return the index in pointer array, where file is stored */
    return next_preload_ptr-1;
}

void preload_free_all(void) {
    int i;
    for(i = 0; i < PRELOAD_MAX-1; i++) {
        free(preload_ptr[i]);
    }
}

void preload_rewind(int file_n) {
    preload_ptr_position[file_n] = 0;
}

int32_t preload_get_size(int file_n) {
    return preload_file_size[file_n];
}

static int32_t filesize(char *filename) {
    int handle, rc;
    struct stat buf;

    handle = open(filename, O_RDONLY);
    if( handle != -1 ) {
        rc = fstat(handle, &buf);
        if(rc != -1) {
            close(handle);
            return buf.st_size;
        }
    }
    return -1;
}



_______________________________________________
Freedos-user mailing list
Freedos-user@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/freedos-user

Reply via email to