From a27688aa9ff9640b845e43eeda28c91a07387b58 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Wed, 15 Mar 2000 11:32:18 +0000 Subject: [PATCH] (_rl_read_file): Use O_BINARY in open. Enable the test for incomplete read. Strip the CR characters by hand after readin the file. (rl_read_init_file): Allow for ~/_intputrc on 8+3 filesystems. --- readline/bind.c | 47 +++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 45 insertions(+), 2 deletions(-) diff --git a/readline/bind.c b/readline/bind.c index f446dc8cd1..73cd827357 100644 --- a/readline/bind.c +++ b/readline/bind.c @@ -62,6 +62,10 @@ extern int errno; extern char *strchr (), *strrchr (); #endif /* !strchr && !__STDC__ */ +#ifndef O_BINARY +# define O_BINARY 0 +#endif + extern int _rl_horizontal_scroll_mode; extern int _rl_mark_modified_lines; extern int _rl_bell_preference; @@ -646,7 +650,7 @@ _rl_read_file (filename, sizep) char *buffer; int i, file; - if ((stat (filename, &finfo) < 0) || (file = open (filename, O_RDONLY, 0666)) < 0) + if ((stat (filename, &finfo) < 0) || (file = open (filename, O_RDONLY | O_BINARY, 0666)) < 0) return ((char *)NULL); file_size = (size_t)finfo.st_size; @@ -667,7 +671,7 @@ _rl_read_file (filename, sizep) i = read (file, buffer, file_size); close (file); -#if 0 +#if 1 if (i < file_size) #else if (i < 0) @@ -678,6 +682,30 @@ _rl_read_file (filename, sizep) } buffer[file_size] = '\0'; + +#if O_BINARY + { + /* Systems which distinguish between text and binary files need + to strip the CR characters before each Newline, otherwise the + parsing functions won't work. */ + char *s, *d; + size_t removed = 0; + + for (s = buffer, d = buffer; s < buffer + file_size; s++) + { + if (removed) + *d = *s; + if (*s != '\r' || s[1] != '\n') + d++; + else + removed++; + } + + file_size -= removed; + buffer[file_size] = '\0'; + } +#endif + if (sizep) *sizep = file_size; return (buffer); @@ -699,6 +727,7 @@ rl_re_read_init_file (count, ignore) 1. the filename used for the previous call 2. the value of the shell variable `INPUTRC' 3. ~/.inputrc + 4. (for __MSDOS__ only) ~/_inputrc If the file existed and could be opened and read, 0 is returned, otherwise errno is returned. */ int @@ -718,6 +747,20 @@ rl_read_init_file (filename) if (*filename == 0) filename = DEFAULT_INPUTRC; +#ifdef __MSDOS__ + { + /* DOS doesn't allow leading dots in file names. If the original + name fails (it could work if we are on Windows), fall back to + ~/_inputrc. */ + int retval = _rl_read_init_file (filename, 0); + + if (retval == 0) + return retval; + else if (strcmp (filename, "~/.inputrc") == 0) + filename = "~/_inputrc"; + } +#endif + return (_rl_read_init_file (filename, 0)); }