summaryrefslogtreecommitdiff
path: root/usr.bin/mg/main.c
blob: 73271ce9b6e7ff65f741903d7426eec4ab7a0eaa (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
/*
 *		Mainline
 */
#include	"def.h"
#ifndef NO_MACRO
#include	"macro.h"
#endif

int	thisflag;			/* Flags, this command		*/
int	lastflag;			/* Flags, last command		*/
int	curgoal;			/* Goal column			*/
BUFFER	*curbp;				/* Current buffer		*/
MGWIN	*curwp;				/* Current window		*/
BUFFER	*bheadp;			/* BUFFER listhead		*/
MGWIN	*wheadp = (MGWIN *)NULL;	/* MGWIN listhead		*/
char	pat[NPAT];			/* Pattern			*/
#ifndef NO_DPROMPT
extern char prompt[], *promptp;		/* delayed prompting		*/
#endif

static VOID	edinit();

int
main(argc, argv)
int  argc;
char **argv;
{
#ifndef NO_STARTUP
	char	*startupfile();
#endif
	char	*cp;
	VOID	vtinit(), makename(), eerase();
	BUFFER	*findbuffer();

#ifdef SYSINIT
	SYSINIT;				/* system dependent.	*/
#endif
	vtinit();				/* Virtual terminal.	*/
#ifndef NO_DIR
	dirinit();				/* Get current directory */
#endif
	edinit();				/* Buffers, windows.	*/
	ttykeymapinit();			/* Symbols, bindings.	*/
	/* doing update() before reading files causes the error messages from
	 * the file I/O show up on the screen.	(and also an extra display
	 * of the mode line if there are files specified on the command line.)
	 */
	update();
#ifndef NO_STARTUP				/* User startup file.	*/
	if ((cp = startupfile((char *)NULL)) != NULL)
		(VOID) load(cp);
#endif
	while (--argc > 0) {
		cp = adjustname(*++argv);
		curbp = findbuffer(cp);
		(VOID) showbuffer(curbp, curwp, 0);
		(VOID) readin(cp);
	}
	thisflag = 0;				/* Fake last flags.	*/
	for(;;) {
#ifndef NO_DPROMPT
	    *(promptp = prompt) = '\0';
	    if(epresf == KPROMPT) eerase();
#endif
	    update();
	    lastflag = thisflag;
	    thisflag = 0;
	    switch(doin()) {
		case TRUE: break;
		case ABORT:
		    ewprintf("Quit");		/* and fall through	*/
		case FALSE:
		default:
		    ttbeep();
#ifndef NO_MACRO
		    macrodef = FALSE;
#endif
	    }
	}
}

/*
 * Initialize default buffer and window.
 */
static VOID
edinit() {
	register BUFFER *bp;
	register MGWIN *wp;

	bheadp = NULL;
	bp = bfind("*scratch*", TRUE);		/* Text buffer.		*/
	wp = (MGWIN *)malloc(sizeof(MGWIN));	/* Initial window.	*/
	if (bp==NULL || wp==NULL) panic("edinit");
	curbp  = bp;				/* Current ones.	*/
	wheadp = wp;
	curwp  = wp;
	wp->w_wndp  = NULL;			/* Initialize window.	*/
	wp->w_bufp  = bp;
	bp->b_nwnd  = 1;			/* Displayed.		*/
	wp->w_linep = wp->w_dotp = bp->b_linep;
	wp->w_doto  = 0;
	wp->w_markp = NULL;
	wp->w_marko = 0;
	wp->w_toprow = 0;
	wp->w_ntrows = nrow-2;			/* 2 = mode, echo.	*/
	wp->w_force = 0;
	wp->w_flag  = WFMODE|WFHARD;		/* Full.		*/
}

/*
 * Quit command. If an argument, always
 * quit. Otherwise confirm if a buffer has been
 * changed and not written out. Normally bound
 * to "C-X C-C".
 */
/*ARGSUSED*/
quit(f, n)
{
	register int	s;
	VOID		vttidy();

	if ((s = anycb(FALSE)) == ABORT) return ABORT;
	if (s == FALSE
	|| eyesno("Some modified buffers exist, really exit") == TRUE) {
		vttidy();
#ifdef	SYSCLEANUP
	SYSCLEANUP;
#endif
		exit(GOOD);
	}
	return TRUE;
}

/*
 * User abort. Should be called by any input routine that sees a C-g
 * to abort whatever C-g is aborting these days. Currently does
 * nothing.
 */
/*ARGSUSED*/
ctrlg(f, n)
{
	return ABORT;
}