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