OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [branches/] [oc/] [gdb-5.0/] [readline/] [complete.c] - Blame information for rev 106

Go to most recent revision | Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.