home *** CD-ROM | disk | FTP | other *** search
/ Serving the Web / ServingTheWeb1995.disc1of1.iso / linux / slacksrce / d / libc / libc-4.6 / libc-4 / libc-linux / locale / collate / mkcollate.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-03-18  |  3.8 KB  |  231 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <getopt.h>
  5. #include <locale.h>
  6. #include <localeinfo.h>
  7.  
  8. #include "mkcollate.h"
  9.  
  10. extern int yyparse (void);
  11.  
  12. int check_order (mkorder_t *, int);
  13. int write_out (unsigned char *);
  14.  
  15. void grok_order (void);
  16.  
  17. unsigned char cvalues[UCHAR_MAX + 1];
  18. unsigned char coffsets[UCHAR_MAX + 1];
  19.  
  20. struct collate_info cinfo =
  21. {
  22.   0,
  23.   NULL,
  24.   cvalues,
  25.   coffsets
  26. };
  27.  
  28. mksub_t *substitutions = NULL;
  29. mksub_t *last_sub = NULL;
  30. int nsubs = 0;
  31.  
  32. mkorder_t *order = NULL;
  33.  
  34. unsigned char *codename;
  35.  
  36. int
  37. main (int argc, char *argv[])
  38. {
  39.   int i;
  40.   unsigned char *outname = "LC_COLLATE";
  41.  
  42.   while ((i = getopt (argc, argv, "o:")) != EOF)
  43.     {
  44.       switch (i)
  45.     {
  46.     case 'o':
  47.       outname = optarg;
  48.       break;
  49.     }
  50.     }
  51.  
  52.   if (argc - optind > 1)
  53.     {
  54.       (void) fprintf (stderr, "Usage: %s [-o out_file_name] [file]\n", argv[0]);
  55.       return 3;
  56.     }
  57.   else if ((argc - optind) == 1)
  58.     {
  59.       if (freopen (argv[optind], "r", stdin) == NULL)
  60.     {
  61.       perror (argv[optind]);
  62.       return 2;
  63.     }
  64.     }
  65.  
  66.   if (yyparse ())
  67.     return 1;
  68.  
  69.   if (nsubs)
  70.     (void) fprintf (stderr, "Warning: substitutions ignored\n");
  71.  
  72.   for (i = 0; i <= UCHAR_MAX; i++)
  73.     {
  74.       cvalues[i] = UCHAR_MAX;
  75.       coffsets[i] = '\0';
  76.     }
  77.  
  78.   if (!check_order (order, 0))
  79.     return 1;
  80.  
  81.   grok_order ();
  82.  
  83.   return !write_out (outname);
  84. }
  85.  
  86. int
  87. check_order (mkorder_t * node, int dep)
  88. {
  89.   int res = 1;
  90.  
  91.   while (node != NULL)
  92.     {
  93.       switch (node->node_type)
  94.     {
  95.     case range:
  96.       if (strlen (node->low) != 1 || strlen (node->top) != 1)
  97.         {
  98.           (void) fprintf (stderr, "Can't handle multibytes (%s;...;%s)\n",
  99.                   node->low, node->top);
  100.           res = 0;
  101.         }
  102.       if (*(node->low) > *(node->top))
  103.         {
  104.           (void) fprintf (stderr, "Invalid range (%s;...;%s)\n",
  105.                   node->low, node->top);
  106.           res = 0;
  107.         }
  108.       break;
  109.  
  110.     case primary_only:
  111.     case secondary:
  112.       if (dep)
  113.         {
  114.           (void) fprintf (stderr, "Overnested order list\n");
  115.           res = 0;
  116.         }
  117.       else if (!check_order (node->extra, !dep))
  118.         res = 0;
  119.       break;
  120.     }
  121.       node = node->next;
  122.     }
  123.   return res;
  124. }
  125.  
  126. void
  127. grok_order ()
  128. {
  129.   mkorder_t *node = order;
  130.   unsigned char p_order = 1;
  131.  
  132.   while (node != NULL)
  133.     {
  134.       switch (node->node_type)
  135.     {
  136.     case range:
  137.       {
  138.         unsigned int i = *node->low;
  139.  
  140.         for (; i <= *node->top; i++)
  141.           {
  142.         cvalues[i] = p_order++;
  143.         coffsets[i] = 0;
  144.           }
  145.       }
  146.       break;
  147.  
  148.     case primary_only:
  149.       {
  150.         mkorder_t *node2 = node->extra;
  151.  
  152.         while (node2 != NULL)
  153.           {
  154.         switch (node2->node_type)
  155.           {
  156.           case range:
  157.             {
  158.               unsigned int i2 = *node2->low;
  159.  
  160.               for (; i2 <= *node2->top; i2++)
  161.             {
  162.               cvalues[i2] = p_order;
  163.               coffsets[i2] = 0;
  164.             }
  165.             }
  166.             break;
  167.  
  168.           default:
  169.             (void) fprintf (stderr, "Should not happens\n");
  170.             exit (4);
  171.           }
  172.         node2 = node2->next;
  173.           }
  174.       }
  175.       p_order++;
  176.       break;
  177.  
  178.     case secondary:
  179.       {
  180.         unsigned char s_order = 1;
  181.         mkorder_t *node3 = node->extra;
  182.  
  183.         while (node3 != NULL)
  184.           {
  185.         switch (node3->node_type)
  186.           {
  187.           case range:
  188.             {
  189.               unsigned int i3 = *node3->low;
  190.  
  191.               for (; i3 <= *node3->top; i3++)
  192.             {
  193.               cvalues[i3] = p_order;
  194.               coffsets[i3] = s_order++;
  195.             }
  196.             }
  197.             break;
  198.  
  199.           default:
  200.             (void) fprintf (stderr, "Should not happens\n");
  201.             exit (4);
  202.           }
  203.         node3 = node3->next;
  204.           }
  205.       }
  206.       p_order++;
  207.       break;
  208.     }
  209.       node = node->next;
  210.     }
  211. }
  212.  
  213. int
  214. write_out (outname)
  215.      unsigned char *outname;
  216. {
  217.   FILE *ofp = fopen (outname, "w");
  218.  
  219.   if (ofp == NULL)
  220.     return 0;
  221.  
  222.   (void) fwrite (cvalues, sizeof (cvalues), 1, ofp);
  223.   (void) fwrite (coffsets, sizeof (coffsets), 1, ofp);
  224.   (void) fwrite (&cinfo.nsubsts, sizeof (cinfo.nsubsts), 1, ofp);
  225. #ifndef NOGUARD
  226.   (void) fwrite (codename, sizeof (unsigned char), strlen (codename) + 1, ofp);
  227. #endif
  228.   (void) fclose (ofp);
  229.   return 1;
  230. }
  231.