From 0160fbe1508e18e4ff7b50822b3620f69cffe400 Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Sat, 4 Nov 2000 04:56:25 +0000 Subject: [PATCH] class.c (cxx_keyword_p): Accept keywords with trailing `$'s. * class.c (cxx_keyword_p): Accept keywords with trailing `$'s. * gjavah.c (cxx_keyword_subst): Handle any number of trailing `$'. From-SVN: r37243 --- gcc/java/ChangeLog | 4 ++++ gcc/java/class.c | 18 +++++++++++++++--- gcc/java/gjavah.c | 28 ++++++++++++++++++++++------ 3 files changed, 41 insertions(+), 9 deletions(-) diff --git a/gcc/java/ChangeLog b/gcc/java/ChangeLog index e62b217b14a..3aeede4d23e 100644 --- a/gcc/java/ChangeLog +++ b/gcc/java/ChangeLog @@ -1,5 +1,9 @@ 2000-11-03 Tom Tromey + * class.c (cxx_keyword_p): Accept keywords with trailing `$'s. + * gjavah.c (cxx_keyword_subst): Handle any number of trailing + `$'. + * lex.h (_JAVA_IDENTIFIER_IGNORABLE): New macro. (JAVA_ID_CHAR_P): Also try java_ignorable_control_p. * lex.c (java_read_unicode): Removed `term_context' argument. diff --git a/gcc/java/class.c b/gcc/java/class.c index 1b184975dfa..00cf42e6e80 100644 --- a/gcc/java/class.c +++ b/gcc/java/class.c @@ -1961,11 +1961,23 @@ cxx_keyword_p (name, length) mid != old; old = mid, mid = (last + first) / 2) { - int r = utf8_cmp (name, length, cxx_keywords[mid]); + int kwl = strlen (cxx_keywords[mid]); + int min_length = kwl > length ? length : kwl; + int r = utf8_cmp (name, min_length, cxx_keywords[mid]); if (r == 0) - return 1; - else if (r < 0) + { + int i; + /* We've found a match if all the remaining characters are + `$'. */ + for (i = min_length; i < length && name[i] == '$'; ++i) + ; + if (i == length) + return 1; + r = 1; + } + + if (r < 0) last = mid; else first = mid; diff --git a/gcc/java/gjavah.c b/gcc/java/gjavah.c index 6aabf1c8adc..f49b717c199 100644 --- a/gcc/java/gjavah.c +++ b/gcc/java/gjavah.c @@ -440,16 +440,32 @@ cxx_keyword_subst (str, length) mid != old; old = mid, mid = (last + first) / 2) { - int r = utf8_cmp (str, length, cxx_keywords[mid]); + int kwl = strlen (cxx_keywords[mid]); + int min_length = kwl > length ? length : kwl; + int r = utf8_cmp (str, min_length, cxx_keywords[mid]); if (r == 0) { - char *str = xmalloc (2 + strlen (cxx_keywords[mid])); - strcpy (str, cxx_keywords[mid]); - strcat (str, "$"); - return str; + int i; + + /* Skip all trailing `$'. */ + for (i = min_length; i < length && str[i] == '$'; ++i) + ; + /* We've only found a match if all the remaining characters + are `$'. */ + if (i == length) + { + char *dup = xmalloc (2 + length - min_length + kwl); + strcpy (dup, cxx_keywords[mid]); + for (i = kwl; i < length + 1; ++i) + dup[i] = '$'; + dup[i] = '\0'; + return dup; + } + r = 1; } - else if (r < 0) + + if (r < 0) last = mid; else first = mid; -- 2.30.2