yacc.y.patch   [plain text]


--- yacc.y.orig	2004-10-30 17:17:05.000000000 -0700
+++ yacc.y	2004-10-31 00:03:45.000000000 -0700
@@ -237,7 +237,7 @@
 	case 'o':
 	    locale_file = optarg;
 	    if ((fp = fopen(locale_file, "w")) == 0)
-		err(1, "%s", locale_file);
+		err(1, "%s: fopen", locale_file);
 	    atexit(cleanout);
 	    break;
 	default:
@@ -250,7 +250,7 @@
 	break;
     case 1:
 	if (freopen(av[optind], "r", stdin) == 0)
-	    err(1, "%s", av[optind]);
+	    err(1, "%s: freopen", av[optind]);
 	break;
     default:
 	usage();
@@ -651,10 +651,8 @@
     /*
      * PART 1: The _RuneLocale structure
      */
-    if (fwrite((char *)&new_locale, sizeof(new_locale), 1, fp) != 1) {
-	perror(locale_file);
-	exit(1);
-    }
+    if (fwrite((char *)&new_locale, sizeof(new_locale), 1, fp) != 1)
+	err(1, "%s: _RuneLocale structure", locale_file);
     /*
      * PART 2: The runetype_ext structures (not the actual tables)
      */
@@ -667,10 +665,8 @@
 	re.__max = htonl(list->max);
 	re.__map = htonl(list->map);
 
-	if (fwrite((char *)&re, sizeof(re), 1, fp) != 1) {
-	    perror(locale_file);
-	    exit(1);
-	}
+	if (fwrite((char *)&re, sizeof(re), 1, fp) != 1)
+	    err(1, "%s: runetype_ext structures", locale_file);
 
         list = list->next;
     }
@@ -686,10 +682,8 @@
 	re.__max = htonl(list->max);
 	re.__map = htonl(list->map);
 
-	if (fwrite((char *)&re, sizeof(re), 1, fp) != 1) {
-	    perror(locale_file);
-	    exit(1);
-	}
+	if (fwrite((char *)&re, sizeof(re), 1, fp) != 1)
+	    err(1, "%s: maplower_ext structures", locale_file);
 
         list = list->next;
     }
@@ -705,10 +699,8 @@
 	re.__max = htonl(list->max);
 	re.__map = htonl(list->map);
 
-	if (fwrite((char *)&re, sizeof(re), 1, fp) != 1) {
-	    perror(locale_file);
-	    exit(1);
-	}
+	if (fwrite((char *)&re, sizeof(re), 1, fp) != 1)
+	    err(1, "%s: mapupper_ext structures", locale_file);
 
         list = list->next;
     }
@@ -724,25 +716,20 @@
 	if (!list->map) {
 	    if (fwrite((char *)list->types,
 		       (list->max - list->min + 1) * sizeof(unsigned long),
-		       1, fp) != 1) {
-		perror(locale_file);
-		exit(1);
-	    }
+		       1, fp) != 1)
+		err(1, "%s: runetype_ext tables", locale_file);
 	}
         list = list->next;
     }
     /*
      * PART 5: And finally the variable data
+     * SUSv3 says fwrite returns zero when either size of nitems is zero.
      */
-    if (fwrite((char *)new_locale.__variable,
-	       ntohl(new_locale.__variable_len), 1, fp) != 1) {
-	perror(locale_file);
-	exit(1);
-    }
-    if (fclose(fp) != 0) {
-	perror(locale_file);
-	exit(1);
-    }
+    if (ntohl(new_locale.__variable_len) > 0 && fwrite((char *)new_locale.__variable,
+	       ntohl(new_locale.__variable_len), 1, fp) != 1)
+	err(1, "%s: variable data", locale_file);
+    if (fclose(fp) != 0)
+	err(1, "%s: fclose", locale_file);
     fp = NULL;
 
     if (!debug)