All pastes #618199 Raw Edit

Miscellany

public text v1 · immutable
·published 2007-07-13 20:16 UTC
rendered paste body
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;
}