annotate readline/complete.c @ 3284:f7e4a95916f2

[project @ 1999-10-13 21:37:04 by jwe]
author jwe
date Wed, 13 Oct 1999 21:37:40 +0000
parents 9d4e3a9de17e
children 3001e15555e9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2996
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1 /* complete.c -- filename completion for readline. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
2
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
3 /* Copyright (C) 1987, 1989, 1992 Free Software Foundation, Inc.
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
4
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
5 This file is part of the GNU Readline Library, a library for
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
6 reading lines of text with interactive input and history editing.
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
7
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
8 The GNU Readline Library is free software; you can redistribute it
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
9 and/or modify it under the terms of the GNU General Public License
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
10 as published by the Free Software Foundation; either version 1, or
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
11 (at your option) any later version.
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
12
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
13 The GNU Readline Library is distributed in the hope that it will be
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
14 useful, but WITHOUT ANY WARRANTY; without even the implied warranty
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
15 of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
16 GNU General Public License for more details.
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
17
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
18 The GNU General Public License is often shipped with GNU software, and
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
19 is generally kept in a file called COPYING or LICENSE. If you do not
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
20 have a copy of the license, write to the Free Software Foundation,
3284
f7e4a95916f2 [project @ 1999-10-13 21:37:04 by jwe]
jwe
parents: 2996
diff changeset
21 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
2996
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
22 #define READLINE_LIBRARY
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
23
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
24 #if defined (HAVE_CONFIG_H)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
25 # include <config.h>
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
26 #endif
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
27
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
28 #include <sys/types.h>
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
29 #include <fcntl.h>
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
30 #if defined (HAVE_SYS_FILE_H)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
31 #include <sys/file.h>
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
32 #endif
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
33
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
34 #if defined (HAVE_UNISTD_H)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
35 # include <unistd.h>
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
36 #endif /* HAVE_UNISTD_H */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
37
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
38 #if defined (HAVE_STDLIB_H)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
39 # include <stdlib.h>
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
40 #else
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
41 # include "ansi_stdlib.h"
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
42 #endif /* HAVE_STDLIB_H */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
43
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
44 #include <stdio.h>
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
45
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
46 #include <errno.h>
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
47 #if !defined (errno)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
48 extern int errno;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
49 #endif /* !errno */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
50
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
51 #include <pwd.h>
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
52 #if !defined (HAVE_GETPW_DECLS)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
53 extern struct passwd *getpwent ();
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
54 #endif /* USG && !HAVE_GETPW_DECLS */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
55
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
56 /* ISC systems don't define getpwent() if _POSIX_SOURCE is defined. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
57 #if defined (isc386) && defined (_POSIX_SOURCE)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
58 # if defined (__STDC__)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
59 extern struct passwd *getpwent (void);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
60 # else
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
61 extern struct passwd *getpwent ();
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
62 # endif /* !__STDC__ */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
63 #endif /* isc386 && _POSIX_SOURCE */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
64
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
65 #include "posixdir.h"
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
66 #include "posixstat.h"
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
67
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
68 /* System-specific feature definitions and include files. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
69 #include "rldefs.h"
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
70
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
71 /* Some standard library routines. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
72 #include "readline.h"
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
73
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
74 extern char *tilde_expand ();
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
75 extern char *rl_copy_text ();
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
76 extern void _rl_abort_internal ();
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
77 extern int _rl_qsort_string_compare ();
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
78
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
79 extern Function *rl_last_func;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
80 extern int rl_editing_mode;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
81 extern int screenwidth;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
82
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
83 extern void _rl_move_vert ();
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
84 extern int _rl_vis_botlin;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
85 extern int rl_display_fixed;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
86
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
87 /* Forward declarations for functions defined and used in this file. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
88 char *filename_completion_function ();
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
89 char **completion_matches ();
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
90
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
91 static char *rl_quote_filename ();
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
92 static char *rl_strpbrk ();
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
93
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
94 static char **remove_duplicate_matches ();
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
95 static void insert_text ();
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
96 static void insert_match ();
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
97 static void append_to_match ();
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
98 static void insert_all_matches ();
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
99 static void display_matches ();
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
100 static int compute_lcd_of_matches ();
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
101
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
102 extern char *xmalloc (), *xrealloc ();
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
103
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
104 /* If non-zero, then this is the address of a function to call when
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
105 completing on a directory name. The function is called with
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
106 the address of a string (the current directory name) as an arg. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
107 Function *rl_directory_completion_hook = (Function *)NULL;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
108
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
109 /* Non-zero means readline completion functions perform tilde expansion. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
110 int rl_complete_with_tilde_expansion = 0;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
111
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
112 /* If non-zero, non-unique completions always show the list of matches. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
113 int _rl_complete_show_all = 0;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
114
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
115 /* If non-zero, completed directory names have a slash appended. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
116 int _rl_complete_mark_directories = 1;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
117
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
118 #if defined (VISIBLE_STATS)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
119 # if !defined (X_OK)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
120 # define X_OK 1
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
121 # endif
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
122
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
123 static int stat_char ();
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
124
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
125 /* Non-zero means add an additional character to each filename displayed
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
126 during listing completion iff rl_filename_completion_desired which helps
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
127 to indicate the type of file being listed. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
128 int rl_visible_stats = 0;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
129 #endif /* VISIBLE_STATS */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
130
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
131 /* **************************************************************** */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
132 /* */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
133 /* Completion matching, from readline's point of view. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
134 /* */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
135 /* **************************************************************** */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
136
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
137 /* Local variable states what happened during the last completion attempt. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
138 static int completion_changed_buffer;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
139
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
140 /* Pointer to the generator function for completion_matches ().
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
141 NULL means to use filename_completion_function (), the default filename
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
142 completer. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
143 Function *rl_completion_entry_function = (Function *)NULL;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
144
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
145 /* Pointer to alternative function to create matches.
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
146 Function is called with TEXT, START, and END.
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
147 START and END are indices in RL_LINE_BUFFER saying what the boundaries
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
148 of TEXT are.
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
149 If this function exists and returns NULL then call the value of
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
150 rl_completion_entry_function to try to match, otherwise use the
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
151 array of strings returned. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
152 CPPFunction *rl_attempted_completion_function = (CPPFunction *)NULL;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
153
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
154 /* Non-zero means to suppress normal filename completion after the
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
155 user-specified completion function has been called. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
156 int rl_attempted_completion_over = 0;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
157
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
158 /* Set to a character indicating the type of completion being performed
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
159 by rl_complete_internal, available for use by application completion
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
160 functions. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
161 int rl_completion_type = 0;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
162
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
163 /* Up to this many items will be displayed in response to a
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
164 possible-completions call. After that, we ask the user if
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
165 she is sure she wants to see them all. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
166 int rl_completion_query_items = 100;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
167
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
168 /* The basic list of characters that signal a break between words for the
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
169 completer routine. The contents of this variable is what breaks words
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
170 in the shell, i.e. " \t\n\"\\'`@$><=" */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
171 char *rl_basic_word_break_characters = " \t\n\"\\'`@$><=;|&{(";
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
172
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
173 /* List of basic quoting characters. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
174 char *rl_basic_quote_characters = "\"'";
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
175
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
176 /* The list of characters that signal a break between words for
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
177 rl_complete_internal. The default list is the contents of
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
178 rl_basic_word_break_characters. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
179 char *rl_completer_word_break_characters = (char *)NULL;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
180
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
181 /* List of characters which can be used to quote a substring of the line.
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
182 Completion occurs on the entire substring, and within the substring
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
183 rl_completer_word_break_characters are treated as any other character,
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
184 unless they also appear within this list. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
185 char *rl_completer_quote_characters = (char *)NULL;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
186
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
187 /* List of characters that should be quoted in filenames by the completer. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
188 char *rl_filename_quote_characters = (char *)NULL;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
189
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
190 /* List of characters that are word break characters, but should be left
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
191 in TEXT when it is passed to the completion function. The shell uses
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
192 this to help determine what kind of completing to do. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
193 char *rl_special_prefixes = (char *)NULL;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
194
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
195 /* If non-zero, then disallow duplicates in the matches. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
196 int rl_ignore_completion_duplicates = 1;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
197
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
198 /* Non-zero means that the results of the matches are to be treated
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
199 as filenames. This is ALWAYS zero on entry, and can only be changed
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
200 within a completion entry finder function. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
201 int rl_filename_completion_desired = 0;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
202
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
203 /* Non-zero means that the results of the matches are to be quoted using
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
204 double quotes (or an application-specific quoting mechanism) if the
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
205 filename contains any characters in rl_filename_quote_chars. This is
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
206 ALWAYS non-zero on entry, and can only be changed within a completion
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
207 entry finder function. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
208 int rl_filename_quoting_desired = 1;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
209
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
210 /* This function, if defined, is called by the completer when real
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
211 filename completion is done, after all the matching names have been
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
212 generated. It is passed a (char**) known as matches in the code below.
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
213 It consists of a NULL-terminated array of pointers to potential
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
214 matching strings. The 1st element (matches[0]) is the maximal
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
215 substring that is common to all matches. This function can re-arrange
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
216 the list of matches as required, but all elements of the array must be
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
217 free()'d if they are deleted. The main intent of this function is
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
218 to implement FIGNORE a la SunOS csh. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
219 Function *rl_ignore_some_completions_function = (Function *)NULL;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
220
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
221 /* Set to a function to quote a filename in an application-specific fashion.
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
222 Called with the text to quote, the type of match found (single or multiple)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
223 and a pointer to the quoting character to be used, which the function can
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
224 reset if desired. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
225 CPFunction *rl_filename_quoting_function = rl_quote_filename;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
226
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
227 /* Function to call to remove quoting characters from a filename. Called
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
228 before completion is attempted, so the embedded quotes do not interfere
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
229 with matching names in the file system. Readline doesn't do anything
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
230 with this; it's set only by applications. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
231 CPFunction *rl_filename_dequoting_function = (CPFunction *)NULL;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
232
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
233 /* Function to call to decide whether or not a word break character is
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
234 quoted. If a character is quoted, it does not break words for the
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
235 completer. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
236 Function *rl_char_is_quoted_p = (Function *)NULL;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
237
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
238 /* Character appended to completed words when at the end of the line. The
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
239 default is a space. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
240 int rl_completion_append_character = ' ';
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
241
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
242 /* If non-zero, inhibit completion (temporarily). */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
243 int rl_inhibit_completion;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
244
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
245 /* Complete the word at or before point. You have supplied the function
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
246 that does the initial simple matching selection algorithm (see
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
247 completion_matches ()). The default is to do filename completion. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
248 int
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
249 rl_complete (ignore, invoking_key)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
250 int ignore, invoking_key;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
251 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
252 if (rl_inhibit_completion)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
253 return (rl_insert (ignore, invoking_key));
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
254 else if (rl_last_func == rl_complete && !completion_changed_buffer)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
255 return (rl_complete_internal ('?'));
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
256 else if (_rl_complete_show_all)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
257 return (rl_complete_internal ('!'));
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
258 else
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
259 return (rl_complete_internal (TAB));
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
260 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
261
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
262 /* List the possible completions. See description of rl_complete (). */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
263 int
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
264 rl_possible_completions (ignore, invoking_key)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
265 int ignore, invoking_key;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
266 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
267 return (rl_complete_internal ('?'));
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
268 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
269
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
270 int
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
271 rl_insert_completions (ignore, invoking_key)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
272 int ignore, invoking_key;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
273 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
274 return (rl_complete_internal ('*'));
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
275 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
276
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
277 /* The user must press "y" or "n". Non-zero return means "y" pressed. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
278 static int
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
279 get_y_or_n ()
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
280 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
281 int c;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
282
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
283 for (;;)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
284 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
285 c = rl_read_key ();
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
286 if (c == 'y' || c == 'Y' || c == ' ')
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
287 return (1);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
288 if (c == 'n' || c == 'N' || c == RUBOUT)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
289 return (0);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
290 if (c == ABORT_CHAR)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
291 _rl_abort_internal ();
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
292 ding ();
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
293 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
294 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
295
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
296 /* Return the portion of PATHNAME that should be output when listing
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
297 possible completions. If we are hacking filename completion, we
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
298 are only interested in the basename, the portion following the
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
299 final slash. Otherwise, we return what we were passed. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
300 static char *
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
301 printable_part (pathname)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
302 char *pathname;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
303 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
304 char *temp;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
305
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
306 temp = rl_filename_completion_desired ? strrchr (pathname, '/') : (char *)NULL;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
307 return (temp ? ++temp : pathname);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
308 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
309
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
310 /* Output TO_PRINT to rl_outstream. If VISIBLE_STATS is defined and we
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
311 are using it, check for and output a single character for `special'
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
312 filenames. Return 1 if we printed an extension character, 0 if not. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
313
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
314 #define PUTX(c) \
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
315 if (CTRL_CHAR (c)) \
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
316 { \
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
317 putc ('^', rl_outstream); \
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
318 putc (UNCTRL (c), rl_outstream); \
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
319 } \
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
320 else if (c == RUBOUT) \
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
321 { \
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
322 putc ('^', rl_outstream); \
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
323 putc ('?', rl_outstream); \
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
324 } \
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
325 else \
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
326 putc (c, rl_outstream)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
327
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
328 static int
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
329 print_filename (to_print, full_pathname)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
330 char *to_print, *full_pathname;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
331 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
332 #if !defined (VISIBLE_STATS)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
333 char *s;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
334
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
335 for (s = to_print; *s; s++)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
336 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
337 PUTX (*s);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
338 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
339 return 0;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
340 #else
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
341 char *s, c, *new_full_pathname;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
342 int extension_char, slen, tlen;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
343
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
344 for (s = to_print; *s; s++)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
345 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
346 PUTX (*s);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
347 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
348
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
349 if (rl_filename_completion_desired && rl_visible_stats)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
350 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
351 /* If to_print != full_pathname, to_print is the basename of the
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
352 path passed. In this case, we try to expand the directory
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
353 name before checking for the stat character. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
354 if (to_print != full_pathname)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
355 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
356 /* Terminate the directory name. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
357 c = to_print[-1];
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
358 to_print[-1] = '\0';
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
359
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
360 s = tilde_expand (full_pathname);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
361 if (rl_directory_completion_hook)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
362 (*rl_directory_completion_hook) (&s);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
363
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
364 slen = strlen (s);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
365 tlen = strlen (to_print);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
366 new_full_pathname = xmalloc (slen + tlen + 2);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
367 strcpy (new_full_pathname, s);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
368 new_full_pathname[slen] = '/';
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
369 strcpy (new_full_pathname + slen + 1, to_print);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
370
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
371 extension_char = stat_char (new_full_pathname);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
372
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
373 free (new_full_pathname);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
374 to_print[-1] = c;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
375 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
376 else
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
377 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
378 s = tilde_expand (full_pathname);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
379 extension_char = stat_char (s);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
380 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
381
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
382 free (s);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
383 if (extension_char)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
384 putc (extension_char, rl_outstream);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
385 return (extension_char != 0);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
386 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
387 else
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
388 return 0;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
389 #endif /* VISIBLE_STATS */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
390 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
391
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
392 static char *
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
393 rl_quote_filename (s, rtype, qcp)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
394 char *s;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
395 int rtype;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
396 char *qcp;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
397 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
398 char *r;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
399
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
400 r = xmalloc (strlen (s) + 2);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
401 *r = *rl_completer_quote_characters;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
402 strcpy (r + 1, s);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
403 if (qcp)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
404 *qcp = *rl_completer_quote_characters;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
405 return r;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
406 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
407
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
408 /* Find the bounds of the current word for completion purposes, and leave
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
409 rl_point set to the end of the word. This function skips quoted
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
410 substrings (characters between matched pairs of characters in
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
411 rl_completer_quote_characters. First we try to find an unclosed
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
412 quoted substring on which to do matching. If one is not found, we use
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
413 the word break characters to find the boundaries of the current word.
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
414 We call an application-specific function to decide whether or not a
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
415 particular word break character is quoted; if that function returns a
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
416 non-zero result, the character does not break a word. This function
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
417 returns the opening quote character if we found an unclosed quoted
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
418 substring, '\0' otherwise. FP, if non-null, is set to a value saying
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
419 which (shell-like) quote characters we found (single quote, double
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
420 quote, or backslash) anywhere in the string. DP, if non-null, is set to
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
421 the value of the delimiter character that caused a word break. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
422
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
423 static char
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
424 find_completion_word (fp, dp)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
425 int *fp, *dp;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
426 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
427 int scan, end, found_quote, delimiter, pass_next, isbrk;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
428 char quote_char;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
429
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
430 end = rl_point;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
431 found_quote = delimiter = 0;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
432 quote_char = '\0';
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
433
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
434 if (rl_completer_quote_characters)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
435 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
436 /* We have a list of characters which can be used in pairs to
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
437 quote substrings for the completer. Try to find the start
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
438 of an unclosed quoted substring. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
439 /* FOUND_QUOTE is set so we know what kind of quotes we found. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
440 for (scan = pass_next = 0; scan < end; scan++)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
441 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
442 if (pass_next)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
443 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
444 pass_next = 0;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
445 continue;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
446 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
447
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
448 if (rl_line_buffer[scan] == '\\')
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
449 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
450 pass_next = 1;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
451 found_quote |= RL_QF_BACKSLASH;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
452 continue;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
453 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
454
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
455 if (quote_char != '\0')
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
456 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
457 /* Ignore everything until the matching close quote char. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
458 if (rl_line_buffer[scan] == quote_char)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
459 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
460 /* Found matching close. Abandon this substring. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
461 quote_char = '\0';
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
462 rl_point = end;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
463 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
464 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
465 else if (strchr (rl_completer_quote_characters, rl_line_buffer[scan]))
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
466 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
467 /* Found start of a quoted substring. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
468 quote_char = rl_line_buffer[scan];
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
469 rl_point = scan + 1;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
470 /* Shell-like quoting conventions. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
471 if (quote_char == '\'')
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
472 found_quote |= RL_QF_SINGLE_QUOTE;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
473 else if (quote_char == '"')
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
474 found_quote |= RL_QF_DOUBLE_QUOTE;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
475 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
476 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
477 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
478
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
479 if (rl_point == end && quote_char == '\0')
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
480 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
481 /* We didn't find an unclosed quoted substring upon which to do
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
482 completion, so use the word break characters to find the
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
483 substring on which to complete. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
484 while (--rl_point)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
485 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
486 scan = rl_line_buffer[rl_point];
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
487
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
488 if (strchr (rl_completer_word_break_characters, scan) == 0)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
489 continue;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
490
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
491 /* Call the application-specific function to tell us whether
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
492 this word break character is quoted and should be skipped. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
493 if (rl_char_is_quoted_p && found_quote &&
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
494 (*rl_char_is_quoted_p) (rl_line_buffer, rl_point))
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
495 continue;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
496
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
497 /* Convoluted code, but it avoids an n^2 algorithm with calls
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
498 to char_is_quoted. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
499 break;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
500 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
501 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
502
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
503 /* If we are at an unquoted word break, then advance past it. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
504 scan = rl_line_buffer[rl_point];
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
505
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
506 /* If there is an application-specific function to say whether or not
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
507 a character is quoted and we found a quote character, let that
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
508 function decide whether or not a character is a word break, even
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
509 if it is found in rl_completer_word_break_characters. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
510 if (rl_char_is_quoted_p)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
511 isbrk = (found_quote == 0 ||
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
512 (*rl_char_is_quoted_p) (rl_line_buffer, rl_point) == 0) &&
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
513 strchr (rl_completer_word_break_characters, scan) != 0;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
514 else
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
515 isbrk = strchr (rl_completer_word_break_characters, scan) != 0;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
516
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
517 if (isbrk)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
518 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
519 /* If the character that caused the word break was a quoting
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
520 character, then remember it as the delimiter. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
521 if (rl_basic_quote_characters && strchr (rl_basic_quote_characters, scan) && (end - rl_point) > 1)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
522 delimiter = scan;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
523
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
524 /* If the character isn't needed to determine something special
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
525 about what kind of completion to perform, then advance past it. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
526 if (rl_special_prefixes == 0 || strchr (rl_special_prefixes, scan) == 0)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
527 rl_point++;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
528 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
529
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
530 if (fp)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
531 *fp = found_quote;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
532 if (dp)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
533 *dp = delimiter;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
534
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
535 return (quote_char);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
536 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
537
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
538 static char **
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
539 gen_completion_matches (text, start, end, our_func, found_quote, quote_char)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
540 char *text;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
541 int start, end;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
542 Function *our_func;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
543 int found_quote, quote_char;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
544 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
545 char **matches, *temp;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
546
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
547 /* If the user wants to TRY to complete, but then wants to give
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
548 up and use the default completion function, they set the
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
549 variable rl_attempted_completion_function. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
550 if (rl_attempted_completion_function)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
551 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
552 matches = (*rl_attempted_completion_function) (text, start, end);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
553
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
554 if (matches || rl_attempted_completion_over)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
555 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
556 rl_attempted_completion_over = 0;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
557 return (matches);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
558 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
559 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
560
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
561 /* Beware -- we're stripping the quotes here. Do this only if we know
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
562 we are doing filename completion and the application has defined a
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
563 filename dequoting function. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
564 temp = (char *)NULL;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
565 if (found_quote && our_func == (Function *)filename_completion_function &&
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
566 rl_filename_dequoting_function)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
567 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
568 /* delete single and double quotes */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
569 temp = (*rl_filename_dequoting_function) (text, quote_char);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
570 text = temp; /* not freeing text is not a memory leak */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
571 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
572
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
573 matches = completion_matches (text, our_func);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
574 FREE (temp);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
575 return matches;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
576 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
577
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
578 /* Filter out duplicates in MATCHES. This frees up the strings in
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
579 MATCHES. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
580 static char **
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
581 remove_duplicate_matches (matches)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
582 char **matches;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
583 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
584 char *lowest_common;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
585 int i, j, newlen;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
586 char dead_slot;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
587 char **temp_array;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
588
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
589 /* Sort the items. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
590 for (i = 0; matches[i]; i++)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
591 ;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
592
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
593 /* Sort the array without matches[0], since we need it to
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
594 stay in place no matter what. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
595 if (i)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
596 qsort (matches+1, i-1, sizeof (char *), _rl_qsort_string_compare);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
597
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
598 /* Remember the lowest common denominator for it may be unique. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
599 lowest_common = savestring (matches[0]);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
600
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
601 for (i = newlen = 0; matches[i + 1]; i++)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
602 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
603 if (strcmp (matches[i], matches[i + 1]) == 0)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
604 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
605 free (matches[i]);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
606 matches[i] = (char *)&dead_slot;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
607 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
608 else
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
609 newlen++;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
610 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
611
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
612 /* We have marked all the dead slots with (char *)&dead_slot.
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
613 Copy all the non-dead entries into a new array. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
614 temp_array = (char **)xmalloc ((3 + newlen) * sizeof (char *));
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
615 for (i = j = 1; matches[i]; i++)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
616 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
617 if (matches[i] != (char *)&dead_slot)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
618 temp_array[j++] = matches[i];
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
619 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
620 temp_array[j] = (char *)NULL;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
621
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
622 if (matches[0] != (char *)&dead_slot)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
623 free (matches[0]);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
624
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
625 /* Place the lowest common denominator back in [0]. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
626 temp_array[0] = lowest_common;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
627
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
628 /* If there is one string left, and it is identical to the
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
629 lowest common denominator, then the LCD is the string to
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
630 insert. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
631 if (j == 2 && strcmp (temp_array[0], temp_array[1]) == 0)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
632 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
633 free (temp_array[1]);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
634 temp_array[1] = (char *)NULL;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
635 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
636 return (temp_array);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
637 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
638
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
639 static void
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
640 display_matches (matches)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
641 char **matches;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
642 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
643 int len, count, limit, max, printed_len;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
644 int i, j, k, l;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
645 char *temp;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
646
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
647 /* Move to the last visible line of a possibly-multiple-line command. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
648 _rl_move_vert (_rl_vis_botlin);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
649
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
650 /* Handle simple case first. What if there is only one answer? */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
651 if (matches[1] == 0)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
652 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
653 temp = printable_part (matches[0]);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
654 crlf ();
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
655 print_filename (temp, matches[0]);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
656 crlf ();
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
657 #if 0
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
658 rl_on_new_line ();
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
659 #else
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
660 rl_forced_update_display ();
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
661 rl_display_fixed = 1;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
662 #endif
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
663 return;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
664 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
665
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
666 /* There is more than one answer. Find out how many there are,
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
667 and find the maximum printed length of a single entry. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
668 for (max = 0, i = 1; matches[i]; i++)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
669 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
670 temp = printable_part (matches[i]);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
671 len = strlen (temp);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
672
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
673 if (len > max)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
674 max = len;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
675 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
676
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
677 len = i - 1;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
678
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
679 /* If there are many items, then ask the user if she really wants to
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
680 see them all. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
681 if (len >= rl_completion_query_items)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
682 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
683 crlf ();
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
684 fprintf (rl_outstream, "Display all %d possibilities? (y or n)", len);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
685 fflush (rl_outstream);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
686 if (get_y_or_n () == 0)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
687 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
688 crlf ();
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
689 #if 0
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
690 rl_on_new_line ();
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
691 #else
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
692 rl_forced_update_display ();
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
693 rl_display_fixed = 1;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
694 #endif
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
695 return;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
696 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
697 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
698
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
699 /* How many items of MAX length can we fit in the screen window? */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
700 max += 2;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
701 limit = screenwidth / max;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
702 if (limit != 1 && (limit * max == screenwidth))
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
703 limit--;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
704
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
705 /* Avoid a possible floating exception. If max > screenwidth,
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
706 limit will be 0 and a divide-by-zero fault will result. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
707 if (limit == 0)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
708 limit = 1;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
709
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
710 /* How many iterations of the printing loop? */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
711 count = (len + (limit - 1)) / limit;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
712
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
713 /* Watch out for special case. If LEN is less than LIMIT, then
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
714 just do the inner printing loop.
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
715 0 < len <= limit implies count = 1. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
716
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
717 /* Sort the items if they are not already sorted. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
718 if (rl_ignore_completion_duplicates == 0)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
719 qsort (matches + 1, len, sizeof (char *), _rl_qsort_string_compare);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
720
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
721 /* Print the sorted items, up-and-down alphabetically, like ls. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
722 crlf ();
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
723
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
724 for (i = 1; i <= count; i++)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
725 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
726 for (j = 0, l = i; j < limit; j++)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
727 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
728 if (l > len || matches[l] == 0)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
729 break;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
730 else
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
731 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
732 temp = printable_part (matches[l]);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
733 printed_len = strlen (temp) + print_filename (temp, matches[l]);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
734
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
735 if (j + 1 < limit)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
736 for (k = 0; k < max - printed_len; k++)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
737 putc (' ', rl_outstream);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
738 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
739 l += count;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
740 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
741 crlf ();
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
742 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
743
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
744 #if 0
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
745 rl_on_new_line ();
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
746 #else
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
747 rl_forced_update_display ();
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
748 rl_display_fixed = 1;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
749 #endif
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
750 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
751
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
752 static void
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
753 insert_text (text, start, end)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
754 char *text;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
755 int start, end;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
756 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
757 rl_begin_undo_group ();
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
758 rl_delete_text (start, end + 1);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
759 rl_point = start;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
760 rl_insert_text (text);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
761 rl_end_undo_group ();
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
762 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
763
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
764 static char *
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
765 make_quoted_replacement (match, mtype, qc)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
766 char *match;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
767 int mtype;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
768 char *qc; /* Pointer to quoting character, if any */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
769 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
770 int should_quote, do_replace;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
771 char *replacement;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
772
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
773 /* If we are doing completion on quoted substrings, and any matches
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
774 contain any of the completer_word_break_characters, then auto-
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
775 matically prepend the substring with a quote character (just pick
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
776 the first one from the list of such) if it does not already begin
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
777 with a quote string. FIXME: Need to remove any such automatically
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
778 inserted quote character when it no longer is necessary, such as
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
779 if we change the string we are completing on and the new set of
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
780 matches don't require a quoted substring. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
781 replacement = match;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
782
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
783 should_quote = match && rl_completer_quote_characters &&
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
784 rl_filename_completion_desired &&
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
785 rl_filename_quoting_desired;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
786
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
787 if (should_quote)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
788 #if defined (SHELL)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
789 should_quote = should_quote && (!qc || !*qc || *qc == '"' || *qc == '\'');
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
790 #else /* !SHELL */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
791 should_quote = should_quote && (!qc || !*qc);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
792 #endif /* !SHELL */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
793
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
794 if (should_quote)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
795 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
796 /* If there is a single match, see if we need to quote it.
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
797 This also checks whether the common prefix of several
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
798 matches needs to be quoted. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
799 should_quote = rl_strpbrk (match, rl_filename_quote_characters) != 0;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
800
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
801 do_replace = should_quote ? mtype : NO_MATCH;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
802 /* Quote the replacement, since we found an embedded
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
803 word break character in a potential match. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
804 if (do_replace != NO_MATCH && rl_filename_quoting_function)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
805 replacement = (*rl_filename_quoting_function) (match, do_replace, qc);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
806 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
807 return (replacement);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
808 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
809
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
810 static void
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
811 insert_match (match, start, mtype, qc)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
812 char *match;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
813 int start, mtype;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
814 char *qc;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
815 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
816 char *replacement;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
817 char oqc;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
818
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
819 oqc = qc ? *qc : '\0';
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
820 replacement = make_quoted_replacement (match, mtype, qc);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
821
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
822 /* Now insert the match. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
823 if (replacement)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
824 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
825 /* Don't double an opening quote character. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
826 if (qc && *qc && start && rl_line_buffer[start - 1] == *qc &&
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
827 replacement[0] == *qc)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
828 start--;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
829 /* If make_quoted_replacement changed the quoting character, remove
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
830 the opening quote and insert the (fully-quoted) replacement. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
831 else if (qc && (*qc != oqc) && start && rl_line_buffer[start - 1] == oqc &&
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
832 replacement[0] != oqc)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
833 start--;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
834 insert_text (replacement, start, rl_point - 1);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
835 if (replacement != match)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
836 free (replacement);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
837 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
838 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
839
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
840 /* Append any necessary closing quote and a separator character to the
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
841 just-inserted match. If the user has specified that directories
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
842 should be marked by a trailing `/', append one of those instead. The
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
843 default trailing character */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
844 static void
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
845 append_to_match (text, delimiter, quote_char)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
846 char *text;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
847 int delimiter, quote_char;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
848 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
849 char temp_string[4], *filename;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
850 int temp_string_index;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
851 struct stat finfo;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
852
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
853 temp_string_index = 0;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
854 if (quote_char && rl_point && rl_line_buffer[rl_point - 1] != quote_char)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
855 temp_string[temp_string_index++] = quote_char;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
856
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
857 if (delimiter)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
858 temp_string[temp_string_index++] = delimiter;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
859 else if (rl_completion_append_character)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
860 temp_string[temp_string_index++] = rl_completion_append_character;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
861
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
862 temp_string[temp_string_index++] = '\0';
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
863
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
864 if (rl_filename_completion_desired)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
865 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
866 filename = tilde_expand (text);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
867 if (stat (filename, &finfo) == 0 && S_ISDIR (finfo.st_mode))
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
868 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
869 if (_rl_complete_mark_directories && rl_line_buffer[rl_point] != '/')
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
870 rl_insert_text ("/");
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
871 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
872 else
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
873 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
874 if (rl_point == rl_end)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
875 rl_insert_text (temp_string);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
876 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
877 free (filename);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
878 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
879 else
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
880 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
881 if (rl_point == rl_end)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
882 rl_insert_text (temp_string);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
883 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
884 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
885
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
886 static void
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
887 insert_all_matches (matches, point, qc)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
888 char **matches;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
889 int point;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
890 char *qc;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
891 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
892 int i;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
893 char *rp;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
894
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
895 rl_begin_undo_group ();
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
896 /* remove any opening quote character; make_quoted_replacement will add
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
897 it back. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
898 if (qc && *qc && point && rl_line_buffer[point - 1] == *qc)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
899 point--;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
900 rl_delete_text (point, rl_point);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
901 rl_point = point;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
902
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
903 if (matches[1])
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
904 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
905 for (i = 1; matches[i]; i++)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
906 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
907 rp = make_quoted_replacement (matches[i], SINGLE_MATCH, qc);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
908 rl_insert_text (rp);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
909 rl_insert_text (" ");
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
910 if (rp != matches[i])
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
911 free (rp);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
912 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
913 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
914 else
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
915 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
916 rp = make_quoted_replacement (matches[0], SINGLE_MATCH, qc);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
917 rl_insert_text (rp);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
918 rl_insert_text (" ");
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
919 if (rp != matches[0])
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
920 free (rp);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
921 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
922 rl_end_undo_group ();
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
923 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
924
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
925 /* Complete the word at or before point.
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
926 WHAT_TO_DO says what to do with the completion.
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
927 `?' means list the possible completions.
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
928 TAB means do standard completion.
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
929 `*' means insert all of the possible completions.
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
930 `!' means to do standard completion, and list all possible completions if
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
931 there is more than one. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
932 int
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
933 rl_complete_internal (what_to_do)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
934 int what_to_do;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
935 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
936 char **matches, **temp_matches;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
937 Function *our_func;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
938 int start, end, delimiter, found_quote, nmatch, i;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
939 char *text, *saved_line_buffer, *t;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
940 char quote_char;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
941
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
942 saved_line_buffer = rl_line_buffer ? savestring (rl_line_buffer) : (char *)NULL;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
943
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
944 our_func = rl_completion_entry_function
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
945 ? rl_completion_entry_function
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
946 : (Function *)filename_completion_function;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
947
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
948 /* Only the completion entry function can change these. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
949 rl_filename_completion_desired = 0;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
950 rl_filename_quoting_desired = 1;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
951
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
952 rl_completion_type = what_to_do;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
953
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
954 /* We now look backwards for the start of a filename/variable word. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
955 end = rl_point;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
956
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
957 found_quote = delimiter = 0;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
958 quote_char = '\0';
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
959
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
960 if (rl_point)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
961 /* This (possibly) changes rl_point. If it returns a non-zero char,
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
962 we know we have an open quote. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
963 quote_char = find_completion_word (&found_quote, &delimiter);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
964
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
965 start = rl_point;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
966 rl_point = end;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
967
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
968 text = rl_copy_text (start, end);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
969 matches = gen_completion_matches (text, start, end, our_func, found_quote, quote_char);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
970
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
971 if (matches == 0)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
972 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
973 ding ();
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
974 FREE (saved_line_buffer);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
975 free (text);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
976 return 0;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
977 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
978
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
979 /* It seems to me that in all the cases we handle we would like
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
980 to ignore duplicate possiblilities. Scan for the text to
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
981 insert being identical to the other completions. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
982 if (rl_ignore_completion_duplicates)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
983 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
984 temp_matches = remove_duplicate_matches (matches);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
985 free (matches);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
986 matches = temp_matches;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
987 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
988
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
989 /* If we are matching filenames, then here is our chance to
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
990 do clever processing by re-examining the list. Call the
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
991 ignore function with the array as a parameter. It can
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
992 munge the array, deleting matches as it desires. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
993 if (rl_ignore_some_completions_function &&
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
994 our_func == (Function *)filename_completion_function)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
995 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
996 for (nmatch = 1; matches[nmatch]; nmatch++)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
997 ;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
998 (void)(*rl_ignore_some_completions_function) (matches);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
999 if (matches == 0 || matches[0] == 0)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1000 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1001 FREE (matches);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1002 ding ();
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1003 FREE (saved_line_buffer);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1004 FREE (text);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1005 return 0;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1006 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1007 else
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1008 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1009 /* If we removed some matches, recompute the common prefix. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1010 for (i = 1; matches[i]; i++)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1011 ;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1012 if (i > 1 && i < nmatch)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1013 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1014 t = matches[0];
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1015 compute_lcd_of_matches (matches, i - 1, text);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1016 FREE (t);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1017 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1018 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1019 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1020 free (text);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1021
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1022 switch (what_to_do)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1023 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1024 case TAB:
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1025 case '!':
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1026 /* Insert the first match with proper quoting. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1027 if (*matches[0])
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1028 insert_match (matches[0], start, matches[1] ? MULT_MATCH : SINGLE_MATCH, &quote_char);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1029
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1030 /* If there are more matches, ring the bell to indicate.
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1031 If we are in vi mode, Posix.2 says to not ring the bell.
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1032 If the `show-all-if-ambiguous' variable is set, display
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1033 all the matches immediately. Otherwise, if this was the
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1034 only match, and we are hacking files, check the file to
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1035 see if it was a directory. If so, and the `mark-directories'
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1036 variable is set, add a '/' to the name. If not, and we
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1037 are at the end of the line, then add a space. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1038 if (matches[1])
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1039 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1040 if (what_to_do == '!')
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1041 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1042 display_matches (matches);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1043 break;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1044 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1045 else if (rl_editing_mode != vi_mode)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1046 ding (); /* There are other matches remaining. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1047 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1048 else
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1049 append_to_match (matches[0], delimiter, quote_char);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1050
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1051 break;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1052
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1053 case '*':
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1054 insert_all_matches (matches, start, &quote_char);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1055 break;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1056
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1057 case '?':
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1058 display_matches (matches);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1059 break;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1060
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1061 default:
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1062 fprintf (stderr, "\r\nreadline: bad value %d for what_to_do in rl_complete\n", what_to_do);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1063 ding ();
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1064 FREE (saved_line_buffer);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1065 return 1;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1066 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1067
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1068 for (i = 0; matches[i]; i++)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1069 free (matches[i]);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1070 free (matches);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1071
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1072 /* Check to see if the line has changed through all of this manipulation. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1073 if (saved_line_buffer)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1074 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1075 completion_changed_buffer = strcmp (rl_line_buffer, saved_line_buffer) != 0;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1076 free (saved_line_buffer);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1077 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1078
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1079 return 0;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1080 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1081
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1082 #if defined (VISIBLE_STATS)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1083 /* Return the character which best describes FILENAME.
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1084 `@' for symbolic links
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1085 `/' for directories
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1086 `*' for executables
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1087 `=' for sockets
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1088 `|' for FIFOs
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1089 `%' for character special devices
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1090 `#' for block special devices */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1091 static int
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1092 stat_char (filename)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1093 char *filename;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1094 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1095 struct stat finfo;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1096 int character, r;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1097
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1098 #if defined (HAVE_LSTAT) && defined (S_ISLNK)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1099 r = lstat (filename, &finfo);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1100 #else
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1101 r = stat (filename, &finfo);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1102 #endif
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1103
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1104 if (r == -1)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1105 return (0);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1106
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1107 character = 0;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1108 if (S_ISDIR (finfo.st_mode))
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1109 character = '/';
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1110 #if defined (S_ISCHR)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1111 else if (S_ISCHR (finfo.st_mode))
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1112 character = '%';
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1113 #endif /* S_ISCHR */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1114 #if defined (S_ISBLK)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1115 else if (S_ISBLK (finfo.st_mode))
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1116 character = '#';
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1117 #endif /* S_ISBLK */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1118 #if defined (S_ISLNK)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1119 else if (S_ISLNK (finfo.st_mode))
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1120 character = '@';
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1121 #endif /* S_ISLNK */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1122 #if defined (S_ISSOCK)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1123 else if (S_ISSOCK (finfo.st_mode))
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1124 character = '=';
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1125 #endif /* S_ISSOCK */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1126 #if defined (S_ISFIFO)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1127 else if (S_ISFIFO (finfo.st_mode))
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1128 character = '|';
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1129 #endif
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1130 else if (S_ISREG (finfo.st_mode))
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1131 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1132 if (access (filename, X_OK) == 0)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1133 character = '*';
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1134 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1135 return (character);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1136 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1137 #endif /* VISIBLE_STATS */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1138
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1139 /* A completion function for usernames.
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1140 TEXT contains a partial username preceded by a random
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1141 character (usually `~'). */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1142 char *
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1143 username_completion_function (text, state)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1144 int state;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1145 char *text;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1146 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1147 #if defined (__GO32__) || defined (__WIN32__)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1148 return (char *)NULL;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1149 #else /* !__GO32__ */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1150 static char *username = (char *)NULL;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1151 static struct passwd *entry;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1152 static int namelen, first_char, first_char_loc;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1153 char *value;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1154
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1155 if (state == 0)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1156 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1157 FREE (username);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1158
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1159 first_char = *text;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1160 first_char_loc = first_char == '~';
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1161
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1162 username = savestring (&text[first_char_loc]);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1163 namelen = strlen (username);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1164 setpwent ();
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1165 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1166
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1167 while (entry = getpwent ())
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1168 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1169 /* Null usernames should result in all users as possible completions. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1170 if (namelen == 0 || (STREQN (username, entry->pw_name, namelen)))
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1171 break;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1172 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1173
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1174 if (entry == 0)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1175 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1176 endpwent ();
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1177 return ((char *)NULL);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1178 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1179 else
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1180 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1181 value = xmalloc (2 + strlen (entry->pw_name));
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1182
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1183 *value = *text;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1184
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1185 strcpy (value + first_char_loc, entry->pw_name);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1186
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1187 if (first_char == '~')
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1188 rl_filename_completion_desired = 1;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1189
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1190 return (value);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1191 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1192 #endif /* !__GO32__ */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1193 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1194
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1195 /* **************************************************************** */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1196 /* */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1197 /* Completion */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1198 /* */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1199 /* **************************************************************** */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1200
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1201 /* Non-zero means that case is not significant in completion. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1202 int completion_case_fold = 0;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1203
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1204 /* Find the common prefix of the list of matches, and put it into
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1205 matches[0]. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1206 static int
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1207 compute_lcd_of_matches (match_list, matches, text)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1208 char **match_list;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1209 int matches;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1210 char *text;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1211 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1212 register int i, c1, c2, si;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1213 int low; /* Count of max-matched characters. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1214
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1215 /* If only one match, just use that. Otherwise, compare each
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1216 member of the list with the next, finding out where they
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1217 stop matching. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1218 if (matches == 1)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1219 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1220 match_list[0] = match_list[1];
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1221 match_list[1] = (char *)NULL;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1222 return 1;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1223 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1224
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1225 for (i = 1, low = 100000; i < matches; i++)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1226 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1227 if (completion_case_fold)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1228 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1229 for (si = 0;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1230 (c1 = _rl_to_lower(match_list[i][si])) &&
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1231 (c2 = _rl_to_lower(match_list[i + 1][si]));
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1232 si++)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1233 if (c1 != c2)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1234 break;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1235 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1236 else
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1237 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1238 for (si = 0;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1239 (c1 = match_list[i][si]) &&
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1240 (c2 = match_list[i + 1][si]);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1241 si++)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1242 if (c1 != c2)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1243 break;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1244 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1245
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1246 if (low > si)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1247 low = si;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1248 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1249
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1250 /* If there were multiple matches, but none matched up to even the
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1251 first character, and the user typed something, use that as the
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1252 value of matches[0]. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1253 if (low == 0 && text && *text)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1254 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1255 match_list[0] = xmalloc (strlen (text) + 1);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1256 strcpy (match_list[0], text);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1257 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1258 else
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1259 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1260 match_list[0] = xmalloc (low + 1);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1261 strncpy (match_list[0], match_list[1], low);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1262 match_list[0][low] = '\0';
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1263 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1264
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1265 return matches;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1266 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1267
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1268 /* Return an array of (char *) which is a list of completions for TEXT.
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1269 If there are no completions, return a NULL pointer.
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1270 The first entry in the returned array is the substitution for TEXT.
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1271 The remaining entries are the possible completions.
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1272 The array is terminated with a NULL pointer.
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1273
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1274 ENTRY_FUNCTION is a function of two args, and returns a (char *).
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1275 The first argument is TEXT.
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1276 The second is a state argument; it should be zero on the first call, and
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1277 non-zero on subsequent calls. It returns a NULL pointer to the caller
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1278 when there are no more matches.
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1279 */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1280 char **
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1281 completion_matches (text, entry_function)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1282 char *text;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1283 CPFunction *entry_function;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1284 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1285 /* Number of slots in match_list. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1286 int match_list_size;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1287
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1288 /* The list of matches. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1289 char **match_list;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1290
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1291 /* Number of matches actually found. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1292 int matches;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1293
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1294 /* Temporary string binder. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1295 char *string;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1296
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1297 matches = 0;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1298 match_list_size = 10;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1299 match_list = (char **)xmalloc ((match_list_size + 1) * sizeof (char *));
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1300 match_list[1] = (char *)NULL;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1301
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1302 while (string = (*entry_function) (text, matches))
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1303 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1304 if (matches + 1 == match_list_size)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1305 match_list = (char **)xrealloc
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1306 (match_list, ((match_list_size += 10) + 1) * sizeof (char *));
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1307
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1308 match_list[++matches] = string;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1309 match_list[matches + 1] = (char *)NULL;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1310 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1311
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1312 /* If there were any matches, then look through them finding out the
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1313 lowest common denominator. That then becomes match_list[0]. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1314 if (matches)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1315 compute_lcd_of_matches (match_list, matches, text);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1316 else /* There were no matches. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1317 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1318 free (match_list);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1319 match_list = (char **)NULL;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1320 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1321 return (match_list);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1322 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1323
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1324 /* Okay, now we write the entry_function for filename completion. In the
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1325 general case. Note that completion in the shell is a little different
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1326 because of all the pathnames that must be followed when looking up the
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1327 completion for a command. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1328 char *
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1329 filename_completion_function (text, state)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1330 int state;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1331 char *text;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1332 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1333 static DIR *directory = (DIR *)NULL;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1334 static char *filename = (char *)NULL;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1335 static char *dirname = (char *)NULL;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1336 static char *users_dirname = (char *)NULL;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1337 static int filename_len;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1338 char *temp;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1339 int dirlen;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1340 struct dirent *entry;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1341
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1342 /* If we don't have any state, then do some initialization. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1343 if (state == 0)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1344 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1345 /* If we were interrupted before closing the directory or reading
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1346 all of its contents, close it. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1347 if (directory)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1348 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1349 closedir (directory);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1350 directory = (DIR *)NULL;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1351 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1352 FREE (dirname);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1353 FREE (filename);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1354 FREE (users_dirname);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1355
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1356 filename = savestring (text);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1357 if (*text == 0)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1358 text = ".";
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1359 dirname = savestring (text);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1360
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1361 temp = strrchr (dirname, '/');
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1362
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1363 if (temp)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1364 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1365 strcpy (filename, ++temp);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1366 *temp = '\0';
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1367 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1368 else
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1369 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1370 dirname[0] = '.';
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1371 dirname[1] = '\0';
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1372 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1373
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1374 /* We aren't done yet. We also support the "~user" syntax. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1375
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1376 /* Save the version of the directory that the user typed. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1377 users_dirname = savestring (dirname);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1378
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1379 if (*dirname == '~')
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1380 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1381 temp = tilde_expand (dirname);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1382 free (dirname);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1383 dirname = temp;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1384 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1385
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1386 if (rl_directory_completion_hook && (*rl_directory_completion_hook) (&dirname))
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1387 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1388 free (users_dirname);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1389 users_dirname = savestring (dirname);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1390 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1391
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1392 directory = opendir (dirname);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1393 filename_len = strlen (filename);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1394
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1395 rl_filename_completion_desired = 1;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1396 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1397
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1398 /* At this point we should entertain the possibility of hacking wildcarded
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1399 filenames, like /usr/man/man<WILD>/te<TAB>. If the directory name
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1400 contains globbing characters, then build an array of directories, and
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1401 then map over that list while completing. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1402 /* *** UNIMPLEMENTED *** */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1403
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1404 /* Now that we have some state, we can read the directory. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1405
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1406 entry = (struct dirent *)NULL;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1407 while (directory && (entry = readdir (directory)))
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1408 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1409 /* Special case for no filename.
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1410 All entries except "." and ".." match. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1411 if (filename_len == 0)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1412 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1413 if (entry->d_name[0] != '.' ||
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1414 (entry->d_name[1] &&
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1415 (entry->d_name[1] != '.' || entry->d_name[2])))
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1416 break;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1417 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1418 else
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1419 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1420 /* Otherwise, if these match up to the length of filename, then
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1421 it is a match. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1422 if ((entry->d_name[0] == filename[0]) &&
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1423 (((int)D_NAMLEN (entry)) >= filename_len) &&
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1424 (strncmp (filename, entry->d_name, filename_len) == 0))
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1425 break;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1426 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1427 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1428
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1429 if (entry == 0)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1430 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1431 if (directory)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1432 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1433 closedir (directory);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1434 directory = (DIR *)NULL;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1435 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1436 if (dirname)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1437 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1438 free (dirname);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1439 dirname = (char *)NULL;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1440 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1441 if (filename)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1442 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1443 free (filename);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1444 filename = (char *)NULL;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1445 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1446 if (users_dirname)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1447 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1448 free (users_dirname);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1449 users_dirname = (char *)NULL;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1450 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1451
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1452 return (char *)NULL;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1453 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1454 else
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1455 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1456 /* dirname && (strcmp (dirname, ".") != 0) */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1457 if (dirname && (dirname[0] != '.' || dirname[1]))
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1458 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1459 if (rl_complete_with_tilde_expansion && *users_dirname == '~')
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1460 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1461 dirlen = strlen (dirname);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1462 temp = xmalloc (2 + dirlen + D_NAMLEN (entry));
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1463 strcpy (temp, dirname);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1464 /* Canonicalization cuts off any final slash present. We
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1465 may need to add it back. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1466 if (dirname[dirlen - 1] != '/')
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1467 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1468 temp[dirlen++] = '/';
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1469 temp[dirlen] = '\0';
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1470 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1471 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1472 else
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1473 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1474 dirlen = strlen (users_dirname);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1475 temp = xmalloc (1 + dirlen + D_NAMLEN (entry));
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1476 strcpy (temp, users_dirname);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1477 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1478
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1479 strcpy (temp + dirlen, entry->d_name); /* strcat (temp, entry->d_name); */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1480 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1481 else
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1482 temp = savestring (entry->d_name);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1483
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1484 return (temp);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1485 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1486 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1487
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1488 /* A function for simple tilde expansion. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1489 int
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1490 rl_tilde_expand (ignore, key)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1491 int ignore, key;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1492 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1493 register int start, end;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1494 char *homedir, *temp;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1495 int len;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1496
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1497 end = rl_point;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1498 start = end - 1;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1499
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1500 if (rl_point == rl_end && rl_line_buffer[rl_point] == '~')
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1501 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1502 homedir = tilde_expand ("~");
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1503 insert_text (homedir, start, end);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1504 return (0);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1505 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1506 else if (rl_line_buffer[start] != '~')
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1507 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1508 for (; !whitespace (rl_line_buffer[start]) && start >= 0; start--)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1509 ;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1510 start++;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1511 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1512
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1513 end = start;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1514 do
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1515 end++;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1516 while (whitespace (rl_line_buffer[end]) == 0 && end < rl_end);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1517
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1518 if (whitespace (rl_line_buffer[end]) || end >= rl_end)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1519 end--;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1520
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1521 /* If the first character of the current word is a tilde, perform
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1522 tilde expansion and insert the result. If not a tilde, do
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1523 nothing. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1524 if (rl_line_buffer[start] == '~')
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1525 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1526 len = end - start + 1;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1527 temp = xmalloc (len + 1);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1528 strncpy (temp, rl_line_buffer + start, len);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1529 temp[len] = '\0';
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1530 homedir = tilde_expand (temp);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1531 free (temp);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1532
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1533 insert_text (homedir, start, end);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1534 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1535
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1536 return (0);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1537 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1538
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1539 /* Find the first occurrence in STRING1 of any character from STRING2.
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1540 Return a pointer to the character in STRING1. */
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1541 static char *
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1542 rl_strpbrk (string1, string2)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1543 char *string1, *string2;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1544 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1545 register char *scan;
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1546
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1547 for (; *string1; string1++)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1548 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1549 for (scan = string2; *scan; scan++)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1550 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1551 if (*string1 == *scan)
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1552 {
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1553 return (string1);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1554 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1555 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1556 }
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1557 return ((char *)NULL);
9d4e3a9de17e [project @ 1997-05-22 20:58:07 by jwe]
jwe
parents:
diff changeset
1558 }