for (cat = LC_COLLATE; cat <= LC_MESSAGES; ++cat)
for (cat = LC_CTYPE; cat <= LC_MESSAGES; ++cat)
main (int argc, char *argv[]){  int optchar;  int do_help = 0;  int do_version = 0;  int force_output = 0;  const char *charmap_file = NULL;  const char *input_file = NULL;  const char *ucs_csn = NULL;  const char *output_path;  int cannot_write_why;  struct charset_t *charset;  struct localedef_t *localedef;  struct copy_def_list_t *act_add_locdef;  /* Set initial values for global varaibles.  */  copy_list = NULL;  posix_conformance = getenv ("POSIXLY_CORRECT") != NULL;  program_name = argv[0];  error_print_progname = error_print;  verbose = 0;  /* Set locale.  Do not set LC_ALL because the other categories must     not be affected (acccording to POSIX.2).  */  setlocale (LC_MESSAGES, "");  setlocale (LC_CTYPE, "");  /* Initialize the message catalog.  */#if 0  /* In the final version for glibc we can use the variable.  */  textdomain (_libc_intl_domainname);#else  textdomain ("SYS_libc");#endif  while ((optchar = getopt_long (argc, argv, "cf:hi:u:vV", long_options, NULL))         != EOF)    switch (optchar)      {      case '\0':		/* Long option.  */        break;      case 'c':	force_output = 1;	break;      case 'f':        charmap_file = optarg;        break;      case 'h':        do_help = 1;        break;      case 'i':	input_file = optarg;        break;      case 'u':	ucs_csn = optarg;	break;	case 'v':        verbose = 1;        break;      case 'V':        do_version = 1;        break;      default:        usage (4);	/* A value >3 is forced by POSIX.  */        break;      }  /* POSIX.2 requires to be verbose about missing characters in the     character map.  */  verbose |= posix_conformance;  /* Version information is requested.  */  if (do_version)    {      fprintf (stderr, "%s - GNU %s %s\n", program_name, PACKAGE, VERSION);      exit (0);    }  /* Help is requested.  */  if (do_help)    /* Possible violation: POSIX.2 4.35.8 defines the return value 0 as       "No errors occured and the locale(s) were successfully created."       But giving a other value than 0 does not make sense here.  It       is perhaps not that important because POSIX does not specify the       -h option for localedef.  */    usage (0);  if (argc - optind != 1)    /* We need exactly one non-option parameter.  */    usage (4);  /* The parameter describes the output path of the constructed files.     If the described files cannot be written return a NULL pointer.  */  output_path  = construct_output_path (argv[optind]);  cannot_write_why = errno;  /* Now that the parameters are processed we have to reset the local     ctype locale.  (P1003.2 4.35.5.2)  */  setlocale (LC_CTYPE, "POSIX");  /* Look whether the system really allows locale definitions.  POSIX     defines error code 3 for this situation so I think it must be     a fatal error (see P1003.2 4.35.8).  */  if (sysconf (_SC_2_LOCALEDEF) < 0)    error (3, 0, _("FATAL: system does not define `_POSIX2_LOCALEDEF'"));  /* Process charmap file.  */  charset = charmap_read (charmap_file);  /* Now read the locale file.  */  localedef = locfile_read (input_file, charset);  if (localedef->failed != 0)    error (4, errno, _("cannot open locale definition file `%s'"), input_file);  /* Perhaps we saw some `copy' instructions.  Process the given list.     We use a very simple algorithm: we look up the list from the     beginning every time.  */  do    {      int cat;      for (act_add_locdef = copy_list; act_add_locdef != NULL;	   act_add_locdef = act_add_locdef->next)	{	  for (cat = LC_COLLATE; cat <= LC_MESSAGES; ++cat)	    if ((act_add_locdef->mask & (1 << cat)) != 0)	      {		act_add_locdef->mask &= ~(1 << cat);		break;	      }	  if (cat <= LC_MESSAGES)	    break;	}      if (act_add_locdef != NULL)	{	  int avail = 0;	  if (act_add_locdef->locale == NULL)	    act_add_locdef->locale = locfile_read (act_add_locdef->name,						   charset);	  if (! act_add_locdef->locale->failed)	    {	      avail = act_add_locdef->locale->categories[cat].generic != NULL;	      if (avail)		localedef->categories[cat].generic		  = act_add_locdef->locale->categories[cat].generic;	    }	  if (! avail)	    {	      const char *locale_names[] = { "LC_COLLATE", "LC_CTYPE",					     "LC_MONETARY", "LC_NUMERIC",					     "LC_TIME", "LC_MESSAGES" };	      char *fname;	      int fd;	      struct stat st;	      asprintf (&fname, LOCALE_PATH "/%s/%s", act_add_locdef->name,			locale_names[cat]);	      fd = open (fname, O_RDONLY);	      if (fd == -1)		{		  free (fname);		  asprintf (&fname, LOCALE_PATH "/%s/%s/SYS_%s",			    act_add_locdef->name, locale_names[cat],			    locale_names[cat]);		  fd = open (fname, O_RDONLY);		  if (fd == -1)		    error (5, 0, _("\locale file `%s', used in `copy' statement, not found"),			   act_add_locdef->name);		}	      if (fstat (fd, &st) < 0)		error (5, errno, _("\cannot `stat' locale file `%s'"),		       fname);	      localedef->len[cat] = st.st_size;	      localedef->categories[cat].generic		= mmap (NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0);	      if (localedef->categories[cat].generic == (void *) -1)		{		  size_t left = st.st_size;		  void *read_ptr;		  localedef->categories[cat].generic		    = xmalloc (st.st_size);		  read_ptr = localedef->categories[cat].generic;		  do		    {		      long int n;		      n = read (fd, read_ptr, left);		      if (n == 1)			error (5, errno, _("cannot read locale file `%s'"),			       fname);		      read_ptr += n;		      left -= n;		    }		  while (left > 0);		}	      close (fd);	      free (fname);	      localedef->binary |= 1 << cat;	    }	}    }  while (act_add_locdef != NULL);  /* Check the categories we processed in source form.  */  check_all_categories (localedef, charset);  /* We are now able to write the data files.  If warning were given we     do it only if it is explicitly requested (--force).  */  if (error_message_count == 0 || force_output != 0)    {      if (cannot_write_why != 0)	error (4, cannot_write_why, _("cannot write output files to `%s'"),	       output_path);      else	write_all_categories (localedef, output_path);    }  else    error (4, 0, _("no output file produced because warning were issued"));  /* This exit status is prescribed by POSIX.2 4.35.7.  */  exit (error_message_count != 0);}