{ int reverse = 0, done = 0; event_t ch;  move (LINES - 1, 0); if (i == OP_SORT_REVERSE) { reverse = SORT_REVERSE; addstr (_("Reverse sort by (d)ate, (a)lpha, si(z)e or do(n)'t sort? ")); } else { addstr (_("Sort by (d)ate, (a)lpha, si(z)e or do(n)'t sort? ")); } clrtoeol ();  FOREVER { ch = mutt_getch(); if (ch.ch == 'a' || ch.ch == 'd' || ch.ch == 'z' || ch.ch == 'n') break;  if (ch.ch == -1 || CI_is_return (ch.ch)) { done = 1; CLEARLINE (LINES - 1); break; } else BEEP (); }   if (done) break;  switch (ch.ch) { case 'a':
{ int resort = 1; int reverse = (i == OP_SORT_REVERSE);  switch (mutt_multi_choice ((reverse) ? _("Reverse sort by (d)ate, (a)lpha, si(z)e or do(n)'t sort? ") : _("Sort by (d)ate, (a)lpha, si(z)e or do(n)'t sort? "), _("dazn"))) { case -1:  resort = 0; break;  case 1:  BrowserSort = reverse | SORT_DATE; break;  case 2:
void mutt_select_file (char *f, size_t flen, int buffy){  char buf[_POSIX_PATH_MAX];  char prefix[_POSIX_PATH_MAX] = "";  char helpstr[SHORT_STRING];  char title[STRING];  struct browser_state state;  MUTTMENU *menu;  struct stat st;  int i, killPrefix = 0;  memset (&state, 0, sizeof (struct browser_state));  if (*f)  {    mutt_expand_path (f, flen);    for (i = strlen (f) - 1; i > 0 && f[i] != '/' ; i--);    if (i > 0)    {      if (f[0] == '/')      {	if (i > sizeof (LastDir) - 1) i = sizeof (LastDir) - 1;	strncpy (LastDir, f, i);	LastDir[i] = 0;      }      else      {	getcwd (LastDir, sizeof (LastDir));	strcat (LastDir, "/");	strncat (LastDir, f, i);      }    }    else    {      if (f[0] == '/')	strcpy (LastDir, "/");      else	getcwd (LastDir, sizeof (LastDir));    }    if (i <= 0 && f[0] != '/')      strfcpy (prefix, f, sizeof (prefix));    else      strfcpy (prefix, f + i + 1, sizeof (prefix));    killPrefix = 1;  }  else if (!LastDir[0])    strfcpy (LastDir, NONULL(Maildir), sizeof (LastDir));  *f = 0;  if (buffy)  {    if (examine_mailboxes (NULL, &state) == -1)      return;  }  else if (examine_directory (NULL, &state, LastDir, prefix) == -1)    return;  menu = mutt_new_menu ();  menu->menu = MENU_FOLDER;  menu->make_entry = folder_entry;  menu->search = select_file_search;  menu->title = title;  menu->data = state.entry;  menu->help = mutt_compile_help (helpstr, sizeof (helpstr), MENU_FOLDER, FolderHelp);  init_menu (&state, menu, title, sizeof (title), buffy);  FOREVER  {    switch (i = mutt_menuLoop (menu))    {      case OP_GENERIC_SELECT_ENTRY:	if (!state.entrylen)	{	  mutt_error _("No files match the file mask");	  break;	}        if (S_ISDIR (state.entry[menu->current].mode) ||	    (S_ISLNK (state.entry[menu->current].mode) &&	    link_is_dir (state.entry[menu->current].name)))	{	  /* make sure this isn't a MH or maildir mailbox */	  if (buffy)	  {	    strfcpy (buf, state.entry[menu->current].name, sizeof (buf));	    mutt_expand_path (buf, sizeof (buf));	  }	  else	    snprintf (buf, sizeof (buf), "%s/%s", LastDir, 		      state.entry[menu->current].name);	  if (mx_get_magic (buf) <= 0)	  {	    char OldLastDir[_POSIX_PATH_MAX];	    /* save the old directory */	    strfcpy (OldLastDir, LastDir, sizeof (OldLastDir));	    if (strcmp (state.entry[menu->current].name, "..") == 0)	    {	      if (strcmp ("..", LastDir + strlen (LastDir) - 2) == 0)		strcat (LastDir, "/..");	      else	      {		char *p = strrchr (LastDir + 1, '/');		if (p)		  *p = 0;		else		{		  if (LastDir[0] == '/')		    LastDir[1] = 0;		  else		    strcat (LastDir, "/..");		}	      }	    }	    else if (buffy)	    {	      sprintf (LastDir, "%s", state.entry[menu->current].name);	      mutt_expand_path (LastDir, sizeof (LastDir));	    }	    else	      sprintf (LastDir + strlen (LastDir), "/%s",		       state.entry[menu->current].name);	    destroy_state (&state);	    if (killPrefix)	    {	      prefix[0] = 0;	      killPrefix = 0;	    }	    buffy = 0;	    if (examine_directory (menu, &state, LastDir, prefix) == -1)	    {	      /* try to restore the old values */	      strfcpy (LastDir, OldLastDir, sizeof (LastDir));	      if (examine_directory (menu, &state, LastDir, prefix) == -1)	      {		strfcpy (LastDir, NONULL(Homedir), sizeof (LastDir));		return;	      }	    }	    menu->current = 0; 	    menu->top = 0; 	    init_menu (&state, menu, title, sizeof (title), buffy);	    break;	  }	}	if (buffy)	{	  strfcpy (f, state.entry[menu->current].name, flen);	  mutt_expand_path (f, flen);	}	else	  snprintf (f, flen, "%s/%s", LastDir, state.entry[menu->current].name);	/* Fall through to OP_EXIT */      case OP_EXIT:	destroy_state (&state);	mutt_menuDestroy (&menu);	return;      case OP_BROWSER_TELL:        if(state.entrylen)	  mutt_message(state.entry[menu->current].name);        break;            case OP_CHANGE_DIRECTORY:	strfcpy (buf, LastDir, sizeof (buf));	{/* add '/' at the end of the directory name */	int len=strlen(LastDir);	if (sizeof (buf) > len)	  buf[len]='/';	}	if (mutt_get_field (_("Chdir to: "), buf, sizeof (buf), M_FILE) == 0 &&	    buf[0])	{	  buffy = 0;	  	  mutt_expand_path (buf, sizeof (buf));	  if (stat (buf, &st) == 0)	  {	    if (S_ISDIR (st.st_mode))	    {	      strfcpy (LastDir, buf, sizeof (LastDir));	      destroy_state (&state);	      if (examine_directory (menu, &state, LastDir, prefix) == 0)	      {		menu->current = 0; 		menu->top = 0; 		init_menu (&state, menu, title, sizeof (title), buffy);	      }	      else	      {		mutt_error _("Error scanning directory.");		destroy_state (&state);		mutt_menuDestroy (&menu);		return;	      }	    }	    else	      mutt_error (_("%s is not a directory."), buf);	  }	  else	    mutt_perror (buf);	}	MAYBE_REDRAW (menu->redraw);	break;	      case OP_ENTER_MASK:	strfcpy (buf, Mask.pattern, sizeof (buf));	if (mutt_get_field (_("File Mask: "), buf, sizeof (buf), 0) == 0)	{	  regex_t *rx = (regex_t *) safe_malloc (sizeof (regex_t));	  char *s = buf;	  int not = 0, err;	  buffy = 0;	  /* assume that the user wants to see everything */	  if (!buf[0])	    strfcpy (buf, ".", sizeof (buf));	  SKIPWS (s);	  if (*s == '!')	  {	    s++;	    SKIPWS (s);	    not = 1;	  }	  if ((err = REGCOMP (rx, s, REG_NOSUB)) != 0)	  {	    regerror (err, rx, buf, sizeof (buf));	    regfree (rx);	    safe_free ((void **) &rx);	    mutt_error ("%s", buf);	  }	  else	  {	    safe_free ((void **) &Mask.pattern);	    regfree (Mask.rx);	    safe_free ((void **) &Mask.rx);	    Mask.pattern = safe_strdup (buf);	    Mask.rx = rx;	    Mask.not = not;	    destroy_state (&state);	    if (examine_directory (menu, &state, LastDir, NULL) == 0)	      init_menu (&state, menu, title, sizeof (title), buffy);	    else	    {	      mutt_error _("Error scanning directory.");	      mutt_menuDestroy (&menu);	      return;	    }	    killPrefix = 0;	    if (!state.entrylen)	    {	      mutt_error _("No files match the file mask");	      break;	    }	  }	}	MAYBE_REDRAW (menu->redraw);	break;      case OP_SORT:      case OP_SORT_REVERSE:	{	  int reverse = 0, done = 0;	  event_t ch;	  move (LINES - 1, 0);	  if (i == OP_SORT_REVERSE)	  {	    reverse = SORT_REVERSE;	    addstr (_("Reverse sort by (d)ate, (a)lpha, si(z)e or do(n)'t sort? "));	  } else {	    addstr (_("Sort by (d)ate, (a)lpha, si(z)e or do(n)'t sort? "));	  }	  clrtoeol ();	  FOREVER	  {	    ch = mutt_getch();	    if (ch.ch == 'a' || ch.ch == 'd' || ch.ch == 'z' || ch.ch == 'n')	      break;	    if (ch.ch == -1 || CI_is_return (ch.ch))	    {	      done = 1;	      CLEARLINE (LINES - 1);	      break;	    }	    else	      BEEP ();	  }	  /* nothing to be done */	  if (done)	    break;	  switch (ch.ch)	  {	    case 'a': 	      BrowserSort = reverse | SORT_SUBJECT;	      break;	    case 'd':	      BrowserSort = reverse | SORT_DATE;	      break;	    case 'z': 	      BrowserSort = reverse | SORT_SIZE;	      break;	    case 'n': 	      BrowserSort = SORT_ORDER;	      break;	  }	  browser_sort (&state);	  menu->redraw = REDRAW_FULL;	}	break;      case OP_TOGGLE_MAILBOXES:	buffy = 1 - buffy;      case OP_CHECK_NEW:	destroy_state (&state);	prefix[0] = 0;	killPrefix = 0;	if (buffy)	{	  if (examine_mailboxes (menu, &state) == -1)	    return;	}	else if (examine_directory (menu, &state, LastDir, prefix) == -1)	  return;	init_menu (&state, menu, title, sizeof (title), buffy);	break;      case OP_BROWSER_NEW_FILE:	snprintf (buf, sizeof (buf), "%s/", LastDir);	if (mutt_get_field (_("New file name: "), buf, sizeof (buf), M_FILE) == 0)	{	  strfcpy (f, buf, flen);	  destroy_state (&state);	  mutt_menuDestroy (&menu);	  return;	}	MAYBE_REDRAW (menu->redraw);	break;      case OP_BROWSER_VIEW_FILE:	if (!state.entrylen)	{	  mutt_error _("No files match the file mask");	  break;	}        if (S_ISDIR (state.entry[menu->current].mode) ||	    (S_ISLNK (state.entry[menu->current].mode) &&	    link_is_dir (state.entry[menu->current].name)))	{	  mutt_error _("Can't view a directory");	  break;	} 	else	{	  BODY *b;	  char buf[_POSIX_PATH_MAX];	  snprintf (buf, sizeof (buf), "%s/%s", LastDir,		    state.entry[menu->current].name);	  b = mutt_make_file_attach (buf);	  if (b != NULL)	  {	    mutt_view_attachment (NULL, b, M_REGULAR);	    mutt_free_body (&b);	    menu->redraw = REDRAW_FULL;	  }	  else	    mutt_error _("Error trying to view file");	}    }  }  /* not reached */}