Home | History | Annotate | Line # | Download | only in mklocale
yacc.y revision 1.7
      1  1.7       tv /*	$NetBSD: yacc.y,v 1.7 2002/01/29 10:20:35 tv Exp $	*/
      2  1.2   itojun 
      3  1.2   itojun %{
      4  1.2   itojun /*-
      5  1.2   itojun  * Copyright (c) 1993
      6  1.2   itojun  *	The Regents of the University of California.  All rights reserved.
      7  1.2   itojun  *
      8  1.2   itojun  * This code is derived from software contributed to Berkeley by
      9  1.2   itojun  * Paul Borman at Krystal Technologies.
     10  1.2   itojun  *
     11  1.2   itojun  * Redistribution and use in source and binary forms, with or without
     12  1.2   itojun  * modification, are permitted provided that the following conditions
     13  1.2   itojun  * are met:
     14  1.2   itojun  * 1. Redistributions of source code must retain the above copyright
     15  1.2   itojun  *    notice, this list of conditions and the following disclaimer.
     16  1.2   itojun  * 2. Redistributions in binary form must reproduce the above copyright
     17  1.2   itojun  *    notice, this list of conditions and the following disclaimer in the
     18  1.2   itojun  *    documentation and/or other materials provided with the distribution.
     19  1.2   itojun  * 3. All advertising materials mentioning features or use of this software
     20  1.2   itojun  *    must display the following acknowledgement:
     21  1.2   itojun  *	This product includes software developed by the University of
     22  1.2   itojun  *	California, Berkeley and its contributors.
     23  1.2   itojun  * 4. Neither the name of the University nor the names of its contributors
     24  1.2   itojun  *    may be used to endorse or promote products derived from this software
     25  1.2   itojun  *    without specific prior written permission.
     26  1.2   itojun  *
     27  1.2   itojun  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
     28  1.2   itojun  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     29  1.2   itojun  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     30  1.2   itojun  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
     31  1.2   itojun  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     32  1.2   itojun  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     33  1.2   itojun  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     34  1.2   itojun  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     35  1.2   itojun  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     36  1.2   itojun  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     37  1.2   itojun  * SUCH DAMAGE.
     38  1.2   itojun  */
     39  1.2   itojun 
     40  1.7       tv #if HAVE_CONFIG_H
     41  1.7       tv #include "config.h"
     42  1.7       tv #else
     43  1.7       tv #define HAVE_ERR_H 1
     44  1.7       tv #endif
     45  1.7       tv 
     46  1.2   itojun #include <sys/cdefs.h>
     47  1.3   itojun #if defined(LIBC_SCCS) && !defined(lint)
     48  1.2   itojun #if 0
     49  1.2   itojun static char sccsid[] = "@(#)yacc.y	8.1 (Berkeley) 6/6/93";
     50  1.2   itojun static char rcsid[] = "$FreeBSD$";
     51  1.2   itojun #else
     52  1.7       tv __RCSID("$NetBSD: yacc.y,v 1.7 2002/01/29 10:20:35 tv Exp $");
     53  1.2   itojun #endif
     54  1.3   itojun #endif /* LIBC_SCCS and not lint */
     55  1.2   itojun 
     56  1.2   itojun #include <ctype.h>
     57  1.2   itojun #if !defined(__FreeBSD__)
     58  1.2   itojun #define _BSD_RUNE_T_    int
     59  1.2   itojun #define _BSD_CT_RUNE_T_ rune_t
     60  1.2   itojun #include "rune.h"
     61  1.2   itojun #else
     62  1.2   itojun #include <rune.h>
     63  1.2   itojun #endif
     64  1.2   itojun #include <stddef.h>
     65  1.2   itojun #include <stdio.h>
     66  1.2   itojun #include <stdlib.h>
     67  1.2   itojun #include <string.h>
     68  1.2   itojun #include <unistd.h>
     69  1.2   itojun 
     70  1.2   itojun #include "ldef.h"
     71  1.7       tv 
     72  1.7       tv #if HAVE_ERR_H
     73  1.7       tv #include <err.h>
     74  1.7       tv #endif
     75  1.2   itojun 
     76  1.4  thorpej const char	*locale_file = "<stdout>";
     77  1.2   itojun 
     78  1.2   itojun rune_map	maplower = { { 0, }, };
     79  1.2   itojun rune_map	mapupper = { { 0, }, };
     80  1.2   itojun rune_map	types = { { 0, }, };
     81  1.2   itojun 
     82  1.2   itojun _RuneLocale	new_locale = { { 0, }, };
     83  1.2   itojun 
     84  1.2   itojun rune_t		charsetbits = (rune_t)0x00000000;
     85  1.2   itojun #if 0
     86  1.2   itojun rune_t		charsetmask = (rune_t)0x0000007f;
     87  1.2   itojun #endif
     88  1.2   itojun rune_t		charsetmask = (rune_t)0xffffffff;
     89  1.2   itojun 
     90  1.2   itojun void set_map __P((rune_map *, rune_list *, u_int32_t));
     91  1.2   itojun void set_digitmap __P((rune_map *, rune_list *));
     92  1.2   itojun void add_map __P((rune_map *, rune_list *, u_int32_t));
     93  1.2   itojun 
     94  1.2   itojun int		main __P((int, char *[]));
     95  1.2   itojun int		yyerror __P((const char *s));
     96  1.2   itojun void		*xmalloc __P((unsigned int sz));
     97  1.2   itojun u_int32_t	*xlalloc __P((unsigned int sz));
     98  1.2   itojun u_int32_t	*xrelalloc __P((u_int32_t *old, unsigned int sz));
     99  1.2   itojun void		dump_tables __P((void));
    100  1.2   itojun int		yyparse __P((void));
    101  1.2   itojun extern int	yylex __P((void));
    102  1.2   itojun %}
    103  1.2   itojun 
    104  1.2   itojun %union	{
    105  1.2   itojun     rune_t	rune;
    106  1.2   itojun     int		i;
    107  1.2   itojun     char	*str;
    108  1.2   itojun 
    109  1.2   itojun     rune_list	*list;
    110  1.2   itojun }
    111  1.2   itojun 
    112  1.2   itojun %token	<rune>	RUNE
    113  1.2   itojun %token		LBRK
    114  1.2   itojun %token		RBRK
    115  1.2   itojun %token		THRU
    116  1.2   itojun %token		MAPLOWER
    117  1.2   itojun %token		MAPUPPER
    118  1.2   itojun %token		DIGITMAP
    119  1.2   itojun %token	<i>	LIST
    120  1.2   itojun %token	<str>	VARIABLE
    121  1.2   itojun %token		CHARSET
    122  1.2   itojun %token		ENCODING
    123  1.2   itojun %token		INVALID
    124  1.2   itojun %token	<str>	STRING
    125  1.2   itojun 
    126  1.2   itojun %type	<list>	list
    127  1.2   itojun %type	<list>	map
    128  1.2   itojun 
    129  1.2   itojun 
    130  1.2   itojun %%
    131  1.2   itojun 
    132  1.2   itojun locale	:	/* empty */
    133  1.2   itojun 	|	table
    134  1.2   itojun 	    	{ dump_tables(); }
    135  1.2   itojun 	;
    136  1.2   itojun 
    137  1.2   itojun table	:	entry
    138  1.2   itojun 	|	table entry
    139  1.2   itojun 	;
    140  1.2   itojun 
    141  1.2   itojun entry	:	ENCODING STRING
    142  1.2   itojun 		{ strncpy(new_locale.__encoding, $2, sizeof(new_locale.__encoding)); }
    143  1.2   itojun 	|	VARIABLE
    144  1.2   itojun 		{ new_locale.__variable_len = strlen($1) + 1;
    145  1.2   itojun 		  new_locale.__rune_variable =
    146  1.2   itojun 			malloc(new_locale.__variable_len);
    147  1.2   itojun 		  strcpy((char *)new_locale.__rune_variable, $1);
    148  1.2   itojun 		}
    149  1.2   itojun 	|	CHARSET RUNE
    150  1.2   itojun 		{ charsetbits = $2; charsetmask = 0x0000007f; }
    151  1.2   itojun 	|	CHARSET RUNE RUNE
    152  1.2   itojun 		{ charsetbits = $2; charsetmask = $3; }
    153  1.2   itojun 	|	CHARSET STRING
    154  1.2   itojun 		{ int final = $2[strlen($2) - 1] & 0x7f;
    155  1.2   itojun 		  charsetbits = final << 24;
    156  1.2   itojun 		  if ($2[0] == '$') {
    157  1.2   itojun 			charsetmask = 0x00007f7f;
    158  1.2   itojun 			if (strchr(",-./", $2[1]))
    159  1.2   itojun 				charsetbits |= 0x80;
    160  1.2   itojun 			if (0xd0 <= final && final <= 0xdf)
    161  1.2   itojun 				charsetmask |= 0x007f0000;
    162  1.2   itojun 		  } else {
    163  1.2   itojun 			charsetmask = 0x0000007f;
    164  1.2   itojun 			if (strchr(",-./", $2[0]))
    165  1.2   itojun 				charsetbits |= 0x80;
    166  1.2   itojun 			if (strlen($2) == 2 && $2[0] == '!')
    167  1.2   itojun 				charsetbits |= ((0x80 | $2[0]) << 16);
    168  1.2   itojun 		  }
    169  1.2   itojun 
    170  1.2   itojun 		  /*
    171  1.2   itojun 		   * special rules
    172  1.2   itojun 		   */
    173  1.2   itojun 		  if (charsetbits == ('B' << 24)
    174  1.2   itojun 		   && charsetmask == 0x0000007f) {
    175  1.2   itojun 			/*ASCII: 94B*/
    176  1.2   itojun 			charsetbits = 0;
    177  1.2   itojun 			charsetmask = 0x0000007f;
    178  1.2   itojun 		  } else if (charsetbits == (('A' << 24) | 0x80)
    179  1.2   itojun 		  	  && charsetmask == 0x0000007f) {
    180  1.2   itojun 		  	/*Latin1: 96A*/
    181  1.2   itojun 			charsetbits = 0x80;
    182  1.2   itojun 			charsetmask = 0x0000007f;
    183  1.2   itojun 		  }
    184  1.2   itojun 		}
    185  1.2   itojun 	|	INVALID RUNE
    186  1.2   itojun 		{ new_locale.__invalid_rune = $2; }
    187  1.2   itojun 	|	LIST list
    188  1.2   itojun 		{ set_map(&types, $2, $1); }
    189  1.2   itojun 	|	MAPLOWER map
    190  1.2   itojun 		{ set_map(&maplower, $2, 0); }
    191  1.2   itojun 	|	MAPUPPER map
    192  1.2   itojun 		{ set_map(&mapupper, $2, 0); }
    193  1.2   itojun 	|	DIGITMAP map
    194  1.2   itojun 		{ set_digitmap(&types, $2); }
    195  1.2   itojun 	;
    196  1.2   itojun 
    197  1.2   itojun list	:	RUNE
    198  1.2   itojun 		{
    199  1.2   itojun 		    $$ = (rune_list *)malloc(sizeof(rune_list));
    200  1.2   itojun 		    $$->min = ($1 & charsetmask) | charsetbits;
    201  1.2   itojun 		    $$->max = ($1 & charsetmask) | charsetbits;
    202  1.2   itojun 		    $$->next = 0;
    203  1.2   itojun 		}
    204  1.2   itojun 	|	RUNE THRU RUNE
    205  1.2   itojun 		{
    206  1.2   itojun 		    $$ = (rune_list *)malloc(sizeof(rune_list));
    207  1.2   itojun 		    $$->min = ($1 & charsetmask) | charsetbits;
    208  1.2   itojun 		    $$->max = ($3 & charsetmask) | charsetbits;
    209  1.2   itojun 		    $$->next = 0;
    210  1.2   itojun 		}
    211  1.2   itojun 	|	list RUNE
    212  1.2   itojun 		{
    213  1.2   itojun 		    $$ = (rune_list *)malloc(sizeof(rune_list));
    214  1.2   itojun 		    $$->min = ($2 & charsetmask) | charsetbits;
    215  1.2   itojun 		    $$->max = ($2 & charsetmask) | charsetbits;
    216  1.2   itojun 		    $$->next = $1;
    217  1.2   itojun 		}
    218  1.2   itojun 	|	list RUNE THRU RUNE
    219  1.2   itojun 		{
    220  1.2   itojun 		    $$ = (rune_list *)malloc(sizeof(rune_list));
    221  1.2   itojun 		    $$->min = ($2 & charsetmask) | charsetbits;
    222  1.2   itojun 		    $$->max = ($4 & charsetmask) | charsetbits;
    223  1.2   itojun 		    $$->next = $1;
    224  1.2   itojun 		}
    225  1.2   itojun 	;
    226  1.2   itojun 
    227  1.2   itojun map	:	LBRK RUNE RUNE RBRK
    228  1.2   itojun 		{
    229  1.2   itojun 		    $$ = (rune_list *)malloc(sizeof(rune_list));
    230  1.2   itojun 		    $$->min = ($2 & charsetmask) | charsetbits;
    231  1.2   itojun 		    $$->max = ($2 & charsetmask) | charsetbits;
    232  1.2   itojun 		    $$->map = $3;
    233  1.2   itojun 		    $$->next = 0;
    234  1.2   itojun 		}
    235  1.2   itojun 	|	map LBRK RUNE RUNE RBRK
    236  1.2   itojun 		{
    237  1.2   itojun 		    $$ = (rune_list *)malloc(sizeof(rune_list));
    238  1.2   itojun 		    $$->min = ($3 & charsetmask) | charsetbits;
    239  1.2   itojun 		    $$->max = ($3 & charsetmask) | charsetbits;
    240  1.2   itojun 		    $$->map = $4;
    241  1.2   itojun 		    $$->next = $1;
    242  1.2   itojun 		}
    243  1.2   itojun 	|	LBRK RUNE THRU RUNE ':' RUNE RBRK
    244  1.2   itojun 		{
    245  1.2   itojun 		    $$ = (rune_list *)malloc(sizeof(rune_list));
    246  1.2   itojun 		    $$->min = ($2 & charsetmask) | charsetbits;
    247  1.2   itojun 		    $$->max = ($4 & charsetmask) | charsetbits;
    248  1.2   itojun 		    $$->map = $6;
    249  1.2   itojun 		    $$->next = 0;
    250  1.2   itojun 		}
    251  1.2   itojun 	|	map LBRK RUNE THRU RUNE ':' RUNE RBRK
    252  1.2   itojun 		{
    253  1.2   itojun 		    $$ = (rune_list *)malloc(sizeof(rune_list));
    254  1.2   itojun 		    $$->min = ($3 & charsetmask) | charsetbits;
    255  1.2   itojun 		    $$->max = ($5 & charsetmask) | charsetbits;
    256  1.2   itojun 		    $$->map = $7;
    257  1.2   itojun 		    $$->next = $1;
    258  1.2   itojun 		}
    259  1.2   itojun 	;
    260  1.2   itojun %%
    261  1.2   itojun 
    262  1.2   itojun int debug = 0;
    263  1.2   itojun FILE *fp = stdout;
    264  1.2   itojun 
    265  1.2   itojun int
    266  1.2   itojun main(ac, av)
    267  1.2   itojun 	int ac;
    268  1.2   itojun 	char *av[];
    269  1.2   itojun {
    270  1.2   itojun     int x;
    271  1.2   itojun 
    272  1.2   itojun     extern char *optarg;
    273  1.2   itojun     extern int optind;
    274  1.2   itojun 
    275  1.2   itojun     while ((x = getopt(ac, av, "do:")) != EOF) {
    276  1.2   itojun 	switch(x) {
    277  1.2   itojun 	case 'd':
    278  1.2   itojun 	    debug = 1;
    279  1.2   itojun 	    break;
    280  1.2   itojun 	case 'o':
    281  1.2   itojun 	    locale_file = optarg;
    282  1.5  thorpej 	    if ((fp = fopen(locale_file, "w")) == 0)
    283  1.5  thorpej 		err(1, "unable to open output file %s", locale_file);
    284  1.2   itojun 	    break;
    285  1.2   itojun 	default:
    286  1.2   itojun 	usage:
    287  1.2   itojun 	    fprintf(stderr, "Usage: mklocale [-d] [-o output] [source]\n");
    288  1.2   itojun 	    exit(1);
    289  1.2   itojun 	}
    290  1.2   itojun     }
    291  1.2   itojun 
    292  1.2   itojun     switch (ac - optind) {
    293  1.2   itojun     case 0:
    294  1.2   itojun 	break;
    295  1.2   itojun     case 1:
    296  1.5  thorpej 	if (freopen(av[optind], "r", stdin) == 0)
    297  1.5  thorpej 	    err(1, "unable to open input file %s", av[optind]);
    298  1.2   itojun 	break;
    299  1.2   itojun     default:
    300  1.2   itojun 	goto usage;
    301  1.2   itojun     }
    302  1.2   itojun     for (x = 0; x < _CACHED_RUNES; ++x) {
    303  1.2   itojun 	mapupper.map[x] = x;
    304  1.2   itojun 	maplower.map[x] = x;
    305  1.2   itojun     }
    306  1.6      jmc     new_locale.__invalid_rune = _DEFAULT_INVALID_RUNE;
    307  1.2   itojun     memcpy(new_locale.__magic, _RUNE_MAGIC_1, sizeof(new_locale.__magic));
    308  1.2   itojun 
    309  1.2   itojun     yyparse();
    310  1.2   itojun 
    311  1.2   itojun     return 0;
    312  1.2   itojun }
    313  1.2   itojun 
    314  1.2   itojun int
    315  1.2   itojun yyerror(s)
    316  1.2   itojun 	const char *s;
    317  1.2   itojun {
    318  1.2   itojun     fprintf(stderr, "%s\n", s);
    319  1.2   itojun 
    320  1.2   itojun     return 0;
    321  1.2   itojun }
    322  1.2   itojun 
    323  1.2   itojun void *
    324  1.2   itojun xmalloc(sz)
    325  1.2   itojun 	unsigned int sz;
    326  1.2   itojun {
    327  1.2   itojun     void *r = malloc(sz);
    328  1.2   itojun     if (!r) {
    329  1.2   itojun 	perror("xmalloc");
    330  1.2   itojun 	abort();
    331  1.2   itojun     }
    332  1.2   itojun     return(r);
    333  1.2   itojun }
    334  1.2   itojun 
    335  1.2   itojun u_int32_t *
    336  1.2   itojun xlalloc(sz)
    337  1.2   itojun 	unsigned int sz;
    338  1.2   itojun {
    339  1.2   itojun     u_int32_t *r = (u_int32_t *)malloc(sz * sizeof(u_int32_t));
    340  1.2   itojun     if (!r) {
    341  1.2   itojun 	perror("xlalloc");
    342  1.2   itojun 	abort();
    343  1.2   itojun     }
    344  1.2   itojun     return(r);
    345  1.2   itojun }
    346  1.2   itojun 
    347  1.2   itojun u_int32_t *
    348  1.2   itojun xrelalloc(old, sz)
    349  1.2   itojun 	u_int32_t *old;
    350  1.2   itojun 	unsigned int sz;
    351  1.2   itojun {
    352  1.2   itojun     u_int32_t *r = (u_int32_t *)realloc((char *)old,
    353  1.2   itojun 						sz * sizeof(u_int32_t));
    354  1.2   itojun     if (!r) {
    355  1.2   itojun 	perror("xrelalloc");
    356  1.2   itojun 	abort();
    357  1.2   itojun     }
    358  1.2   itojun     return(r);
    359  1.2   itojun }
    360  1.2   itojun 
    361  1.2   itojun void
    362  1.2   itojun set_map(map, list, flag)
    363  1.2   itojun 	rune_map *map;
    364  1.2   itojun 	rune_list *list;
    365  1.2   itojun 	u_int32_t flag;
    366  1.2   itojun {
    367  1.2   itojun     list->map &= charsetmask;
    368  1.2   itojun     list->map |= charsetbits;
    369  1.2   itojun     while (list) {
    370  1.2   itojun 	rune_list *nlist = list->next;
    371  1.2   itojun 	add_map(map, list, flag);
    372  1.2   itojun 	list = nlist;
    373  1.2   itojun     }
    374  1.2   itojun }
    375  1.2   itojun 
    376  1.2   itojun void
    377  1.2   itojun set_digitmap(map, list)
    378  1.2   itojun 	rune_map *map;
    379  1.2   itojun 	rune_list *list;
    380  1.2   itojun {
    381  1.2   itojun     rune_t i;
    382  1.2   itojun 
    383  1.2   itojun     while (list) {
    384  1.2   itojun 	rune_list *nlist = list->next;
    385  1.2   itojun 	for (i = list->min; i <= list->max; ++i) {
    386  1.2   itojun 	    if (list->map + (i - list->min)) {
    387  1.2   itojun 		rune_list *tmp = (rune_list *)xmalloc(sizeof(rune_list));
    388  1.2   itojun 		tmp->min = i;
    389  1.2   itojun 		tmp->max = i;
    390  1.2   itojun 		add_map(map, tmp, list->map + (i - list->min));
    391  1.2   itojun 	    }
    392  1.2   itojun 	}
    393  1.2   itojun 	free(list);
    394  1.2   itojun 	list = nlist;
    395  1.2   itojun     }
    396  1.2   itojun }
    397  1.2   itojun 
    398  1.2   itojun void
    399  1.2   itojun add_map(map, list, flag)
    400  1.2   itojun 	rune_map *map;
    401  1.2   itojun 	rune_list *list;
    402  1.2   itojun 	u_int32_t flag;
    403  1.2   itojun {
    404  1.2   itojun     rune_t i;
    405  1.2   itojun     rune_list *lr = 0;
    406  1.2   itojun     rune_list *r;
    407  1.2   itojun     rune_t run;
    408  1.2   itojun 
    409  1.2   itojun     while (list->min < _CACHED_RUNES && list->min <= list->max) {
    410  1.2   itojun 	if (flag)
    411  1.2   itojun 	    map->map[list->min++] |= flag;
    412  1.2   itojun 	else
    413  1.2   itojun 	    map->map[list->min++] = list->map++;
    414  1.2   itojun     }
    415  1.2   itojun 
    416  1.2   itojun     if (list->min > list->max) {
    417  1.2   itojun 	free(list);
    418  1.2   itojun 	return;
    419  1.2   itojun     }
    420  1.2   itojun 
    421  1.2   itojun     run = list->max - list->min + 1;
    422  1.2   itojun 
    423  1.2   itojun     if (!(r = map->root) || (list->max < r->min - 1)
    424  1.2   itojun 			 || (!flag && list->max == r->min - 1)) {
    425  1.2   itojun 	if (flag) {
    426  1.2   itojun 	    list->types = xlalloc(run);
    427  1.2   itojun 	    for (i = 0; i < run; ++i)
    428  1.2   itojun 		list->types[i] = flag;
    429  1.2   itojun 	}
    430  1.2   itojun 	list->next = map->root;
    431  1.2   itojun 	map->root = list;
    432  1.2   itojun 	return;
    433  1.2   itojun     }
    434  1.2   itojun 
    435  1.2   itojun     for (r = map->root; r && r->max + 1 < list->min; r = r->next)
    436  1.2   itojun 	lr = r;
    437  1.2   itojun 
    438  1.2   itojun     if (!r) {
    439  1.2   itojun 	/*
    440  1.2   itojun 	 * We are off the end.
    441  1.2   itojun 	 */
    442  1.2   itojun 	if (flag) {
    443  1.2   itojun 	    list->types = xlalloc(run);
    444  1.2   itojun 	    for (i = 0; i < run; ++i)
    445  1.2   itojun 		list->types[i] = flag;
    446  1.2   itojun 	}
    447  1.2   itojun 	list->next = 0;
    448  1.2   itojun 	lr->next = list;
    449  1.2   itojun 	return;
    450  1.2   itojun     }
    451  1.2   itojun 
    452  1.2   itojun     if (list->max < r->min - 1) {
    453  1.2   itojun 	/*
    454  1.2   itojun 	 * We come before this range and we do not intersect it.
    455  1.2   itojun 	 * We are not before the root node, it was checked before the loop
    456  1.2   itojun 	 */
    457  1.2   itojun 	if (flag) {
    458  1.2   itojun 	    list->types = xlalloc(run);
    459  1.2   itojun 	    for (i = 0; i < run; ++i)
    460  1.2   itojun 		list->types[i] = flag;
    461  1.2   itojun 	}
    462  1.2   itojun 	list->next = lr->next;
    463  1.2   itojun 	lr->next = list;
    464  1.2   itojun 	return;
    465  1.2   itojun     }
    466  1.2   itojun 
    467  1.2   itojun     /*
    468  1.2   itojun      * At this point we have found that we at least intersect with
    469  1.2   itojun      * the range pointed to by `r', we might intersect with one or
    470  1.2   itojun      * more ranges beyond `r' as well.
    471  1.2   itojun      */
    472  1.2   itojun 
    473  1.2   itojun     if (!flag && list->map - list->min != r->map - r->min) {
    474  1.2   itojun 	/*
    475  1.2   itojun 	 * There are only two cases when we are doing case maps and
    476  1.2   itojun 	 * our maps needn't have the same offset.  When we are adjoining
    477  1.2   itojun 	 * but not intersecting.
    478  1.2   itojun 	 */
    479  1.2   itojun 	if (list->max + 1 == r->min) {
    480  1.2   itojun 	    lr->next = list;
    481  1.2   itojun 	    list->next = r;
    482  1.2   itojun 	    return;
    483  1.2   itojun 	}
    484  1.2   itojun 	if (list->min - 1 == r->max) {
    485  1.2   itojun 	    list->next = r->next;
    486  1.2   itojun 	    r->next = list;
    487  1.2   itojun 	    return;
    488  1.2   itojun 	}
    489  1.2   itojun 	fprintf(stderr, "Error: conflicting map entries\n");
    490  1.2   itojun 	exit(1);
    491  1.2   itojun     }
    492  1.2   itojun 
    493  1.2   itojun     if (list->min >= r->min && list->max <= r->max) {
    494  1.2   itojun 	/*
    495  1.2   itojun 	 * Subset case.
    496  1.2   itojun 	 */
    497  1.2   itojun 
    498  1.2   itojun 	if (flag) {
    499  1.2   itojun 	    for (i = list->min; i <= list->max; ++i)
    500  1.2   itojun 		r->types[i - r->min] |= flag;
    501  1.2   itojun 	}
    502  1.2   itojun 	free(list);
    503  1.2   itojun 	return;
    504  1.2   itojun     }
    505  1.2   itojun     if (list->min <= r->min && list->max >= r->max) {
    506  1.2   itojun 	/*
    507  1.2   itojun 	 * Superset case.  Make him big enough to hold us.
    508  1.2   itojun 	 * We might need to merge with the guy after him.
    509  1.2   itojun 	 */
    510  1.2   itojun 	if (flag) {
    511  1.2   itojun 	    list->types = xlalloc(list->max - list->min + 1);
    512  1.2   itojun 
    513  1.2   itojun 	    for (i = list->min; i <= list->max; ++i)
    514  1.2   itojun 		list->types[i - list->min] = flag;
    515  1.2   itojun 
    516  1.2   itojun 	    for (i = r->min; i <= r->max; ++i)
    517  1.2   itojun 		list->types[i - list->min] |= r->types[i - r->min];
    518  1.2   itojun 
    519  1.2   itojun 	    free(r->types);
    520  1.2   itojun 	    r->types = list->types;
    521  1.2   itojun 	} else {
    522  1.2   itojun 	    r->map = list->map;
    523  1.2   itojun 	}
    524  1.2   itojun 	r->min = list->min;
    525  1.2   itojun 	r->max = list->max;
    526  1.2   itojun 	free(list);
    527  1.2   itojun     } else if (list->min < r->min) {
    528  1.2   itojun 	/*
    529  1.2   itojun 	 * Our tail intersects his head.
    530  1.2   itojun 	 */
    531  1.2   itojun 	if (flag) {
    532  1.2   itojun 	    list->types = xlalloc(r->max - list->min + 1);
    533  1.2   itojun 
    534  1.2   itojun 	    for (i = r->min; i <= r->max; ++i)
    535  1.2   itojun 		list->types[i - list->min] = r->types[i - r->min];
    536  1.2   itojun 
    537  1.2   itojun 	    for (i = list->min; i < r->min; ++i)
    538  1.2   itojun 		list->types[i - list->min] = flag;
    539  1.2   itojun 
    540  1.2   itojun 	    for (i = r->min; i <= list->max; ++i)
    541  1.2   itojun 		list->types[i - list->min] |= flag;
    542  1.2   itojun 
    543  1.2   itojun 	    free(r->types);
    544  1.2   itojun 	    r->types = list->types;
    545  1.2   itojun 	} else {
    546  1.2   itojun 	    r->map = list->map;
    547  1.2   itojun 	}
    548  1.2   itojun 	r->min = list->min;
    549  1.2   itojun 	free(list);
    550  1.2   itojun 	return;
    551  1.2   itojun     } else {
    552  1.2   itojun 	/*
    553  1.2   itojun 	 * Our head intersects his tail.
    554  1.2   itojun 	 * We might need to merge with the guy after him.
    555  1.2   itojun 	 */
    556  1.2   itojun 	if (flag) {
    557  1.2   itojun 	    r->types = xrelalloc(r->types, list->max - r->min + 1);
    558  1.2   itojun 
    559  1.2   itojun 	    for (i = list->min; i <= r->max; ++i)
    560  1.2   itojun 		r->types[i - r->min] |= flag;
    561  1.2   itojun 
    562  1.2   itojun 	    for (i = r->max+1; i <= list->max; ++i)
    563  1.2   itojun 		r->types[i - r->min] = flag;
    564  1.2   itojun 	}
    565  1.2   itojun 	r->max = list->max;
    566  1.2   itojun 	free(list);
    567  1.2   itojun     }
    568  1.2   itojun 
    569  1.2   itojun     /*
    570  1.2   itojun      * Okay, check to see if we grew into the next guy(s)
    571  1.2   itojun      */
    572  1.2   itojun     while ((lr = r->next) && r->max >= lr->min) {
    573  1.2   itojun 	if (flag) {
    574  1.2   itojun 	    if (r->max >= lr->max) {
    575  1.2   itojun 		/*
    576  1.2   itojun 		 * Good, we consumed all of him.
    577  1.2   itojun 		 */
    578  1.2   itojun 		for (i = lr->min; i <= lr->max; ++i)
    579  1.2   itojun 		    r->types[i - r->min] |= lr->types[i - lr->min];
    580  1.2   itojun 	    } else {
    581  1.2   itojun 		/*
    582  1.2   itojun 		 * "append" him on to the end of us.
    583  1.2   itojun 		 */
    584  1.2   itojun 		r->types = xrelalloc(r->types, lr->max - r->min + 1);
    585  1.2   itojun 
    586  1.2   itojun 		for (i = lr->min; i <= r->max; ++i)
    587  1.2   itojun 		    r->types[i - r->min] |= lr->types[i - lr->min];
    588  1.2   itojun 
    589  1.2   itojun 		for (i = r->max+1; i <= lr->max; ++i)
    590  1.2   itojun 		    r->types[i - r->min] = lr->types[i - lr->min];
    591  1.2   itojun 
    592  1.2   itojun 		r->max = lr->max;
    593  1.2   itojun 	    }
    594  1.2   itojun 	} else {
    595  1.2   itojun 	    if (lr->max > r->max)
    596  1.2   itojun 		r->max = lr->max;
    597  1.2   itojun 	}
    598  1.2   itojun 
    599  1.2   itojun 	r->next = lr->next;
    600  1.2   itojun 
    601  1.2   itojun 	if (flag)
    602  1.2   itojun 	    free(lr->types);
    603  1.2   itojun 	free(lr);
    604  1.2   itojun     }
    605  1.2   itojun }
    606  1.2   itojun 
    607  1.2   itojun void
    608  1.2   itojun dump_tables()
    609  1.2   itojun {
    610  1.5  thorpej     int x, n;
    611  1.2   itojun     rune_list *list;
    612  1.2   itojun     _FileRuneLocale file_new_locale;
    613  1.2   itojun 
    614  1.2   itojun     memset(&file_new_locale, 0, sizeof(file_new_locale));
    615  1.2   itojun 
    616  1.2   itojun     /*
    617  1.2   itojun      * See if we can compress some of the istype arrays
    618  1.2   itojun      */
    619  1.2   itojun     for(list = types.root; list; list = list->next) {
    620  1.2   itojun 	list->map = list->types[0];
    621  1.2   itojun 	for (x = 1; x < list->max - list->min + 1; ++x) {
    622  1.2   itojun 	    if (list->types[x] != list->map) {
    623  1.2   itojun 		list->map = 0;
    624  1.2   itojun 		break;
    625  1.2   itojun 	    }
    626  1.2   itojun 	}
    627  1.2   itojun     }
    628  1.2   itojun 
    629  1.2   itojun     memcpy(&file_new_locale.__magic, new_locale.__magic,
    630  1.2   itojun 	sizeof(file_new_locale.__magic));
    631  1.2   itojun     memcpy(&file_new_locale.__encoding, new_locale.__encoding,
    632  1.2   itojun 	sizeof(file_new_locale.__encoding));
    633  1.2   itojun 
    634  1.2   itojun     file_new_locale.__invalid_rune = htonl(new_locale.__invalid_rune);
    635  1.2   itojun 
    636  1.2   itojun     /*
    637  1.2   itojun      * Fill in our tables.  Do this in network order so that
    638  1.2   itojun      * diverse machines have a chance of sharing data.
    639  1.2   itojun      * (Machines like Crays cannot share with little machines due to
    640  1.2   itojun      *  word size.  Sigh.  We tried.)
    641  1.2   itojun      */
    642  1.2   itojun     for (x = 0; x < _CACHED_RUNES; ++x) {
    643  1.2   itojun 	file_new_locale.__runetype[x] = htonl(types.map[x]);
    644  1.2   itojun 	file_new_locale.__maplower[x] = htonl(maplower.map[x]);
    645  1.2   itojun 	file_new_locale.__mapupper[x] = htonl(mapupper.map[x]);
    646  1.2   itojun     }
    647  1.2   itojun 
    648  1.2   itojun     /*
    649  1.2   itojun      * Count up how many ranges we will need for each of the extents.
    650  1.2   itojun      */
    651  1.2   itojun     list = types.root;
    652  1.2   itojun 
    653  1.2   itojun     while (list) {
    654  1.2   itojun 	new_locale.__runetype_ext.__nranges++;
    655  1.2   itojun 	list = list->next;
    656  1.2   itojun     }
    657  1.2   itojun     file_new_locale.__runetype_ext.__nranges =
    658  1.2   itojun 	htonl(new_locale.__runetype_ext.__nranges);
    659  1.2   itojun 
    660  1.2   itojun     list = maplower.root;
    661  1.2   itojun 
    662  1.2   itojun     while (list) {
    663  1.2   itojun 	new_locale.__maplower_ext.__nranges++;
    664  1.2   itojun 	list = list->next;
    665  1.2   itojun     }
    666  1.2   itojun     file_new_locale.__maplower_ext.__nranges =
    667  1.2   itojun 	htonl(new_locale.__maplower_ext.__nranges);
    668  1.2   itojun 
    669  1.2   itojun     list = mapupper.root;
    670  1.2   itojun 
    671  1.2   itojun     while (list) {
    672  1.2   itojun 	new_locale.__mapupper_ext.__nranges++;
    673  1.2   itojun 	list = list->next;
    674  1.2   itojun     }
    675  1.2   itojun     file_new_locale.__mapupper_ext.__nranges =
    676  1.2   itojun 	htonl(new_locale.__mapupper_ext.__nranges);
    677  1.2   itojun 
    678  1.2   itojun     file_new_locale.__variable_len = htonl(new_locale.__variable_len);
    679  1.2   itojun 
    680  1.2   itojun     /*
    681  1.2   itojun      * Okay, we are now ready to write the new locale file.
    682  1.2   itojun      */
    683  1.2   itojun 
    684  1.2   itojun     /*
    685  1.2   itojun      * PART 1: The _RuneLocale structure
    686  1.2   itojun      */
    687  1.5  thorpej     if (fwrite((char *)&file_new_locale, sizeof(file_new_locale), 1, fp) != 1)
    688  1.5  thorpej 	err(1, "writing _RuneLocale to %s", locale_file);
    689  1.2   itojun     /*
    690  1.2   itojun      * PART 2: The runetype_ext structures (not the actual tables)
    691  1.2   itojun      */
    692  1.5  thorpej     for (list = types.root, n = 0; list != NULL; list = list->next, n++) {
    693  1.2   itojun 	_FileRuneEntry re;
    694  1.2   itojun 
    695  1.2   itojun 	re.__min = htonl(list->min);
    696  1.2   itojun 	re.__max = htonl(list->max);
    697  1.2   itojun 	re.__map = htonl(list->map);
    698  1.2   itojun 
    699  1.5  thorpej 	if (fwrite((char *)&re, sizeof(re), 1, fp) != 1)
    700  1.5  thorpej 	    err(1, "writing runetype_ext #%d to %s", n, locale_file);
    701  1.2   itojun     }
    702  1.2   itojun     /*
    703  1.2   itojun      * PART 3: The maplower_ext structures
    704  1.2   itojun      */
    705  1.5  thorpej     for (list = maplower.root, n = 0; list != NULL; list = list->next, n++) {
    706  1.2   itojun 	_FileRuneEntry re;
    707  1.2   itojun 
    708  1.2   itojun 	re.__min = htonl(list->min);
    709  1.2   itojun 	re.__max = htonl(list->max);
    710  1.2   itojun 	re.__map = htonl(list->map);
    711  1.2   itojun 
    712  1.5  thorpej 	if (fwrite((char *)&re, sizeof(re), 1, fp) != 1)
    713  1.5  thorpej 	    err(1, "writing maplower_ext #%d to %s", n, locale_file);
    714  1.2   itojun     }
    715  1.2   itojun     /*
    716  1.2   itojun      * PART 4: The mapupper_ext structures
    717  1.2   itojun      */
    718  1.5  thorpej     for (list = mapupper.root, n = 0; list != NULL; list = list->next, n++) {
    719  1.2   itojun 	_FileRuneEntry re;
    720  1.2   itojun 
    721  1.2   itojun 	re.__min = htonl(list->min);
    722  1.2   itojun 	re.__max = htonl(list->max);
    723  1.2   itojun 	re.__map = htonl(list->map);
    724  1.2   itojun 
    725  1.5  thorpej 	if (fwrite((char *)&re, sizeof(re), 1, fp) != 1)
    726  1.5  thorpej 	    err(1, "writing mapupper_ext #%d to %s", n, locale_file);
    727  1.2   itojun     }
    728  1.2   itojun     /*
    729  1.2   itojun      * PART 5: The runetype_ext tables
    730  1.2   itojun      */
    731  1.5  thorpej     for (list = types.root, n = 0; list != NULL; list = list->next, n++) {
    732  1.2   itojun 	for (x = 0; x < list->max - list->min + 1; ++x)
    733  1.2   itojun 	    list->types[x] = htonl(list->types[x]);
    734  1.2   itojun 
    735  1.2   itojun 	if (!list->map) {
    736  1.2   itojun 	    if (fwrite((char *)list->types,
    737  1.2   itojun 		       (list->max - list->min + 1) * sizeof(u_int32_t),
    738  1.5  thorpej 		       1, fp) != 1)
    739  1.5  thorpej 		err(1, "writing runetype_ext table #%d to %s", n, locale_file);
    740  1.2   itojun 	}
    741  1.2   itojun     }
    742  1.2   itojun     /*
    743  1.2   itojun      * PART 5: And finally the variable data
    744  1.2   itojun      */
    745  1.5  thorpej     if (new_locale.__variable_len != 0 &&
    746  1.5  thorpej 	fwrite((char *)new_locale.__rune_variable,
    747  1.5  thorpej 	       new_locale.__variable_len, 1, fp) != 1)
    748  1.5  thorpej 	err(1, "writing variable data to %s", locale_file);
    749  1.2   itojun     fclose(fp);
    750  1.2   itojun 
    751  1.2   itojun     if (!debug)
    752  1.2   itojun 	return;
    753  1.2   itojun 
    754  1.2   itojun     if (new_locale.__encoding[0])
    755  1.2   itojun 	fprintf(stderr, "ENCODING	%s\n", new_locale.__encoding);
    756  1.2   itojun     if (new_locale.__rune_variable)
    757  1.2   itojun 	fprintf(stderr, "VARIABLE	%s\n",
    758  1.2   itojun 		(char *)new_locale.__rune_variable);
    759  1.2   itojun 
    760  1.2   itojun     fprintf(stderr, "\nMAPLOWER:\n\n");
    761  1.2   itojun 
    762  1.2   itojun     for (x = 0; x < _CACHED_RUNES; ++x) {
    763  1.2   itojun 	if (isprint(maplower.map[x]))
    764  1.2   itojun 	    fprintf(stderr, " '%c'", (int)maplower.map[x]);
    765  1.2   itojun 	else if (maplower.map[x])
    766  1.2   itojun 	    fprintf(stderr, "%04x", maplower.map[x]);
    767  1.2   itojun 	else
    768  1.2   itojun 	    fprintf(stderr, "%4x", 0);
    769  1.2   itojun 	if ((x & 0xf) == 0xf)
    770  1.2   itojun 	    fprintf(stderr, "\n");
    771  1.2   itojun 	else
    772  1.2   itojun 	    fprintf(stderr, " ");
    773  1.2   itojun     }
    774  1.2   itojun     fprintf(stderr, "\n");
    775  1.2   itojun 
    776  1.2   itojun     for (list = maplower.root; list; list = list->next)
    777  1.2   itojun 	fprintf(stderr, "\t%04x - %04x : %04x\n", list->min, list->max, list->map);
    778  1.2   itojun 
    779  1.2   itojun     fprintf(stderr, "\nMAPUPPER:\n\n");
    780  1.2   itojun 
    781  1.2   itojun     for (x = 0; x < _CACHED_RUNES; ++x) {
    782  1.2   itojun 	if (isprint(mapupper.map[x]))
    783  1.2   itojun 	    fprintf(stderr, " '%c'", (int)mapupper.map[x]);
    784  1.2   itojun 	else if (mapupper.map[x])
    785  1.2   itojun 	    fprintf(stderr, "%04x", mapupper.map[x]);
    786  1.2   itojun 	else
    787  1.2   itojun 	    fprintf(stderr, "%4x", 0);
    788  1.2   itojun 	if ((x & 0xf) == 0xf)
    789  1.2   itojun 	    fprintf(stderr, "\n");
    790  1.2   itojun 	else
    791  1.2   itojun 	    fprintf(stderr, " ");
    792  1.2   itojun     }
    793  1.2   itojun     fprintf(stderr, "\n");
    794  1.2   itojun 
    795  1.2   itojun     for (list = mapupper.root; list; list = list->next)
    796  1.2   itojun 	fprintf(stderr, "\t%04x - %04x : %04x\n", list->min, list->max, list->map);
    797  1.2   itojun 
    798  1.2   itojun 
    799  1.2   itojun     fprintf(stderr, "\nTYPES:\n\n");
    800  1.2   itojun 
    801  1.2   itojun     for (x = 0; x < _CACHED_RUNES; ++x) {
    802  1.2   itojun 	u_int32_t r = types.map[x];
    803  1.2   itojun 
    804  1.2   itojun 	if (r) {
    805  1.2   itojun 	    if (isprint(x))
    806  1.2   itojun 		fprintf(stderr, " '%c':%2d", x, (int)(r & 0xff));
    807  1.2   itojun 	    else
    808  1.2   itojun 		fprintf(stderr, "%04x:%2d", x, (int)(r & 0xff));
    809  1.2   itojun 
    810  1.2   itojun 	    fprintf(stderr, " %4s", (r & _CTYPE_A) ? "alph" : "");
    811  1.2   itojun 	    fprintf(stderr, " %4s", (r & _CTYPE_C) ? "ctrl" : "");
    812  1.2   itojun 	    fprintf(stderr, " %4s", (r & _CTYPE_D) ? "dig" : "");
    813  1.2   itojun 	    fprintf(stderr, " %4s", (r & _CTYPE_G) ? "graf" : "");
    814  1.2   itojun 	    fprintf(stderr, " %4s", (r & _CTYPE_L) ? "low" : "");
    815  1.2   itojun 	    fprintf(stderr, " %4s", (r & _CTYPE_P) ? "punc" : "");
    816  1.2   itojun 	    fprintf(stderr, " %4s", (r & _CTYPE_S) ? "spac" : "");
    817  1.2   itojun 	    fprintf(stderr, " %4s", (r & _CTYPE_U) ? "upp" : "");
    818  1.2   itojun 	    fprintf(stderr, " %4s", (r & _CTYPE_X) ? "xdig" : "");
    819  1.2   itojun 	    fprintf(stderr, " %4s", (r & _CTYPE_B) ? "blnk" : "");
    820  1.2   itojun 	    fprintf(stderr, " %4s", (r & _CTYPE_R) ? "prnt" : "");
    821  1.2   itojun 	    fprintf(stderr, " %4s", (r & _CTYPE_I) ? "ideo" : "");
    822  1.2   itojun 	    fprintf(stderr, " %4s", (r & _CTYPE_T) ? "spec" : "");
    823  1.2   itojun 	    fprintf(stderr, " %4s", (r & _CTYPE_Q) ? "phon" : "");
    824  1.2   itojun 	    fprintf(stderr, "\n");
    825  1.2   itojun 	}
    826  1.2   itojun     }
    827  1.2   itojun 
    828  1.2   itojun     for (list = types.root; list; list = list->next) {
    829  1.2   itojun 	if (list->map && list->min + 3 < list->max) {
    830  1.2   itojun 	    u_int32_t r = list->map;
    831  1.2   itojun 
    832  1.2   itojun 	    fprintf(stderr, "%04x:%2d", list->min, r & 0xff);
    833  1.2   itojun 
    834  1.2   itojun 	    fprintf(stderr, " %4s", (r & _CTYPE_A) ? "alph" : "");
    835  1.2   itojun 	    fprintf(stderr, " %4s", (r & _CTYPE_C) ? "ctrl" : "");
    836  1.2   itojun 	    fprintf(stderr, " %4s", (r & _CTYPE_D) ? "dig" : "");
    837  1.2   itojun 	    fprintf(stderr, " %4s", (r & _CTYPE_G) ? "graf" : "");
    838  1.2   itojun 	    fprintf(stderr, " %4s", (r & _CTYPE_L) ? "low" : "");
    839  1.2   itojun 	    fprintf(stderr, " %4s", (r & _CTYPE_P) ? "punc" : "");
    840  1.2   itojun 	    fprintf(stderr, " %4s", (r & _CTYPE_S) ? "spac" : "");
    841  1.2   itojun 	    fprintf(stderr, " %4s", (r & _CTYPE_U) ? "upp" : "");
    842  1.2   itojun 	    fprintf(stderr, " %4s", (r & _CTYPE_X) ? "xdig" : "");
    843  1.2   itojun 	    fprintf(stderr, " %4s", (r & _CTYPE_B) ? "blnk" : "");
    844  1.2   itojun 	    fprintf(stderr, " %4s", (r & _CTYPE_R) ? "prnt" : "");
    845  1.2   itojun 	    fprintf(stderr, " %4s", (r & _CTYPE_I) ? "ideo" : "");
    846  1.2   itojun 	    fprintf(stderr, " %4s", (r & _CTYPE_T) ? "spec" : "");
    847  1.2   itojun 	    fprintf(stderr, " %4s", (r & _CTYPE_Q) ? "phon" : "");
    848  1.2   itojun 	    fprintf(stderr, "\n...\n");
    849  1.2   itojun 
    850  1.2   itojun 	    fprintf(stderr, "%04x:%2d", list->max, r & 0xff);
    851  1.2   itojun 
    852  1.2   itojun 	    fprintf(stderr, " %4s", (r & _CTYPE_A) ? "alph" : "");
    853  1.2   itojun 	    fprintf(stderr, " %4s", (r & _CTYPE_C) ? "ctrl" : "");
    854  1.2   itojun 	    fprintf(stderr, " %4s", (r & _CTYPE_D) ? "dig" : "");
    855  1.2   itojun 	    fprintf(stderr, " %4s", (r & _CTYPE_G) ? "graf" : "");
    856  1.2   itojun 	    fprintf(stderr, " %4s", (r & _CTYPE_L) ? "low" : "");
    857  1.2   itojun 	    fprintf(stderr, " %4s", (r & _CTYPE_P) ? "punc" : "");
    858  1.2   itojun 	    fprintf(stderr, " %4s", (r & _CTYPE_S) ? "spac" : "");
    859  1.2   itojun 	    fprintf(stderr, " %4s", (r & _CTYPE_U) ? "upp" : "");
    860  1.2   itojun 	    fprintf(stderr, " %4s", (r & _CTYPE_X) ? "xdig" : "");
    861  1.2   itojun 	    fprintf(stderr, " %4s", (r & _CTYPE_B) ? "blnk" : "");
    862  1.2   itojun 	    fprintf(stderr, " %4s", (r & _CTYPE_R) ? "prnt" : "");
    863  1.2   itojun 	    fprintf(stderr, " %4s", (r & _CTYPE_I) ? "ideo" : "");
    864  1.2   itojun 	    fprintf(stderr, " %4s", (r & _CTYPE_T) ? "spec" : "");
    865  1.2   itojun 	    fprintf(stderr, " %4s", (r & _CTYPE_Q) ? "phon" : "");
    866  1.2   itojun             fprintf(stderr, " %1ld", ((unsigned)r&_CTYPE_SWM)>>_CTYPE_SWS);
    867  1.2   itojun 	    fprintf(stderr, "\n");
    868  1.2   itojun 	} else
    869  1.2   itojun 	for (x = list->min; x <= list->max; ++x) {
    870  1.2   itojun 	    u_int32_t r = ntohl(list->types[x - list->min]);
    871  1.2   itojun 
    872  1.2   itojun 	    if (r) {
    873  1.2   itojun 		fprintf(stderr, "%04x:%2d", x, (int)(r & 0xff));
    874  1.2   itojun 
    875  1.2   itojun 		fprintf(stderr, " %4s", (r & _CTYPE_A) ? "alph" : "");
    876  1.2   itojun 		fprintf(stderr, " %4s", (r & _CTYPE_C) ? "ctrl" : "");
    877  1.2   itojun 		fprintf(stderr, " %4s", (r & _CTYPE_D) ? "dig" : "");
    878  1.2   itojun 		fprintf(stderr, " %4s", (r & _CTYPE_G) ? "graf" : "");
    879  1.2   itojun 		fprintf(stderr, " %4s", (r & _CTYPE_L) ? "low" : "");
    880  1.2   itojun 		fprintf(stderr, " %4s", (r & _CTYPE_P) ? "punc" : "");
    881  1.2   itojun 		fprintf(stderr, " %4s", (r & _CTYPE_S) ? "spac" : "");
    882  1.2   itojun 		fprintf(stderr, " %4s", (r & _CTYPE_U) ? "upp" : "");
    883  1.2   itojun 		fprintf(stderr, " %4s", (r & _CTYPE_X) ? "xdig" : "");
    884  1.2   itojun 		fprintf(stderr, " %4s", (r & _CTYPE_B) ? "blnk" : "");
    885  1.2   itojun 		fprintf(stderr, " %4s", (r & _CTYPE_R) ? "prnt" : "");
    886  1.2   itojun 		fprintf(stderr, " %4s", (r & _CTYPE_I) ? "ideo" : "");
    887  1.2   itojun 		fprintf(stderr, " %4s", (r & _CTYPE_T) ? "spec" : "");
    888  1.2   itojun 		fprintf(stderr, " %4s", (r & _CTYPE_Q) ? "phon" : "");
    889  1.2   itojun                 fprintf(stderr, " %1ld", ((unsigned)r&_CTYPE_SWM)>>_CTYPE_SWS);
    890  1.2   itojun 		fprintf(stderr, "\n");
    891  1.2   itojun 	    }
    892  1.2   itojun 	}
    893  1.2   itojun     }
    894  1.2   itojun }
    895