Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 19 Aug 2008 14:50:21 GMT
From:      Konrad Jankowski <konrad@FreeBSD.org>
To:        Perforce Change Reviews <perforce@FreeBSD.org>
Subject:   PERFORCE change 147809 for review
Message-ID:  <200808191450.m7JEoLj2034351@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=147809

Change 147809 by konrad@vspredator on 2008/08/19 14:49:35

	With this change we pass the regression tests for much more languages.

Affected files ...

.. //depot/projects/soc2008/konrad_collation/colldef.apple/parse.y#8 edit

Differences ...

==== //depot/projects/soc2008/konrad_collation/colldef.apple/parse.y#8 (text+ko) ====

@@ -89,9 +89,9 @@
 static DB *chaindb;
 static int nchain = 0;
 static DB *stringdb;
-static struct symbol *prev_weight_table[COLL_WEIGHTS_MAX];
-static struct symbol *prev2_weight_table[COLL_WEIGHTS_MAX];
-static struct symbol *weight_table[COLL_WEIGHTS_MAX];
+static struct symbol prev_weight_table[COLL_WEIGHTS_MAX];
+static struct symbol prev2_weight_table[COLL_WEIGHTS_MAX];
+static struct symbol weight_table[COLL_WEIGHTS_MAX];
 static int prev_line = LINE_NONE;
 static struct symbol *prev_elem;
 static int weight_index = 0;
@@ -548,7 +548,7 @@
 			yyerror("Can't specify weights for collating symbol <%s>", showwcs($1, CHARMAP_SYMBOL_LEN));
 	} else if (weight_index == 0) {
 		for(i = 0; i < directive_count; i++)
-			weight_table[i] = s;
+			weight_table[i] = *s;
 	} else if (weight_index != directive_count)
 		yyerror("Not enough weights specified");
 	memcpy(prev_weight_table, weight_table, sizeof(weight_table));
