@@ -35,40 +35,40 @@ static void init_prefix_map(struct prefix_map *prefix_map,
35
35
static void add_prefix_item (struct prefix_map * prefix_map ,
36
36
struct prefix_item * item )
37
37
{
38
- struct prefix_map_entry * e = xmalloc ( sizeof ( * e )) , * e2 ;
38
+ struct prefix_map_entry e = { { NULL } } , * e2 ;
39
39
int j ;
40
40
41
- e -> item = item ;
42
- e -> name = e -> item -> name ;
41
+ e . item = item ;
42
+ e . name = item -> name ;
43
43
44
- for (j = prefix_map -> min_length ; j <= prefix_map -> max_length ; j ++ ) {
45
- if (!isascii (e -> name [j ])) {
46
- free (e );
44
+ for (j = prefix_map -> min_length ;
45
+ j <= prefix_map -> max_length && e .name [j ]; j ++ ) {
46
+ /* Avoid breaking UTF-8 multi-byte sequences */
47
+ if (!isascii (e .name [j ]))
47
48
break ;
48
- }
49
49
50
- e -> prefix_length = j ;
51
- hashmap_entry_init (e , memhash (e -> name , j ));
52
- e2 = hashmap_get (& prefix_map -> map , e , NULL );
50
+ e . prefix_length = j ;
51
+ hashmap_entry_init (& e , memhash (e . name , j ));
52
+ e2 = hashmap_get (& prefix_map -> map , & e , NULL );
53
53
if (!e2 ) {
54
- /* prefix is unique so far */
55
- e -> item -> prefix_length = j ;
56
- hashmap_add (& prefix_map -> map , e );
54
+ /* prefix is unique at this stage */
55
+ item -> prefix_length = j ;
56
+ add_prefix_entry (& prefix_map -> map , e . name , j , item );
57
57
break ;
58
58
}
59
59
60
60
if (!e2 -> item )
61
61
continue ; /* non-unique prefix */
62
62
63
- if (j != e2 -> item -> prefix_length )
64
- BUG ("unexpected prefix length: %d != %d" ,
65
- ( int ) j , (int )e2 -> item -> prefix_length );
63
+ if (j != e2 -> item -> prefix_length || memcmp ( e . name , e2 -> name , j ) )
64
+ BUG ("unexpected prefix length: %d != %d (%s != %s) " ,
65
+ j , (int )e2 -> item -> prefix_length , e . name , e2 -> name );
66
66
67
67
/* skip common prefix */
68
- for (; j < prefix_map -> max_length && e -> name [j ]; j ++ ) {
69
- if (e -> item -> name [j ] != e2 -> item -> name [j ])
68
+ for (; j < prefix_map -> max_length && e . name [j ]; j ++ ) {
69
+ if (e . item -> name [j ] != e2 -> item -> name [j ])
70
70
break ;
71
- add_prefix_entry (& prefix_map -> map , e -> name , j + 1 ,
71
+ add_prefix_entry (& prefix_map -> map , e . name , j + 1 ,
72
72
NULL );
73
73
}
74
74
@@ -83,16 +83,14 @@ static void add_prefix_item(struct prefix_map *prefix_map,
83
83
e2 -> item -> prefix_length = 0 ;
84
84
e2 -> item = NULL ;
85
85
86
- if (j < prefix_map -> max_length && e -> name [j ]) {
86
+ if (j < prefix_map -> max_length && e . name [j ]) {
87
87
/* found a unique prefix for the item */
88
- e -> item -> prefix_length = j + 1 ;
89
- add_prefix_entry (& prefix_map -> map , e -> name , j + 1 ,
90
- e -> item );
91
- } else {
88
+ e . item -> prefix_length = j + 1 ;
89
+ add_prefix_entry (& prefix_map -> map , e . name , j + 1 ,
90
+ e . item );
91
+ } else
92
92
/* item has no (short enough) unique prefix */
93
- e -> item -> prefix_length = 0 ;
94
- free (e );
95
- }
93
+ e .item -> prefix_length = 0 ;
96
94
97
95
break ;
98
96
}
0 commit comments