annotate info/session.c @ 1249:86fc40576f22

[project @ 1995-04-11 01:03:08 by jwe]
author jwe
date Tue, 11 Apr 1995 01:03:57 +0000
parents 5fb4ee02da70
children 5762998e76ab
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
171
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1 /* session.c -- The user windowing interface to Info. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3 /* This file is part of GNU Info, a program for reading online documentation
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4 stored in Info format.
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
5
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
6 Copyright (C) 1993 Free Software Foundation, Inc.
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
7
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
8 This program is free software; you can redistribute it and/or modify
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
9 it under the terms of the GNU General Public License as published by
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
10 the Free Software Foundation; either version 2, or (at your option)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
11 any later version.
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
12
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
13 This program is distributed in the hope that it will be useful,
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
16 GNU General Public License for more details.
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
17
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
18 You should have received a copy of the GNU General Public License
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
19 along with this program; if not, write to the Free Software
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
20 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
21
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
22 Written by Brian Fox (bfox@ai.mit.edu). */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
23
1242
5fb4ee02da70 [project @ 1995-04-10 23:05:10 by jwe]
jwe
parents: 655
diff changeset
24 #ifdef HAVE_CONFIG_H
5fb4ee02da70 [project @ 1995-04-10 23:05:10 by jwe]
jwe
parents: 655
diff changeset
25 #include <config.h>
5fb4ee02da70 [project @ 1995-04-10 23:05:10 by jwe]
jwe
parents: 655
diff changeset
26 #endif
5fb4ee02da70 [project @ 1995-04-10 23:05:10 by jwe]
jwe
parents: 655
diff changeset
27
171
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
28 #include "info.h"
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
29 #include <sys/file.h>
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
30 #include <sys/ioctl.h>
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
31 #include <fcntl.h>
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
32
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
33 #if defined (HAVE_SYS_TIME_H)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
34 # include <sys/time.h>
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
35 # define HAVE_STRUCT_TIMEVAL
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
36 #endif /* HAVE_SYS_TIME_H */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
37
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
38 static void info_clear_pending_input (), info_set_pending_input ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
39 static void info_handle_pointer ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
40
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
41 /* **************************************************************** */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
42 /* */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
43 /* Running an Info Session */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
44 /* */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
45 /* **************************************************************** */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
46
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
47 /* The place that we are reading input from. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
48 static FILE *info_input_stream = (FILE *)NULL;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
49
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
50 /* The last executed command. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
51 VFunction *info_last_executed_command = (VFunction *)NULL;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
52
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
53 /* Becomes non-zero when 'q' is typed to an Info window. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
54 int quit_info_immediately = 0;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
55
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
56 /* Array of structures describing for each window which nodes have been
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
57 visited in that window. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
58 INFO_WINDOW **info_windows = (INFO_WINDOW **)NULL;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
59
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
60 /* Where to add the next window, if we need to add one. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
61 static int info_windows_index = 0;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
62
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
63 /* Number of slots allocated to INFO_WINDOWS. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
64 static int info_windows_slots = 0;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
65
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
66 void remember_window_and_node (), forget_window_and_nodes ();
249
0a1644ef9a0a [project @ 1993-12-06 18:56:13 by jwe]
jwe
parents: 173
diff changeset
67 void display_startup_message_and_start (), info_session ();
173
c74bb6e6c838 [project @ 1993-10-21 22:43:36 by jwe]
jwe
parents: 171
diff changeset
68 void finish_info_session ();
249
0a1644ef9a0a [project @ 1993-12-06 18:56:13 by jwe]
jwe
parents: 173
diff changeset
69 int initialize_info_session ();
171
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
70
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
71 /* Begin an info session finding the nodes specified by FILENAME and NODENAMES.
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
72 For each loaded node, create a new window. Always split the largest of the
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
73 available windows. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
74 void
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
75 begin_multiple_window_info_session (filename, nodenames)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
76 char *filename;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
77 char **nodenames;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
78 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
79 register int i;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
80 WINDOW *window = (WINDOW *)NULL;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
81
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
82 for (i = 0; nodenames[i]; i++)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
83 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
84 NODE *node;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
85
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
86 node = info_get_node (filename, nodenames[i]);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
87
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
88 if (!node)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
89 break;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
90
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
91 /* If this is the first node, initialize the info session. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
92 if (!window)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
93 {
173
c74bb6e6c838 [project @ 1993-10-21 22:43:36 by jwe]
jwe
parents: 171
diff changeset
94 initialize_info_session (node, 1);
171
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
95 window = active_window;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
96 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
97 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
98 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
99 /* Find the largest window in WINDOWS, and make that be the active
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
100 one. Then split it and add our window and node to the list
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
101 of remembered windows and nodes. Then tile the windows. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
102 register WINDOW *win, *largest = (WINDOW *)NULL;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
103 int max_height = 0;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
104
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
105 for (win = windows; win; win = win->next)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
106 if (win->height > max_height)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
107 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
108 max_height = win->height;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
109 largest = win;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
110 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
111
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
112 if (!largest)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
113 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
114 display_update_display (windows);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
115 info_error (CANT_FIND_WIND);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
116 info_session ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
117 exit (0);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
118 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
119
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
120 active_window = largest;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
121 window = window_make_window (node);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
122 if (window)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
123 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
124 window_tile_windows (TILE_INTERNALS);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
125 remember_window_and_node (window, node);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
126 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
127 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
128 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
129 display_update_display (windows);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
130 info_error (WIN_TOO_SMALL);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
131 info_session ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
132 exit (0);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
133 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
134 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
135 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
136 display_startup_message_and_start ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
137 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
138
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
139 /* Start an info session with INITIAL_NODE, and an error message in the echo
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
140 area made from FORMAT and ARG. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
141 void
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
142 begin_info_session_with_error (initial_node, format, arg)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
143 NODE *initial_node;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
144 char *format;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
145 void *arg;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
146 {
173
c74bb6e6c838 [project @ 1993-10-21 22:43:36 by jwe]
jwe
parents: 171
diff changeset
147 initialize_info_session (initial_node, 1);
171
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
148 info_error (format, arg, (void *)NULL);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
149 info_session ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
150 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
151
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
152 /* Start an info session with INITIAL_NODE. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
153 void
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
154 begin_info_session (initial_node)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
155 NODE *initial_node;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
156 {
173
c74bb6e6c838 [project @ 1993-10-21 22:43:36 by jwe]
jwe
parents: 171
diff changeset
157 initialize_info_session (initial_node, 1);
171
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
158 display_startup_message_and_start ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
159 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
160
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
161 void
173
c74bb6e6c838 [project @ 1993-10-21 22:43:36 by jwe]
jwe
parents: 171
diff changeset
162 finish_info_session ()
c74bb6e6c838 [project @ 1993-10-21 22:43:36 by jwe]
jwe
parents: 171
diff changeset
163 {
c74bb6e6c838 [project @ 1993-10-21 22:43:36 by jwe]
jwe
parents: 171
diff changeset
164 close_dribble_file ();
c74bb6e6c838 [project @ 1993-10-21 22:43:36 by jwe]
jwe
parents: 171
diff changeset
165 clear_info_signal_handler ();
c74bb6e6c838 [project @ 1993-10-21 22:43:36 by jwe]
jwe
parents: 171
diff changeset
166 }
c74bb6e6c838 [project @ 1993-10-21 22:43:36 by jwe]
jwe
parents: 171
diff changeset
167
c74bb6e6c838 [project @ 1993-10-21 22:43:36 by jwe]
jwe
parents: 171
diff changeset
168 void
171
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
169 display_startup_message_and_start ()
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
170 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
171 char *format;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
172
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
173 format = replace_in_documentation
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
174 ("Welcome to Info version %s. Type \"\\[get-help-window]\" for help.");
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
175
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
176 window_message_in_echo_area (format, version_string ());
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
177 info_session ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
178 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
179
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
180 /* Run an info session with an already initialized window and node. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
181 void
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
182 info_session ()
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
183 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
184 terminal_prep_terminal ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
185 display_update_display (windows);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
186 info_last_executed_command = (VFunction *)NULL;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
187 info_read_and_dispatch ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
188 terminal_unprep_terminal ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
189 close_dribble_file ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
190 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
191
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
192 /* Here is a window-location dependent event loop. Called from the
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
193 functions info_session (), and from read_xxx_in_echo_area (). */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
194 void
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
195 info_read_and_dispatch ()
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
196 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
197 unsigned char key;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
198 int done;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
199 done = 0;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
200
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
201 while (!done && !quit_info_immediately)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
202 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
203 int lk;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
204
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
205 /* If we haven't just gone up or down a line, there is no
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
206 goal column for this window. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
207 if ((info_last_executed_command != info_next_line) &&
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
208 (info_last_executed_command != info_prev_line))
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
209 active_window->goal_column = -1;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
210
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
211 if (echo_area_is_active)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
212 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
213 lk = echo_area_last_command_was_kill;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
214 echo_area_prep_read ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
215 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
216
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
217 if (!info_any_buffered_input_p ())
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
218 display_update_display (windows);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
219
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
220 display_cursor_at_point (active_window);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
221 info_initialize_numeric_arg ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
222
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
223 initialize_keyseq ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
224 key = info_get_input_char ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
225
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
226 /* No errors yet. We just read a character, that's all. Only clear
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
227 the echo_area if it is not currently active. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
228 if (!echo_area_is_active)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
229 window_clear_echo_area ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
230
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
231 info_error_was_printed = 0;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
232
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
233 /* Do the selected command. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
234 info_dispatch_on_key (key, active_window->keymap);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
235
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
236 if (echo_area_is_active)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
237 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
238 /* Echo area commands that do killing increment the value of
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
239 ECHO_AREA_LAST_COMMAND_WAS_KILL. Thus, if there is no
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
240 change in the value of this variable, the last command
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
241 executed was not a kill command. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
242 if (lk == echo_area_last_command_was_kill)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
243 echo_area_last_command_was_kill = 0;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
244
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
245 if (ea_last_executed_command == ea_newline ||
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
246 info_aborted_echo_area)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
247 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
248 ea_last_executed_command = (VFunction *)NULL;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
249 done = 1;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
250 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
251
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
252 if (info_last_executed_command == info_quit)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
253 quit_info_immediately = 1;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
254 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
255 else if (info_last_executed_command == info_quit)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
256 done = 1;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
257 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
258 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
259
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
260 /* Found in signals.c */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
261 extern void initialize_info_signal_handler ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
262
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
263 /* Initialize the first info session by starting the terminal, window,
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
264 and display systems. */
249
0a1644ef9a0a [project @ 1993-12-06 18:56:13 by jwe]
jwe
parents: 173
diff changeset
265 int
173
c74bb6e6c838 [project @ 1993-10-21 22:43:36 by jwe]
jwe
parents: 171
diff changeset
266 initialize_info_session (node, clear_screen)
171
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
267 NODE *node;
173
c74bb6e6c838 [project @ 1993-10-21 22:43:36 by jwe]
jwe
parents: 171
diff changeset
268 int clear_screen;
171
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
269 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
270 char *getenv (), *term_name;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
271
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
272 term_name = getenv ("TERM");
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
273 terminal_initialize_terminal (term_name);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
274
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
275 if (terminal_is_dumb_p)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
276 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
277 if (!term_name)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
278 term_name = "dumb";
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
279
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
280 info_error (TERM_TOO_DUMB, term_name);
249
0a1644ef9a0a [project @ 1993-12-06 18:56:13 by jwe]
jwe
parents: 173
diff changeset
281 return -1;
171
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
282 }
249
0a1644ef9a0a [project @ 1993-12-06 18:56:13 by jwe]
jwe
parents: 173
diff changeset
283
0a1644ef9a0a [project @ 1993-12-06 18:56:13 by jwe]
jwe
parents: 173
diff changeset
284 if (screenwidth < 4 || screenheight < 4)
0a1644ef9a0a [project @ 1993-12-06 18:56:13 by jwe]
jwe
parents: 173
diff changeset
285 {
0a1644ef9a0a [project @ 1993-12-06 18:56:13 by jwe]
jwe
parents: 173
diff changeset
286 info_error (TERM_TOO_SMALL, screenheight, screenwidth);
0a1644ef9a0a [project @ 1993-12-06 18:56:13 by jwe]
jwe
parents: 173
diff changeset
287 return -1;
0a1644ef9a0a [project @ 1993-12-06 18:56:13 by jwe]
jwe
parents: 173
diff changeset
288 }
0a1644ef9a0a [project @ 1993-12-06 18:56:13 by jwe]
jwe
parents: 173
diff changeset
289
173
c74bb6e6c838 [project @ 1993-10-21 22:43:36 by jwe]
jwe
parents: 171
diff changeset
290 if (clear_screen)
c74bb6e6c838 [project @ 1993-10-21 22:43:36 by jwe]
jwe
parents: 171
diff changeset
291 terminal_clear_screen ();
249
0a1644ef9a0a [project @ 1993-12-06 18:56:13 by jwe]
jwe
parents: 173
diff changeset
292
171
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
293 initialize_info_keymaps ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
294 window_initialize_windows (screenwidth, screenheight);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
295 initialize_info_signal_handler ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
296 display_initialize_display (screenwidth, screenheight);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
297 info_set_node_of_window (active_window, node);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
298
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
299 /* Tell the window system how to notify us when a window needs to be
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
300 asynchronously deleted (e.g., user resizes window very small). */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
301 window_deletion_notifier = forget_window_and_nodes;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
302
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
303 /* If input has not been redirected yet, make it come from STDIN. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
304 if (!info_input_stream)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
305 info_input_stream = stdin;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
306
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
307 info_windows_initialized_p = 1;
249
0a1644ef9a0a [project @ 1993-12-06 18:56:13 by jwe]
jwe
parents: 173
diff changeset
308
0a1644ef9a0a [project @ 1993-12-06 18:56:13 by jwe]
jwe
parents: 173
diff changeset
309 return 0;
171
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
310 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
311
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
312 /* Tell Info that input is coming from the file FILENAME. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
313 void
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
314 info_set_input_from_file (filename)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
315 char *filename;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
316 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
317 FILE *stream;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
318
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
319 stream = fopen (filename, "r");
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
320
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
321 if (!stream)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
322 return;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
323
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
324 if (info_input_stream != stdin)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
325 fclose (info_input_stream);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
326
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
327 info_input_stream = stream;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
328
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
329 if (stream != stdin)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
330 display_inhibited = 1;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
331 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
332
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
333 /* Return the INFO_WINDOW containing WINDOW, or NULL if there isn't one. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
334 static INFO_WINDOW *
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
335 get_info_window_of_window (window)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
336 WINDOW *window;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
337 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
338 register int i;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
339 INFO_WINDOW *info_win = (INFO_WINDOW *)NULL;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
340
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
341 for (i = 0; info_windows && (info_win = info_windows[i]); i++)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
342 if (info_win->window == window)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
343 break;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
344
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
345 return (info_win);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
346 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
347
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
348 /* Reset the remembered pagetop and point of WINDOW to WINDOW's current
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
349 values if the window and node are the same as the current one being
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
350 displayed. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
351 void
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
352 set_remembered_pagetop_and_point (window)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
353 WINDOW *window;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
354 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
355 INFO_WINDOW *info_win;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
356
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
357 info_win = get_info_window_of_window (window);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
358
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
359 if (!info_win)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
360 return;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
361
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
362 if (info_win->nodes_index &&
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
363 (info_win->nodes[info_win->current] == window->node))
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
364 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
365 info_win->pagetops[info_win->current] = window->pagetop;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
366 info_win->points[info_win->current] = window->point;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
367 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
368 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
369
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
370 void
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
371 remember_window_and_node (window, node)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
372 WINDOW *window;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
373 NODE *node;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
374 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
375 INFO_WINDOW *info_win;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
376
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
377 /* See if we already have this window in our list. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
378 info_win = get_info_window_of_window (window);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
379
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
380 /* If the window wasn't already on our list, then make a new entry. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
381 if (!info_win)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
382 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
383 info_win = (INFO_WINDOW *)xmalloc (sizeof (INFO_WINDOW));
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
384 info_win->window = window;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
385 info_win->nodes = (NODE **)NULL;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
386 info_win->pagetops = (int *)NULL;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
387 info_win->points = (long *)NULL;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
388 info_win->current = 0;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
389 info_win->nodes_index = 0;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
390 info_win->nodes_slots = 0;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
391
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
392 add_pointer_to_array (info_win, info_windows_index, info_windows,
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
393 info_windows_slots, 10, INFO_WINDOW *);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
394 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
395
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
396 /* If this node, the current pagetop, and the current point are the
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
397 same as the last saved node and pagetop, don't really add this to
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
398 the list of history nodes. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
399 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
400 int ni = info_win->nodes_index - 1;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
401
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
402 if ((ni != -1) &&
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
403 (info_win->nodes[ni]->contents == node->contents) &&
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
404 (info_win->pagetops[ni] == window->pagetop) &&
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
405 (info_win->points[ni] == window->point))
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
406 return;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
407 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
408
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
409 /* Remember this node, the currently displayed pagetop, and the current
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
410 location of point in this window. Because we are updating pagetops
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
411 and points as well as nodes, it is more efficient to avoid the
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
412 add_pointer_to_array macro here. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
413 if (info_win->nodes_index + 2 >= info_win->nodes_slots)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
414 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
415 info_win->nodes = (NODE **)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
416 xrealloc (info_win->nodes,
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
417 (info_win->nodes_slots += 20) * sizeof (NODE *));
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
418
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
419 info_win->pagetops = (int *)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
420 xrealloc (info_win->pagetops, info_win->nodes_slots * sizeof (int));
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
421
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
422 info_win->points = (long *)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
423 xrealloc (info_win->points, info_win->nodes_slots * sizeof (long));
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
424 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
425
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
426 info_win->nodes[info_win->nodes_index] = node;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
427 info_win->pagetops[info_win->nodes_index] = window->pagetop;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
428 info_win->points[info_win->nodes_index] = window->point;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
429 info_win->current = info_win->nodes_index++;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
430 info_win->nodes[info_win->nodes_index] = (NODE *)NULL;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
431 info_win->pagetops[info_win->nodes_index] = 0;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
432 info_win->points[info_win->nodes_index] = 0;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
433 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
434
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
435 #define DEBUG_FORGET_WINDOW_AND_NODES
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
436 #if defined (DEBUG_FORGET_WINDOW_AND_NODES)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
437 static void
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
438 consistency_check_info_windows ()
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
439 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
440 register int i;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
441 INFO_WINDOW *info_win;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
442
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
443 for (i = 0; i < info_windows_index; i++)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
444 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
445 WINDOW *win;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
446
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
447 for (win = windows; win; win = win->next)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
448 if (win == info_windows[i]->window)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
449 break;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
450
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
451 if (!win)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
452 abort ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
453 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
454 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
455 #endif /* DEBUG_FORGET_WINDOW_AND_NODES */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
456
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
457 /* Remove WINDOW and its associated list of nodes from INFO_WINDOWS. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
458 void
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
459 forget_window_and_nodes (window)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
460 WINDOW *window;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
461 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
462 register int i;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
463 INFO_WINDOW *info_win = (INFO_WINDOW *)NULL;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
464
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
465 for (i = 0; info_windows && (info_win = info_windows[i]); i++)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
466 if (info_win->window == window)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
467 break;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
468
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
469 /* If we found the window to forget, then do so. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
470 if (info_win)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
471 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
472 while (i < info_windows_index)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
473 info_windows[i] = info_windows[++i];
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
474
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
475 info_windows_index--;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
476 info_windows[info_windows_index] = (INFO_WINDOW *)NULL;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
477
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
478 if (info_win->nodes)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
479 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
480 for (i = 0; info_win->nodes[i]; i++)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
481 if (internal_info_node_p (info_win->nodes[i]))
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
482 free (info_win->nodes[i]);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
483 free (info_win->nodes);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
484
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
485 maybe_free (info_win->pagetops);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
486 maybe_free (info_win->points);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
487 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
488
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
489 free (info_win);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
490 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
491 #if defined (DEBUG_FORGET_WINDOW_AND_NODES)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
492 consistency_check_info_windows ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
493 #endif /* DEBUG_FORGET_WINDOW_AND_NODES */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
494 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
495
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
496 /* Set WINDOW to show NODE. Remember the new window in our list of Info
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
497 windows. If we are doing automatic footnote display, also try to display
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
498 the footnotes for this window. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
499 void
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
500 info_set_node_of_window (window, node)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
501 WINDOW *window;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
502 NODE *node;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
503 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
504 /* Put this node into the window. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
505 window_set_node_of_window (window, node);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
506
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
507 /* Remember this node and window in our list of info windows. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
508 remember_window_and_node (window, node);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
509
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
510 /* If doing auto-footnote display/undisplay, show the footnotes belonging
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
511 to this window's node. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
512 if (auto_footnotes_p)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
513 info_get_or_remove_footnotes (window);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
514 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
515
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
516
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
517 /* **************************************************************** */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
518 /* */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
519 /* Info Movement Commands */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
520 /* */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
521 /* **************************************************************** */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
522
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
523 /* Change the pagetop of WINDOW to DESIRED_TOP, perhaps scrolling the screen
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
524 to do so. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
525 void
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
526 set_window_pagetop (window, desired_top)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
527 WINDOW *window;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
528 int desired_top;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
529 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
530 int point_line, old_pagetop;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
531
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
532 if (desired_top < 0)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
533 desired_top = 0;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
534 else if (desired_top > window->line_count)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
535 desired_top = window->line_count - 1;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
536
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
537 if (window->pagetop == desired_top)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
538 return;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
539
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
540 old_pagetop = window->pagetop;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
541 window->pagetop = desired_top;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
542
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
543 /* Make sure that point appears in this window. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
544 point_line = window_line_of_point (window);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
545 if ((point_line < window->pagetop) ||
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
546 ((point_line - window->pagetop) > window->height - 1))
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
547 window->point =
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
548 window->line_starts[window->pagetop] - window->node->contents;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
549
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
550 window->flags |= W_UpdateWindow;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
551
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
552 /* Find out which direction to scroll, and scroll the window in that
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
553 direction. Do this only if there would be a savings in redisplay
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
554 time. This is true if the amount to scroll is less than the height
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
555 of the window, and if the number of lines scrolled would be greater
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
556 than 10 % of the window's height. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
557 if (old_pagetop < desired_top)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
558 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
559 int start, end, amount;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
560
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
561 amount = desired_top - old_pagetop;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
562
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
563 if ((amount >= window->height) ||
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
564 (((window->height - amount) * 10) < window->height))
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
565 return;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
566
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
567 start = amount + window->first_row;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
568 end = window->height + window->first_row;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
569
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
570 display_scroll_display (start, end, -amount);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
571 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
572 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
573 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
574 int start, end, amount;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
575
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
576 amount = old_pagetop - desired_top;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
577
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
578 if ((amount >= window->height) ||
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
579 (((window->height - amount) * 10) < window->height))
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
580 return;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
581
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
582 start = window->first_row;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
583 end = (window->first_row + window->height) - amount;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
584 display_scroll_display (start, end, amount);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
585 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
586 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
587
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
588 /* Immediately make WINDOW->point visible on the screen, and move the
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
589 terminal cursor there. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
590 static void
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
591 info_show_point (window)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
592 WINDOW *window;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
593 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
594 int old_pagetop;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
595
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
596 old_pagetop = window->pagetop;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
597 window_adjust_pagetop (window);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
598 if (old_pagetop != window->pagetop)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
599 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
600 int new_pagetop;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
601
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
602 new_pagetop = window->pagetop;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
603 window->pagetop = old_pagetop;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
604 set_window_pagetop (window, new_pagetop);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
605 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
606
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
607 if (window->flags & W_UpdateWindow)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
608 display_update_one_window (window);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
609
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
610 display_cursor_at_point (window);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
611 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
612
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
613 /* Move WINDOW->point from OLD line index to NEW line index. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
614 static void
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
615 move_to_new_line (old, new, window)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
616 int old, new;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
617 WINDOW *window;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
618 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
619 if (old == -1)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
620 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
621 info_error (CANT_FIND_POINT);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
622 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
623 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
624 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
625 int goal;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
626
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
627 if (new >= window->line_count || new < 0)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
628 return;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
629
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
630 goal = window_get_goal_column (window);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
631 window->goal_column = goal;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
632
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
633 window->point = window->line_starts[new] - window->node->contents;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
634 window->point += window_chars_to_goal (window->line_starts[new], goal);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
635 info_show_point (window);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
636 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
637 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
638
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
639 /* Move WINDOW's point down to the next line if possible. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
640 DECLARE_INFO_COMMAND (info_next_line, "Move down to the next line")
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
641 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
642 int old_line, new_line;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
643
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
644 if (count < 0)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
645 info_prev_line (window, -count, key);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
646 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
647 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
648 old_line = window_line_of_point (window);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
649 new_line = old_line + count;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
650 move_to_new_line (old_line, new_line, window);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
651 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
652 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
653
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
654 /* Move WINDOW's point up to the previous line if possible. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
655 DECLARE_INFO_COMMAND (info_prev_line, "Move up to the previous line")
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
656 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
657 int old_line, new_line;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
658
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
659 if (count < 0)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
660 info_next_line (window, -count, key);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
661 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
662 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
663 old_line = window_line_of_point (window);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
664 new_line = old_line - count;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
665 move_to_new_line (old_line, new_line, window);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
666 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
667 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
668
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
669 /* Move WINDOW's point to the end of the true line. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
670 DECLARE_INFO_COMMAND (info_end_of_line, "Move to the end of the line")
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
671 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
672 register int point, len;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
673 register char *buffer;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
674
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
675 buffer = window->node->contents;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
676 len = window->node->nodelen;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
677
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
678 for (point = window->point;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
679 (point < len) && (buffer[point] != '\n');
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
680 point++);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
681
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
682 if (point != window->point)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
683 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
684 window->point = point;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
685 info_show_point (window);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
686 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
687 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
688
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
689 /* Move WINDOW's point to the beginning of the true line. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
690 DECLARE_INFO_COMMAND (info_beginning_of_line, "Move to the start of the line")
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
691 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
692 register int point;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
693 register char *buffer;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
694
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
695 buffer = window->node->contents;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
696 point = window->point;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
697
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
698 for (; (point) && (buffer[point - 1] != '\n'); point--);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
699
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
700 /* If at a line start alreay, do nothing. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
701 if (point != window->point)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
702 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
703 window->point = point;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
704 info_show_point (window);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
705 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
706 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
707
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
708 /* Move point forward in the node. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
709 DECLARE_INFO_COMMAND (info_forward_char, "Move forward a character")
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
710 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
711 if (count < 0)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
712 info_backward_char (window, -count, key);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
713 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
714 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
715 window->point += count;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
716
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
717 if (window->point >= window->node->nodelen)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
718 window->point = window->node->nodelen - 1;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
719
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
720 info_show_point (window);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
721 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
722 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
723
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
724 /* Move point backward in the node. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
725 DECLARE_INFO_COMMAND (info_backward_char, "Move backward a character")
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
726 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
727 if (count < 0)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
728 info_forward_char (window, -count, key);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
729 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
730 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
731 window->point -= count;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
732
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
733 if (window->point < 0)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
734 window->point = 0;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
735
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
736 info_show_point (window);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
737 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
738 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
739
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
740 #define alphabetic(c) (islower (c) || isupper (c) || isdigit (c))
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
741
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
742 /* Move forward a word in this node. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
743 DECLARE_INFO_COMMAND (info_forward_word, "Move forward a word")
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
744 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
745 long point;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
746 char *buffer;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
747 int end, c;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
748
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
749 if (count < 0)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
750 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
751 info_backward_word (window, -count, key);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
752 return;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
753 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
754
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
755 point = window->point;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
756 buffer = window->node->contents;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
757 end = window->node->nodelen;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
758
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
759 while (count)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
760 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
761 if (point + 1 >= end)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
762 return;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
763
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
764 /* If we are not in a word, move forward until we are in one.
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
765 Then, move forward until we hit a non-alphabetic character. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
766 c = buffer[point];
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
767
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
768 if (!alphabetic (c))
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
769 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
770 while (++point < end)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
771 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
772 c = buffer[point];
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
773 if (alphabetic (c))
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
774 break;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
775 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
776 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
777
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
778 if (point >= end) return;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
779
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
780 while (++point < end)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
781 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
782 c = buffer[point];
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
783 if (!alphabetic (c))
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
784 break;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
785 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
786 --count;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
787 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
788 window->point = point;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
789 info_show_point (window);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
790 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
791
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
792 DECLARE_INFO_COMMAND (info_backward_word, "Move backward a word")
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
793 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
794 long point;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
795 char *buffer;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
796 int c;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
797
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
798 if (count < 0)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
799 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
800 info_forward_word (window, -count, key);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
801 return;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
802 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
803
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
804 buffer = window->node->contents;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
805 point = window->point;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
806
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
807 while (count)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
808 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
809 if (point == 0)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
810 break;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
811
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
812 /* Like info_forward_word (), except that we look at the
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
813 characters just before point. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
814
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
815 c = buffer[point - 1];
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
816
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
817 if (!alphabetic (c))
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
818 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
819 while (--point)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
820 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
821 c = buffer[point - 1];
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
822 if (alphabetic (c))
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
823 break;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
824 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
825 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
826
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
827 while (point)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
828 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
829 c = buffer[point - 1];
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
830 if (!alphabetic (c))
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
831 break;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
832 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
833 --point;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
834 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
835 --count;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
836 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
837 window->point = point;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
838 info_show_point (window);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
839 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
840
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
841 /* Here is a list of time counter names which correspond to ordinal numbers.
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
842 It is used to print "once" instead of "1". */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
843 static char *counter_names[] = {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
844 "not at all", "once", "twice", "three", "four", "five", "six",
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
845 (char *)NULL
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
846 };
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
847
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
848 /* Buffer used to return values from times_description (). */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
849 static char td_buffer[50];
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
850
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
851 /* Function returns a static string fully describing the number of times
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
852 present in COUNT. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
853 static char *
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
854 times_description (count)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
855 int count;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
856 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
857 register int i;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
858
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
859 td_buffer[0] = '\0';
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
860
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
861 for (i = 0; counter_names[i]; i++)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
862 if (count == i)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
863 break;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
864
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
865 if (counter_names[i])
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
866 sprintf (td_buffer, "%s%s", counter_names[i], count > 2 ? " times" : "");
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
867 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
868 sprintf (td_buffer, "%d times", count);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
869
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
870 return (td_buffer);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
871 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
872
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
873 /* Variable controlling the behaviour of default scrolling when you are
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
874 already at the bottom of a node. Possible values are defined in session.h.
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
875 The meanings are:
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
876
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
877 IS_Continuous Try to get first menu item, or failing that, the
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
878 "Next:" pointer, or failing that, the "Up:" and
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
879 "Next:" of the up.
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
880 IS_NextOnly Try to get "Next:" menu item.
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
881 IS_PageOnly Simply give up at the bottom of a node. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
882
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
883 int info_scroll_behaviour = IS_Continuous;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
884
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
885 /* Choices used by the completer when reading a value for the user-visible
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
886 variable "scroll-behaviour". */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
887 char *info_scroll_choices[] = {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
888 "Continuous", "Next Only", "Page Only", (char *)NULL
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
889 };
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
890
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
891 /* Move to 1st menu item, Next, Up/Next, or error in this window. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
892 static void
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
893 forward_move_node_structure (window, behaviour)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
894 WINDOW *window;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
895 int behaviour;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
896 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
897 switch (behaviour)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
898 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
899 case IS_PageOnly:
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
900 info_error (AT_NODE_BOTTOM);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
901 break;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
902
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
903 case IS_NextOnly:
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
904 info_next_label_of_node (window->node);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
905 if (!info_parsed_nodename && !info_parsed_filename)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
906 info_error ("No \"Next\" pointer for this node.");
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
907 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
908 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
909 window_message_in_echo_area ("Following \"Next\" node...");
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
910 info_handle_pointer ("Next", window);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
911 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
912 break;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
913
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
914 case IS_Continuous:
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
915 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
916 /* First things first. If this node contains a menu, move down
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
917 into the menu. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
918 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
919 REFERENCE **menu;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
920
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
921 menu = info_menu_of_node (window->node);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
922
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
923 if (menu)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
924 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
925 info_free_references (menu);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
926 window_message_in_echo_area ("Selecting first menu item...");
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
927 info_menu_digit (window, 1, '1');
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
928 return;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
929 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
930 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
931
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
932 /* Okay, this node does not contain a menu. If it contains a
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
933 "Next:" pointer, use that. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
934 info_next_label_of_node (window->node);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
935 if (info_label_was_found)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
936 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
937 window_message_in_echo_area ("Selecting \"Next\" node...");
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
938 info_handle_pointer ("Next", window);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
939 return;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
940 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
941
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
942 /* Okay, there wasn't a "Next:" for this node. Move "Up:" until we
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
943 can move "Next:". If that isn't possible, complain that there
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
944 are no more nodes. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
945 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
946 int up_counter, old_current;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
947 INFO_WINDOW *info_win;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
948
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
949 /* Remember the current node and location. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
950 info_win = get_info_window_of_window (window);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
951 old_current = info_win->current;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
952
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
953 /* Back up through the "Up:" pointers until we have found a "Next:"
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
954 that isn't the same as the first menu item found in that node. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
955 up_counter = 0;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
956 while (!info_error_was_printed)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
957 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
958 info_up_label_of_node (window->node);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
959 if (info_label_was_found)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
960 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
961 info_handle_pointer ("Up", window);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
962 if (info_error_was_printed)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
963 continue;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
964
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
965 up_counter++;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
966
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
967 info_next_label_of_node (window->node);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
968
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
969 /* If no "Next" pointer, keep backing up. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
970 if (!info_label_was_found)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
971 continue;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
972
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
973 /* If this node's first menu item is the same as this node's
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
974 Next pointer, keep backing up. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
975 if (!info_parsed_filename)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
976 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
977 REFERENCE **menu;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
978 char *next_nodename;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
979
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
980 /* Remember the name of the Next node, since reading
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
981 the menu can overwrite the contents of the
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
982 info_parsed_xxx strings. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
983 next_nodename = savestring (info_parsed_nodename);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
984
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
985 menu = info_menu_of_node (window->node);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
986 if (menu &&
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
987 (strcmp
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
988 (menu[0]->nodename, next_nodename) == 0))
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
989 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
990 info_free_references (menu);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
991 free (next_nodename);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
992 continue;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
993 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
994 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
995 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
996 /* Restore the world to where it was before
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
997 reading the menu contents. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
998 info_free_references (menu);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
999 free (next_nodename);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1000 info_next_label_of_node (window->node);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1001 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1002 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1003
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1004 /* This node has a "Next" pointer, and it is not the
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1005 same as the first menu item found in this node. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1006 window_message_in_echo_area
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1007 ("Moving \"Up\" %s, then \"Next\".",
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1008 times_description (up_counter));
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1009
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1010 info_handle_pointer ("Next", window);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1011 return;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1012 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1013 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1014 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1015 /* No more "Up" pointers. Print an error, and call it
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1016 quits. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1017 register int i;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1018
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1019 for (i = 0; i < up_counter; i++)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1020 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1021 info_win->nodes_index--;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1022 free (info_win->nodes[info_win->nodes_index]);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1023 info_win->nodes[info_win->nodes_index] = (NODE *)NULL;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1024 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1025 info_win->current = old_current;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1026 window->node = info_win->nodes[old_current];
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1027 window->pagetop = info_win->pagetops[old_current];
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1028 window->point = info_win->points[old_current];
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1029 recalculate_line_starts (window);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1030 window->flags |= W_UpdateWindow;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1031 info_error ("No more nodes.");
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1032 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1033 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1034 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1035 break;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1036 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1037 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1038 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1039
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1040 /* Move Prev, Up or error in WINDOW depending on BEHAVIOUR. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1041 static void
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1042 backward_move_node_structure (window, behaviour)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1043 WINDOW *window;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1044 int behaviour;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1045 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1046 switch (behaviour)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1047 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1048 case IS_PageOnly:
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1049 info_error (AT_NODE_TOP);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1050 break;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1051
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1052 case IS_NextOnly:
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1053 info_prev_label_of_node (window->node);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1054 if (!info_parsed_nodename && !info_parsed_filename)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1055 info_error ("No \"Prev\" for this node.");
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1056 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1057 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1058 window_message_in_echo_area ("Moving \"Prev\" in this window.");
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1059 info_handle_pointer ("Prev", window);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1060 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1061 break;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1062
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1063 case IS_Continuous:
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1064 info_prev_label_of_node (window->node);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1065
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1066 if (!info_parsed_nodename && !info_parsed_filename)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1067 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1068 info_up_label_of_node (window->node);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1069 if (!info_parsed_nodename && !info_parsed_filename)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1070 info_error ("No \"Prev\" or \"Up\" for this node.");
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1071 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1072 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1073 window_message_in_echo_area ("Moving \"Up\" in this window.");
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1074 info_handle_pointer ("Up", window);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1075 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1076 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1077 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1078 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1079 REFERENCE **menu;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1080 int inhibit_menu_traversing = 0;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1081
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1082 /* Watch out! If this node's Prev is the same as the Up, then
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1083 move Up. Otherwise, we could move Prev, and then to the last
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1084 menu item in the Prev. This would cause the user to loop
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1085 through a subsection of the info file. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1086 if (!info_parsed_filename && info_parsed_nodename)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1087 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1088 char *pnode;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1089
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1090 pnode = savestring (info_parsed_nodename);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1091 info_up_label_of_node (window->node);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1092
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1093 if (!info_parsed_filename && info_parsed_nodename &&
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1094 strcmp (info_parsed_nodename, pnode) == 0)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1095 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1096 /* The nodes are the same. Inhibit moving to the last
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1097 menu item. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1098 free (pnode);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1099 inhibit_menu_traversing = 1;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1100 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1101 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1102 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1103 free (pnode);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1104 info_prev_label_of_node (window->node);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1105 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1106 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1107
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1108 /* Move to the previous node. If this node now contains a menu,
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1109 and we have not inhibited movement to it, move to the node
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1110 corresponding to the last menu item. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1111 window_message_in_echo_area ("Moving \"Prev\" in this window.");
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1112 info_handle_pointer ("Prev", window);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1113
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1114 if (!inhibit_menu_traversing)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1115 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1116 while (!info_error_was_printed &&
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1117 (menu = info_menu_of_node (window->node)))
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1118 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1119 info_free_references (menu);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1120 window_message_in_echo_area
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1121 ("Moving to \"Prev\"'s last menu item.");
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1122 info_menu_digit (window, 1, '0');
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1123 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1124 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1125 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1126 break;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1127 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1128 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1129
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1130 /* Move continuously forward through the node structure of this info file. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1131 DECLARE_INFO_COMMAND (info_global_next_node,
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1132 "Move forwards or down through node structure")
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1133 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1134 if (count < 0)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1135 info_global_prev_node (window, -count, key);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1136 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1137 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1138 while (count && !info_error_was_printed)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1139 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1140 forward_move_node_structure (window, IS_Continuous);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1141 count--;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1142 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1143 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1144 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1145
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1146 /* Move continuously backward through the node structure of this info file. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1147 DECLARE_INFO_COMMAND (info_global_prev_node,
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1148 "Move backwards or up through node structure")
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1149 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1150 if (count < 0)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1151 info_global_next_node (window, -count, key);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1152 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1153 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1154 while (count && !info_error_was_printed)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1155 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1156 backward_move_node_structure (window, IS_Continuous);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1157 count--;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1158 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1159 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1160 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1161
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1162 /* Show the next screen of WINDOW's node. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1163 DECLARE_INFO_COMMAND (info_scroll_forward, "Scroll forward in this window")
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1164 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1165 if (count < 0)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1166 info_scroll_backward (window, -count, key);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1167 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1168 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1169 int desired_top;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1170
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1171 /* Without an explicit numeric argument, scroll the bottom two
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1172 lines to the top of this window, Or, if at bottom of window,
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1173 and the user wishes to scroll through nodes get the "Next" node
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1174 for this window. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1175 if (!info_explicit_arg && count == 1)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1176 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1177 desired_top = window->pagetop + (window->height - 2);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1178
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1179 /* If there are no more lines to scroll here, error, or get
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1180 another node, depending on INFO_SCROLL_BEHAVIOUR. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1181 if (desired_top > window->line_count)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1182 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1183 int behaviour = info_scroll_behaviour;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1184
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1185 /* Here is a hack. If the key being used is not SPC, do the
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1186 PageOnly behaviour. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1187 if (key != SPC && key != DEL)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1188 behaviour = IS_PageOnly;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1189
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1190 forward_move_node_structure (window, behaviour);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1191 return;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1192 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1193 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1194 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1195 desired_top = window->pagetop + count;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1196
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1197 if (desired_top >= window->line_count)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1198 desired_top = window->line_count - 2;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1199
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1200 if (window->pagetop > desired_top)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1201 return;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1202 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1203 set_window_pagetop (window, desired_top);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1204 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1205 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1206
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1207 /* Show the previous screen of WINDOW's node. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1208 DECLARE_INFO_COMMAND (info_scroll_backward, "Scroll backward in this window")
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1209 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1210 if (count < 0)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1211 info_scroll_forward (window, -count, key);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1212 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1213 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1214 int desired_top;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1215
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1216 /* Without an explicit numeric argument, scroll the top two lines
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1217 to the bottom of this window, or move to the previous, or Up'th
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1218 node. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1219 if (!info_explicit_arg && count == 1)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1220 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1221 desired_top = window->pagetop - (window->height - 2);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1222
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1223 if ((desired_top < 0) && (window->pagetop == 0))
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1224 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1225 int behaviour = info_scroll_behaviour;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1226
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1227 /* Same kind of hack as in info_scroll_forward. If the key
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1228 used to invoke this command is not DEL, do only the PageOnly
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1229 behaviour. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1230 if (key != DEL && key != SPC)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1231 behaviour = IS_PageOnly;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1232
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1233 backward_move_node_structure (window, behaviour);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1234 return;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1235 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1236 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1237 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1238 desired_top = window->pagetop - count;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1239
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1240 if (desired_top < 0)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1241 desired_top = 0;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1242
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1243 set_window_pagetop (window, desired_top);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1244 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1245 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1246
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1247 /* Move to the beginning of the node. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1248 DECLARE_INFO_COMMAND (info_beginning_of_node, "Move to the start of this node")
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1249 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1250 window->pagetop = window->point = 0;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1251 window->flags |= W_UpdateWindow;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1252 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1253
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1254 /* Move to the end of the node. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1255 DECLARE_INFO_COMMAND (info_end_of_node, "Move to the end of this node")
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1256 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1257 window->point = window->node->nodelen - 1;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1258 info_show_point (window);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1259 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1260
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1261 /* **************************************************************** */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1262 /* */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1263 /* Commands for Manipulating Windows */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1264 /* */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1265 /* **************************************************************** */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1266
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1267 /* Make the next window in the chain be the active window. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1268 DECLARE_INFO_COMMAND (info_next_window, "Select the next window")
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1269 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1270 if (count < 0)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1271 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1272 info_prev_window (window, -count, key);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1273 return;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1274 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1275
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1276 /* If no other window, error now. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1277 if (!windows->next && !echo_area_is_active)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1278 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1279 info_error (ONE_WINDOW);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1280 return;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1281 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1282
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1283 while (count--)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1284 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1285 if (window->next)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1286 window = window->next;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1287 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1288 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1289 if (window == the_echo_area || !echo_area_is_active)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1290 window = windows;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1291 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1292 window = the_echo_area;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1293 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1294 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1295
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1296 if (active_window != window)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1297 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1298 if (auto_footnotes_p)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1299 info_get_or_remove_footnotes (window);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1300
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1301 window->flags |= W_UpdateWindow;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1302 active_window = window;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1303 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1304 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1305
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1306 /* Make the previous window in the chain be the active window. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1307 DECLARE_INFO_COMMAND (info_prev_window, "Select the previous window")
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1308 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1309 if (count < 0)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1310 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1311 info_next_window (window, -count, key);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1312 return;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1313 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1314
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1315 /* Only one window? */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1316
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1317 if (!windows->next && !echo_area_is_active)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1318 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1319 info_error (ONE_WINDOW);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1320 return;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1321 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1322
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1323 while (count--)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1324 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1325 /* If we are in the echo area, or if the echo area isn't active and we
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1326 are in the first window, find the last window in the chain. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1327 if (window == the_echo_area ||
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1328 (window == windows && !echo_area_is_active))
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1329 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1330 register WINDOW *win, *last;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1331
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1332 for (win = windows; win; win = win->next)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1333 last = win;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1334
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1335 window = last;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1336 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1337 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1338 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1339 if (window == windows)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1340 window = the_echo_area;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1341 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1342 window = window->prev;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1343 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1344 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1345
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1346 if (active_window != window)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1347 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1348 if (auto_footnotes_p)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1349 info_get_or_remove_footnotes (window);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1350
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1351 window->flags |= W_UpdateWindow;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1352 active_window = window;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1353 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1354 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1355
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1356 /* Split WINDOW into two windows, both showing the same node. If we
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1357 are automatically tiling windows, re-tile after the split. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1358 DECLARE_INFO_COMMAND (info_split_window, "Split the current window")
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1359 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1360 WINDOW *split, *old_active;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1361 int pagetop;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1362
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1363 /* Remember the current pagetop of the window being split. If it doesn't
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1364 change, we can scroll its contents around after the split. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1365 pagetop = window->pagetop;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1366
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1367 /* Make the new window. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1368 old_active = active_window;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1369 active_window = window;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1370 split = window_make_window (window->node);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1371 active_window = old_active;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1372
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1373 if (!split)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1374 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1375 info_error (WIN_TOO_SMALL);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1376 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1377 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1378 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1379 #if defined (SPLIT_BEFORE_ACTIVE)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1380 /* Try to scroll the old window into its new postion. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1381 if (pagetop == window->pagetop)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1382 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1383 int start, end, amount;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1384
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1385 start = split->first_row;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1386 end = start + window->height;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1387 amount = split->height + 1;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1388 display_scroll_display (start, end, amount);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1389 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1390 #else /* !SPLIT_BEFORE_ACTIVE */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1391 /* Make sure point still appears in the active window. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1392 info_show_point (window);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1393 #endif /* !SPLIT_BEFORE_ACTIVE */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1394
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1395 /* If the window just split was one internal to Info, try to display
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1396 something else in it. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1397 if (internal_info_node_p (split->node))
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1398 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1399 register int i, j;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1400 INFO_WINDOW *iw;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1401 NODE *node = (NODE *)NULL;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1402 char *filename;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1403
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1404 for (i = 0; iw = info_windows[i]; i++)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1405 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1406 for (j = 0; j < iw->nodes_index; j++)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1407 if (!internal_info_node_p (iw->nodes[j]))
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1408 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1409 if (iw->nodes[j]->parent)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1410 filename = iw->nodes[j]->parent;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1411 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1412 filename = iw->nodes[j]->filename;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1413
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1414 node = info_get_node (filename, iw->nodes[j]->nodename);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1415 if (node)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1416 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1417 window_set_node_of_window (split, node);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1418 i = info_windows_index - 1;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1419 break;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1420 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1421 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1422 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1423 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1424 split->pagetop = window->pagetop;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1425
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1426 if (auto_tiling_p)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1427 window_tile_windows (DONT_TILE_INTERNALS);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1428 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1429 window_adjust_pagetop (split);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1430
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1431 remember_window_and_node (split, split->node);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1432 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1433 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1434
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1435 /* Delete WINDOW, forgetting the list of last visited nodes. If we are
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1436 automatically displaying footnotes, show or remove the footnotes
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1437 window. If we are automatically tiling windows, re-tile after the
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1438 deletion. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1439 DECLARE_INFO_COMMAND (info_delete_window, "Delete the current window")
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1440 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1441 if (!windows->next)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1442 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1443 info_error (CANT_KILL_LAST);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1444 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1445 else if (window->flags & W_WindowIsPerm)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1446 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1447 info_error ("Cannot delete a permanent window");
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1448 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1449 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1450 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1451 info_delete_window_internal (window);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1452
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1453 if (auto_footnotes_p)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1454 info_get_or_remove_footnotes (active_window);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1455
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1456 if (auto_tiling_p)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1457 window_tile_windows (DONT_TILE_INTERNALS);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1458 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1459 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1460
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1461 /* Do the physical deletion of WINDOW, and forget this window and
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1462 associated nodes. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1463 void
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1464 info_delete_window_internal (window)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1465 WINDOW *window;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1466 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1467 if (windows->next && ((window->flags & W_WindowIsPerm) == 0))
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1468 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1469 /* We not only delete the window from the display, we forget it from
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1470 our list of remembered windows. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1471 forget_window_and_nodes (window);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1472 window_delete_window (window);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1473
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1474 if (echo_area_is_active)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1475 echo_area_inform_of_deleted_window (window);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1476 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1477 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1478
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1479 /* Just keep WINDOW, deleting all others. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1480 DECLARE_INFO_COMMAND (info_keep_one_window, "Delete all other windows")
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1481 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1482 int num_deleted; /* The number of windows we deleted. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1483 int pagetop, start, end;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1484
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1485 /* Remember a few things about this window. We may be able to speed up
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1486 redisplay later by scrolling its contents. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1487 pagetop = window->pagetop;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1488 start = window->first_row;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1489 end = start + window->height;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1490
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1491 num_deleted = 0;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1492
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1493 while (1)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1494 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1495 WINDOW *win;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1496
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1497 /* Find an eligible window and delete it. If no eligible windows
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1498 are found, we are done. A window is eligible for deletion if
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1499 is it not permanent, and it is not WINDOW. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1500 for (win = windows; win; win = win->next)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1501 if (win != window && ((win->flags & W_WindowIsPerm) == 0))
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1502 break;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1503
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1504 if (!win)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1505 break;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1506
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1507 info_delete_window_internal (win);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1508 num_deleted++;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1509 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1510
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1511 /* Scroll the contents of this window into the right place so that the
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1512 user doesn't have to wait any longer than necessary for redisplay. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1513 if (num_deleted)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1514 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1515 int amount;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1516
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1517 amount = (window->first_row - start);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1518 amount -= (window->pagetop - pagetop);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1519 display_scroll_display (start, end, amount);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1520 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1521
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1522 window->flags |= W_UpdateWindow;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1523 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1524
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1525 /* Scroll the "other" window of WINDOW. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1526 DECLARE_INFO_COMMAND (info_scroll_other_window, "Scroll the other window")
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1527 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1528 WINDOW *other;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1529
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1530 /* If only one window, give up. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1531 if (!windows->next)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1532 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1533 info_error (ONE_WINDOW);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1534 return;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1535 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1536
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1537 other = window->next;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1538
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1539 if (!other)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1540 other = window->prev;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1541
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1542 info_scroll_forward (other, count, key);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1543 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1544
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1545 /* Change the size of WINDOW by AMOUNT. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1546 DECLARE_INFO_COMMAND (info_grow_window, "Grow (or shrink) this window")
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1547 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1548 window_change_window_height (window, count);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1549 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1550
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1551 /* When non-zero, tiling takes place automatically when info_split_window
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1552 is called. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1553 int auto_tiling_p = 0;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1554
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1555 /* Tile all of the visible windows. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1556 DECLARE_INFO_COMMAND (info_tile_windows,
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1557 "Divide the available screen space among the visible windows")
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1558 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1559 window_tile_windows (TILE_INTERNALS);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1560 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1561
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1562 /* Toggle the state of this window's wrapping of lines. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1563 DECLARE_INFO_COMMAND (info_toggle_wrap,
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1564 "Toggle the state of line wrapping in the current window")
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1565 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1566 window_toggle_wrap (window);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1567 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1568
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1569 /* **************************************************************** */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1570 /* */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1571 /* Info Node Commands */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1572 /* */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1573 /* **************************************************************** */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1574
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1575 /* Using WINDOW for various defaults, select the node referenced by ENTRY
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1576 in it. If the node is selected, the window and node are remembered. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1577 void
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1578 info_select_reference (window, entry)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1579 WINDOW *window;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1580 REFERENCE *entry;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1581 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1582 NODE *node;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1583 char *filename, *nodename, *file_system_error;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1584
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1585 file_system_error = (char *)NULL;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1586
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1587 filename = entry->filename;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1588 if (!filename)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1589 filename = window->node->parent;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1590 if (!filename)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1591 filename = window->node->filename;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1592
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1593 if (filename)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1594 filename = savestring (filename);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1595
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1596 if (entry->nodename)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1597 nodename = savestring (entry->nodename);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1598 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1599 nodename = savestring ("Top");
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1600
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1601 node = info_get_node (filename, nodename);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1602
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1603 /* Try something a little weird. If the node couldn't be found, and the
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1604 reference was of the form "foo::", see if the entry->label can be found
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1605 as a file, with a node of "Top". */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1606 if (!node)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1607 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1608 if (info_recent_file_error)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1609 file_system_error = savestring (info_recent_file_error);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1610
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1611 if (entry->nodename && (strcmp (entry->nodename, entry->label) == 0))
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1612 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1613 node = info_get_node (entry->label, "Top");
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1614 if (!node && info_recent_file_error)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1615 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1616 maybe_free (file_system_error);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1617 file_system_error = savestring (info_recent_file_error);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1618 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1619 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1620 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1621
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1622 if (!node)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1623 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1624 if (file_system_error)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1625 info_error (file_system_error);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1626 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1627 info_error (CANT_FIND_NODE, nodename);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1628 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1629
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1630 maybe_free (file_system_error);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1631 maybe_free (filename);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1632 maybe_free (nodename);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1633
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1634 if (node)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1635 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1636 set_remembered_pagetop_and_point (window);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1637 info_set_node_of_window (window, node);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1638 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1639 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1640
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1641 /* Parse the node specification in LINE using WINDOW to default the filename.
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1642 Select the parsed node in WINDOW and remember it, or error if the node
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1643 couldn't be found. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1644 static void
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1645 info_parse_and_select (line, window)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1646 char *line;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1647 WINDOW *window;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1648 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1649 REFERENCE entry;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1650
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1651 info_parse_node (line, DONT_SKIP_NEWLINES);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1652
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1653 entry.nodename = info_parsed_nodename;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1654 entry.filename = info_parsed_filename;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1655 entry.label = "*info-parse-and-select*";
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1656
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1657 info_select_reference (window, &entry);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1658 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1659
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1660 /* Given that the values of INFO_PARSED_FILENAME and INFO_PARSED_NODENAME
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1661 are previously filled, try to get the node represented by them into
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1662 WINDOW. The node should have been pointed to by the LABEL pointer of
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1663 WINDOW->node. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1664 static void
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1665 info_handle_pointer (label, window)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1666 char *label;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1667 WINDOW *window;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1668 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1669 if (info_parsed_filename || info_parsed_nodename)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1670 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1671 char *filename, *nodename;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1672 NODE *node;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1673
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1674 filename = nodename = (char *)NULL;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1675
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1676 if (info_parsed_filename)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1677 filename = savestring (info_parsed_filename);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1678 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1679 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1680 if (window->node->parent)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1681 filename = savestring (window->node->parent);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1682 else if (window->node->filename)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1683 filename = savestring (window->node->filename);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1684 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1685
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1686 if (info_parsed_nodename)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1687 nodename = savestring (info_parsed_nodename);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1688 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1689 nodename = savestring ("Top");
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1690
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1691 node = info_get_node (filename, nodename);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1692
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1693 if (node)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1694 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1695 INFO_WINDOW *info_win;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1696
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1697 info_win = get_info_window_of_window (window);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1698 if (info_win)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1699 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1700 info_win->pagetops[info_win->current] = window->pagetop;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1701 info_win->points[info_win->current] = window->point;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1702 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1703 set_remembered_pagetop_and_point (window);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1704 info_set_node_of_window (window, node);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1705 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1706 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1707 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1708 if (info_recent_file_error)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1709 info_error (info_recent_file_error);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1710 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1711 info_error (CANT_FILE_NODE, filename, nodename);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1712 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1713
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1714 free (filename);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1715 free (nodename);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1716 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1717 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1718 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1719 info_error (NO_POINTER, label);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1720 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1721 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1722
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1723 /* Make WINDOW display the "Next:" node of the node currently being
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1724 displayed. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1725 DECLARE_INFO_COMMAND (info_next_node, "Select the `Next' node")
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1726 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1727 info_next_label_of_node (window->node);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1728 info_handle_pointer ("Next", window);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1729 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1730
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1731 /* Make WINDOW display the "Prev:" node of the node currently being
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1732 displayed. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1733 DECLARE_INFO_COMMAND (info_prev_node, "Select the `Prev' node")
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1734 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1735 info_prev_label_of_node (window->node);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1736 info_handle_pointer ("Prev", window);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1737 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1738
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1739 /* Make WINDOW display the "Up:" node of the node currently being
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1740 displayed. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1741 DECLARE_INFO_COMMAND (info_up_node, "Select the `Up' node")
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1742 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1743 info_up_label_of_node (window->node);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1744 info_handle_pointer ("Up", window);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1745 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1746
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1747 /* Make WINDOW display the last node of this info file. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1748 DECLARE_INFO_COMMAND (info_last_node, "Select the last node in this file")
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1749 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1750 register int i;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1751 FILE_BUFFER *fb = file_buffer_of_window (window);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1752 NODE *node = (NODE *)NULL;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1753
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1754 if (fb && fb->tags)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1755 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1756 for (i = 0; fb->tags[i]; i++);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1757 node = info_get_node (fb->filename, fb->tags[i - 1]->nodename);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1758 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1759
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1760 if (!node)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1761 info_error ("This window has no additional nodes");
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1762 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1763 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1764 set_remembered_pagetop_and_point (window);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1765 info_set_node_of_window (window, node);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1766 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1767 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1768
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1769 /* Make WINDOW display the first node of this info file. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1770 DECLARE_INFO_COMMAND (info_first_node, "Select the first node in this file")
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1771 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1772 FILE_BUFFER *fb = file_buffer_of_window (window);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1773 NODE *node = (NODE *)NULL;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1774
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1775 if (fb && fb->tags)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1776 node = info_get_node (fb->filename, fb->tags[0]->nodename);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1777
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1778 if (!node)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1779 info_error ("This window has no additional nodes");
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1780 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1781 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1782 set_remembered_pagetop_and_point (window);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1783 info_set_node_of_window (window, node);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1784 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1785 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1786
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1787 /* Make WINDOW display the previous node displayed in this window. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1788 DECLARE_INFO_COMMAND (info_history_node,
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1789 "Select the most recently selected node")
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1790 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1791 INFO_WINDOW *info_win;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1792
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1793 /* Find the INFO_WINDOW which contains WINDOW. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1794 info_win = get_info_window_of_window (window);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1795
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1796 if (!info_win)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1797 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1798 info_error ("Requested window is not present!");
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1799 return;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1800 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1801
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1802 set_remembered_pagetop_and_point (window);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1803 if (!info_win->current)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1804 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1805 if (info_win->nodes_index > 1)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1806 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1807 window_message_in_echo_area
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1808 ("Now wrapped around to beginning of history.");
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1809 info_win->current = info_win->nodes_index;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1810 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1811 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1812 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1813 info_error ("No earlier nodes in this window.");
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1814 return;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1815 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1816 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1817
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1818 info_win->current--;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1819 window_set_node_of_window (window, info_win->nodes[info_win->current]);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1820 window->pagetop = info_win->pagetops[info_win->current];
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1821 window->point = info_win->points[info_win->current];
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1822 window->flags |= W_UpdateWindow;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1823 if (auto_footnotes_p)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1824 info_get_or_remove_footnotes (window);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1825 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1826
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1827 /* Select the last menu item in WINDOW->node. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1828 DECLARE_INFO_COMMAND (info_last_menu_item,
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1829 "Select the last item in this node's menu")
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1830 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1831 info_menu_digit (window, 1, '0');
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1832 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1833
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1834 /* Use KEY (a digit) to select the Nth menu item in WINDOW->node. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1835 DECLARE_INFO_COMMAND (info_menu_digit, "Select this menu item")
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1836 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1837 register int i, item;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1838 register REFERENCE *entry, **menu;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1839
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1840 menu = info_menu_of_node (window->node);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1841
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1842 if (!menu)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1843 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1844 info_error (NO_MENU_NODE);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1845 return;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1846 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1847
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1848 /* We have the menu. See if there are this many items in it. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1849 item = key - '0';
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1850
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1851 /* Special case. Item "0" is the last item in this menu. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1852 if (item == 0)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1853 for (i = 0; menu[i + 1]; i++);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1854 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1855 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1856 for (i = 0; entry = menu[i]; i++)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1857 if (i == item - 1)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1858 break;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1859 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1860
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1861 if (menu[i])
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1862 info_select_reference (window, menu[i]);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1863 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1864 info_error ("There aren't %d items in this menu.", item);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1865
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1866 info_free_references (menu);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1867 return;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1868 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1869
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1870 /* Read a menu or followed reference from the user defaulting to the
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1871 reference found on the current line, and select that node. The
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1872 reading is done with completion. BUILDER is the function used
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1873 to build the list of references. ASK_P is non-zero if the user
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1874 should be prompted, or zero to select the default item. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1875 static void
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1876 info_menu_or_ref_item (window, count, key, builder, ask_p)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1877 WINDOW *window;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1878 int count;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1879 unsigned char key;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1880 REFERENCE **(*builder) ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1881 int ask_p;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1882 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1883 REFERENCE **menu, *entry, *defentry = (REFERENCE *)NULL;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1884 char *line;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1885
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1886 menu = (*builder) (window->node);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1887
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1888 if (!menu)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1889 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1890 if (builder == info_menu_of_node)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1891 info_error (NO_MENU_NODE);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1892 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1893 info_error (NO_XREF_NODE);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1894 return;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1895 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1896
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1897 /* Default the selected reference to the one which is on the line that
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1898 point is in. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1899 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1900 REFERENCE **refs = (REFERENCE **)NULL;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1901 int point_line;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1902
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1903 point_line = window_line_of_point (window);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1904
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1905 if (point_line != -1)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1906 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1907 SEARCH_BINDING binding;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1908
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1909 binding.start = 0;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1910 binding.buffer = window->line_starts[point_line];
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1911 if (window->line_starts[point_line + 1])
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1912 binding.end = window->line_starts[point_line + 1] - binding.buffer;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1913 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1914 binding.end =
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1915 (window->node->contents + window->node->nodelen) - binding.buffer;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1916 binding.flags = 0;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1917
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1918 if (builder == info_menu_of_node)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1919 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1920 if (point_line)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1921 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1922 binding.buffer--;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1923 binding.end++;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1924
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1925 refs = info_menu_items (&binding);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1926 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1927 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1928 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1929 refs = info_xrefs (&binding);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1930
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1931 if (refs)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1932 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1933 if ((strcmp (refs[0]->label, "Menu") != 0) ||
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1934 (builder == info_xrefs_of_node))
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1935 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1936 defentry = (REFERENCE *)xmalloc (sizeof (REFERENCE));
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1937 defentry->label = savestring (refs[0]->label);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1938 defentry->filename = refs[0]->filename;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1939 defentry->nodename = refs[0]->nodename;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1940
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1941 if (defentry->filename)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1942 defentry->filename = savestring (defentry->filename);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1943 if (defentry->nodename)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1944 defentry->nodename = savestring (defentry->nodename);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1945 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1946 info_free_references (refs);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1947 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1948 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1949 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1950
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1951 /* If we are going to ask the user a question, do it now. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1952 if (ask_p)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1953 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1954 char *prompt;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1955
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1956 /* Build the prompt string. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1957 if (defentry)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1958 prompt = (char *)xmalloc (20 + strlen (defentry->label));
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1959 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1960 prompt = (char *)xmalloc (20);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1961
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1962 if (builder == info_menu_of_node)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1963 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1964 if (defentry)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1965 sprintf (prompt, "Menu item (%s): ", defentry->label);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1966 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1967 sprintf (prompt, "Menu item: ");
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1968 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1969 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1970 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1971 if (defentry)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1972 sprintf (prompt, "Follow xref (%s): ", defentry->label);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1973 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1974 sprintf (prompt, "Follow xref: ");
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1975 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1976
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1977 line = info_read_completing_in_echo_area (window, prompt, menu);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1978 free (prompt);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1979
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1980 window = active_window;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1981
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1982 /* User aborts, just quit. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1983 if (!line)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1984 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1985 maybe_free (defentry);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1986 info_free_references (menu);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1987 info_abort_key (window, 0, 0);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1988 return;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1989 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1990
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1991 /* If we had a default and the user accepted it, use that. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1992 if (!*line)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1993 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1994 free (line);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1995 if (defentry)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1996 line = savestring (defentry->label);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1997 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1998 line = (char *)NULL;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
1999 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2000 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2001 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2002 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2003 /* Not going to ask any questions. If we have a default entry, use
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2004 that, otherwise return. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2005 if (!defentry)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2006 return;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2007 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2008 line = savestring (defentry->label);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2009 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2010
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2011 if (line)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2012 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2013 /* Find the selected label in the references. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2014 entry = info_get_labeled_reference (line, menu);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2015
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2016 if (!entry && defentry)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2017 info_error ("The reference disappeared! (%s).", line);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2018 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2019 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2020 NODE *orig;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2021
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2022 orig = window->node;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2023 info_select_reference (window, entry);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2024 if ((builder == info_xrefs_of_node) && (window->node != orig))
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2025 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2026 long offset;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2027 long start;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2028
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2029 if (window->line_count > 0)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2030 start = window->line_starts[1] - window->node->contents;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2031 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2032 start = 0;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2033
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2034 offset =
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2035 info_target_search_node (window->node, entry->label, start);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2036
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2037 if (offset != -1)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2038 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2039 window->point = offset;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2040 window_adjust_pagetop (window);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2041 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2042 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2043 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2044
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2045 free (line);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2046 if (defentry)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2047 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2048 free (defentry->label);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2049 maybe_free (defentry->filename);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2050 maybe_free (defentry->nodename);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2051 free (defentry);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2052 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2053 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2054
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2055 info_free_references (menu);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2056
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2057 if (!info_error_was_printed)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2058 window_clear_echo_area ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2059 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2060
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2061 /* Read a line (with completion) which is the name of a menu item,
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2062 and select that item. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2063 DECLARE_INFO_COMMAND (info_menu_item, "Read a menu item and select its node")
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2064 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2065 info_menu_or_ref_item (window, count, key, info_menu_of_node, 1);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2066 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2067
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2068 /* Read a line (with completion) which is the name of a reference to
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2069 follow, and select the node. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2070 DECLARE_INFO_COMMAND
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2071 (info_xref_item, "Read a footnote or cross reference and select its node")
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2072 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2073 info_menu_or_ref_item (window, count, key, info_xrefs_of_node, 1);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2074 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2075
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2076 /* Position the cursor at the start of this node's menu. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2077 DECLARE_INFO_COMMAND (info_find_menu, "Move to the start of this node's menu")
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2078 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2079 SEARCH_BINDING binding;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2080 long position;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2081
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2082 binding.buffer = window->node->contents;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2083 binding.start = 0;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2084 binding.end = window->node->nodelen;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2085 binding.flags = S_FoldCase | S_SkipDest;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2086
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2087 position = search (INFO_MENU_LABEL, &binding);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2088
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2089 if (position == -1)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2090 info_error (NO_MENU_NODE);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2091 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2092 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2093 window->point = position;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2094 window_adjust_pagetop (window);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2095 window->flags |= W_UpdateWindow;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2096 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2097 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2098
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2099 /* Visit as many menu items as is possible, each in a separate window. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2100 DECLARE_INFO_COMMAND (info_visit_menu,
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2101 "Visit as many menu items at once as possible")
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2102 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2103 register int i;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2104 REFERENCE *entry, **menu;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2105
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2106 menu = info_menu_of_node (window->node);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2107
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2108 if (!menu)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2109 info_error (NO_MENU_NODE);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2110
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2111 for (i = 0; (!info_error_was_printed) && (entry = menu[i]); i++)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2112 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2113 WINDOW *new;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2114
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2115 new = window_make_window (window->node);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2116 window_tile_windows (TILE_INTERNALS);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2117
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2118 if (!new)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2119 info_error (WIN_TOO_SMALL);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2120 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2121 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2122 active_window = new;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2123 info_select_reference (new, entry);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2124 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2125 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2126 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2127
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2128 /* Read a line of input which is a node name, and go to that node. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2129 DECLARE_INFO_COMMAND (info_goto_node, "Read a node name and select it")
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2130 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2131 char *line;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2132 NODE *node;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2133
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2134 #define GOTO_COMPLETES
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2135 #if defined (GOTO_COMPLETES)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2136 /* Build a completion list of all of the known nodes. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2137 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2138 register int fbi, i;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2139 FILE_BUFFER *current;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2140 REFERENCE **items = (REFERENCE **)NULL;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2141 int items_index = 0;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2142 int items_slots = 0;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2143
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2144 current = file_buffer_of_window (window);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2145
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2146 for (fbi = 0; info_loaded_files && info_loaded_files[fbi]; fbi++)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2147 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2148 FILE_BUFFER *fb;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2149 REFERENCE *entry;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2150 int this_is_the_current_fb;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2151
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2152 fb = info_loaded_files[fbi];
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2153 this_is_the_current_fb = (current == fb);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2154
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2155 entry = (REFERENCE *)xmalloc (sizeof (REFERENCE));
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2156 entry->filename = entry->nodename = (char *)NULL;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2157 entry->label = (char *)xmalloc (4 + strlen (fb->filename));
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2158 sprintf (entry->label, "(%s)*", fb->filename);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2159
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2160 add_pointer_to_array
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2161 (entry, items_index, items, items_slots, 10, REFERENCE *);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2162
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2163 if (fb->tags)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2164 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2165 for (i = 0; fb->tags[i]; i++)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2166 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2167 entry = (REFERENCE *)xmalloc (sizeof (REFERENCE));
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2168 entry->filename = entry->nodename = (char *)NULL;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2169 entry->label = (char *) xmalloc
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2170 (4 + strlen (fb->filename) + strlen (fb->tags[i]->nodename));
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2171 sprintf (entry->label, "(%s)%s",
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2172 fb->filename, fb->tags[i]->nodename);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2173
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2174 add_pointer_to_array
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2175 (entry, items_index, items, items_slots, 100, REFERENCE *);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2176 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2177
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2178 if (this_is_the_current_fb)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2179 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2180 for (i = 0; fb->tags[i]; i++)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2181 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2182 entry = (REFERENCE *)xmalloc (sizeof (REFERENCE));
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2183 entry->filename = entry->nodename = (char *)NULL;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2184 entry->label = savestring (fb->tags[i]->nodename);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2185 add_pointer_to_array (entry, items_index, items,
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2186 items_slots, 100, REFERENCE *);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2187 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2188 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2189 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2190 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2191 line = info_read_maybe_completing (window, "Goto Node: ", items);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2192 info_free_references (items);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2193 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2194 #else /* !GOTO_COMPLETES */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2195 line = info_read_in_echo_area (window, "Goto Node: ");
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2196 #endif /* !GOTO_COMPLETES */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2197
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2198 /* If the user aborted, quit now. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2199 if (!line)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2200 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2201 info_abort_key (window, 0, 0);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2202 return;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2203 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2204
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2205 canonicalize_whitespace (line);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2206
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2207 if (*line)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2208 info_parse_and_select (line, window);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2209
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2210 free (line);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2211 if (!info_error_was_printed)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2212 window_clear_echo_area ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2213 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2214
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2215 /* Move to the "Top" node in this file. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2216 DECLARE_INFO_COMMAND (info_top_node, "Select the node `Top' in this file")
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2217 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2218 info_parse_and_select ("Top", window);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2219 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2220
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2221 /* Move to the node "(dir)Top". */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2222 DECLARE_INFO_COMMAND (info_dir_node, "Select the node `(dir)'")
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2223 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2224 info_parse_and_select ("(dir)Top", window);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2225 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2226
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2227 /* Try to delete the current node appearing in this window, showing the most
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2228 recently selected node in this window. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2229 DECLARE_INFO_COMMAND (info_kill_node, "Kill this node")
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2230 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2231 register int iw, i;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2232 register INFO_WINDOW *info_win;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2233 char *nodename = (char *)NULL;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2234 NODE *temp = (NODE *)NULL;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2235
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2236 /* Read the name of a node to kill. The list of available nodes comes
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2237 from the nodes appearing in the current window configuration. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2238 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2239 REFERENCE **menu = (REFERENCE **)NULL;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2240 int menu_index = 0, menu_slots = 0;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2241 char *default_nodename, *prompt;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2242
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2243 for (iw = 0; info_win = info_windows[iw]; iw++)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2244 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2245 REFERENCE *entry;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2246
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2247 entry = (REFERENCE *)xmalloc (sizeof (REFERENCE));
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2248 entry->label = savestring (info_win->window->node->nodename);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2249 entry->filename = entry->nodename = (char *)NULL;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2250
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2251 add_pointer_to_array
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2252 (entry, menu_index, menu, menu_slots, 10, REFERENCE *);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2253 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2254
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2255 default_nodename = savestring (active_window->node->nodename);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2256 prompt = (char *)xmalloc (40 + strlen (default_nodename));
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2257 sprintf (prompt, "Kill node (%s): ", default_nodename);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2258
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2259 nodename = info_read_completing_in_echo_area (window, prompt, menu);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2260 free (prompt);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2261 info_free_references (menu);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2262 if (nodename && !*nodename)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2263 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2264 free (nodename);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2265 nodename = default_nodename;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2266 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2267 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2268 free (default_nodename);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2269 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2270
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2271 /* If there is no nodename to kill, quit now. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2272 if (!nodename)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2273 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2274 info_abort_key (window, 0, 0);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2275 return;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2276 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2277
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2278 /* If there is a nodename, find it in our window list. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2279 for (iw = 0; info_win = info_windows[iw]; iw++)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2280 if (strcmp (nodename, info_win->nodes[info_win->current]->nodename) == 0)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2281 break;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2282
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2283 if (!info_win)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2284 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2285 if (*nodename)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2286 info_error ("Cannot kill the node `%s'", nodename);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2287 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2288 window_clear_echo_area ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2289
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2290 return;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2291 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2292
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2293 /* If there are no more nodes left anywhere to view, complain and exit. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2294 if (info_windows_index == 1 && info_windows[0]->nodes_index == 1)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2295 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2296 info_error ("Cannot kill the last node");
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2297 return;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2298 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2299
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2300 /* INFO_WIN contains the node that the user wants to stop viewing.
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2301 Delete this node from the list of nodes previously shown in this
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2302 window. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2303 for (i = info_win->current; i < info_win->nodes_index; i++)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2304 info_win->nodes[i] = info_win->nodes[i++];
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2305
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2306 /* There is one less node in this window's history list. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2307 info_win->nodes_index--;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2308
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2309 /* Make this window show the most recent history node. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2310 info_win->current = info_win->nodes_index - 1;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2311
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2312 /* If there aren't any nodes left in this window, steal one from the
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2313 next window. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2314 if (info_win->current < 0)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2315 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2316 INFO_WINDOW *stealer;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2317 int which, pagetop;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2318 long point;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2319
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2320 if (info_windows[iw + 1])
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2321 stealer = info_windows[iw + 1];
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2322 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2323 stealer = info_windows[0];
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2324
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2325 /* If the node being displayed in the next window is not the most
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2326 recently loaded one, get the most recently loaded one. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2327 if ((stealer->nodes_index - 1) != stealer->current)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2328 which = stealer->nodes_index - 1;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2329
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2330 /* Else, if there is another node behind the stealers current node,
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2331 use that one. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2332 else if (stealer->current > 0)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2333 which = stealer->current - 1;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2334
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2335 /* Else, just use the node appearing in STEALER's window. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2336 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2337 which = stealer->current;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2338
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2339 /* Copy this node. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2340 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2341 NODE *copy;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2342
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2343 temp = stealer->nodes[which];
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2344 point = stealer->points[which];
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2345 pagetop = stealer->pagetops[which];
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2346
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2347 copy = (NODE *)xmalloc (sizeof (NODE));
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2348 copy->filename = temp->filename;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2349 copy->parent = temp->parent;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2350 copy->nodename = temp->nodename;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2351 copy->contents = temp->contents;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2352 copy->nodelen = temp->nodelen;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2353 copy->flags = temp->flags;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2354
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2355 temp = copy;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2356 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2357
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2358 window_set_node_of_window (info_win->window, temp);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2359 window->point = point;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2360 window->pagetop = pagetop;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2361 remember_window_and_node (info_win->window, temp);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2362 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2363 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2364 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2365 temp = info_win->nodes[info_win->current];
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2366 window_set_node_of_window (info_win->window, temp);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2367 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2368 if (!info_error_was_printed)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2369 window_clear_echo_area ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2370 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2371
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2372 /* Read the name of a file and select the entire file. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2373 DECLARE_INFO_COMMAND (info_view_file, "Read the name of a file and select it")
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2374 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2375 char *line;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2376
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2377 line = info_read_in_echo_area (window, "Find file: ");
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2378 if (!line)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2379 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2380 info_abort_key (active_window, 1, 0);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2381 return;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2382 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2383
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2384 if (*line)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2385 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2386 NODE *node;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2387
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2388 node = info_get_node (line, "*");
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2389 if (!node)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2390 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2391 if (info_recent_file_error)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2392 info_error (info_recent_file_error);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2393 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2394 info_error ("Cannot find \"%s\".", line);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2395 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2396 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2397 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2398 set_remembered_pagetop_and_point (active_window);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2399 info_set_node_of_window (window, node);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2400 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2401 free (line);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2402 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2403
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2404 if (!info_error_was_printed)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2405 window_clear_echo_area ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2406 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2407
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2408 /* **************************************************************** */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2409 /* */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2410 /* Dumping and Printing Nodes */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2411 /* */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2412 /* **************************************************************** */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2413
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2414 #define VERBOSE_NODE_DUMPING
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2415 static void write_node_to_stream ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2416 static void dump_node_to_stream ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2417 static void initialize_dumping ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2418
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2419 /* Dump the nodes specified by FILENAME and NODENAMES to the file named
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2420 in OUTPUT_FILENAME. If DUMP_SUBNODES is non-zero, recursively dump
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2421 the nodes which appear in the menu of each node dumped. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2422 void
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2423 dump_nodes_to_file (filename, nodenames, output_filename, dump_subnodes)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2424 char *filename;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2425 char **nodenames;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2426 char *output_filename;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2427 int dump_subnodes;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2428 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2429 register int i;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2430 FILE *output_stream;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2431
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2432 /* Get the stream to print the nodes to. Special case of an output
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2433 filename of "-" means to dump the nodes to stdout. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2434 if (strcmp (output_filename, "-") == 0)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2435 output_stream = stdout;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2436 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2437 output_stream = fopen (output_filename, "w");
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2438
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2439 if (!output_stream)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2440 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2441 info_error ("Could not create output file \"%s\".", output_filename);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2442 return;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2443 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2444
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2445 /* Print each node to stream. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2446 initialize_dumping ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2447 for (i = 0; nodenames[i]; i++)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2448 dump_node_to_stream (filename, nodenames[i], output_stream, dump_subnodes);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2449
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2450 if (output_stream != stdout)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2451 fclose (output_stream);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2452
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2453 #if defined (VERBOSE_NODE_DUMPING)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2454 info_error ("Done.");
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2455 #endif /* VERBOSE_NODE_DUMPING */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2456 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2457
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2458 /* A place to remember already dumped nodes. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2459 static char **dumped_already = (char **)NULL;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2460 static int dumped_already_index = 0;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2461 static int dumped_already_slots = 0;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2462
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2463 static void
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2464 initialize_dumping ()
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2465 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2466 dumped_already_index = 0;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2467 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2468
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2469 /* Get and print the node specified by FILENAME and NODENAME to STREAM.
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2470 If DUMP_SUBNODES is non-zero, recursively dump the nodes which appear
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2471 in the menu of each node dumped. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2472 static void
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2473 dump_node_to_stream (filename, nodename, stream, dump_subnodes)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2474 char *filename, *nodename;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2475 FILE *stream;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2476 int dump_subnodes;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2477 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2478 register int i;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2479 NODE *node;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2480
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2481 node = info_get_node (filename, nodename);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2482
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2483 if (!node)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2484 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2485 if (info_recent_file_error)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2486 info_error (info_recent_file_error);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2487 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2488 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2489 if (filename && *nodename != '(')
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2490 info_error
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2491 (CANT_FILE_NODE, filename_non_directory (filename), nodename);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2492 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2493 info_error (CANT_FIND_NODE, nodename);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2494 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2495 return;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2496 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2497
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2498 /* If we have already dumped this node, don't dump it again. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2499 for (i = 0; i < dumped_already_index; i++)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2500 if (strcmp (node->nodename, dumped_already[i]) == 0)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2501 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2502 free (node);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2503 return;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2504 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2505 add_pointer_to_array (node->nodename, dumped_already_index, dumped_already,
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2506 dumped_already_slots, 50, char *);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2507
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2508 #if defined (VERBOSE_NODE_DUMPING)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2509 /* Maybe we should print some information about the node being output. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2510 if (node->filename)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2511 info_error ("Writing node \"(%s)%s\"...",
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2512 filename_non_directory (node->filename), node->nodename);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2513 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2514 info_error ("Writing node \"%s\"...", node->nodename);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2515 #endif /* VERBOSE_NODE_DUMPING */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2516
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2517 write_node_to_stream (node, stream);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2518
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2519 /* If we are dumping subnodes, get the list of menu items in this node,
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2520 and dump each one recursively. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2521 if (dump_subnodes)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2522 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2523 REFERENCE **menu = (REFERENCE **)NULL;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2524
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2525 /* If this node is an Index, do not dump the menu references. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2526 if (string_in_line ("Index", node->nodename) == -1)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2527 menu = info_menu_of_node (node);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2528
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2529 if (menu)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2530 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2531 for (i = 0; menu[i]; i++)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2532 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2533 /* We don't dump Info files which are different than the
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2534 current one. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2535 if (!menu[i]->filename)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2536 dump_node_to_stream
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2537 (filename, menu[i]->nodename, stream, dump_subnodes);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2538 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2539 info_free_references (menu);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2540 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2541 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2542
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2543 free (node);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2544 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2545
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2546 /* Dump NODE to FILENAME. If DUMP_SUBNODES is non-zero, recursively dump
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2547 the nodes which appear in the menu of each node dumped. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2548 void
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2549 dump_node_to_file (node, filename, dump_subnodes)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2550 NODE *node;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2551 char *filename;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2552 int dump_subnodes;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2553 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2554 FILE *output_stream;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2555 char *nodes_filename;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2556
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2557 /* Get the stream to print this node to. Special case of an output
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2558 filename of "-" means to dump the nodes to stdout. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2559 if (strcmp (filename, "-") == 0)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2560 output_stream = stdout;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2561 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2562 output_stream = fopen (filename, "w");
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2563
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2564 if (!output_stream)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2565 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2566 info_error ("Could not create output file \"%s\".", filename);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2567 return;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2568 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2569
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2570 if (node->parent)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2571 nodes_filename = node->parent;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2572 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2573 nodes_filename = node->filename;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2574
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2575 initialize_dumping ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2576 dump_node_to_stream
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2577 (nodes_filename, node->nodename, output_stream, dump_subnodes);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2578
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2579 if (output_stream != stdout)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2580 fclose (output_stream);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2581
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2582 #if defined (VERBOSE_NODE_DUMPING)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2583 info_error ("Done.");
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2584 #endif /* VERBOSE_NODE_DUMPING */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2585 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2586
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2587 #if !defined (DEFAULT_INFO_PRINT_COMMAND)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2588 # define DEFAULT_INFO_PRINT_COMMAND "lpr"
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2589 #endif /* !DEFAULT_INFO_PRINT_COMMAND */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2590
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2591 DECLARE_INFO_COMMAND (info_print_node,
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2592 "Pipe the contents of this node through INFO_PRINT_COMMAND")
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2593 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2594 print_node (window->node);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2595 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2596
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2597 /* Print NODE on a printer piping it into INFO_PRINT_COMMAND. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2598 void
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2599 print_node (node)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2600 NODE *node;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2601 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2602 char *print_command, *getenv ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2603 FILE *printer_pipe;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2604
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2605 print_command = getenv ("INFO_PRINT_COMMAND");
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2606
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2607 if (!print_command || !*print_command)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2608 print_command = DEFAULT_INFO_PRINT_COMMAND;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2609
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2610 printer_pipe = popen (print_command, "w");
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2611
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2612 if (!printer_pipe)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2613 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2614 info_error ("Cannot open pipe to \"%s\".", print_command);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2615 return;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2616 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2617
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2618 #if defined (VERBOSE_NODE_DUMPING)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2619 /* Maybe we should print some information about the node being output. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2620 if (node->filename)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2621 info_error ("Printing node \"(%s)%s\"...",
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2622 filename_non_directory (node->filename), node->nodename);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2623 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2624 info_error ("Printing node \"%s\"...", node->nodename);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2625 #endif /* VERBOSE_NODE_DUMPING */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2626
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2627 write_node_to_stream (node, printer_pipe);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2628 pclose (printer_pipe);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2629
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2630 #if defined (VERBOSE_NODE_DUMPING)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2631 info_error ("Done.");
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2632 #endif /* VERBOSE_NODE_DUMPING */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2633 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2634
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2635 static void
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2636 write_node_to_stream (node, stream)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2637 NODE *node;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2638 FILE *stream;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2639 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2640 fwrite (node->contents, 1, node->nodelen, stream);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2641 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2642
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2643 /* **************************************************************** */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2644 /* */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2645 /* Info Searching Commands */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2646 /* */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2647 /* **************************************************************** */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2648
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2649 /* Variable controlling the garbage collection of files briefly visited
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2650 during searches. Such files are normally gc'ed, unless they were
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2651 compressed to begin with. If this variable is non-zero, it says
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2652 to gc even those file buffer contents which had to be uncompressed. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2653 int gc_compressed_files = 0;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2654
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2655 static void info_gc_file_buffers ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2656
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2657 static char *search_string = (char *)NULL;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2658 static int search_string_index = 0;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2659 static int search_string_size = 0;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2660 static int isearch_is_active = 0;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2661
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2662 /* Return the file buffer which belongs to WINDOW's node. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2663 FILE_BUFFER *
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2664 file_buffer_of_window (window)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2665 WINDOW *window;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2666 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2667 /* If this window has no node, then it has no file buffer. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2668 if (!window->node)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2669 return ((FILE_BUFFER *)NULL);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2670
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2671 if (window->node->parent)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2672 return (info_find_file (window->node->parent));
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2673
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2674 if (window->node->filename)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2675 return (info_find_file (window->node->filename));
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2676
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2677 return ((FILE_BUFFER *)NULL);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2678 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2679
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2680 /* Search for STRING in NODE starting at START. Return -1 if the string
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2681 was not found, or the location of the string if it was. If WINDOW is
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2682 passed as non-null, set the window's node to be NODE, its point to be
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2683 the found string, and readjust the window's pagetop. Final argument
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2684 DIR says which direction to search in. If it is positive, search
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2685 forward, else backwards. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2686 long
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2687 info_search_in_node (string, node, start, window, dir)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2688 char *string;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2689 NODE *node;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2690 long start;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2691 WINDOW *window;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2692 int dir;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2693 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2694 SEARCH_BINDING binding;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2695 long offset;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2696
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2697 binding.buffer = node->contents;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2698 binding.start = start;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2699 binding.end = node->nodelen;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2700 binding.flags = S_FoldCase;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2701
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2702 if (dir < 0)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2703 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2704 binding.end = 0;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2705 binding.flags |= S_SkipDest;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2706 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2707
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2708 if (binding.start < 0)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2709 return (-1);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2710
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2711 /* For incremental searches, we always wish to skip past the string. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2712 if (isearch_is_active)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2713 binding.flags |= S_SkipDest;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2714
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2715 offset = search (string, &binding);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2716
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2717 if (offset != -1 && window)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2718 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2719 set_remembered_pagetop_and_point (window);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2720 if (window->node != node)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2721 window_set_node_of_window (window, node);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2722 window->point = offset;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2723 window_adjust_pagetop (window);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2724 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2725 return (offset);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2726 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2727
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2728 /* Search NODE, looking for the largest possible match of STRING. Start the
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2729 search at START. Return the absolute position of the match, or -1, if
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2730 no part of the string could be found. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2731 long
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2732 info_target_search_node (node, string, start)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2733 NODE *node;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2734 char *string;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2735 long start;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2736 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2737 register int i;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2738 long offset;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2739 char *target;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2740
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2741 target = savestring (string);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2742 i = strlen (target);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2743
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2744 /* Try repeatedly searching for this string while removing words from
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2745 the end of it. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2746 while (i)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2747 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2748 target[i] = '\0';
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2749 offset = info_search_in_node (target, node, start, (WINDOW *)NULL, 1);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2750
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2751 if (offset != -1)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2752 break;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2753
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2754 /* Delete the last word from TARGET. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2755 for (; i && (!whitespace (target[i]) && (target[i] != ',')); i--);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2756 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2757 free (target);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2758 return (offset);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2759 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2760
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2761 /* Search for STRING starting in WINDOW at point. If the string is found
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2762 in this node, set point to that position. Otherwise, get the file buffer
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2763 associated with WINDOW's node, and search through each node in that file.
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2764 If the search fails, return non-zero, else zero. Side-effect window
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2765 leaving the node and point where the string was found current. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2766 static char *last_searched_for_string = (char *)NULL;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2767 static int
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2768 info_search_internal (string, window, dir)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2769 char *string;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2770 WINDOW *window;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2771 int dir;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2772 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2773 register int i;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2774 FILE_BUFFER *file_buffer;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2775 char *initial_nodename;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2776 long ret, start = 0;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2777
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2778 file_buffer = file_buffer_of_window (window);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2779 initial_nodename = window->node->nodename;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2780
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2781 if ((info_last_executed_command == info_search) &&
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2782 (last_searched_for_string) &&
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2783 (strcmp (last_searched_for_string, string) == 0))
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2784 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2785 ret = info_search_in_node
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2786 (string, window->node, window->point + dir, window, dir);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2787 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2788 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2789 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2790 ret = info_search_in_node
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2791 (string, window->node, window->point, window, dir);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2792 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2793
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2794 maybe_free (last_searched_for_string);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2795 last_searched_for_string = savestring (string);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2796
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2797 if (ret != -1)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2798 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2799 /* We won! */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2800 if (!echo_area_is_active && !isearch_is_active)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2801 window_clear_echo_area ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2802 return (0);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2803 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2804
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2805 /* The string wasn't found in the current node. Search through the
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2806 window's file buffer, iff the current node is not "*". */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2807 if (!file_buffer || (strcmp (initial_nodename, "*") == 0))
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2808 return (-1);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2809
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2810 /* If this file has tags, search through every subfile, starting at
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2811 this node's subfile and node. Otherwise, search through the
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2812 file's node list. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2813 if (file_buffer->tags)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2814 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2815 register int current_tag, number_of_tags;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2816 char *last_subfile;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2817 TAG *tag;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2818
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2819 /* Find number of tags and current tag. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2820 last_subfile = (char *)NULL;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2821 for (i = 0; file_buffer->tags[i]; i++)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2822 if (strcmp (initial_nodename, file_buffer->tags[i]->nodename) == 0)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2823 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2824 current_tag = i;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2825 last_subfile = file_buffer->tags[i]->filename;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2826 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2827
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2828 number_of_tags = i;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2829
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2830 /* If there is no last_subfile, our tag wasn't found. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2831 if (!last_subfile)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2832 return (-1);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2833
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2834 /* Search through subsequent nodes, wrapping around to the top
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2835 of the info file until we find the string or return to this
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2836 window's node and point. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2837 while (1)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2838 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2839 NODE *node;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2840
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2841 /* Allow C-g to quit the search, failing it if pressed. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2842 return_if_control_g (-1);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2843
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2844 current_tag += dir;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2845
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2846 if (current_tag < 0)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2847 current_tag = number_of_tags - 1;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2848 else if (current_tag == number_of_tags)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2849 current_tag = 0;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2850
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2851 tag = file_buffer->tags[current_tag];
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2852
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2853 if (!echo_area_is_active && (last_subfile != tag->filename))
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2854 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2855 window_message_in_echo_area
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2856 ("Searching subfile \"%s\"...",
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2857 filename_non_directory (tag->filename));
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2858
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2859 last_subfile = tag->filename;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2860 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2861
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2862 node = info_get_node (file_buffer->filename, tag->nodename);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2863
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2864 if (!node)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2865 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2866 /* If not doing i-search... */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2867 if (!echo_area_is_active)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2868 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2869 if (info_recent_file_error)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2870 info_error (info_recent_file_error);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2871 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2872 info_error (CANT_FILE_NODE,
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2873 filename_non_directory (file_buffer->filename),
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2874 tag->nodename);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2875 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2876 return (-1);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2877 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2878
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2879 if (dir < 0)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2880 start = tag->nodelen;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2881
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2882 ret =
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2883 info_search_in_node (string, node, start, window, dir);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2884
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2885 /* Did we find the string in this node? */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2886 if (ret != -1)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2887 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2888 /* Yes! We win. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2889 remember_window_and_node (window, node);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2890 if (!echo_area_is_active)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2891 window_clear_echo_area ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2892 return (0);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2893 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2894
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2895 /* No. Free this node, and make sure that we haven't passed
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2896 our starting point. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2897 free (node);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2898
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2899 if (strcmp (initial_nodename, tag->nodename) == 0)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2900 return (-1);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2901 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2902 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2903 return (-1);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2904 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2905
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2906 DECLARE_INFO_COMMAND (info_search, "Read a string and search for it")
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2907 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2908 char *line, *prompt;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2909 int result, old_pagetop;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2910 int direction;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2911
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2912 if (count < 0)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2913 direction = -1;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2914 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2915 direction = 1;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2916
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2917 /* Read a string from the user, defaulting the search to SEARCH_STRING. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2918 if (!search_string)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2919 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2920 search_string = (char *)xmalloc (search_string_size = 100);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2921 search_string[0] = '\0';
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2922 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2923
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2924 prompt = (char *)xmalloc (50 + strlen (search_string));
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2925
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2926 sprintf (prompt, "%s for string [%s]: ",
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2927 direction < 0 ? "Search backward" : "Search",
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2928 search_string);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2929
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2930 line = info_read_in_echo_area (window, prompt);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2931 free (prompt);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2932
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2933 if (!line)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2934 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2935 info_abort_key ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2936 return;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2937 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2938
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2939 if (*line)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2940 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2941 if (strlen (line) + 1 > search_string_size)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2942 search_string = (char *)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2943 xrealloc (search_string, (search_string_size += 50 + strlen (line)));
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2944
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2945 strcpy (search_string, line);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2946 search_string_index = strlen (line);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2947 free (line);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2948 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2949
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2950 old_pagetop = active_window->pagetop;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2951 result = info_search_internal (search_string, active_window, direction);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2952
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2953 if (result != 0 && !info_error_was_printed)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2954 info_error ("Search failed.");
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2955 else if (old_pagetop != active_window->pagetop)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2956 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2957 int new_pagetop;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2958
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2959 new_pagetop = active_window->pagetop;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2960 active_window->pagetop = old_pagetop;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2961 set_window_pagetop (active_window, new_pagetop);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2962 if (auto_footnotes_p)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2963 info_get_or_remove_footnotes (active_window);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2964 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2965
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2966 /* Perhaps free the unreferenced file buffers that were searched, but
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2967 not retained. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2968 info_gc_file_buffers ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2969 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2970
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2971 /* **************************************************************** */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2972 /* */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2973 /* Incremental Searching */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2974 /* */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2975 /* **************************************************************** */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2976
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2977 static void incremental_search ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2978
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2979 DECLARE_INFO_COMMAND (isearch_forward,
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2980 "Search interactively for a string as you type it")
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2981 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2982 incremental_search (window, count, key);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2983 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2984
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2985 DECLARE_INFO_COMMAND (isearch_backward,
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2986 "Search interactively for a string as you type it")
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2987 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2988 incremental_search (window, -count, key);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2989 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2990
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2991 /* Incrementally search for a string as it is typed. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2992 /* The last accepted incremental search string. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2993 static char *last_isearch_accepted = (char *)NULL;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2994
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2995 /* The current incremental search string. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2996 static char *isearch_string = (char *)NULL;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2997 static int isearch_string_index = 0;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2998 static int isearch_string_size = 0;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
2999 static unsigned char isearch_terminate_search_key = ESC;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3000
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3001 /* Structure defining the current state of an incremental search. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3002 typedef struct {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3003 WINDOW_STATE_DECL; /* The node, pagetop and point. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3004 int search_index; /* Offset of the last char in the search string. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3005 int direction; /* The direction that this search is heading in. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3006 int failing; /* Whether or not this search failed. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3007 } SEARCH_STATE;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3008
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3009 /* Array of search states. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3010 static SEARCH_STATE **isearch_states = (SEARCH_STATE **)NULL;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3011 static int isearch_states_index = 0;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3012 static int isearch_states_slots = 0;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3013
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3014 /* Push the state of this search. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3015 static void
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3016 push_isearch (window, search_index, direction, failing)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3017 WINDOW *window;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3018 int search_index, direction, failing;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3019 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3020 SEARCH_STATE *state;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3021
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3022 state = (SEARCH_STATE *)xmalloc (sizeof (SEARCH_STATE));
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3023 window_get_state (window, state);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3024 state->search_index = search_index;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3025 state->direction = direction;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3026 state->failing = failing;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3027
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3028 add_pointer_to_array (state, isearch_states_index, isearch_states,
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3029 isearch_states_slots, 20, SEARCH_STATE *);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3030 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3031
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3032 /* Pop the state of this search to WINDOW, SEARCH_INDEX, and DIRECTION. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3033 static void
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3034 pop_isearch (window, search_index, direction, failing)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3035 WINDOW *window;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3036 int *search_index, *direction, *failing;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3037 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3038 SEARCH_STATE *state;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3039
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3040 if (isearch_states_index)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3041 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3042 isearch_states_index--;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3043 state = isearch_states[isearch_states_index];
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3044 window_set_state (window, state);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3045 *search_index = state->search_index;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3046 *direction = state->direction;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3047 *failing = state->failing;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3048
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3049 free (state);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3050 isearch_states[isearch_states_index] = (SEARCH_STATE *)NULL;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3051 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3052 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3053
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3054 /* Free the memory used by isearch_states. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3055 static void
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3056 free_isearch_states ()
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3057 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3058 register int i;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3059
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3060 for (i = 0; i < isearch_states_index; i++)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3061 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3062 free (isearch_states[i]);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3063 isearch_states[i] = (SEARCH_STATE *)NULL;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3064 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3065 isearch_states_index = 0;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3066 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3067
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3068 /* Display the current search in the echo area. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3069 static void
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3070 show_isearch_prompt (dir, string, failing_p)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3071 int dir;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3072 unsigned char *string;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3073 int failing_p;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3074 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3075 register int i;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3076 char *prefix, *prompt, *p_rep;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3077 int prompt_len, p_rep_index, p_rep_size;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3078
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3079 if (dir < 0)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3080 prefix = "I-search backward: ";
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3081 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3082 prefix = "I-search: ";
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3083
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3084 p_rep_index = p_rep_size = 0;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3085 p_rep = (char *)NULL;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3086 for (i = 0; string[i]; i++)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3087 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3088 char *rep;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3089
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3090 switch (string[i])
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3091 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3092 case ' ': rep = " "; break;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3093 case LFD: rep = "\\n"; break;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3094 case TAB: rep = "\\t"; break;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3095 default:
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3096 rep = pretty_keyname (string[i]);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3097 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3098 if ((p_rep_index + strlen (rep) + 1) >= p_rep_size)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3099 p_rep = (char *)xrealloc (p_rep, p_rep_size += 100);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3100
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3101 strcpy (p_rep + p_rep_index, rep);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3102 p_rep_index += strlen (rep);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3103 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3104
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3105 prompt_len = strlen (prefix) + p_rep_index + 20;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3106 prompt = (char *)xmalloc (prompt_len);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3107 sprintf (prompt, "%s%s%s", failing_p ? "Failing " : "", prefix,
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3108 p_rep ? p_rep : "");
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3109
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3110 window_message_in_echo_area ("%s", prompt);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3111 maybe_free (p_rep);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3112 free (prompt);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3113 display_cursor_at_point (active_window);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3114 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3115
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3116 static void
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3117 incremental_search (window, count, ignore)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3118 WINDOW *window;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3119 int count;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3120 unsigned char ignore;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3121 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3122 unsigned char key;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3123 int last_search_result, search_result, dir;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3124 SEARCH_STATE mystate, orig_state;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3125
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3126 if (count < 0)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3127 dir = -1;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3128 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3129 dir = 1;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3130
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3131 last_search_result = search_result = 0;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3132
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3133 window_get_state (window, &orig_state);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3134
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3135 isearch_string_index = 0;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3136 if (!isearch_string_size)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3137 isearch_string = (char *)xmalloc (isearch_string_size = 50);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3138
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3139 /* Show the search string in the echo area. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3140 isearch_string[isearch_string_index] = '\0';
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3141 show_isearch_prompt (dir, isearch_string, search_result);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3142
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3143 isearch_is_active = 1;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3144
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3145 while (isearch_is_active)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3146 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3147 VFunction *func = (VFunction *)NULL;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3148 int quoted = 0;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3149
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3150 /* If a recent display was interrupted, then do the redisplay now if
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3151 it is convenient. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3152 if (!info_any_buffered_input_p () && display_was_interrupted_p)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3153 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3154 display_update_one_window (window);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3155 display_cursor_at_point (active_window);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3156 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3157
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3158 /* Read a character and dispatch on it. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3159 key = info_get_input_char ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3160 window_get_state (window, &mystate);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3161
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3162 if (key == DEL)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3163 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3164 /* User wants to delete one level of search? */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3165 if (!isearch_states_index)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3166 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3167 terminal_ring_bell ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3168 continue;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3169 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3170 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3171 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3172 pop_isearch
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3173 (window, &isearch_string_index, &dir, &search_result);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3174 isearch_string[isearch_string_index] = '\0';
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3175 show_isearch_prompt (dir, isearch_string, search_result);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3176 goto after_search;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3177 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3178 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3179 else if (key == Control ('q'))
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3180 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3181 key = info_get_input_char ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3182 quoted = 1;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3183 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3184
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3185 /* We are about to search again, or quit. Save the current search. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3186 push_isearch (window, isearch_string_index, dir, search_result);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3187
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3188 if (quoted)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3189 goto insert_and_search;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3190
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3191 if (!Meta_p (key) || (ISO_Latin_p && key < 160))
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3192 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3193 func = window->keymap[key].function;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3194
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3195 /* If this key invokes an incremental search, then this means that
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3196 we will either search again in the same direction, search
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3197 again in the reverse direction, or insert the last search
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3198 string that was accepted through incremental searching. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3199 if (func == isearch_forward || func == isearch_backward)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3200 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3201 if ((func == isearch_forward && dir > 0) ||
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3202 (func == isearch_backward && dir < 0))
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3203 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3204 /* If the user has typed no characters, then insert the
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3205 last successful search into the current search string. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3206 if (isearch_string_index == 0)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3207 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3208 /* Of course, there must be something to insert. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3209 if (last_isearch_accepted)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3210 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3211 if (strlen (last_isearch_accepted) + 1 >=
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3212 isearch_string_size)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3213 isearch_string = (char *)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3214 xrealloc (isearch_string,
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3215 isearch_string_size += 10 +
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3216 strlen (last_isearch_accepted));
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3217 strcpy (isearch_string, last_isearch_accepted);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3218 isearch_string_index = strlen (isearch_string);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3219 goto search_now;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3220 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3221 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3222 continue;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3223 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3224 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3225 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3226 /* Search again in the same direction. This means start
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3227 from a new place if the last search was successful. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3228 if (search_result == 0)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3229 window->point += dir;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3230 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3231 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3232 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3233 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3234 /* Reverse the direction of the search. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3235 dir = -dir;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3236 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3237 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3238 else if (isprint (key) || func == (VFunction *)NULL)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3239 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3240 insert_and_search:
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3241
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3242 if (isearch_string_index + 2 >= isearch_string_size)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3243 isearch_string = (char *)xrealloc
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3244 (isearch_string, isearch_string_size += 100);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3245
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3246 isearch_string[isearch_string_index++] = key;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3247 isearch_string[isearch_string_index] = '\0';
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3248 goto search_now;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3249 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3250 else if (func == info_abort_key)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3251 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3252 /* If C-g pressed, and the search is failing, pop the search
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3253 stack back to the last unfailed search. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3254 if (isearch_states_index && (search_result != 0))
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3255 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3256 terminal_ring_bell ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3257 while (isearch_states_index && (search_result != 0))
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3258 pop_isearch
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3259 (window, &isearch_string_index, &dir, &search_result);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3260 isearch_string[isearch_string_index] = '\0';
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3261 show_isearch_prompt (dir, isearch_string, search_result);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3262 continue;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3263 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3264 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3265 goto exit_search;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3266 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3267 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3268 goto exit_search;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3269 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3270 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3271 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3272 exit_search:
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3273 /* The character is not printable, or it has a function which is
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3274 non-null. Exit the search, remembering the search string. If
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3275 the key is not the same as the isearch_terminate_search_key,
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3276 then push it into pending input. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3277 if (isearch_string_index && func != info_abort_key)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3278 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3279 maybe_free (last_isearch_accepted);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3280 last_isearch_accepted = savestring (isearch_string);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3281 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3282
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3283 if (key != isearch_terminate_search_key)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3284 info_set_pending_input (key);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3285
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3286 if (func == info_abort_key)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3287 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3288 if (isearch_states_index)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3289 window_set_state (window, &orig_state);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3290 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3291
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3292 if (!echo_area_is_active)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3293 window_clear_echo_area ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3294
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3295 if (auto_footnotes_p)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3296 info_get_or_remove_footnotes (active_window);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3297
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3298 isearch_is_active = 0;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3299 continue;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3300 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3301
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3302 /* Search for the contents of isearch_string. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3303 search_now:
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3304 show_isearch_prompt (dir, isearch_string, search_result);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3305
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3306 if (search_result == 0)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3307 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3308 /* Check to see if the current search string is right here. If
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3309 we are looking at it, then don't bother calling the search
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3310 function. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3311 if (((dir < 0) &&
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3312 (strnicmp (window->node->contents + window->point,
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3313 isearch_string, isearch_string_index) == 0)) ||
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3314 ((dir > 0) &&
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3315 ((window->point - isearch_string_index) >= 0) &&
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3316 (strnicmp (window->node->contents +
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3317 (window->point - (isearch_string_index - 1)),
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3318 isearch_string, isearch_string_index) == 0)))
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3319 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3320 if (dir > 0)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3321 window->point++;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3322 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3323 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3324 search_result = info_search_internal (isearch_string, window, dir);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3325 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3326
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3327 /* If this search failed, and we didn't already have a failed search,
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3328 then ring the terminal bell. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3329 if (search_result != 0 && last_search_result == 0)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3330 terminal_ring_bell ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3331
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3332 after_search:
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3333 show_isearch_prompt (dir, isearch_string, search_result);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3334
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3335 if (search_result == 0)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3336 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3337 if ((mystate.node == window->node) &&
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3338 (mystate.pagetop != window->pagetop))
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3339 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3340 int newtop = window->pagetop;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3341 window->pagetop = mystate.pagetop;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3342 set_window_pagetop (window, newtop);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3343 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3344 display_update_one_window (window);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3345 display_cursor_at_point (window);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3346 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3347
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3348 last_search_result = search_result;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3349 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3350
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3351 /* Free the memory used to remember each search state. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3352 free_isearch_states ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3353
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3354 /* Perhaps GC some file buffers. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3355 info_gc_file_buffers ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3356
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3357 /* After searching, leave the window in the correct state. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3358 if (!echo_area_is_active)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3359 window_clear_echo_area ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3360 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3361
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3362 /* GC some file buffers. A file buffer can be gc-ed if there we have
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3363 no nodes in INFO_WINDOWS that reference this file buffer's contents.
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3364 Garbage collecting a file buffer means to free the file buffers
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3365 contents. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3366 static void
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3367 info_gc_file_buffers ()
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3368 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3369 register int fb_index, iw_index, i;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3370 register FILE_BUFFER *fb;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3371 register INFO_WINDOW *iw;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3372
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3373 if (!info_loaded_files)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3374 return;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3375
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3376 for (fb_index = 0; fb = info_loaded_files[fb_index]; fb_index++)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3377 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3378 int fb_referenced_p = 0;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3379
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3380 /* If already gc-ed, do nothing. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3381 if (!fb->contents)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3382 continue;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3383
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3384 /* If this file had to be uncompressed, check to see if we should
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3385 gc it. This means that the user-variable "gc-compressed-files"
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3386 is non-zero. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3387 if ((fb->flags & N_IsCompressed) && !gc_compressed_files)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3388 continue;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3389
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3390 /* If this file's contents are not gc-able, move on. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3391 if (fb->flags & N_CannotGC)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3392 continue;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3393
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3394 /* Check each INFO_WINDOW to see if it has any nodes which reference
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3395 this file. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3396 for (iw_index = 0; iw = info_windows[iw_index]; iw_index++)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3397 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3398 for (i = 0; iw->nodes && iw->nodes[i]; i++)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3399 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3400 if ((strcmp (fb->fullpath, iw->nodes[i]->filename) == 0) ||
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3401 (strcmp (fb->filename, iw->nodes[i]->filename) == 0))
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3402 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3403 fb_referenced_p = 1;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3404 break;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3405 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3406 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3407 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3408
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3409 /* If this file buffer wasn't referenced, free its contents. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3410 if (!fb_referenced_p)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3411 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3412 free (fb->contents);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3413 fb->contents = (char *)NULL;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3414 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3415 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3416 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3417
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3418 /* **************************************************************** */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3419 /* */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3420 /* Traversing and Selecting References */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3421 /* */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3422 /* **************************************************************** */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3423
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3424 /* Move to the next or previous cross reference in this node. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3425 static void
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3426 info_move_to_xref (window, count, key, dir)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3427 WINDOW *window;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3428 int count;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3429 unsigned char key;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3430 int dir;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3431 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3432 long firstmenu, firstxref;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3433 long nextmenu, nextxref;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3434 long placement = -1;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3435 long start = 0;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3436 NODE *node = window->node;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3437
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3438 if (dir < 0)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3439 start = node->nodelen;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3440
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3441 /* This search is only allowed to fail if there is no menu or cross
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3442 reference in the current node. Otherwise, the first menu or xref
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3443 found is moved to. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3444
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3445 firstmenu = info_search_in_node
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3446 (INFO_MENU_ENTRY_LABEL, node, start, (WINDOW *)NULL, dir);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3447
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3448 /* FIRSTMENU may point directly to the line defining the menu. Skip that
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3449 and go directly to the first item. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3450
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3451 if (firstmenu != -1)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3452 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3453 char *text = node->contents + firstmenu;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3454
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3455 if (strncmp (text, INFO_MENU_LABEL, strlen (INFO_MENU_LABEL)) == 0)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3456 firstmenu = info_search_in_node
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3457 (INFO_MENU_ENTRY_LABEL, node, firstmenu + dir, (WINDOW *)NULL, dir);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3458 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3459
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3460 firstxref =
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3461 info_search_in_node (INFO_XREF_LABEL, node, start, (WINDOW *)NULL, dir);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3462
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3463 if (firstmenu == -1 && firstxref == -1)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3464 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3465 info_error ("No cross references in this node.");
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3466 return;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3467 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3468
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3469 /* There is at least one cross reference or menu entry in this node.
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3470 Try hard to find the next available one. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3471
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3472 nextmenu = info_search_in_node
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3473 (INFO_MENU_ENTRY_LABEL, node, window->point + dir, (WINDOW *)NULL, dir);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3474
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3475 nextxref = info_search_in_node
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3476 (INFO_XREF_LABEL, node, window->point + dir, (WINDOW *)NULL, dir);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3477
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3478 /* Ignore "Menu:" as a menu item. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3479 if (nextmenu != -1)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3480 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3481 char *text = node->contents + nextmenu;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3482
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3483 if (strncmp (text, INFO_MENU_LABEL, strlen (INFO_MENU_LABEL)) == 0)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3484 nextmenu = info_search_in_node
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3485 (INFO_MENU_ENTRY_LABEL, node, nextmenu + dir, (WINDOW *)NULL, dir);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3486 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3487
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3488 /* If there is both a next menu entry, and a next xref entry, choose the
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3489 one which occurs first. Otherwise, select the one which actually
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3490 appears in this node following point. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3491 if (nextmenu != -1 && nextxref != -1)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3492 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3493 if (((dir == 1) && (nextmenu < nextxref)) ||
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3494 ((dir == -1) && (nextmenu > nextxref)))
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3495 placement = nextmenu + 1;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3496 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3497 placement = nextxref;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3498 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3499 else if (nextmenu != -1)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3500 placement = nextmenu + 1;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3501 else if (nextxref != -1)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3502 placement = nextxref;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3503
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3504 /* If there was neither a menu or xref entry appearing in this node after
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3505 point, choose the first menu or xref entry appearing in this node. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3506 if (placement == -1)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3507 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3508 if (firstmenu != -1 && firstxref != -1)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3509 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3510 if (((dir == 1) && (firstmenu < firstxref)) ||
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3511 ((dir == -1) && (firstmenu > firstxref)))
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3512 placement = firstmenu + 1;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3513 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3514 placement = firstxref;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3515 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3516 else if (firstmenu != -1)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3517 placement = firstmenu + 1;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3518 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3519 placement = firstxref;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3520 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3521 window->point = placement;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3522 window_adjust_pagetop (window);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3523 window->flags |= W_UpdateWindow;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3524 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3525
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3526 DECLARE_INFO_COMMAND (info_move_to_prev_xref,
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3527 "Move to the previous cross reference")
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3528 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3529 if (count < 0)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3530 info_move_to_prev_xref (window, -count, key);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3531 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3532 info_move_to_xref (window, count, key, -1);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3533 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3534
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3535 DECLARE_INFO_COMMAND (info_move_to_next_xref,
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3536 "Move to the next cross reference")
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3537 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3538 if (count < 0)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3539 info_move_to_next_xref (window, -count, key);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3540 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3541 info_move_to_xref (window, count, key, 1);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3542 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3543
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3544 /* Select the menu item or reference that appears on this line. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3545 DECLARE_INFO_COMMAND (info_select_reference_this_line,
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3546 "Select reference or menu item appearing on this line")
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3547 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3548 char *line;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3549 NODE *orig;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3550
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3551 line = window->line_starts[window_line_of_point (window)];
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3552 orig = window->node;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3553
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3554 /* If this line contains a menu item, select that one. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3555 if (strncmp ("* ", line, 2) == 0)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3556 info_menu_or_ref_item (window, count, key, info_menu_of_node, 0);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3557 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3558 info_menu_or_ref_item (window, count, key, info_xrefs_of_node, 0);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3559 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3560
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3561 /* **************************************************************** */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3562 /* */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3563 /* Miscellaneous Info Commands */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3564 /* */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3565 /* **************************************************************** */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3566
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3567 /* What to do when C-g is pressed in a window. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3568 DECLARE_INFO_COMMAND (info_abort_key, "Cancel current operation")
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3569 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3570 /* If error printing doesn't oridinarily ring the bell, do it now,
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3571 since C-g always rings the bell. Otherwise, let the error printer
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3572 do it. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3573 if (!info_error_rings_bell_p)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3574 terminal_ring_bell ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3575 info_error ("Quit");
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3576
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3577 info_initialize_numeric_arg ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3578 info_clear_pending_input ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3579 info_last_executed_command = (VFunction *)NULL;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3580 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3581
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3582 /* Move the cursor to the desired line of the window. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3583 DECLARE_INFO_COMMAND (info_move_to_window_line,
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3584 "Move to the cursor to a specific line of the window")
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3585 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3586 int line;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3587
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3588 /* With no numeric argument of any kind, default to the center line. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3589 if (!info_explicit_arg && count == 1)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3590 line = (window->height / 2) + window->pagetop;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3591 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3592 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3593 if (count < 0)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3594 line = (window->height + count) + window->pagetop;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3595 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3596 line = window->pagetop + count;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3597 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3598
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3599 /* If the line doesn't appear in this window, make it do so. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3600 if ((line - window->pagetop) >= window->height)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3601 line = window->pagetop + (window->height - 1);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3602
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3603 /* If the line is too small, make it fit. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3604 if (line < window->pagetop)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3605 line = window->pagetop;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3606
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3607 /* If the selected line is past the bottom of the node, force it back. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3608 if (line >= window->line_count)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3609 line = window->line_count - 1;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3610
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3611 window->point = (window->line_starts[line] - window->node->contents);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3612 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3613
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3614 /* Clear the screen and redraw its contents. Given a numeric argument,
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3615 move the line the cursor is on to the COUNT'th line of the window. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3616 DECLARE_INFO_COMMAND (info_redraw_display, "Redraw the display")
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3617 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3618 if ((!info_explicit_arg && count == 1) || echo_area_is_active)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3619 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3620 terminal_clear_screen ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3621 display_clear_display (the_display);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3622 window_mark_chain (windows, W_UpdateWindow);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3623 display_update_display (windows);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3624 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3625 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3626 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3627 int desired_line, point_line;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3628 int new_pagetop;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3629
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3630 point_line = window_line_of_point (window) - window->pagetop;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3631
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3632 if (count < 0)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3633 desired_line = window->height + count;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3634 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3635 desired_line = count;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3636
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3637 if (desired_line < 0)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3638 desired_line = 0;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3639
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3640 if (desired_line >= window->height)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3641 desired_line = window->height - 1;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3642
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3643 if (desired_line == point_line)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3644 return;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3645
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3646 new_pagetop = window->pagetop + (point_line - desired_line);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3647
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3648 set_window_pagetop (window, new_pagetop);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3649 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3650 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3651 /* This command does nothing. It is the fact that a key is bound to it
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3652 that has meaning. See the code at the top of info_session (). */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3653 DECLARE_INFO_COMMAND (info_quit, "Quit using Info")
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3654 {}
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3655
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3656
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3657 /* **************************************************************** */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3658 /* */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3659 /* Reading Keys and Dispatching on Them */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3660 /* */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3661 /* **************************************************************** */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3662
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3663 /* Declaration only. Special cased in info_dispatch_on_key (). */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3664 DECLARE_INFO_COMMAND (info_do_lowercase_version, "")
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3665 {}
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3666
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3667 static void
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3668 dispatch_error (keyseq)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3669 char *keyseq;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3670 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3671 char *rep;
173
c74bb6e6c838 [project @ 1993-10-21 22:43:36 by jwe]
jwe
parents: 171
diff changeset
3672 char *format;
171
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3673
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3674 rep = pretty_keyseq (keyseq);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3675
173
c74bb6e6c838 [project @ 1993-10-21 22:43:36 by jwe]
jwe
parents: 171
diff changeset
3676 format = replace_in_documentation
c74bb6e6c838 [project @ 1993-10-21 22:43:36 by jwe]
jwe
parents: 171
diff changeset
3677 ("Unknown command (%s). Type \"\\[quit]\" to quit, \"\\[get-help-window]\" for help.");
c74bb6e6c838 [project @ 1993-10-21 22:43:36 by jwe]
jwe
parents: 171
diff changeset
3678
171
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3679 if (!echo_area_is_active)
173
c74bb6e6c838 [project @ 1993-10-21 22:43:36 by jwe]
jwe
parents: 171
diff changeset
3680 info_error (format, rep);
171
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3681 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3682 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3683 char *temp;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3684
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3685 temp = (char *)xmalloc (1 + strlen (rep) + strlen ("\"\" is invalid"));
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3686
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3687 sprintf (temp, "\"%s\" is invalid", rep);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3688 terminal_ring_bell ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3689 inform_in_echo_area (temp);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3690 free (temp);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3691 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3692 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3693
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3694 /* Keeping track of key sequences. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3695 static char *info_keyseq = (char *)NULL;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3696 static char keyseq_rep[100];
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3697 static int info_keyseq_index = 0;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3698 static int info_keyseq_size = 0;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3699 static int info_keyseq_displayed_p = 0;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3700
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3701 /* Initialize the length of the current key sequence. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3702 void
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3703 initialize_keyseq ()
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3704 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3705 info_keyseq_index = 0;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3706 info_keyseq_displayed_p = 0;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3707 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3708
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3709 /* Add CHARACTER to the current key sequence. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3710 void
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3711 add_char_to_keyseq (character)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3712 char character;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3713 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3714 if (info_keyseq_index + 2 >= info_keyseq_size)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3715 info_keyseq = (char *)xrealloc (info_keyseq, info_keyseq_size += 10);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3716
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3717 info_keyseq[info_keyseq_index++] = character;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3718 info_keyseq[info_keyseq_index] = '\0';
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3719 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3720
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3721 /* Return the pretty printable string which represents KEYSEQ. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3722 char *
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3723 pretty_keyseq (keyseq)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3724 char *keyseq;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3725 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3726 register int i;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3727
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3728 keyseq_rep[0] = '\0';
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3729
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3730 for (i = 0; keyseq[i]; i++)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3731 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3732 sprintf (keyseq_rep + strlen (keyseq_rep), "%s%s",
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3733 strlen (keyseq_rep) ? " " : "",
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3734 pretty_keyname (keyseq[i]));
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3735 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3736
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3737 return (keyseq_rep);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3738 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3739
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3740 /* Display the current value of info_keyseq. If argument EXPECTING is
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3741 non-zero, input is expected to be read after the key sequence is
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3742 displayed, so add an additional prompting character to the sequence. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3743 void
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3744 display_info_keyseq (expecting_future_input)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3745 int expecting_future_input;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3746 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3747 char *rep;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3748
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3749 rep = pretty_keyseq (info_keyseq);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3750 if (expecting_future_input)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3751 strcat (rep, "-");
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3752
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3753 if (echo_area_is_active)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3754 inform_in_echo_area (rep);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3755 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3756 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3757 window_message_in_echo_area (rep);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3758 display_cursor_at_point (active_window);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3759 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3760 info_keyseq_displayed_p = 1;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3761 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3762
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3763 /* Called by interactive commands to read a keystroke. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3764 unsigned char
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3765 info_get_another_input_char ()
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3766 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3767 int ready = 0;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3768
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3769 /* If there isn't any input currently available, then wait a
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3770 moment looking for input. If we don't get it fast enough,
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3771 prompt a little bit with the current key sequence. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3772 if (!info_keyseq_displayed_p &&
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3773 !info_any_buffered_input_p () &&
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3774 !info_input_pending_p ())
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3775 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3776 #if defined (FD_SET)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3777 struct timeval timer;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3778 fd_set readfds;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3779
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3780 FD_ZERO (&readfds);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3781 FD_SET (fileno (info_input_stream), &readfds);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3782 timer.tv_sec = 1;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3783 timer.tv_usec = 750;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3784 ready = select (1, &readfds, (fd_set *)NULL, (fd_set *)NULL, &timer);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3785 #endif /* FD_SET */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3786 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3787
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3788 if (!ready)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3789 display_info_keyseq (1);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3790
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3791 return (info_get_input_char ());
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3792 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3793
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3794 /* Do the command associated with KEY in MAP. If the associated command is
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3795 really a keymap, then read another key, and dispatch into that map. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3796 void
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3797 info_dispatch_on_key (key, map)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3798 unsigned char key;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3799 Keymap map;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3800 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3801 if (Meta_p (key) && (!ISO_Latin_p || map[key].function != ea_insert))
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3802 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3803 if (map[ESC].type == ISKMAP)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3804 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3805 map = (Keymap)map[ESC].function;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3806 add_char_to_keyseq (ESC);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3807 key = UnMeta (key);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3808 info_dispatch_on_key (key, map);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3809 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3810 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3811 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3812 dispatch_error (info_keyseq);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3813 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3814 return;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3815 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3816
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3817 switch (map[key].type)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3818 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3819 case ISFUNC:
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3820 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3821 VFunction *func;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3822
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3823 func = map[key].function;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3824 if (func != (VFunction *)NULL)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3825 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3826 /* Special case info_do_lowercase_version (). */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3827 if (func == info_do_lowercase_version)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3828 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3829 info_dispatch_on_key (tolower (key), map);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3830 return;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3831 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3832
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3833 add_char_to_keyseq (key);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3834
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3835 if (info_keyseq_displayed_p)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3836 display_info_keyseq (0);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3837
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3838 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3839 WINDOW *where;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3840
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3841 where = active_window;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3842 (*map[key].function)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3843 (active_window, info_numeric_arg * info_numeric_arg_sign, key);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3844
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3845 /* If we have input pending, then the last command was a prefix
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3846 command. Don't change the value of the last function vars.
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3847 Otherwise, remember the last command executed in the var
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3848 appropriate to the window in which it was executed. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3849 if (!info_input_pending_p ())
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3850 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3851 if (where == the_echo_area)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3852 ea_last_executed_command = map[key].function;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3853 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3854 info_last_executed_command = map[key].function;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3855 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3856 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3857 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3858 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3859 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3860 add_char_to_keyseq (key);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3861 dispatch_error (info_keyseq);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3862 return;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3863 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3864 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3865 break;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3866
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3867 case ISKMAP:
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3868 add_char_to_keyseq (key);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3869 if (map[key].function != (VFunction *)NULL)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3870 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3871 unsigned char newkey;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3872
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3873 newkey = info_get_another_input_char ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3874 info_dispatch_on_key (newkey, (Keymap)map[key].function);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3875 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3876 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3877 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3878 dispatch_error (info_keyseq);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3879 return;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3880 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3881 break;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3882 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3883 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3884
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3885 /* **************************************************************** */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3886 /* */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3887 /* Numeric Arguments */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3888 /* */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3889 /* **************************************************************** */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3890
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3891 /* Handle C-u style numeric args, as well as M--, and M-digits. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3892
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3893 /* Non-zero means that an explicit argument has been passed to this
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3894 command, as in C-u C-v. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3895 int info_explicit_arg = 0;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3896
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3897 /* The sign of the numeric argument. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3898 int info_numeric_arg_sign = 1;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3899
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3900 /* The value of the argument itself. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3901 int info_numeric_arg = 1;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3902
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3903 /* Add the current digit to the argument in progress. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3904 DECLARE_INFO_COMMAND (info_add_digit_to_numeric_arg,
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3905 "Add this digit to the current numeric argument")
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3906 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3907 info_numeric_arg_digit_loop (window, 0, key);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3908 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3909
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3910 /* C-u, universal argument. Multiply the current argument by 4.
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3911 Read a key. If the key has nothing to do with arguments, then
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3912 dispatch on it. If the key is the abort character then abort. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3913 DECLARE_INFO_COMMAND (info_universal_argument,
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3914 "Start (or multiply by 4) the current numeric argument")
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3915 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3916 info_numeric_arg *= 4;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3917 info_numeric_arg_digit_loop (window, 0, 0);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3918 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3919
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3920 /* Create a default argument. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3921 void
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3922 info_initialize_numeric_arg ()
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3923 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3924 info_numeric_arg = info_numeric_arg_sign = 1;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3925 info_explicit_arg = 0;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3926 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3927
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3928 DECLARE_INFO_COMMAND (info_numeric_arg_digit_loop, "")
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3929 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3930 unsigned char pure_key;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3931 Keymap keymap = window->keymap;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3932
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3933 while (1)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3934 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3935 if (key)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3936 pure_key = key;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3937 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3938 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3939 if (display_was_interrupted_p && !info_any_buffered_input_p ())
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3940 display_update_display (windows);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3941
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3942 if (active_window != the_echo_area)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3943 display_cursor_at_point (active_window);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3944
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3945 pure_key = key = info_get_another_input_char ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3946
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3947 if (Meta_p (key))
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3948 add_char_to_keyseq (ESC);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3949
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3950 add_char_to_keyseq (UnMeta (key));
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3951 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3952
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3953 if (Meta_p (key))
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3954 key = UnMeta (key);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3955
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3956 if (keymap[key].type == ISFUNC &&
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3957 keymap[key].function == info_universal_argument)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3958 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3959 info_numeric_arg *= 4;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3960 key = 0;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3961 continue;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3962 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3963
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3964 if (isdigit (key))
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3965 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3966 if (info_explicit_arg)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3967 info_numeric_arg = (info_numeric_arg * 10) + (key - '0');
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3968 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3969 info_numeric_arg = (key - '0');
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3970 info_explicit_arg = 1;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3971 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3972 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3973 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3974 if (key == '-' && !info_explicit_arg)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3975 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3976 info_numeric_arg_sign = -1;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3977 info_numeric_arg = 1;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3978 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3979 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3980 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3981 info_keyseq_index--;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3982 info_dispatch_on_key (pure_key, keymap);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3983 return;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3984 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3985 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3986 key = 0;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3987 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3988 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3989
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3990 /* **************************************************************** */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3991 /* */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3992 /* Input Character Buffering */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3993 /* */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3994 /* **************************************************************** */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3995
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3996 /* Character waiting to be read next. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3997 static int pending_input_character = 0;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3998
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
3999 /* How to make there be no pending input. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4000 static void
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4001 info_clear_pending_input ()
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4002 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4003 pending_input_character = 0;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4004 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4005
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4006 /* How to set the pending input character. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4007 static void
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4008 info_set_pending_input (key)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4009 unsigned char key;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4010 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4011 pending_input_character = key;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4012 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4013
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4014 /* How to see if there is any pending input. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4015 unsigned char
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4016 info_input_pending_p ()
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4017 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4018 return (pending_input_character);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4019 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4020
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4021 /* Largest number of characters that we can read in advance. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4022 #define MAX_INFO_INPUT_BUFFERING 512
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4023
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4024 static int pop_index = 0, push_index = 0;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4025 static unsigned char info_input_buffer[MAX_INFO_INPUT_BUFFERING];
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4026
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4027 /* Add KEY to the buffer of characters to be read. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4028 static void
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4029 info_push_typeahead (key)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4030 unsigned char key;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4031 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4032 /* Flush all pending input in the case of C-g pressed. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4033 if (key == Control ('g'))
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4034 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4035 push_index = pop_index;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4036 info_set_pending_input (Control ('g'));
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4037 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4038 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4039 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4040 info_input_buffer[push_index++] = key;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4041 if (push_index >= sizeof (info_input_buffer))
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4042 push_index = 0;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4043 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4044 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4045
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4046 /* Return the amount of space available in INFO_INPUT_BUFFER for new chars. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4047 static int
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4048 info_input_buffer_space_available ()
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4049 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4050 if (pop_index > push_index)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4051 return (pop_index - push_index);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4052 else
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4053 return (sizeof (info_input_buffer - (push_index - pop_index)));
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4054 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4055
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4056 /* Get a key from the buffer of characters to be read.
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4057 Return the key in KEY.
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4058 Result is non-zero if there was a key, or 0 if there wasn't. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4059 static int
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4060 info_get_key_from_typeahead (key)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4061 unsigned char *key;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4062 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4063 if (push_index == pop_index)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4064 return (0);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4065
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4066 *key = info_input_buffer[pop_index++];
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4067
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4068 if (pop_index >= sizeof (info_input_buffer))
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4069 pop_index = 0;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4070
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4071 return (1);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4072 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4073
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4074 int
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4075 info_any_buffered_input_p ()
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4076 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4077 info_gather_typeahead ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4078 return (push_index != pop_index);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4079 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4080
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4081 /* Push KEY into the *front* of the input buffer. Returns non-zero if
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4082 successful, zero if there is no space left in the buffer. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4083 static int
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4084 info_replace_key_to_typeahead (key)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4085 unsigned char key;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4086 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4087 if (info_input_buffer_space_available ())
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4088 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4089 pop_index--;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4090 if (pop_index < 0)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4091 pop_index = sizeof (info_input_buffer) - 1;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4092 info_input_buffer[pop_index] = key;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4093 return (1);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4094 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4095 return (0);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4096 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4097
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4098 /* If characters are available to be read, then read them and stuff them into
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4099 info_input_buffer. Otherwise, do nothing. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4100 void
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4101 info_gather_typeahead ()
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4102 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4103 int tty, space_avail;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4104 long chars_avail;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4105 unsigned char input[MAX_INFO_INPUT_BUFFERING];
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4106
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4107 tty = fileno (info_input_stream);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4108 chars_avail = 0;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4109
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4110 space_avail = info_input_buffer_space_available ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4111
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4112 /* If we can just find out how many characters there are to read, do so. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4113 #if defined (FIONREAD)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4114 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4115 ioctl (tty, FIONREAD, &chars_avail);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4116
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4117 if (chars_avail > space_avail)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4118 chars_avail = space_avail;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4119
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4120 if (chars_avail)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4121 read (tty, &input[0], chars_avail);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4122 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4123 #else /* !FIONREAD */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4124 # if defined (O_NDELAY)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4125 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4126 int flags;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4127
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4128 flags = fcntl (tty, F_GETFL, 0);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4129
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4130 fcntl (tty, F_SETFL, (flags | O_NDELAY));
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4131 chars_avail = read (tty, &input[0], space_avail);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4132 fcntl (tty, F_SETFL, flags);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4133
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4134 if (chars_avail == -1)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4135 chars_avail = 0;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4136 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4137 # endif /* O_NDELAY */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4138 #endif /* !FIONREAD */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4139
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4140 /* Store the input characters just read into our input buffer. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4141 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4142 register int i;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4143
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4144 for (i = 0; i < chars_avail; i++)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4145 info_push_typeahead (input[i]);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4146 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4147 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4148
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4149 /* How to read a single character. */
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4150 unsigned char
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4151 info_get_input_char ()
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4152 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4153 unsigned char keystroke;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4154
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4155 info_gather_typeahead ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4156
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4157 if (pending_input_character)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4158 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4159 keystroke = pending_input_character;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4160 pending_input_character = 0;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4161 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4162 else if (info_get_key_from_typeahead (&keystroke) == 0)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4163 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4164 int rawkey;
655
6a2e35dc94c3 [project @ 1994-08-25 22:16:05 by jwe]
jwe
parents: 249
diff changeset
4165 int ignoreeof = 7;
6a2e35dc94c3 [project @ 1994-08-25 22:16:05 by jwe]
jwe
parents: 249
diff changeset
4166
6a2e35dc94c3 [project @ 1994-08-25 22:16:05 by jwe]
jwe
parents: 249
diff changeset
4167 /* Ugh. After returning from a C-z that interrupted us while we were
6a2e35dc94c3 [project @ 1994-08-25 22:16:05 by jwe]
jwe
parents: 249
diff changeset
4168 waiting on input, Ultrix (and other?) systems return EOF from getc
6a2e35dc94c3 [project @ 1994-08-25 22:16:05 by jwe]
jwe
parents: 249
diff changeset
4169 instead of continuing to wait. Hack around that by trying to read
6a2e35dc94c3 [project @ 1994-08-25 22:16:05 by jwe]
jwe
parents: 249
diff changeset
4170 atain up to IGNOREEOF times. */
6a2e35dc94c3 [project @ 1994-08-25 22:16:05 by jwe]
jwe
parents: 249
diff changeset
4171
6a2e35dc94c3 [project @ 1994-08-25 22:16:05 by jwe]
jwe
parents: 249
diff changeset
4172 do
6a2e35dc94c3 [project @ 1994-08-25 22:16:05 by jwe]
jwe
parents: 249
diff changeset
4173 {
6a2e35dc94c3 [project @ 1994-08-25 22:16:05 by jwe]
jwe
parents: 249
diff changeset
4174 rawkey = getc (info_input_stream);
6a2e35dc94c3 [project @ 1994-08-25 22:16:05 by jwe]
jwe
parents: 249
diff changeset
4175 }
6a2e35dc94c3 [project @ 1994-08-25 22:16:05 by jwe]
jwe
parents: 249
diff changeset
4176 while (rawkey == EOF && --ignoreeof);
6a2e35dc94c3 [project @ 1994-08-25 22:16:05 by jwe]
jwe
parents: 249
diff changeset
4177
171
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4178 keystroke = rawkey;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4179
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4180 if (rawkey == EOF)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4181 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4182 if (info_input_stream != stdin)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4183 {
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4184 fclose (info_input_stream);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4185 info_input_stream = stdin;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4186 display_inhibited = 0;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4187 display_update_display (windows);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4188 display_cursor_at_point (active_window);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4189 rawkey = getc (info_input_stream);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4190 keystroke = rawkey;
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4191 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4192
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4193 if (rawkey == EOF)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4194 {
655
6a2e35dc94c3 [project @ 1994-08-25 22:16:05 by jwe]
jwe
parents: 249
diff changeset
4195 keystroke = '\0';
171
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4196 terminal_unprep_terminal ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4197 close_dribble_file ();
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4198 exit (0);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4199 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4200 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4201 }
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4202
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4203 if (info_dribble_file)
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4204 dribble (keystroke);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4205
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4206 return (keystroke);
d6fae6ef3e60 [project @ 1993-10-21 22:39:46 by jwe]
jwe
parents:
diff changeset
4207 }