1: /*
2: * Prompting and other messages.
3: * There are three flavors of prompts, SHORT, MEDIUM and LONG,
4: * selected by the -m/-M options.
5: * A prompt is either a colon or a message composed of various
6: * pieces, such as the name of the file being viewed, the percentage
7: * into the file, etc.
8: */
9:
10: #include "less.h"
11: #include "position.h"
12:
13: extern int pr_type;
14: extern int ispipe;
15: extern int hit_eof;
16: extern int new_file;
17: extern int sc_width;
18: extern char current_file[];
19: extern int ac;
20: extern char **av;
21: extern int curr_ac;
22:
23: static char message[500];
24:
25: /*
26: * Append the name of the current file (to the message buffer).
27: */
28: static void
29: ap_filename()
30: {
31: if (!ispipe)
32: sprintf(message + strlen(message),
33: "%s", current_file);
34: }
35:
36: /*
37: * Append the "file N of M" message.
38: */
39: static void
40: ap_of()
41: {
42: if (ac > 1)
43: sprintf(message + strlen(message),
44: " (file %d of %d)", curr_ac+1, ac);
45: }
46:
47: /*
48: * Append the byte offset into the current file.
49: */
50: static void
51: ap_byte()
52: {
53: POSITION pos, len;
54:
55: pos = position(BOTTOM_PLUS_ONE);
56: if (pos != NULL_POSITION)
57: {
58: sprintf(message + strlen(message),
59: " byte %ld", pos);
60: len = ch_length();
61: if (len > 0)
62: sprintf(message + strlen(message),
63: "/%ld", len);
64: }
65: }
66:
67: /*
68: * Append the percentage into the current file.
69: * If we cannot find the percentage and must_print is true,
70: * the use the byte offset.
71: */
72: static void
73: ap_percent(must_print)
74: {
75: POSITION pos,len;
76:
77: pos = position(BOTTOM_PLUS_ONE);
78: len = ch_length();
79: if (len > 0 && pos != NULL_POSITION)
80: sprintf(message + strlen(message),
81: " (%ld%%)", (100 * pos) / len);
82: else if (must_print)
83: ap_byte();
84: }
85:
86: /*
87: * Append the end-of-file message.
88: */
89: static void
90: ap_eof()
91: {
92: strcat(message, " END");
93: if (curr_ac + 1 < ac)
94: sprintf(message + strlen(message),
95: " - Next: %s", av[curr_ac+1]);
96: }
97:
98: /*
99: * Return a message suitable for printing by the "=" command.
100: */
101: public char *
102: eq_message()
103: {
104: message[0] = '\0';
105: ap_filename();
106: ap_of();
107: ap_byte();
108: ap_percent(0);
109: /*
110: * Truncate to the screen width.
111: * {{ This isn't very nice. }}
112: */
113: message[error_width()] = '\0';
114: return (message);
115: }
116:
117: /*
118: * Return a prompt.
119: * This depends on the prompt type (SHORT, MEDIUM, LONG), etc.
120: * If we can't come up with an appropriate prompt, return NULL
121: * and the caller will prompt with a colon.
122: */
123: public char *
124: pr_string()
125: {
126: message[0] = '\0';
127: switch (pr_type)
128: {
129: case PR_SHORT:
130: if (new_file)
131: {
132: ap_filename();
133: ap_of();
134: }
135: if (hit_eof)
136: ap_eof();
137: break;
138: case PR_MEDIUM:
139: if (new_file)
140: {
141: ap_filename();
142: ap_of();
143: }
144: if (hit_eof)
145: ap_eof();
146: else
147: ap_percent(1);
148: break;
149: case PR_LONG:
150: ap_filename();
151: if (new_file)
152: ap_of();
153: ap_byte();
154: if (hit_eof)
155: ap_eof();
156: else
157: ap_percent(0);
158: break;
159: }
160: new_file = 0;
161: if (message[0] == '\0')
162: return (NULL);
163: /*
164: * Truncate to the screen width.
165: * {{ This isn't very nice. }}
166: */
167: message[sc_width-2] = '\0';
168: return (message);
169: }
Defined functions
ap_of
defined in line
39; used 4 times
Defined variables