File: ip_screen.c

package info (click to toggle)
nvi 1.81.6-11
  • links: PTS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 11,780 kB
  • ctags: 5,451
  • sloc: ansic: 43,638; sh: 11,239; makefile: 604; perl: 262; tcl: 234; awk: 19
file content (93 lines) | stat: -rw-r--r-- 1,710 bytes parent folder | download | duplicates (10)
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
/*-
 * Copyright (c) 1996
 *	Keith Bostic.  All rights reserved.
 *
 * See the LICENSE file for redistribution information.
 */

#include "config.h"

#ifndef lint
static const char sccsid[] = "$Id: ip_screen.c,v 8.8 2001/06/25 15:19:24 skimo Exp $ (Berkeley) $Date: 2001/06/25 15:19:24 $";
#endif /* not lint */

#include <sys/types.h>
#include <sys/queue.h>

#include <bitstring.h>
#include <stdio.h>

#include "../common/common.h"
#include "../ipc/ip.h"
#include "extern.h"

/*
 * ip_screen --
 *	Initialize/shutdown the IP screen.
 *
 * PUBLIC: int ip_screen __P((SCR *, u_int32_t));
 */
int
ip_screen(SCR *sp, u_int32_t flags)
{
	GS *gp;
	IP_PRIVATE *ipp;

	gp = sp->gp;
	ipp = IPP(sp);

	/* See if the current information is incorrect. */
	if (F_ISSET(gp, G_SRESTART)) {
		if (ip_quit(sp->wp))
			return (1);
		F_CLR(gp, G_SRESTART);
	}
	
	/* See if we're already in the right mode. */
	if (LF_ISSET(SC_EX) && F_ISSET(sp, SC_SCR_EX) ||
	    LF_ISSET(SC_VI) && F_ISSET(sp, SC_SCR_VI))
		return (0);

	/* Ex isn't possible if there is no terminal. */
	if (LF_ISSET(SC_EX) && ipp->t_fd == -1)
		return (1);

	if (F_ISSET(sp, SC_SCR_EX))
		F_CLR(sp, SC_SCR_EX);

	if (F_ISSET(sp, SC_SCR_VI))
		F_CLR(sp, SC_SCR_VI);

	if (LF_ISSET(SC_EX)) {
		F_SET(ipp, IP_IN_EX);
	} else {
		/* Initialize terminal based information. */
		if (ip_term_init(sp)) 
			return (1);

		F_CLR(ipp, IP_IN_EX);
		F_SET(ipp, IP_SCR_VI_INIT);
	}
	return (0);
}

/*
 * ip_quit --
 *	Shutdown the screens.
 *
 * PUBLIC: int ip_quit __P((WIN *));
 */
int
ip_quit(WIN *wp)
{
	IP_PRIVATE *ipp;
	int rval;

	/* Clean up the terminal mappings. */
	rval = ip_term_end(wp->gp);

	ipp = WIPP(wp);
	F_CLR(ipp, IP_SCR_VI_INIT);

	return (rval);
}