rendered paste bodystatic error_t open_file(void)
{
SYM_ENTRY *sym;
char sym_buf[MAX_SYM_LEN];
char *sym_buf_ptr = sym_buf + MAX_SYM_LEN-1;
size_t size;
short *sptr = NULL;
char *ptr;
char *mounted = malloc(14*sizeof(char));
char bufsys;
unsigned short size_line = 1, Fsize_line = 0, num_line = 1;
unsigned short i = 0, j = 0;
fpos_t *orPos = malloc(sizeof(fpos_t));
sprintf(mounted, "%s\\fsys", mounted_rep);
//MODIFIED
if(filename[0] == '\\') //If true, active multidirectory mode
{
show_msg("Parsing the config file (\\sidetext\\fsys) of the file system....");
FILE *fsys;
char *bufString;
//First we look for the file system config file
fsys = fopen(mounted, "r");
if(!fsys)
return error(ERR_FILE);
if(fgetpos(fsys, orPos))
return error(ERR_FILE);
//Scan the file to have the malloc values
do
{
bufsys = fgetc(fsys);
if(bufsys != ':' && bufsys != CR) { //CR due to a weird implementation of fgetc()
size_line++;
} else if(bufsys == CR) {
num_line++;
} else {
if(size_line > Fsize_line)
Fsize_line = size_line;
size_line = 0;
}
}while(bufsys != EOF);
//Let's malloc our big stuff
FileSystem = malloc(num_line*2*Fsize_line*sizeof(char));
bufString = malloc(Fsize_line*sizeof(char));
//Check there were enough memory
if(!FileSystem)
return error(ERR_MEMORY);
//Now we can fill the char ***FileSystem
if(fsetpos(fsys, orPos))
return error(ERR_FILE);
do
{
bufsys = fgetc(fsys);
if(bufsys != ':' && bufsys != CR) { //CR due to a weird implementation of fgetc()
sprintf(bufString, "%s%c", bufString, bufsys);
} else if(bufsys == CR) {
strcpy(FileSystem[j][i], bufString);
free(bufString);
bufString = malloc(Fsize_line*sizeof(char));
j++;
i = 0;
} else {
strcpy(FileSystem[j][i], bufString);
free(bufString);
bufString = malloc(Fsize_line*sizeof(char));
i++;
}
}while(bufsys != EOF);
//char *title = malloc(3*sizeof(unsigned char));
//char *message = malloc(3*sizeof(unsigned char));
//sprintf(title, "%u", Fsize_line);
//sprintf(message, "%u", num_line);
//
//DlgMessage(title, message, BT_OK, BT_NONE);
fclose(fsys);
free(bufString);
}
DlgMessage(FileSystem[0][1], FileSystem[0][0], BT_OK, BT_NONE);
//MODFIFIED
if (TokenizeName(filename, sym_buf) != FS_OK)
return error(ERR_FILE);
if ((sym = SymFindPtr(sym_buf_ptr, 0))) {
if (*(unsigned char *) HToESI(sym->handle) != TEXT_TAG || sym->flags.bits.in_view == 1)
return error(ERR_FILE);
sym->flags.bits.in_view = 1;
sptr = HeapDeref(sym->handle);
size = *sptr - 5;
sptr += 2;
ptr = (char *) sptr;
if (!(file_ptr = malloc(size + BUF_SIZE + 1)))
return error(ERR_MEMORY);
page_ptr = curs_ptr = file_ptr;
end_ptr = gap_ptr = file_ptr + BUF_SIZE;
while (*++ptr)
if (*ptr == '\r') {
*end_ptr++ = LF;
ptr++;
} else
*end_ptr++ = *ptr;
} else if (DerefSym(SymAdd(sym_buf_ptr))) {
SymDel(sym_buf_ptr);
if (!(file_ptr = malloc(BUF_SIZE + 1)))
return error(ERR_MEMORY);
page_ptr = curs_ptr = file_ptr;
end_ptr = gap_ptr = file_ptr + BUF_SIZE;
} else
return error(ERR_FILE);
*end_ptr = EOF;
line = 1;
modified = FALSE;
curCol = select = 0;
curRow = 8;
if (sptr) {
sptr--;
size = 1;
while ((short)(curs_ptr - file_ptr + size) < *sptr) {
if (*gap_ptr == LF)
size++;
move_right();
}
}
//MODIFIED
//Free our stuff
free(mounted);
free(orPos);
free(FileSystem);
//MODIFIED
return ERR_NONE;
}