static char rcsid[] = "@(#)$Id: a_quit.c,v 1.20 2006/04/09 07:37:17 hurtta Exp $";

/******************************************************************************
 *  The Elm (ME+) Mail System  -  $Revision: 1.20 $   $State: Exp $
 *
 *  Modified by: Kari Hurtta <hurtta+elm@posti.FMI.FI> 
 *                           (was hurtta+elm@ozone.FMI.FI)
 ******************************************************************************
 *  The Elm Mail System 
 *
 * 			Copyright (c) 1988-1992 USENET Community Trust
 * 			Copyright (c) 1986,1987 Dave Taylor
 *****************************************************************************/

/** a_quit: leave the aliases menu and return to the main menu.
  
**/

#include "def_elm.h"
#include "s_aliases.h"


DEBUG_VAR(Debug,__FILE__,"alias");

#include <errno.h>
#ifndef ANSI_C
extern int errno;		/* system error number on failure */
#endif

int delete_aliases(newaliases, prompt, aview, page, prompt_area)
     int newaliases, prompt;
     struct AliasView *aview;
     struct menu_context  * page;
     struct menu_context  * prompt_area;
{
    /*
     *	Update aliases by processing deletions.  Prompting is
     *	done as directed by user input and elmrc options.
     *
     *	If "prompt" is false, then no prompting is done.
     *	Otherwise prompting is dependent upon the variable
     *	question_me, as set by an elmrc option.  This behavior
     *	makes the 'q' command prompt just like '$', while
     *	retaining the 'Q' command for a quick exit that never
     *	prompts.
     *
     *	Return	1		Aliases were deleted
     * 		newalias	Aliases were not deleted
     *          -1              Interrupted witn Ctrl-C
     *
     *	The return allows the caller to determine if the "newalias"
     *	routine should be run.
     */
    
    
    char buffer[SLEN];
    char **list;
    
    int to_delete = 0, to_keep = 0, i, marked_deleted = 0, ask_questions;
    int answer;
    int ac = get_alias_count(aview);


    DPRINT(Debug,1,
	   (&Debug, "\n\n-- leaving aliases --\n\n"));
    
    if (ac == 0)
	return(newaliases);	/* nothing changed */
    
    ask_questions = ((!prompt) ? FALSE : question_me);
    
    /* YES or NO on softkeys */
    /*
      if (hp_softkeys && ask_questions) {
      define_softkeys(YESNO);
      softkeys_on();
      }
    */
    
    /* Determine if deleted messages are really to be deleted */
    
    /* we need to know how many there are to delete */
    for (i=0; i<ac; i++) {
	struct alias_rec *a =  give_alias (aview,i);
	if (a &&
	    ison(a->status, DELETED))
	    marked_deleted++;
    }
    DPRINT(Debug,4,(&Debug, 
		    "Number of aliases marked deleted = %d\n",
		    marked_deleted));

    if(marked_deleted) {
	answer = (always_del ? *def_ans_yes : *def_ans_no);	/* default answer */
	if(ask_questions) {
	    int def = answer;
	    
	    if (marked_deleted == 1)
		answer = prompt_letter(0,"",def,
				       PROMPT_yesno|PROMPT_cancel,
				       prompt_area,
				       CATGETS(elm_msg_cat, AliasesSet, AliasesDelete,
					       "Delete 1 alias? (%c/%c) "), 
				       *def_ans_yes, *def_ans_no);
	    else
		answer = prompt_letter(0,"",def,
				       PROMPT_yesno|PROMPT_cancel,
				       prompt_area,
				       CATGETS(elm_msg_cat, AliasesSet, 
					       AliasesDeletePlural,
					       "Delete %d aliases? (%c/%c) "),
				       marked_deleted, *def_ans_yes, *def_ans_no);
	    
	    		    		    
	    if (TERMCH_interrupt_char == answer) {
		return -1;
	    }
	  }

	  if(answer == *def_ans_yes) {
	    list = (char **) safe_malloc(marked_deleted*sizeof(*list));

	    for (i = 0; i < ac; i++) {
		struct alias_rec *a =  give_alias (aview,i);

		if (a &&
		    ison(a->status, DELETED)) {
		    list[to_delete] = a->alias;

		    DPRINT(Debug,8,(&Debug,
				    "Alias number %d, %s is deletion %d\n",
				    i, list[to_delete], to_delete));
		    to_delete++;
		}
		else {
		    to_keep++;
		}
	    }
	   /*
	    * Formulate message as to number of keeps and deletes.
	    * This is only complex so that the message is good English.
	    */
	    if (to_keep > 0) {
		set_alias_current(aview,1);		/* Reset current alias */
	      if (to_keep == 1)
		elm_sfprintf(buffer, sizeof buffer,
			     CATGETS(elm_msg_cat, AliasesSet, 
				     AliasesKeepDelete,
				     "[Keeping 1 alias and deleting %d.]"), 
			     to_delete);
	      else
		elm_sfprintf(buffer, sizeof buffer,
			     CATGETS(elm_msg_cat, AliasesSet, 
				     AliasesKeepDeletePlural,
				     "[Keeping %d aliases and deleting %d.]"),
			     to_keep, to_delete);
	    }
	    else {
		set_alias_current(aview,0);		/* No aliases left */
		elm_sfprintf(buffer, sizeof buffer,
			     CATGETS(elm_msg_cat, AliasesSet, AliasesDeleteAll,
				     "[Deleting all aliases.]"));
	    }

	    DPRINT(Debug,2,(&Debug,
			    "Action: %s\n", buffer));
	    error(buffer);

	    delete_from_alias_text(list, to_delete);

	    free((char *) list);
	  }
	}
	DPRINT(Debug,3,(&Debug,
			"Aliases deleted: %d\n", to_delete));

	/* If all aliases are to be kept we don't need to do anything
	 * (like run newalias for the deleted messages).
	 */

	if(to_delete == 0) {
	  DPRINT(Debug,3,(&Debug,
			  "Aliases kept as is!\n"));
	  return(newaliases);
	}

	return(1);
}

void exit_alias(aview)
     struct AliasView *aview;
{
    
    int i;
    int ac = get_alias_count(aview);

    /* Clear the deletes from all aliases.  */
    
    for(i = 0; i < ac; i++) {
	struct alias_rec *a = give_alias(aview,i);
	if (a &&
	    ison(a->status, DELETED))
	    clearit(a->status, DELETED);
	
    }

    DPRINT(Debug,5,
	   (&Debug, "\nexit_alias:  Done clearing deletes.\n"));

}

/*
 * Local Variables:
 *  mode:c
 *  c-basic-offset:4
 *  buffer-file-coding-system: iso-8859-1
 * End:
 */


syntax highlighted by Code2HTML, v. 0.9.1