xref: /dflybsd-src/contrib/gdb-7/readline/util.c (revision 16003dcfd2baa152f5dd24794ec9f36e139eaeb8)
1*6b445a62SJohn Marino /* util.c -- readline utility functions */
2*6b445a62SJohn Marino 
3*6b445a62SJohn Marino /* Copyright (C) 1987-2010 Free Software Foundation, Inc.
4*6b445a62SJohn Marino 
5*6b445a62SJohn Marino    This file is part of the GNU Readline Library (Readline), a library
6*6b445a62SJohn Marino    for reading lines of text with interactive input and history editing.
7*6b445a62SJohn Marino 
8*6b445a62SJohn Marino    Readline is free software: you can redistribute it and/or modify
9*6b445a62SJohn Marino    it under the terms of the GNU General Public License as published by
10*6b445a62SJohn Marino    the Free Software Foundation, either version 3 of the License, or
11*6b445a62SJohn Marino    (at your option) any later version.
12*6b445a62SJohn Marino 
13*6b445a62SJohn Marino    Readline is distributed in the hope that it will be useful,
14*6b445a62SJohn Marino    but WITHOUT ANY WARRANTY; without even the implied warranty of
15*6b445a62SJohn Marino    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16*6b445a62SJohn Marino    GNU General Public License for more details.
17*6b445a62SJohn Marino 
18*6b445a62SJohn Marino    You should have received a copy of the GNU General Public License
19*6b445a62SJohn Marino    along with Readline.  If not, see <http://www.gnu.org/licenses/>.
20*6b445a62SJohn Marino */
21*6b445a62SJohn Marino 
22*6b445a62SJohn Marino #define READLINE_LIBRARY
23*6b445a62SJohn Marino 
24*6b445a62SJohn Marino #if defined (HAVE_CONFIG_H)
25*6b445a62SJohn Marino #  include <config.h>
26*6b445a62SJohn Marino #endif
27*6b445a62SJohn Marino 
28*6b445a62SJohn Marino #include <sys/types.h>
29*6b445a62SJohn Marino #include <fcntl.h>
30*6b445a62SJohn Marino #include "posixjmp.h"
31*6b445a62SJohn Marino 
32*6b445a62SJohn Marino #if defined (HAVE_UNISTD_H)
33*6b445a62SJohn Marino #  include <unistd.h>           /* for _POSIX_VERSION */
34*6b445a62SJohn Marino #endif /* HAVE_UNISTD_H */
35*6b445a62SJohn Marino 
36*6b445a62SJohn Marino #if defined (HAVE_STDLIB_H)
37*6b445a62SJohn Marino #  include <stdlib.h>
38*6b445a62SJohn Marino #else
39*6b445a62SJohn Marino #  include "ansi_stdlib.h"
40*6b445a62SJohn Marino #endif /* HAVE_STDLIB_H */
41*6b445a62SJohn Marino 
42*6b445a62SJohn Marino #include <stdio.h>
43*6b445a62SJohn Marino #include <ctype.h>
44*6b445a62SJohn Marino 
45*6b445a62SJohn Marino /* System-specific feature definitions and include files. */
46*6b445a62SJohn Marino #include "rldefs.h"
47*6b445a62SJohn Marino #include "rlmbutil.h"
48*6b445a62SJohn Marino 
49*6b445a62SJohn Marino #if defined (TIOCSTAT_IN_SYS_IOCTL)
50*6b445a62SJohn Marino #  include <sys/ioctl.h>
51*6b445a62SJohn Marino #endif /* TIOCSTAT_IN_SYS_IOCTL */
52*6b445a62SJohn Marino 
53*6b445a62SJohn Marino /* Some standard library routines. */
54*6b445a62SJohn Marino #include "readline.h"
55*6b445a62SJohn Marino 
56*6b445a62SJohn Marino #include "rlprivate.h"
57*6b445a62SJohn Marino #include "xmalloc.h"
58*6b445a62SJohn Marino 
59*6b445a62SJohn Marino /* **************************************************************** */
60*6b445a62SJohn Marino /*								    */
61*6b445a62SJohn Marino /*			Utility Functions			    */
62*6b445a62SJohn Marino /*								    */
63*6b445a62SJohn Marino /* **************************************************************** */
64*6b445a62SJohn Marino 
65*6b445a62SJohn Marino /* Return 0 if C is not a member of the class of characters that belong
66*6b445a62SJohn Marino    in words, or 1 if it is. */
67*6b445a62SJohn Marino 
68*6b445a62SJohn Marino int _rl_allow_pathname_alphabetic_chars = 0;
69*6b445a62SJohn Marino static const char * const pathname_alphabetic_chars = "/-_=~.#$";
70*6b445a62SJohn Marino 
71*6b445a62SJohn Marino int
rl_alphabetic(c)72*6b445a62SJohn Marino rl_alphabetic (c)
73*6b445a62SJohn Marino      int c;
74*6b445a62SJohn Marino {
75*6b445a62SJohn Marino   if (ALPHABETIC (c))
76*6b445a62SJohn Marino     return (1);
77*6b445a62SJohn Marino 
78*6b445a62SJohn Marino   return (_rl_allow_pathname_alphabetic_chars &&
79*6b445a62SJohn Marino 	    strchr (pathname_alphabetic_chars, c) != NULL);
80*6b445a62SJohn Marino }
81*6b445a62SJohn Marino 
82*6b445a62SJohn Marino #if defined (HANDLE_MULTIBYTE)
83*6b445a62SJohn Marino int
_rl_walphabetic(wchar_t wc)84*6b445a62SJohn Marino _rl_walphabetic (wchar_t wc)
85*6b445a62SJohn Marino {
86*6b445a62SJohn Marino   int c;
87*6b445a62SJohn Marino 
88*6b445a62SJohn Marino   if (iswalnum (wc))
89*6b445a62SJohn Marino     return (1);
90*6b445a62SJohn Marino 
91*6b445a62SJohn Marino   c = wc & 0177;
92*6b445a62SJohn Marino   return (_rl_allow_pathname_alphabetic_chars &&
93*6b445a62SJohn Marino 	    strchr (pathname_alphabetic_chars, c) != NULL);
94*6b445a62SJohn Marino }
95*6b445a62SJohn Marino #endif
96*6b445a62SJohn Marino 
97*6b445a62SJohn Marino /* How to abort things. */
98*6b445a62SJohn Marino int
_rl_abort_internal()99*6b445a62SJohn Marino _rl_abort_internal ()
100*6b445a62SJohn Marino {
101*6b445a62SJohn Marino   rl_ding ();
102*6b445a62SJohn Marino   rl_clear_message ();
103*6b445a62SJohn Marino   _rl_reset_argument ();
104*6b445a62SJohn Marino   rl_clear_pending_input ();
105*6b445a62SJohn Marino 
106*6b445a62SJohn Marino   RL_UNSETSTATE (RL_STATE_MACRODEF);
107*6b445a62SJohn Marino   while (rl_executing_macro)
108*6b445a62SJohn Marino     _rl_pop_executing_macro ();
109*6b445a62SJohn Marino 
110*6b445a62SJohn Marino   rl_last_func = (rl_command_func_t *)NULL;
111*6b445a62SJohn Marino   longjmp (_rl_top_level, 1);
112*6b445a62SJohn Marino   return (0);
113*6b445a62SJohn Marino }
114*6b445a62SJohn Marino 
115*6b445a62SJohn Marino int
rl_abort(count,key)116*6b445a62SJohn Marino rl_abort (count, key)
117*6b445a62SJohn Marino      int count, key;
118*6b445a62SJohn Marino {
119*6b445a62SJohn Marino   return (_rl_abort_internal ());
120*6b445a62SJohn Marino }
121*6b445a62SJohn Marino 
122*6b445a62SJohn Marino int
_rl_null_function(count,key)123*6b445a62SJohn Marino _rl_null_function (count, key)
124*6b445a62SJohn Marino      int count, key;
125*6b445a62SJohn Marino {
126*6b445a62SJohn Marino   return 0;
127*6b445a62SJohn Marino }
128*6b445a62SJohn Marino 
129*6b445a62SJohn Marino int
rl_tty_status(count,key)130*6b445a62SJohn Marino rl_tty_status (count, key)
131*6b445a62SJohn Marino      int count, key;
132*6b445a62SJohn Marino {
133*6b445a62SJohn Marino #if defined (TIOCSTAT)
134*6b445a62SJohn Marino   ioctl (1, TIOCSTAT, (char *)0);
135*6b445a62SJohn Marino   rl_refresh_line (count, key);
136*6b445a62SJohn Marino #else
137*6b445a62SJohn Marino   rl_ding ();
138*6b445a62SJohn Marino #endif
139*6b445a62SJohn Marino   return 0;
140*6b445a62SJohn Marino }
141*6b445a62SJohn Marino 
142*6b445a62SJohn Marino /* Return a copy of the string between FROM and TO.
143*6b445a62SJohn Marino    FROM is inclusive, TO is not. */
144*6b445a62SJohn Marino char *
rl_copy_text(from,to)145*6b445a62SJohn Marino rl_copy_text (from, to)
146*6b445a62SJohn Marino      int from, to;
147*6b445a62SJohn Marino {
148*6b445a62SJohn Marino   register int length;
149*6b445a62SJohn Marino   char *copy;
150*6b445a62SJohn Marino 
151*6b445a62SJohn Marino   /* Fix it if the caller is confused. */
152*6b445a62SJohn Marino   if (from > to)
153*6b445a62SJohn Marino     SWAP (from, to);
154*6b445a62SJohn Marino 
155*6b445a62SJohn Marino   length = to - from;
156*6b445a62SJohn Marino   copy = (char *)xmalloc (1 + length);
157*6b445a62SJohn Marino   strncpy (copy, rl_line_buffer + from, length);
158*6b445a62SJohn Marino   copy[length] = '\0';
159*6b445a62SJohn Marino   return (copy);
160*6b445a62SJohn Marino }
161*6b445a62SJohn Marino 
162*6b445a62SJohn Marino /* Increase the size of RL_LINE_BUFFER until it has enough space to hold
163*6b445a62SJohn Marino    LEN characters. */
164*6b445a62SJohn Marino void
rl_extend_line_buffer(len)165*6b445a62SJohn Marino rl_extend_line_buffer (len)
166*6b445a62SJohn Marino      int len;
167*6b445a62SJohn Marino {
168*6b445a62SJohn Marino   while (len >= rl_line_buffer_len)
169*6b445a62SJohn Marino     {
170*6b445a62SJohn Marino       rl_line_buffer_len += DEFAULT_BUFFER_SIZE;
171*6b445a62SJohn Marino       rl_line_buffer = (char *)xrealloc (rl_line_buffer, rl_line_buffer_len);
172*6b445a62SJohn Marino     }
173*6b445a62SJohn Marino 
174*6b445a62SJohn Marino   _rl_set_the_line ();
175*6b445a62SJohn Marino }
176*6b445a62SJohn Marino 
177*6b445a62SJohn Marino 
178*6b445a62SJohn Marino /* A function for simple tilde expansion. */
179*6b445a62SJohn Marino int
rl_tilde_expand(ignore,key)180*6b445a62SJohn Marino rl_tilde_expand (ignore, key)
181*6b445a62SJohn Marino      int ignore, key;
182*6b445a62SJohn Marino {
183*6b445a62SJohn Marino   register int start, end;
184*6b445a62SJohn Marino   char *homedir, *temp;
185*6b445a62SJohn Marino   int len;
186*6b445a62SJohn Marino 
187*6b445a62SJohn Marino   end = rl_point;
188*6b445a62SJohn Marino   start = end - 1;
189*6b445a62SJohn Marino 
190*6b445a62SJohn Marino   if (rl_point == rl_end && rl_line_buffer[rl_point] == '~')
191*6b445a62SJohn Marino     {
192*6b445a62SJohn Marino       homedir = tilde_expand ("~");
193*6b445a62SJohn Marino       _rl_replace_text (homedir, start, end);
194*6b445a62SJohn Marino       xfree (homedir);
195*6b445a62SJohn Marino       return (0);
196*6b445a62SJohn Marino     }
197*6b445a62SJohn Marino   else if (rl_line_buffer[start] != '~')
198*6b445a62SJohn Marino     {
199*6b445a62SJohn Marino       for (; !whitespace (rl_line_buffer[start]) && start >= 0; start--)
200*6b445a62SJohn Marino         ;
201*6b445a62SJohn Marino       start++;
202*6b445a62SJohn Marino     }
203*6b445a62SJohn Marino 
204*6b445a62SJohn Marino   end = start;
205*6b445a62SJohn Marino   do
206*6b445a62SJohn Marino     end++;
207*6b445a62SJohn Marino   while (whitespace (rl_line_buffer[end]) == 0 && end < rl_end);
208*6b445a62SJohn Marino 
209*6b445a62SJohn Marino   if (whitespace (rl_line_buffer[end]) || end >= rl_end)
210*6b445a62SJohn Marino     end--;
211*6b445a62SJohn Marino 
212*6b445a62SJohn Marino   /* If the first character of the current word is a tilde, perform
213*6b445a62SJohn Marino      tilde expansion and insert the result.  If not a tilde, do
214*6b445a62SJohn Marino      nothing. */
215*6b445a62SJohn Marino   if (rl_line_buffer[start] == '~')
216*6b445a62SJohn Marino     {
217*6b445a62SJohn Marino       len = end - start + 1;
218*6b445a62SJohn Marino       temp = (char *)xmalloc (len + 1);
219*6b445a62SJohn Marino       strncpy (temp, rl_line_buffer + start, len);
220*6b445a62SJohn Marino       temp[len] = '\0';
221*6b445a62SJohn Marino       homedir = tilde_expand (temp);
222*6b445a62SJohn Marino       xfree (temp);
223*6b445a62SJohn Marino 
224*6b445a62SJohn Marino       _rl_replace_text (homedir, start, end);
225*6b445a62SJohn Marino       xfree (homedir);
226*6b445a62SJohn Marino     }
227*6b445a62SJohn Marino 
228*6b445a62SJohn Marino   return (0);
229*6b445a62SJohn Marino }
230*6b445a62SJohn Marino 
231*6b445a62SJohn Marino #if defined (USE_VARARGS)
232*6b445a62SJohn Marino void
233*6b445a62SJohn Marino #if defined (PREFER_STDARG)
_rl_ttymsg(const char * format,...)234*6b445a62SJohn Marino _rl_ttymsg (const char *format, ...)
235*6b445a62SJohn Marino #else
236*6b445a62SJohn Marino _rl_ttymsg (va_alist)
237*6b445a62SJohn Marino      va_dcl
238*6b445a62SJohn Marino #endif
239*6b445a62SJohn Marino {
240*6b445a62SJohn Marino   va_list args;
241*6b445a62SJohn Marino #if defined (PREFER_VARARGS)
242*6b445a62SJohn Marino   char *format;
243*6b445a62SJohn Marino #endif
244*6b445a62SJohn Marino 
245*6b445a62SJohn Marino #if defined (PREFER_STDARG)
246*6b445a62SJohn Marino   va_start (args, format);
247*6b445a62SJohn Marino #else
248*6b445a62SJohn Marino   va_start (args);
249*6b445a62SJohn Marino   format = va_arg (args, char *);
250*6b445a62SJohn Marino #endif
251*6b445a62SJohn Marino 
252*6b445a62SJohn Marino   fprintf (stderr, "readline: ");
253*6b445a62SJohn Marino   vfprintf (stderr, format, args);
254*6b445a62SJohn Marino   fprintf (stderr, "\n");
255*6b445a62SJohn Marino   fflush (stderr);
256*6b445a62SJohn Marino 
257*6b445a62SJohn Marino   va_end (args);
258*6b445a62SJohn Marino 
259*6b445a62SJohn Marino   rl_forced_update_display ();
260*6b445a62SJohn Marino }
261*6b445a62SJohn Marino 
262*6b445a62SJohn Marino void
263*6b445a62SJohn Marino #if defined (PREFER_STDARG)
_rl_errmsg(const char * format,...)264*6b445a62SJohn Marino _rl_errmsg (const char *format, ...)
265*6b445a62SJohn Marino #else
266*6b445a62SJohn Marino _rl_errmsg (va_alist)
267*6b445a62SJohn Marino      va_dcl
268*6b445a62SJohn Marino #endif
269*6b445a62SJohn Marino {
270*6b445a62SJohn Marino   va_list args;
271*6b445a62SJohn Marino #if defined (PREFER_VARARGS)
272*6b445a62SJohn Marino   char *format;
273*6b445a62SJohn Marino #endif
274*6b445a62SJohn Marino 
275*6b445a62SJohn Marino #if defined (PREFER_STDARG)
276*6b445a62SJohn Marino   va_start (args, format);
277*6b445a62SJohn Marino #else
278*6b445a62SJohn Marino   va_start (args);
279*6b445a62SJohn Marino   format = va_arg (args, char *);
280*6b445a62SJohn Marino #endif
281*6b445a62SJohn Marino 
282*6b445a62SJohn Marino   fprintf (stderr, "readline: ");
283*6b445a62SJohn Marino   vfprintf (stderr, format, args);
284*6b445a62SJohn Marino   fprintf (stderr, "\n");
285*6b445a62SJohn Marino   fflush (stderr);
286*6b445a62SJohn Marino 
287*6b445a62SJohn Marino   va_end (args);
288*6b445a62SJohn Marino }
289*6b445a62SJohn Marino 
290*6b445a62SJohn Marino #else /* !USE_VARARGS */
291*6b445a62SJohn Marino void
_rl_ttymsg(format,arg1,arg2)292*6b445a62SJohn Marino _rl_ttymsg (format, arg1, arg2)
293*6b445a62SJohn Marino      char *format;
294*6b445a62SJohn Marino {
295*6b445a62SJohn Marino   fprintf (stderr, "readline: ");
296*6b445a62SJohn Marino   fprintf (stderr, format, arg1, arg2);
297*6b445a62SJohn Marino   fprintf (stderr, "\n");
298*6b445a62SJohn Marino 
299*6b445a62SJohn Marino   rl_forced_update_display ();
300*6b445a62SJohn Marino }
301*6b445a62SJohn Marino 
302*6b445a62SJohn Marino void
_rl_errmsg(format,arg1,arg2)303*6b445a62SJohn Marino _rl_errmsg (format, arg1, arg2)
304*6b445a62SJohn Marino      char *format;
305*6b445a62SJohn Marino {
306*6b445a62SJohn Marino   fprintf (stderr, "readline: ");
307*6b445a62SJohn Marino   fprintf (stderr, format, arg1, arg2);
308*6b445a62SJohn Marino   fprintf (stderr, "\n");
309*6b445a62SJohn Marino }
310*6b445a62SJohn Marino #endif /* !USE_VARARGS */
311*6b445a62SJohn Marino 
312*6b445a62SJohn Marino /* **************************************************************** */
313*6b445a62SJohn Marino /*								    */
314*6b445a62SJohn Marino /*			String Utility Functions		    */
315*6b445a62SJohn Marino /*								    */
316*6b445a62SJohn Marino /* **************************************************************** */
317*6b445a62SJohn Marino 
318*6b445a62SJohn Marino /* Determine if s2 occurs in s1.  If so, return a pointer to the
319*6b445a62SJohn Marino    match in s1.  The compare is case insensitive. */
320*6b445a62SJohn Marino char *
_rl_strindex(s1,s2)321*6b445a62SJohn Marino _rl_strindex (s1, s2)
322*6b445a62SJohn Marino      register const char *s1, *s2;
323*6b445a62SJohn Marino {
324*6b445a62SJohn Marino   register int i, l, len;
325*6b445a62SJohn Marino 
326*6b445a62SJohn Marino   for (i = 0, l = strlen (s2), len = strlen (s1); (len - i) >= l; i++)
327*6b445a62SJohn Marino     if (_rl_strnicmp (s1 + i, s2, l) == 0)
328*6b445a62SJohn Marino       return ((char *) (s1 + i));
329*6b445a62SJohn Marino   return ((char *)NULL);
330*6b445a62SJohn Marino }
331*6b445a62SJohn Marino 
332*6b445a62SJohn Marino #ifndef HAVE_STRPBRK
333*6b445a62SJohn Marino /* Find the first occurrence in STRING1 of any character from STRING2.
334*6b445a62SJohn Marino    Return a pointer to the character in STRING1. */
335*6b445a62SJohn Marino char *
_rl_strpbrk(string1,string2)336*6b445a62SJohn Marino _rl_strpbrk (string1, string2)
337*6b445a62SJohn Marino      const char *string1, *string2;
338*6b445a62SJohn Marino {
339*6b445a62SJohn Marino   register const char *scan;
340*6b445a62SJohn Marino #if defined (HANDLE_MULTIBYTE)
341*6b445a62SJohn Marino   mbstate_t ps;
342*6b445a62SJohn Marino   register int i, v;
343*6b445a62SJohn Marino 
344*6b445a62SJohn Marino   memset (&ps, 0, sizeof (mbstate_t));
345*6b445a62SJohn Marino #endif
346*6b445a62SJohn Marino 
347*6b445a62SJohn Marino   for (; *string1; string1++)
348*6b445a62SJohn Marino     {
349*6b445a62SJohn Marino       for (scan = string2; *scan; scan++)
350*6b445a62SJohn Marino 	{
351*6b445a62SJohn Marino 	  if (*string1 == *scan)
352*6b445a62SJohn Marino 	    return ((char *)string1);
353*6b445a62SJohn Marino 	}
354*6b445a62SJohn Marino #if defined (HANDLE_MULTIBYTE)
355*6b445a62SJohn Marino       if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
356*6b445a62SJohn Marino 	{
357*6b445a62SJohn Marino 	  v = _rl_get_char_len (string1, &ps);
358*6b445a62SJohn Marino 	  if (v > 1)
359*6b445a62SJohn Marino 	    string1 += v - 1;	/* -1 to account for auto-increment in loop */
360*6b445a62SJohn Marino 	}
361*6b445a62SJohn Marino #endif
362*6b445a62SJohn Marino     }
363*6b445a62SJohn Marino   return ((char *)NULL);
364*6b445a62SJohn Marino }
365*6b445a62SJohn Marino #endif
366*6b445a62SJohn Marino 
367*6b445a62SJohn Marino #if !defined (HAVE_STRCASECMP)
368*6b445a62SJohn Marino /* Compare at most COUNT characters from string1 to string2.  Case
369*6b445a62SJohn Marino    doesn't matter (strncasecmp). */
370*6b445a62SJohn Marino int
_rl_strnicmp(string1,string2,count)371*6b445a62SJohn Marino _rl_strnicmp (string1, string2, count)
372*6b445a62SJohn Marino      char *string1, *string2;
373*6b445a62SJohn Marino      int count;
374*6b445a62SJohn Marino {
375*6b445a62SJohn Marino   register char *s1, *s2;
376*6b445a62SJohn Marino   int d;
377*6b445a62SJohn Marino 
378*6b445a62SJohn Marino   if (count <= 0 || (string1 == string2))
379*6b445a62SJohn Marino     return 0;
380*6b445a62SJohn Marino 
381*6b445a62SJohn Marino   s1 = string1;
382*6b445a62SJohn Marino   s2 = string2;
383*6b445a62SJohn Marino   do
384*6b445a62SJohn Marino     {
385*6b445a62SJohn Marino       d = _rl_to_lower (*s1) - _rl_to_lower (*s2);	/* XXX - cast to unsigned char? */
386*6b445a62SJohn Marino       if (d != 0)
387*6b445a62SJohn Marino 	return d;
388*6b445a62SJohn Marino       if (*s1++ == '\0')
389*6b445a62SJohn Marino         break;
390*6b445a62SJohn Marino       s2++;
391*6b445a62SJohn Marino     }
392*6b445a62SJohn Marino   while (--count != 0)
393*6b445a62SJohn Marino 
394*6b445a62SJohn Marino   return (0);
395*6b445a62SJohn Marino }
396*6b445a62SJohn Marino 
397*6b445a62SJohn Marino /* strcmp (), but caseless (strcasecmp). */
398*6b445a62SJohn Marino int
_rl_stricmp(string1,string2)399*6b445a62SJohn Marino _rl_stricmp (string1, string2)
400*6b445a62SJohn Marino      char *string1, *string2;
401*6b445a62SJohn Marino {
402*6b445a62SJohn Marino   register char *s1, *s2;
403*6b445a62SJohn Marino   int d;
404*6b445a62SJohn Marino 
405*6b445a62SJohn Marino   s1 = string1;
406*6b445a62SJohn Marino   s2 = string2;
407*6b445a62SJohn Marino 
408*6b445a62SJohn Marino   if (s1 == s2)
409*6b445a62SJohn Marino     return 0;
410*6b445a62SJohn Marino 
411*6b445a62SJohn Marino   while ((d = _rl_to_lower (*s1) - _rl_to_lower (*s2)) == 0)
412*6b445a62SJohn Marino     {
413*6b445a62SJohn Marino       if (*s1++ == '\0')
414*6b445a62SJohn Marino         return 0;
415*6b445a62SJohn Marino       s2++;
416*6b445a62SJohn Marino     }
417*6b445a62SJohn Marino 
418*6b445a62SJohn Marino   return (d);
419*6b445a62SJohn Marino }
420*6b445a62SJohn Marino #endif /* !HAVE_STRCASECMP */
421*6b445a62SJohn Marino 
422*6b445a62SJohn Marino /* Stupid comparison routine for qsort () ing strings. */
423*6b445a62SJohn Marino int
_rl_qsort_string_compare(s1,s2)424*6b445a62SJohn Marino _rl_qsort_string_compare (s1, s2)
425*6b445a62SJohn Marino   char **s1, **s2;
426*6b445a62SJohn Marino {
427*6b445a62SJohn Marino #if defined (HAVE_STRCOLL)
428*6b445a62SJohn Marino   return (strcoll (*s1, *s2));
429*6b445a62SJohn Marino #else
430*6b445a62SJohn Marino   int result;
431*6b445a62SJohn Marino 
432*6b445a62SJohn Marino   result = **s1 - **s2;
433*6b445a62SJohn Marino   if (result == 0)
434*6b445a62SJohn Marino     result = strcmp (*s1, *s2);
435*6b445a62SJohn Marino 
436*6b445a62SJohn Marino   return result;
437*6b445a62SJohn Marino #endif
438*6b445a62SJohn Marino }
439*6b445a62SJohn Marino 
440*6b445a62SJohn Marino /* Function equivalents for the macros defined in chardefs.h. */
441*6b445a62SJohn Marino #define FUNCTION_FOR_MACRO(f)	int (f) (c) int c; { return f (c); }
442*6b445a62SJohn Marino 
443*6b445a62SJohn Marino FUNCTION_FOR_MACRO (_rl_digit_p)
444*6b445a62SJohn Marino FUNCTION_FOR_MACRO (_rl_digit_value)
445*6b445a62SJohn Marino FUNCTION_FOR_MACRO (_rl_lowercase_p)
446*6b445a62SJohn Marino FUNCTION_FOR_MACRO (_rl_pure_alphabetic)
447*6b445a62SJohn Marino FUNCTION_FOR_MACRO (_rl_to_lower)
448*6b445a62SJohn Marino FUNCTION_FOR_MACRO (_rl_to_upper)
449*6b445a62SJohn Marino FUNCTION_FOR_MACRO (_rl_uppercase_p)
450*6b445a62SJohn Marino 
451*6b445a62SJohn Marino /* A convenience function, to force memory deallocation to be performed
452*6b445a62SJohn Marino    by readline.  DLLs on Windows apparently require this. */
453*6b445a62SJohn Marino void
454*6b445a62SJohn Marino rl_free (mem)
455*6b445a62SJohn Marino      void *mem;
456*6b445a62SJohn Marino {
457*6b445a62SJohn Marino   if (mem)
458*6b445a62SJohn Marino     free (mem);
459*6b445a62SJohn Marino }
460*6b445a62SJohn Marino 
461*6b445a62SJohn Marino /* Backwards compatibility, now that savestring has been removed from
462*6b445a62SJohn Marino    all `public' readline header files. */
463*6b445a62SJohn Marino #undef _rl_savestring
464*6b445a62SJohn Marino char *
_rl_savestring(s)465*6b445a62SJohn Marino _rl_savestring (s)
466*6b445a62SJohn Marino      const char *s;
467*6b445a62SJohn Marino {
468*6b445a62SJohn Marino   return (strcpy ((char *)xmalloc (1 + (int)strlen (s)), (s)));
469*6b445a62SJohn Marino }
470*6b445a62SJohn Marino 
471*6b445a62SJohn Marino #if defined (USE_VARARGS)
472*6b445a62SJohn Marino static FILE *_rl_tracefp;
473*6b445a62SJohn Marino 
474*6b445a62SJohn Marino void
475*6b445a62SJohn Marino #if defined (PREFER_STDARG)
_rl_trace(const char * format,...)476*6b445a62SJohn Marino _rl_trace (const char *format, ...)
477*6b445a62SJohn Marino #else
478*6b445a62SJohn Marino _rl_trace (va_alist)
479*6b445a62SJohn Marino      va_dcl
480*6b445a62SJohn Marino #endif
481*6b445a62SJohn Marino {
482*6b445a62SJohn Marino   va_list args;
483*6b445a62SJohn Marino #if defined (PREFER_VARARGS)
484*6b445a62SJohn Marino   char *format;
485*6b445a62SJohn Marino #endif
486*6b445a62SJohn Marino 
487*6b445a62SJohn Marino #if defined (PREFER_STDARG)
488*6b445a62SJohn Marino   va_start (args, format);
489*6b445a62SJohn Marino #else
490*6b445a62SJohn Marino   va_start (args);
491*6b445a62SJohn Marino   format = va_arg (args, char *);
492*6b445a62SJohn Marino #endif
493*6b445a62SJohn Marino 
494*6b445a62SJohn Marino   if (_rl_tracefp == 0)
495*6b445a62SJohn Marino     _rl_tropen ();
496*6b445a62SJohn Marino   vfprintf (_rl_tracefp, format, args);
497*6b445a62SJohn Marino   fprintf (_rl_tracefp, "\n");
498*6b445a62SJohn Marino   fflush (_rl_tracefp);
499*6b445a62SJohn Marino 
500*6b445a62SJohn Marino   va_end (args);
501*6b445a62SJohn Marino }
502*6b445a62SJohn Marino 
503*6b445a62SJohn Marino int
_rl_tropen()504*6b445a62SJohn Marino _rl_tropen ()
505*6b445a62SJohn Marino {
506*6b445a62SJohn Marino   char fnbuf[128];
507*6b445a62SJohn Marino 
508*6b445a62SJohn Marino   if (_rl_tracefp)
509*6b445a62SJohn Marino     fclose (_rl_tracefp);
510*6b445a62SJohn Marino   sprintf (fnbuf, "/var/tmp/rltrace.%ld", getpid());
511*6b445a62SJohn Marino   unlink(fnbuf);
512*6b445a62SJohn Marino   _rl_tracefp = fopen (fnbuf, "w+");
513*6b445a62SJohn Marino   return _rl_tracefp != 0;
514*6b445a62SJohn Marino }
515*6b445a62SJohn Marino 
516*6b445a62SJohn Marino int
_rl_trclose()517*6b445a62SJohn Marino _rl_trclose ()
518*6b445a62SJohn Marino {
519*6b445a62SJohn Marino   int r;
520*6b445a62SJohn Marino 
521*6b445a62SJohn Marino   r = fclose (_rl_tracefp);
522*6b445a62SJohn Marino   _rl_tracefp = 0;
523*6b445a62SJohn Marino   return r;
524*6b445a62SJohn Marino }
525*6b445a62SJohn Marino 
526*6b445a62SJohn Marino #endif
527