--- contrib/netbsd-tests/lib/libc/locale/t_mbstowcs.c.orig
+++ contrib/netbsd-tests/lib/libc/locale/t_mbstowcs.c
@@ -88,7 +88,7 @@
 		0xFFFF, 0x5D, 0x5B, 0x10000, 0x10FFFF, 0x5D, 0x0A
 	},
 #ifdef __FreeBSD__
-	{	 1, -1, -1,  1,  1, -1, 1,  1,  1, 1, -1,  1,  1, -1, -1,
+	{	 1, -1, -1,  1,  1, -1, -1,  1,  1, 1, -1,  1,  1, -1, -1,
 #else
 	{	 1, -1, -1,  1,  1, -1, -1,  1,  1, -1, -1,  1,  1, -1, -1,
 #endif
--- usr.bin/localedef/ctype.c.orig
+++ usr.bin/localedef/ctype.c
@@ -407,9 +407,9 @@
 			continue;
 		}
 
-		if ((last_ct != NULL) && (last_ct->ctype == ctn->ctype)) {
+		if ((last_ct != NULL) && (last_ct->ctype == ctn->ctype) &&
+		    (last_ct->wc + 1 == wc)) {
 			ct[rl.runetype_ext_nranges-1].max = wc;
-			last_ct = ctn;
 		} else {
 			rl.runetype_ext_nranges++;
 			ct = realloc(ct,
@@ -417,8 +417,8 @@
 			ct[rl.runetype_ext_nranges - 1].min = wc;
 			ct[rl.runetype_ext_nranges - 1].max = wc;
 			ct[rl.runetype_ext_nranges - 1].map = ctn->ctype;
-			last_ct = ctn;
 		}
+		last_ct = ctn;
 		if (ctn->tolower == 0) {
 			last_lo = NULL;
 		} else if ((last_lo != NULL) &&
--- usr.bin/localedef/parser.y.orig
+++ usr.bin/localedef/parser.y
@@ -27,6 +27,8 @@
  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
  */
 
 /*
@@ -321,22 +323,19 @@
 		| T_TOLOWER conv_list T_NL
 		;
 
+cc_list		: cc_list T_SEMI cc_range_end
+		| cc_list T_SEMI cc_char
+		| cc_char
+		;
 
-cc_list		: cc_list T_SEMI T_CHAR
+cc_range_end	: T_ELLIPSIS T_SEMI T_CHAR
 		{
-			add_ctype($3);
+			add_ctype_range($3);
 		}
-		| cc_list T_SEMI T_SYMBOL
+		;
+
+cc_char		: T_CHAR
 		{
-			add_charmap_undefined($3);
-		}
-		| cc_list T_SEMI T_ELLIPSIS T_SEMI T_CHAR
-		{
-			/* note that the endpoints *must* be characters */
-			add_ctype_range($5);
-		}
-		| T_CHAR
-		{
 			add_ctype($1);
 		}
 		| T_SYMBOL
