/*
 *   Copyright (C) 1988-2006 Lucent Technologies Inc. and others.
 *   All Rights Reserved.
 */

/*	cscope - interactive C symbol cross-reference
 *
 *	file editing functions
 */

#include "global.h"
#include <curses.h>	/* KEY_BREAK and refresh */

#if defined( __STDC__ ) || defined( __BORLANDC__ )
void	editref(int i);
void	editall(void);
void	edit(char *file, char *linenum);
int	execute(char *,...);
#endif

/* edit this displayed reference */

void
editref(i)
int	i;
{
	char	file[PATHLEN + 1];	/* file name */
	char	linenum[NUMLEN + 1];	/* line number */

	/* verify that there is a references found file */
	if (refsfound == NULL) {
		return;
	}
	/* get the selected line */
	seekline(i + topline);
	
	/* get the file name and line number */
	if (fscanf(refsfound, "%s%*s%s", file, linenum) == 2) {
		edit(file, linenum);	/* edit it */
	}
	seekline(topline);	/* restore the line pointer */
}

/* edit all references */

void
editall()
{
	char	file[PATHLEN + 1];	/* file name */
	char	linenum[NUMLEN + 1];	/* line number */
	int	c;

	/* verify that there is a references found file */
	if (refsfound == NULL) {
		return;
	}
	/* get the first line */
	seekline(1);
	
	/* get each file name and line number */
	while (fscanf(refsfound, "%s%*s%s%*[^\n]", file, linenum) == 2) {
		edit(file, linenum);	/* edit it */
		if (editallprompt == YES) {
			putmsg("Type ^D to stop editing all lines, or any other character to continue: ");
			if ((c = mygetch()) == EOF || c == ctrl('D') ||
			    c == ctrl('Z') || c == KEY_BREAK) {
				(void) refresh(); /* needed for interrupt on first time */
				break;
			}
		}
	}
	seekline(topline);
}
	
/* call the editor */

void
edit(file, linenum)
char	*file;
char	*linenum;
{
	char	msg[MSGLEN + 1];	/* message */
	char	plusnum[NUMLEN + 2];	/* line number option */
	char	*s;

	(void) sprintf(msg, "%s +%s %s", mybasename(editor), linenum, file);
	putmsg(msg);
	(void) sprintf(plusnum, "+%s", linenum);
	
	/* if this is the more or page commands */
	if (strcmp(s = mybasename(editor), "more") == 0 || strcmp(s, "page") == 0) {
		
		/* get it to pause after displaying a file smaller than the screen
		   length */
		(void) execute(editor, editor, plusnum, file, "/dev/null", (char *) 0);
	}
	else {
		(void) execute(editor, editor, plusnum, file, (char *) 0);
	}
}
