Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 2 Sep 2008 08:29:53 GMT
From:      Konrad Jankowski <konrad@FreeBSD.org>
To:        Perforce Change Reviews <perforce@FreeBSD.org>
Subject:   PERFORCE change 149051 for review
Message-ID:  <200809020829.m828TrpM039961@repoman.freebsd.org>

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

Change 149051 by konrad@vspredator on 2008/09/02 08:29:17

	Incremental changes to collate.c for new expansion support.
	Also a cleanup of __collate_load_tables.

Affected files ...

.. //depot/projects/soc2008/konrad_collation/libc/locale/collate.c#10 edit

Differences ...

==== //depot/projects/soc2008/konrad_collation/libc/locale/collate.c#10 (text+ko) ====

@@ -70,7 +70,7 @@
 	FILE *fp;
 	int i, saverr, chains, z;
 	char strbuf[STR_LEN], buf[PATH_MAX];
-	struct __locale_st_collate *TMP;
+	struct __locale_st_collate *TMP = NULL;
 	struct __collate_st_info info;
 	void *vp;
 
@@ -104,64 +104,44 @@
 	if ((fp = fopen(buf, "r")) == NULL)
 		return (_LDP_ERROR);
 
-	if (fread(strbuf, sizeof(strbuf), 1, fp) != 1) {
-		saverr = errno;
-		(void)fclose(fp);
-		errno = saverr;
-		return (_LDP_ERROR);
-	}
-	chains = -1;
-	if (strcmp(strbuf, COLLATE_VERSION1_3) == 0)
-		chains = 1;
-	if (chains < 0) {
+	if (fread(strbuf, sizeof(strbuf), 1, fp) != 1)
+		goto error_close_and_return;
+	if (strcmp(strbuf, COLLATE_VERSION1_4) != 0) {
 		fprintf(stderr, "__collate_load_tables: wrong signature: %s\n", strbuf);
-		(void)fclose(fp);
 		errno = EFTYPE;
-		return (_LDP_ERROR);
+		goto error_close_and_return;
 	}
-	if (chains) {
-		if (fread(&info, sizeof(info), 1, fp) != 1) {
-			saverr = errno;
-			(void)fclose(fp);
-			errno = saverr;
-			return (_LDP_ERROR);
-		}
+	if (fread(&info, sizeof(info), 1, fp) != 1)
+		goto error_close_and_return;
 #if _BYTE_ORDER == _LITTLE_ENDIAN
-		for(z = 0; z < info.directive_count; z++) {
-			info.undef_pri.pri[z] = ntohl(info.undef_pri.pri[z]);
-			info.subst_count[z] = ntohl(info.subst_count[z]);
-		}
-		info.chain_count = ntohl(info.chain_count);
-		info.large_pri_count = ntohl(info.large_pri_count);
+	for(z = 0; z < info.directive_count; z++) {
+		info.undef_pri.pri[z] = ntohl(info.undef_pri.pri[z]);
+		info.subst_count[z] = ntohl(info.subst_count[z]);
+	}
+	info.chain_count = ntohl(info.chain_count);
+	info.large_pri_count = ntohl(info.large_pri_count);
 #endif /* _BYTE_ORDER == _LITTLE_ENDIAN */
-		if ((chains = info.chain_count) < 0) {
-			(void)fclose(fp);
-			errno = EFTYPE;
-			return (_LDP_ERROR);
-		}
-	} else
-		chains = TABLE_SIZE;
+	if ((chains = info.chain_count) < 0) {
+#ifdef LOCALE_DEBUG
+		fprintf(stderr, "__collate_load_tables: wrong chain count (%d)\n",
+		    chains);
+#endif
+		errno = EFTYPE;
+		goto error_close_and_return;
+	}
 
 	i = sizeof(struct __locale_st_collate)
 	    + sizeof(struct __collate_st_chain_pri) * chains
 	    + sizeof(struct __collate_st_large_char_pri) * info.large_pri_count;
 	for(z = 0; z < info.directive_count; z++)
 		i += sizeof(struct __collate_st_subst) * info.subst_count[z];
-	if ((TMP = (struct __locale_st_collate *)malloc(i)) == NULL) {
-		saverr = errno;
-		(void)fclose(fp);
-		errno = saverr;
-		return (_LDP_ERROR);
-	}
+	if ((TMP = (struct __locale_st_collate *)malloc(i)) == NULL)
+		goto error_close_and_return;
 
 #define FREAD(a, b, c, d) \
 { \
 	if (fread(a, b, c, d) != c) { \
-		saverr = errno; \
-		free(TMP); \
-		(void)fclose(d); \
-		errno = saverr; \
-		return (_LDP_ERROR); \
+		goto error_close_and_return; \
 	} \
 }
 
@@ -251,6 +231,15 @@
 		__collate_info->directive_count = COLL_WEIGHTS_MAX;
 
 	return (_LDP_LOADED);
+
+    error_close_and_return:
+	saverr = errno;
+	(void)fclose(fp);
+	if (TMP)
+		free(TMP);
+	errno = saverr;
+
+	return (_LDP_ERROR);
 }
 
 static int
@@ -564,7 +553,7 @@
 		xfp = xf[pass];
 		if (direc & DIRECTIVE_POSITION) {
 			while(*t) {
-				__collate_lookup_which(t, &len, &pri, pass);
+				pri = __collate_lookup(t, &len)->pri[pass];
 				t += len;
 				if (pri <= 0) {
 					if (pri < 0) {
@@ -578,7 +567,7 @@
 			}
 		} else {
 			while(*t) {
-				__collate_lookup_which(t, &len, &pri, pass);
+				pri = __collate_lookup(t, &len)->pri[pass];
 				t += len;
 				if (pri <= 0) {
 					if (pri < 0) {



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