static 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; }