Minor cleanup of recent strlen-avoiding patch.

* src/fileio.c (CHECK_LENGTH): Remove.
Rewrite callers so that they don't need it.
(Fexpand_file_name) [DOS_NT]: Fix a case where directory length
variable wasn't set.
This commit is contained in:
Paul Eggert 2014-09-02 11:05:00 -07:00
parent 77ea21cdfc
commit ff8b9b273f
5 changed files with 59 additions and 72 deletions

View file

@ -1,3 +1,11 @@
2014-09-02 Paul Eggert <eggert@cs.ucla.edu>
Minor cleanup of recent strlen-avoiding patch.
* fileio.c (CHECK_LENGTH): Remove.
Rewrite callers so that they don't need it.
(Fexpand_file_name) [DOS_NT]: Fix a case where directory length
variable wasn't set.
2014-09-02 Dmitry Antipov <dmantipov@yandex.ru>
* fileio.c (CHECK_LENGTH): New macro.

View file

@ -1276,10 +1276,10 @@ Most elements look like (SYMBOL . VALUE), describing one variable.
For a symbol that is locally unbound, just the symbol appears in the value.
Note that storing new VALUEs in these elements doesn't change the variables.
No argument or nil as argument means use current buffer as BUFFER. */)
(register Lisp_Object buffer)
(Lisp_Object buffer)
{
register struct buffer *buf = decode_buffer (buffer);
register Lisp_Object result = buffer_lisp_local_variables (buf, 0);
struct buffer *buf = decode_buffer (buffer);
Lisp_Object result = buffer_lisp_local_variables (buf, 0);
/* Add on all the variables stored in special slots. */
{
@ -1306,9 +1306,9 @@ DEFUN ("buffer-modified-p", Fbuffer_modified_p, Sbuffer_modified_p,
0, 1, 0,
doc: /* Return t if BUFFER was modified since its file was last read or saved.
No argument or nil as argument means use current buffer as BUFFER. */)
(register Lisp_Object buffer)
(Lisp_Object buffer)
{
register struct buffer *buf = decode_buffer (buffer);
struct buffer *buf = decode_buffer (buffer);
return BUF_SAVE_MODIFF (buf) < BUF_MODIFF (buf) ? Qt : Qnil;
}

View file

@ -1952,9 +1952,9 @@ DEFUN ("local-variable-p", Flocal_variable_p, Slocal_variable_p,
1, 2, 0,
doc: /* Non-nil if VARIABLE has a local binding in buffer BUFFER.
BUFFER defaults to the current buffer. */)
(register Lisp_Object variable, Lisp_Object buffer)
(Lisp_Object variable, Lisp_Object buffer)
{
register struct buffer *buf = decode_buffer (buffer);
struct buffer *buf = decode_buffer (buffer);
struct Lisp_Symbol *sym;
CHECK_SYMBOL (variable);

View file

@ -847,15 +847,6 @@ probably use `make-temp-file' instead, except in three circumstances:
return make_temp_name (prefix, 0);
}
/* The following function does a lot of work with \0-terminated strings.
To avoid extra calls to strlen and strcat, we maintain an important
lengths explicitly. This macro is used to check whether we're in sync. */
#ifdef ENABLE_CHECKING
#define CHECK_LENGTH(str, len) (eassert (strlen (str) == len), len)
#else
#define CHECK_LENGTH(str, len) (len)
#endif /* ENABLE_CHECKING */
DEFUN ("expand-file-name", Fexpand_file_name, Sexpand_file_name, 1, 2, 0,
doc: /* Convert filename NAME to absolute, and canonicalize it.
Second arg DEFAULT-DIRECTORY is directory to start with if NAME is relative
@ -885,7 +876,9 @@ filesystem tree, not (expand-file-name ".." dirname). */)
/* These point to SDATA and need to be careful with string-relocation
during GC (via DECODE_FILE). */
char *nm;
char *nmlim;
const char *newdir;
const char *newdirlim;
/* This should only point to alloca'd data. */
char *target;
@ -893,10 +886,10 @@ filesystem tree, not (expand-file-name ".." dirname). */)
struct passwd *pw;
#ifdef DOS_NT
int drive = 0;
bool collapse_newdir = 1;
bool collapse_newdir = true;
bool is_escaped = 0;
#endif /* DOS_NT */
ptrdiff_t length, newdirlen, nmlen, nbytes;
ptrdiff_t length, nbytes;
Lisp_Object handler, result, handled_name;
bool multibyte;
Lisp_Object hdir;
@ -1027,14 +1020,13 @@ filesystem tree, not (expand-file-name ".." dirname). */)
/* Make a local copy of NAME to protect it from GC in DECODE_FILE below. */
nm = xlispstrdupa (name);
nmlen = SBYTES (name);
nmlim = nm + SBYTES (name);
#ifdef DOS_NT
/* Note if special escape prefix is present, but remove for now. */
if (nm[0] == '/' && nm[1] == ':')
{
is_escaped = 1;
nmlen -= 2;
nm += 2;
}
@ -1044,7 +1036,6 @@ filesystem tree, not (expand-file-name ".." dirname). */)
if (IS_DRIVE (nm[0]) && IS_DEVICE_SEP (nm[1]))
{
drive = (unsigned char) nm[0];
nmlen -= 2;
nm += 2;
}
@ -1053,7 +1044,7 @@ filesystem tree, not (expand-file-name ".." dirname). */)
colon when stripping the drive letter. Otherwise, this expands to
"//somedir". */
if (drive && IS_DIRECTORY_SEP (nm[0]) && IS_DIRECTORY_SEP (nm[1]))
nmlen--, nm++;
nm++;
/* Discard any previous drive specifier if nm is now in UNC format. */
if (IS_DIRECTORY_SEP (nm[0]) && IS_DIRECTORY_SEP (nm[1])
@ -1114,8 +1105,7 @@ filesystem tree, not (expand-file-name ".." dirname). */)
if (IS_DIRECTORY_SEP (nm[1]))
{
if (strcmp (nm, SSDATA (name)) != 0)
name = make_specified_string
(nm, -1, CHECK_LENGTH (nm, nmlen), multibyte);
name = make_specified_string (nm, -1, nmlim - nm, multibyte);
}
else
#endif
@ -1136,8 +1126,7 @@ filesystem tree, not (expand-file-name ".." dirname). */)
#else /* not DOS_NT */
if (strcmp (nm, SSDATA (name)) == 0)
return name;
return make_specified_string
(nm, -1, CHECK_LENGTH (nm, nmlen), multibyte);
return make_specified_string (nm, -1, nmlim - nm, multibyte);
#endif /* not DOS_NT */
}
}
@ -1158,8 +1147,7 @@ filesystem tree, not (expand-file-name ".." dirname). */)
return an absolute name, if the final prefix is not absolute we
append it to the current working directory. */
newdir = 0;
newdirlen = -1;
newdir = newdirlim = 0;
if (nm[0] == '~') /* prefix ~ */
{
@ -1169,8 +1157,8 @@ filesystem tree, not (expand-file-name ".." dirname). */)
Lisp_Object tem;
if (!(newdir = egetenv ("HOME")))
newdir = "";
nmlen--, nm++;
newdir = newdirlim = "";
nm++;
/* `egetenv' may return a unibyte string, which will bite us since
we expect the directory to be multibyte. */
#ifdef WINDOWSNT
@ -1184,15 +1172,15 @@ filesystem tree, not (expand-file-name ".." dirname). */)
else
#endif
tem = build_string (newdir);
newdirlen = SBYTES (tem);
newdirlim = newdir + SBYTES (tem);
if (multibyte && !STRING_MULTIBYTE (tem))
{
hdir = DECODE_FILE (tem);
newdir = SSDATA (hdir);
newdirlen = SBYTES (hdir);
newdirlim = newdir + SBYTES (hdir);
}
#ifdef DOS_NT
collapse_newdir = 0;
collapse_newdir = false;
#endif
}
else /* ~user/filename */
@ -1216,17 +1204,16 @@ filesystem tree, not (expand-file-name ".." dirname). */)
bite us since we expect the directory to be
multibyte. */
tem = build_string (newdir);
newdirlen = SBYTES (tem);
newdirlim = newdir + SBYTES (tem);
if (multibyte && !STRING_MULTIBYTE (tem))
{
hdir = DECODE_FILE (tem);
newdir = SSDATA (hdir);
newdirlen = SBYTES (hdir);
newdirlim = newdir + SBYTES (hdir);
}
nmlen -= (p - nm);
nm = p;
#ifdef DOS_NT
collapse_newdir = 0;
collapse_newdir = false;
#endif
}
@ -1252,8 +1239,8 @@ filesystem tree, not (expand-file-name ".." dirname). */)
Lisp_Object tem = build_string (adir);
tem = DECODE_FILE (tem);
newdirlen = SBYTES (tem);
memcpy (adir, SSDATA (tem), newdirlen + 1);
newdirlim = adir + SBYTES (tem);
memcpy (adir, SSDATA (tem), SBYTES (tem) + 1);
}
}
if (!adir)
@ -1264,7 +1251,7 @@ filesystem tree, not (expand-file-name ".." dirname). */)
adir[1] = ':';
adir[2] = '/';
adir[3] = 0;
newdirlen = 3;
newdirlim = adir + 3;
}
newdir = adir;
}
@ -1285,13 +1272,12 @@ filesystem tree, not (expand-file-name ".." dirname). */)
&& !newdir)
{
newdir = SSDATA (default_directory);
newdirlen = SBYTES (default_directory);
newdirlim = newdir + SBYTES (default_directory);
#ifdef DOS_NT
/* Note if special escape prefix is present, but remove for now. */
if (newdir[0] == '/' && newdir[1] == ':')
{
is_escaped = 1;
newdirlen -= 2;
newdir += 2;
}
#endif
@ -1327,18 +1313,19 @@ filesystem tree, not (expand-file-name ".." dirname). */)
if (IS_DRIVE (newdir[0]) && IS_DEVICE_SEP (newdir[1]))
{
drive = (unsigned char) newdir[0];
newdirlen -= 2;
newdir += 2;
}
if (!IS_DIRECTORY_SEP (nm[0]))
{
ptrdiff_t nmlen = nmlim - nm;
ptrdiff_t newdirlen = newdirlim - newdir;
char *tmp = alloca (newdirlen + file_name_as_directory_slop
+ CHECK_LENGTH (nm, nmlen) + 1);
nbytes = file_name_as_directory (tmp, newdir, newdirlen,
multibyte);
memcpy (tmp + nbytes, nm, nmlen + 1);
nmlen += nbytes;
+ nmlen + 1);
ptrdiff_t dlen = file_name_as_directory (tmp, newdir, newdirlen,
multibyte);
memcpy (tmp + dlen, nm, nmlen + 1);
nm = tmp;
nmlim = nm + dlen + nmlen;
}
adir = alloca (adir_size);
if (drive)
@ -1353,11 +1340,11 @@ filesystem tree, not (expand-file-name ".." dirname). */)
Lisp_Object tem = build_string (adir);
tem = DECODE_FILE (tem);
newdirlen = SBYTES (tem);
memcpy (adir, SSDATA (tem), newdirlen + 1);
newdirlim = adir + SBYTES (tem);
memcpy (adir, SSDATA (tem), SBYTES (tem) + 1);
}
else
newdirlen = strlen (adir);
newdirlim = adir + strlen (adir);
newdir = adir;
}
@ -1365,7 +1352,6 @@ filesystem tree, not (expand-file-name ".." dirname). */)
if (IS_DRIVE (newdir[0]) && IS_DEVICE_SEP (newdir[1]))
{
drive = newdir[0];
newdirlen -= 2;
newdir += 2;
}
@ -1377,36 +1363,31 @@ filesystem tree, not (expand-file-name ".." dirname). */)
if (IS_DIRECTORY_SEP (newdir[0]) && IS_DIRECTORY_SEP (newdir[1])
&& !IS_DIRECTORY_SEP (newdir[2]))
{
char *adir = strcpy (alloca (newdirlen + 1), newdir);
char *adir = strcpy (alloca (newdirlim - newdir + 1), newdir);
char *p = adir + 2;
while (*p && !IS_DIRECTORY_SEP (*p)) p++;
p++;
while (*p && !IS_DIRECTORY_SEP (*p)) p++;
*p = 0;
newdir = adir;
newdirlen = strlen (adir);
newdirlim = newdir + strlen (adir);
}
else
#endif
newdirlen = 0, newdir = "";
newdir = newdirlim = "";
}
}
#endif /* DOS_NT */
if (newdir)
{
/* Ignore any slash at the end of newdir, unless newdir is
just "/" or "//". */
length = CHECK_LENGTH (newdir, newdirlen);
while (length > 1 && IS_DIRECTORY_SEP (newdir[length - 1])
&& ! (length == 2 && IS_DIRECTORY_SEP (newdir[0])))
length--;
}
else
length = 0;
/* Ignore any slash at the end of newdir, unless newdir is
just "/" or "//". */
length = newdirlim - newdir;
while (length > 1 && IS_DIRECTORY_SEP (newdir[length - 1])
&& ! (length == 2 && IS_DIRECTORY_SEP (newdir[0])))
length--;
/* Now concatenate the directory and name to new space in the stack frame. */
tlen = length + file_name_as_directory_slop + CHECK_LENGTH (nm, nmlen) + 1;
tlen = length + file_name_as_directory_slop + (nmlim - nm) + 1;
#ifdef DOS_NT
/* Reserve space for drive specifier and escape prefix, since either
or both may need to be inserted. (The Microsoft x86 compiler
@ -1442,7 +1423,7 @@ filesystem tree, not (expand-file-name ".." dirname). */)
nbytes = file_name_as_directory (target, newdir, length, multibyte);
}
memcpy (target + nbytes, nm, nmlen + 1);
memcpy (target + nbytes, nm, nmlim - nm + 1);
/* Now canonicalize by removing `//', `/.' and `/foo/..' if they
appear. */

View file

@ -4444,12 +4444,10 @@ extern void xputenv (const char *);
extern char *egetenv_internal (const char *, ptrdiff_t);
/* VAR is usually a compile-time constant, so the
call to strlen is likely to be optimized away. */
INLINE char *
egetenv(const char *var)
egetenv (const char *var)
{
/* When VAR is a string literal, strlen can be optimized away. */
return egetenv_internal (var, strlen (var));
}