@@ -565,13 +565,13 @@
 		yyerror("Ellipsis line must follow a collating identifier lines");
 	if (weight_index == 0) {
 		for(i = 0; i < directive_count; i++)
-			weight_table[i] = &sym_ellipsis;
+			weight_table[i] = sym_ellipsis;
 	} else if (weight_index != directive_count)
 		yyerror("Not enough weights specified");
 	for(i = 0; i < directive_count; i++) {
-		if (weight_table[i]->type != SYMBOL_ELLIPSIS)
+		if (weight_table[i].type != SYMBOL_ELLIPSIS)
 			continue;
-		switch (prev_weight_table[i]->type) {
+		switch (prev_weight_table[i].type) {
 		case SYMBOL_CHAIN:
 			yyerror("Startpoint of ellipsis can't be a collating element");
 		case SYMBOL_IGNORE:
@@ -596,9 +596,9 @@
 }				 weights {
 	int i;
 	if (weight_index == 0) {
-		weight_table[0] = &sym_undefined;
+		weight_table[0] = sym_undefined;
 		for(i = 1; i < directive_count; i++)
-			weight_table[i] = &sym_ellipsis;
+			weight_table[i] = sym_ellipsis;
 	} else if (weight_index != directive_count)
 		yyerror("Not enough weights specified");
 	memcpy(prev_weight_table, weight_table, sizeof(weight_table));
@@ -620,13 +620,13 @@
 			yyerror("Can't specify weights for collating symbol <%s>", showwcs($1, CHARMAP_SYMBOL_LEN));
 	} else if (weight_index == 0) {
 		for(i = 0; i < directive_count; i++)
-			weight_table[i] = s;
+			weight_table[i] = *s;
 	} else if (weight_index != directive_count)
 		yyerror("Not enough weights specified");
 	if (prev_line == LINE_ELLIPSIS) {
 		int w, x;
 		for(i = 0; i < directive_count; i++) {
-			switch (prev_weight_table[i]->type) {
+			switch (prev_weight_table[i].type) {
 			case SYMBOL_CHAR:
 			case SYMBOL_CHAIN:
 			case SYMBOL_IGNORE:
@@ -635,12 +635,12 @@
 					struct __collate_st_char_pri *p = getpri(w);
 					if (p->pri[i] != PRI_UNDEFINED)
 						yyerror("Char 0x%02x previously defined", w);
-					p->pri[i] = prev_weight_table[i]->val;
+					p->pri[i] = prev_weight_table[i].val;
 				}
 				break;
 			case SYMBOL_ELLIPSIS:
 
-				switch (weight_table[i]->type) {
+				switch (weight_table[i].type) {
 				case SYMBOL_STRING:
 					yyerror("Strings can't be endpoints of ellipsis");
 				case SYMBOL_CHAIN:
@@ -650,9 +650,9 @@
 				case SYMBOL_SYMBOL:
 					yyerror("Collation symbols can't be endpoints of ellipsis");
 				}
-				if (s->val - prev_elem->val != weight_table[i]->val - prev2_weight_table[i]->val)
+				if (s->val - prev_elem->val != weight_table[i].val - prev2_weight_table[i].val)
 					yyerror("Range mismatch in weight %d", i);
-				x = prev2_weight_table[i]->val + 1;
+				x = prev2_weight_table[i].val + 1;
 				for (w = prev_elem->u.wc + 1; w < s->u.wc; w++) {
 					struct __collate_st_char_pri *p = getpri(w);
 					if (p->pri[i] != PRI_UNDEFINED)
@@ -665,8 +665,8 @@
 					struct __collate_st_char_pri *p = getpri(w);
 					if (p->pri[i] != PRI_UNDEFINED)
 						yyerror("Char 0x%02x previously defined", w);
-					putsubst(w, i, prev_weight_table[i]->u.str);
-					p->pri[i] = prev_weight_table[i]->val;
+					putsubst(w, i, prev_weight_table[i].u.str);
+					p->pri[i] = prev_weight_table[i].val;
 				}
 				break;
 			}
@@ -676,20 +676,20 @@
 	case SYMBOL_CHAR: {
 		struct __collate_st_char_pri *p = getpri(s->u.wc);
 		for(i = 0; i < directive_count; i++) {
-			switch (weight_table[i]->type) {
+			switch (weight_table[i].type) {
 			case SYMBOL_CHAR:
 			case SYMBOL_CHAIN:
 			case SYMBOL_IGNORE:
 			case SYMBOL_SYMBOL:
 				if (p->pri[i] != PRI_UNDEFINED)
 					yyerror("Char 0x%02x previously defined", s->u.wc);
-				p->pri[i] = weight_table[i]->val;
+				p->pri[i] = weight_table[i].val;
 				break;
 			case SYMBOL_STRING:
 				if (p->pri[i] != PRI_UNDEFINED)
 					yyerror("Char 0x%02x previously defined", s->u.wc);
-				putsubst(s->u.wc, i, weight_table[i]->u.str);
-				p->pri[i] = weight_table[i]->val;
+				putsubst(s->u.wc, i, weight_table[i].u.str);
+				p->pri[i] = weight_table[i].val;
 				break;
 			}
 		}
@@ -698,24 +698,24 @@
 	case SYMBOL_CHAIN: {
 		struct __collate_st_chain_pri *p = getchain(s->u.str, EXISTS);
 		for(i = 0; i < directive_count; i++) {
-			switch (weight_table[i]->type) {
+			switch (weight_table[i].type) {
 			case SYMBOL_CHAR:
 			case SYMBOL_CHAIN:
 			case SYMBOL_IGNORE:
 			case SYMBOL_SYMBOL:
 				if (p->pri[i] != PRI_UNDEFINED)
 					yyerror("Chain %s previously defined", showwcs(s->u.str, STR_LEN));
-				p->pri[i] = weight_table[i]->val;
+				p->pri[i] = weight_table[i].val;
 				break;
 			case SYMBOL_STRING :
-				if (wcsncmp(s->u.str, weight_table[i]->u.str, STR_LEN) != 0)
+				if (wcsncmp(s->u.str, weight_table[i].u.str, STR_LEN) != 0)
 					yyerror("Chain/string mismatch");
 				if (p->pri[i] != PRI_UNDEFINED)
 					yyerror("Chain %s previously defined", showwcs(s->u.str, STR_LEN));
 				/* negative value mean don't substitute
 				 * the chain, but it is in an
 				 * equivalence class */
-				p->pri[i] = -weight_table[i]->val;
+				p->pri[i] = -weight_table[i].val;
 			}
 		}
 		break;
@@ -735,13 +735,13 @@
 		yyerror("Ellipsis line must follow a collating identifier lines");
 	if (weight_index == 0) {
 		for(i = 0; i < directive_count; i++)
-			weight_table[i] = &sym_ellipsis;
+			weight_table[i] = sym_ellipsis;
 	} else if (weight_index != directive_count)
 		yyerror("Not enough weights specified");
 	for(i = 0; i < directive_count; i++) {
-		if (weight_table[i]->type != SYMBOL_ELLIPSIS)
+		if (weight_table[i].type != SYMBOL_ELLIPSIS)
 			continue;
-		switch (prev_weight_table[i]->type) {
+		switch (prev_weight_table[i].type) {
 		case SYMBOL_CHAIN:
 			yyerror("Startpoint of ellipsis can't be a collating element");
 		case SYMBOL_IGNORE:
@@ -761,18 +761,18 @@
 	int i;
 
 	if (weight_index == 0) {
-		weight_table[0] = &sym_undefined;
+		weight_table[0] = sym_undefined;
 		for(i = 1; i < directive_count; i++)
-			weight_table[i] = &sym_ellipsis;
+			weight_table[i] = sym_ellipsis;
 	} else if (weight_index != directive_count)
 		yyerror("Not enough weights specified");
 	for(i = 0; i < directive_count; i++) {
-		switch (weight_table[i]->type) {
+		switch (weight_table[i].type) {
 		case SYMBOL_CHAR:
 		case SYMBOL_CHAIN:
 		case SYMBOL_IGNORE:
 		case SYMBOL_SYMBOL:
-			info.undef_pri[i] = weight_table[i]->val;
+			info.undef_pri[i] = weight_table[i].val;
 			break;
 		case SYMBOL_ELLIPSIS :
 			/* Negative values mean that the priority is
@@ -815,19 +815,19 @@
 		yyerror("More weights than specified by order_start");
 	if (!allow_ellipsis)
 		yyerror("Ellipsis weight not allowed");
-	weight_table[weight_index++] = &sym_ellipsis;
+	weight_table[weight_index++] = sym_ellipsis;
 }
 	| IGNORE {
 	if (weight_index >= directive_count)
 		yyerror("More weights than specified by order_start");
-	weight_table[weight_index++] = &sym_ignore;
+	weight_table[weight_index++] = sym_ignore;
 }
 	| STRING {
 	if (weight_index >= directive_count)
 		yyerror("More weights than specified by order_start");
 	if (wcslen($1) > STR_LEN)
 		yyerror("String '%s' is too long", showwcs($1, STR_LEN));
-	weight_table[weight_index++] = getstring($1);
+	weight_table[weight_index++] = *getstring($1);
 }
 ;
 weight_ex1 : weight_ex { weight_index++; }
@@ -841,7 +841,7 @@
 	s = getsymbol($1, EXISTS);
 	if (order_pass && s->val == PRI_UNDEFINED)
 		printf("<%s> is undefined\n", showwcs($1, CHARMAP_SYMBOL_LEN));
-	weight_table[weight_index] = s;
+	weight_table[weight_index] = *s;
 }
 ;
 weight_ex_null : ELEM {
@@ -853,6 +853,7 @@
 	s = getsymbol($1, EXISTS);
 	if (order_pass && s->val == PRI_UNDEFINED)
 		printf("<%s> is undefined\n", showwcs($1, CHARMAP_SYMBOL_LEN));
+	weight_table[weight_index].val += s->val;
 }
 ;
 order_end : ORDER_END '\n'
@@ -1449,6 +1450,8 @@
 		struct __collate_st_large_char_pri *p2 = __collate_large_char_pri_table;
 		printf("Large priority table:\n");
 		for (i = info.large_pri_count; i-- > 0; p2++) {
+			if (p2->val == 0)
+				break;
 			printf("\t%s :", show(ntohl(p2->val)));
 			for(z = 0; z < info.directive_count; z++)
 				printf(" %d", ntohl(p2->pri.pri[z]));



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200808191450.m7JEoLj2034351>