summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2018-04-18 23:01:13 +0200
committerBram Moolenaar <Bram@vim.org>2018-04-18 23:01:13 +0200
commit285e3358696b1bc6296e5d4c53425680ce8fbd54 (patch)
treef2a33507d8fad7432096ab3240bf047a9f962bb5
parentf98a39ca57d001ba3e24831bae1e375790fb41f0 (diff)
downloadvim-git-285e3358696b1bc6296e5d4c53425680ce8fbd54.tar.gz
patch 8.0.1735: flexible array member feature not supported by HP-UXv8.0.1735
Problem: Flexible array member feature not supported by HP-UX. (John Marriott) Solution: Do not use the flexible array member feature of C99.
-rw-r--r--runtime/doc/develop.txt11
-rwxr-xr-xsrc/auto/configure10
-rw-r--r--src/configure.ac10
-rw-r--r--src/getchar.c88
-rw-r--r--src/structs.h4
-rw-r--r--src/version.c2
6 files changed, 50 insertions, 75 deletions
diff --git a/runtime/doc/develop.txt b/runtime/doc/develop.txt
index d90e4a3dd..2e00ccfa9 100644
--- a/runtime/doc/develop.txt
+++ b/runtime/doc/develop.txt
@@ -209,16 +209,6 @@ Types ~
"long long" is allowed and can be expected to be 64 bits. Use %lld in printf
formats. Also "long long unsigned" with %llu.
-Flexible array members ~
-
-This is an array without size, used as the last member of a struct. Vim used
-to have an array of size one, which causes trouble with FORTIFY_SOURCE. Using
-an "unsized array" is the intended use, we will change all of them.
- struct some_stuff {
- size_t length;
- char payload[]; // will have size "length"
- };
-
Not to be used ~
These C99 features are not to be used, because not enough compilers support
@@ -228,6 +218,7 @@ them:
- Variable length arrays (even in C11 this is an optional feature).
- _Bool and _Complex types.
- "inline" (it's hardly ever needed, let the optimizer do its work)
+- flexible array members: Not supported by HP-UX C compiler (John Marriott)
USE OF COMMON FUNCTIONS *style-functions*
diff --git a/src/auto/configure b/src/auto/configure
index 6673de85a..7a65bec0a 100755
--- a/src/auto/configure
+++ b/src/auto/configure
@@ -4188,14 +4188,10 @@ int
main ()
{
- struct with_flexible_member {
- int count; // comment
- char text[]; // another comment
- };
enum {
- one,
- two,
- three,
+ one, // one comment
+ two, // two comments
+ three, // three comments
};
long long int a = 1;
long long unsigned b = 2;
diff --git a/src/configure.ac b/src/configure.ac
index 4ae21a110..78023ad22 100644
--- a/src/configure.ac
+++ b/src/configure.ac
@@ -36,14 +36,10 @@ dnl - "long long int" and "long long unsigned"
dnl - flexible array member
AC_MSG_CHECKING(if the compiler can handle Vim code)
AC_TRY_COMPILE([#include <stdio.h>], [
- struct with_flexible_member {
- int count; // comment
- char text[]; // another comment
- };
enum {
- one,
- two,
- three,
+ one, // one comment
+ two, // two comments
+ three, // three comments
};
long long int a = 1;
long long unsigned b = 2;
diff --git a/src/getchar.c b/src/getchar.c
index 5a5041a65..285d5d5d0 100644
--- a/src/getchar.c
+++ b/src/getchar.c
@@ -40,9 +40,9 @@
#define MINIMAL_SIZE 20 /* minimal size for b_str */
-static buffheader_T redobuff = {NULL, NULL, 0, 0};
-static buffheader_T old_redobuff = {NULL, NULL, 0, 0};
-static buffheader_T recordbuff = {NULL, NULL, 0, 0};
+static buffheader_T redobuff = {{NULL, {NUL}}, NULL, 0, 0};
+static buffheader_T old_redobuff = {{NULL, {NUL}}, NULL, 0, 0};
+static buffheader_T recordbuff = {{NULL, {NUL}}, NULL, 0, 0};
static int typeahead_char = 0; /* typeahead char that's not flushed */
@@ -138,13 +138,12 @@ free_buff(buffheader_T *buf)
{
buffblock_T *p, *np;
- for (p = buf->bh_first; p != NULL; p = np)
+ for (p = buf->bh_first.b_next; p != NULL; p = np)
{
np = p->b_next;
vim_free(p);
}
- buf->bh_first = NULL;
- buf->bh_curr = NULL;
+ buf->bh_first.b_next = NULL;
}
/*
@@ -160,16 +159,16 @@ get_buffcont(
char_u *p = NULL;
char_u *p2;
char_u *str;
- buffblock_T *bp;
+ buffblock_T *bp;
/* compute the total length of the string */
- for (bp = buffer->bh_first; bp != NULL; bp = bp->b_next)
+ for (bp = buffer->bh_first.b_next; bp != NULL; bp = bp->b_next)
count += (long_u)STRLEN(bp->b_str);
if ((count || dozero) && (p = lalloc(count + 1, TRUE)) != NULL)
{
p2 = p;
- for (bp = buffer->bh_first; bp != NULL; bp = bp->b_next)
+ for (bp = buffer->bh_first.b_next; bp != NULL; bp = bp->b_next)
for (str = bp->b_str; *str; )
*p2++ = *str++;
*p2 = NUL;
@@ -233,17 +232,17 @@ add_buff(
long slen) /* length of "s" or -1 */
{
buffblock_T *p;
- long_u len;
+ long_u len;
if (slen < 0)
slen = (long)STRLEN(s);
if (slen == 0) /* don't add empty strings */
return;
- if (buf->bh_first == NULL) /* first add to list */
+ if (buf->bh_first.b_next == NULL) /* first add to list */
{
buf->bh_space = 0;
- buf->bh_curr = NULL;
+ buf->bh_curr = &(buf->bh_first);
}
else if (buf->bh_curr == NULL) /* buffer has already been read */
{
@@ -251,9 +250,9 @@ add_buff(
return;
}
else if (buf->bh_index != 0)
- mch_memmove(buf->bh_first->b_str,
- buf->bh_first->b_str + buf->bh_index,
- STRLEN(buf->bh_first->b_str + buf->bh_index) + 1);
+ mch_memmove(buf->bh_first.b_next->b_str,
+ buf->bh_first.b_next->b_str + buf->bh_index,
+ STRLEN(buf->bh_first.b_next->b_str + buf->bh_index) + 1);
buf->bh_index = 0;
if (buf->bh_space >= (int)slen)
@@ -268,25 +267,16 @@ add_buff(
len = MINIMAL_SIZE;
else
len = slen;
- p = (buffblock_T *)lalloc((long_u)(sizeof(buffblock_T) + len + 1),
- TRUE);
+ p = (buffblock_T *)lalloc((long_u)(sizeof(buffblock_T) + len),
+ TRUE);
if (p == NULL)
return; /* no space, just forget it */
buf->bh_space = (int)(len - slen);
vim_strncpy(p->b_str, s, (size_t)slen);
- if (buf->bh_curr == NULL)
- {
- p->b_next = NULL;
- buf->bh_first = p;
- buf->bh_curr = p;
- }
- else
- {
- p->b_next = buf->bh_curr->b_next;
- buf->bh_curr->b_next = p;
- buf->bh_curr = p;
- }
+ p->b_next = buf->bh_curr->b_next;
+ buf->bh_curr->b_next = p;
+ buf->bh_curr = p;
}
return;
}
@@ -358,10 +348,10 @@ add_char_buff(buffheader_T *buf, int c)
}
/* First read ahead buffer. Used for translated commands. */
-static buffheader_T readbuf1 = {NULL, NULL, 0, 0};
+static buffheader_T readbuf1 = {{NULL, {NUL}}, NULL, 0, 0};
/* Second read ahead buffer. Used for redo. */
-static buffheader_T readbuf2 = {NULL, NULL, 0, 0};
+static buffheader_T readbuf2 = {{NULL, {NUL}}, NULL, 0, 0};
/*
* Get one byte from the read buffers. Use readbuf1 one first, use readbuf2
@@ -386,17 +376,17 @@ read_readbuf(buffheader_T *buf, int advance)
char_u c;
buffblock_T *curr;
- if (buf->bh_first == NULL) /* buffer is empty */
+ if (buf->bh_first.b_next == NULL) /* buffer is empty */
return NUL;
- curr = buf->bh_first;
+ curr = buf->bh_first.b_next;
c = curr->b_str[buf->bh_index];
if (advance)
{
if (curr->b_str[++buf->bh_index] == NUL)
{
- buf->bh_first = curr->b_next;
+ buf->bh_first.b_next = curr->b_next;
vim_free(curr);
buf->bh_index = 0;
}
@@ -410,14 +400,14 @@ read_readbuf(buffheader_T *buf, int advance)
static void
start_stuff(void)
{
- if (readbuf1.bh_first != NULL)
+ if (readbuf1.bh_first.b_next != NULL)
{
- readbuf1.bh_curr = readbuf1.bh_first;
+ readbuf1.bh_curr = &(readbuf1.bh_first);
readbuf1.bh_space = 0;
}
- if (readbuf2.bh_first != NULL)
+ if (readbuf2.bh_first.b_next != NULL)
{
- readbuf2.bh_curr = readbuf2.bh_first;
+ readbuf2.bh_curr = &(readbuf2.bh_first);
readbuf2.bh_space = 0;
}
}
@@ -428,8 +418,8 @@ start_stuff(void)
int
stuff_empty(void)
{
- return (readbuf1.bh_first == NULL
- && readbuf2.bh_first == NULL);
+ return (readbuf1.bh_first.b_next == NULL
+ && readbuf2.bh_first.b_next == NULL);
}
/*
@@ -439,7 +429,7 @@ stuff_empty(void)
int
readbuf1_empty(void)
{
- return (readbuf1.bh_first == NULL);
+ return (readbuf1.bh_first.b_next == NULL);
}
/*
@@ -504,7 +494,7 @@ ResetRedobuff(void)
{
free_buff(&old_redobuff);
old_redobuff = redobuff;
- redobuff.bh_first = NULL;
+ redobuff.bh_first.b_next = NULL;
}
}
@@ -519,7 +509,7 @@ CancelRedo(void)
{
free_buff(&redobuff);
redobuff = old_redobuff;
- old_redobuff.bh_first = NULL;
+ old_redobuff.bh_first.b_next = NULL;
start_stuff();
while (read_readbuffers(TRUE) != NUL)
;
@@ -536,9 +526,9 @@ saveRedobuff(save_redo_T *save_redo)
char_u *s;
save_redo->sr_redobuff = redobuff;
- redobuff.bh_first = NULL;
+ redobuff.bh_first.b_next = NULL;
save_redo->sr_old_redobuff = old_redobuff;
- old_redobuff.bh_first = NULL;
+ old_redobuff.bh_first.b_next = NULL;
/* Make a copy, so that ":normal ." in a function works. */
s = get_buffcont(&save_redo->sr_redobuff, FALSE);
@@ -757,9 +747,9 @@ read_redo(int init, int old_redo)
if (init)
{
if (old_redo)
- bp = old_redobuff.bh_first;
+ bp = old_redobuff.bh_first.b_next;
else
- bp = redobuff.bh_first;
+ bp = redobuff.bh_first.b_next;
if (bp == NULL)
return FAIL;
p = bp->b_str;
@@ -1382,9 +1372,9 @@ save_typeahead(tasave_T *tp)
old_char = -1;
tp->save_readbuf1 = readbuf1;
- readbuf1.bh_first = NULL;
+ readbuf1.bh_first.b_next = NULL;
tp->save_readbuf2 = readbuf2;
- readbuf2.bh_first = NULL;
+ readbuf2.bh_first.b_next = NULL;
# ifdef USE_INPUT_BUF
tp->save_inputbuf = get_input_buf();
# endif
diff --git a/src/structs.h b/src/structs.h
index e3ad867db..35433b1b2 100644
--- a/src/structs.h
+++ b/src/structs.h
@@ -511,7 +511,7 @@ typedef struct buffheader buffheader_T;
struct buffblock
{
buffblock_T *b_next; /* pointer to next buffblock */
- char_u b_str[]; /* contents (flexible array) */
+ char_u b_str[1]; /* contents (actually longer) */
};
/*
@@ -519,7 +519,7 @@ struct buffblock
*/
struct buffheader
{
- buffblock_T *bh_first; /* first block of the list */
+ buffblock_T bh_first; /* first (dummy) block of list */
buffblock_T *bh_curr; /* buffblock for appending */
int bh_index; /* index for reading */
int bh_space; /* space in bh_curr for appending */
diff --git a/src/version.c b/src/version.c
index 3abe29a65..c2fc3f3bc 100644
--- a/src/version.c
+++ b/src/version.c
@@ -763,6 +763,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1735,
+/**/
1734,
/**/
1733,