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