I've checked all uses of ga_concat in the codebase:
- ex_cmds2.c
- ex_getln.c
- eval.c
- message.c
- regexp-nfa.c
- term.c
- spell.c
None of them concats the garray with itself. This makes it safe to use the
faster memcpy() instead of memmove(). This change was also documented.
Less useless strlen(), stpcpy() is a more natural fit for this task.
ga_concat_strings() still has too much strlen() but that would be ugly to
remove for a function that's not used very often (just once in the current
codebase).
- xrealloc will call xmalloc if the input pointer is NULL, no need to check
twice.
- use the early-quit idiom to decrease the indentation, which enhances
readability.
The function prototypes use garray_T* arguments, but the header is not
included in path.h. Technically we could also get away with a forward
declaration since we're just using the pointer, but I don't see the urgent
need for that.
Though correct (to my understanding), some of the casts introduced in
previous commits could lead to confusion, by casting only the first
expression component instead of the whole expression.
This fixes that, parenthesizing casted expressions, except where
operator precedence rules make it unneccesary.
Fix uses of plain "%ld" within sscanf():
- Replace "%ld" with "%" SCNd64.
- Create (int64_t) local variable and sscanf into that.
- Safely downcast into previous type (introduce assertion, to be removed
when variable type refactored).
Today's compilers generate shift instructions to perform division and
multiplications by powers of 2 [1]. `(x >> 1)` looks straightforward enough, but
if x is signed the code will fail when x < 0. The compiler knows better: use
`x / 2`.
That's why we have code like this:
(long)((long_u)Rows >> 1))
instead of the cleaner version that generates the same or better machine code:
Rows / 2
[1] http://goo.gl/J4WpG7
quickfix.c
- ll_new_list
- ll_get_or_alloc_list
regex_nfa.c
- realloc_post_list -> EMIT -> nfa_emit_equi_class
- nfa_regcomp_start
Use xrealloc() in realloc_post_list() (regexp_nfa.c)
Test plan: force a call to realloc_post_list() for every use of the EMIT macro;
open nvim and test regexp search.
Even though cs_reset() never returns anything different of `CS_SUCCESS` I can't
change its return type to `void`. cs_reset() is used in the `cs_cmds` table.
- xmallocz() is not static anymore. There are many use cases for this function
in the codebase and we should start using it.
- Simpler types in ga_concat_strings()
There will be more use cases for try_malloc(): see #556.
- Reimplemented xmalloc() using try_malloc().
- verbose_try_malloc() is just like try_malloc() but shows an out-of-memory
error message before returning NULL.
- Let the compiler generate size>>1 assembly for signed types. We're not using
old compilers here.
- Add proper function attributes to the new functions in memory.h
Unfortunately there's still a case where NULL can be returned from
file_pat_to_reg_pat().
xmemdupz() and xmallocz() aren't static anymore. There are many use cases for
these function.