OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [libjava/] [gnu/] [gcj/] [convert/] [make-trie.c] - Blame information for rev 756

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 756 jeremybenn
/* Copyright (C) 1999  Free Software Foundation
2
 
3
   This file is part of libgcj.
4
 
5
This software is copyrighted work licensed under the terms of the
6
Libgcj License.  Please consult the file "LIBGCJ_LICENSE" for
7
details.  */
8
 
9
#include <stdio.h>
10
#include <stdlib.h>
11
#include "make-trie.h"
12
 
13
typedef struct trie_node
14
{
15
  int key;
16
  int level;
17
  int position;
18
  union
19
  {
20
    int value;
21
    struct trie_node *node;
22
  } u[16];
23
} trie_node;
24
 
25
trie_node *
26
make_node ()
27
{
28
  trie_node *node = (trie_node *) malloc (sizeof(trie_node));
29
  if (node == NULL)
30
    abort();
31
  return node;
32
}
33
 
34
trie_node *
35
make_leaf_node ()
36
{
37
  trie_node *node = make_node ();
38
  int i = 16;
39
  while (--i >= 0)
40
    node->u[i].value = -1;
41
  return node;
42
}
43
 
44
trie_node *
45
make_branch_node ()
46
{
47
  trie_node *node = make_node ();
48
  int i = 16;
49
  while (--i >= 0)
50
    node->u[i].node = NULL;
51
  return node;
52
}
53
 
54
 
55
trie_node *table = NULL;
56
 
57
void
58
enter (int key, int value)
59
{
60
  trie_node **ptr = &table;
61
  int shift = 12;
62
  for (; shift > 0;  shift -= 4)
63
    {
64
      if (*ptr == NULL)
65
        {
66
          *ptr = make_branch_node ();
67
          (*ptr)->key = key & (0xFFFF << (shift + 4));
68
          (*ptr)->level = shift / 4;
69
        }
70
      ptr = &(*ptr)->u[(key >> shift) & 0xF].node;
71
    }
72
  if (*ptr == NULL)
73
    {
74
      *ptr = make_leaf_node ();
75
      (*ptr)->key = key & 0xFFF0;
76
      (*ptr)->level = 0;
77
    }
78
  if ((*ptr)->u[key & 0xF].value != -1
79
      && (*ptr)->u[key & 0xF].value != value)
80
    fprintf(stderr, "duplicate value for key: %d, %d!\n", key, value);
81
  (*ptr)->u[key & 0xF].value = value;
82
}
83
 
84
int assigned = 0;
85
 
86
void
87
assign (trie_node *node, int level)
88
{
89
  int i;
90
  if (node == NULL)
91
    return;
92
  if (node->level != level)
93
    abort();
94
  node->position = assigned;
95
  assigned++;
96
  if (level == 0)
97
    return;
98
  for (i = 0;  i < 16;  i++)
99
    {
100
      assign (node->u[i].node, level-1);
101
    }
102
}
103
 
104
int next_node_index_toprint = 0;
105
 
106
void
107
print (trie_node *node, int index, int level, FILE *out)
108
{
109
  int i;
110
  if (node->key != index || node->level != level)
111
    abort();
112
  if (level == 0) /* leaf node */
113
    {
114
      for (i = 0;  i < 16;  i++)
115
        {
116
          int node_index = index | (i << (level * 4));
117
          if (node_index < next_node_index_toprint)
118
            abort();
119
          if (node->u[i].value == -1)
120
            fprintf (out, " /* key: 0x%x */ 0xffff,\n", node_index);
121
          else
122
            fprintf (out, " /* key: 0x%x */ 0x%x,\n",
123
                     node_index, node->u[i].value);
124
          next_node_index_toprint = node_index + 1;
125
        }
126
    }
127
  else
128
    {
129
      for (i = 0;  i < 16;  i++)
130
        {
131
          int node_index = index | (i << (level * 4));
132
          fprintf (out, " /* branch: 0x%0*x%.*s */ ",
133
                  4 - level, node_index  >> ( 4 * level),
134
                  level, "XXXX");
135
          if (node->u[i].node == NULL)
136
            fprintf (out, "0,\n");
137
          else
138
            fprintf (out, "%d,\n", 16 * node->u[i].node->position);
139
        }
140
 
141
      for (i = 0;  i < 16;  i++)
142
        {
143
          int node_index = index | (i << (level * 4));
144
          if (node->u[i].node != NULL)
145
            print (node->u[i].node, node_index, level-1, out);
146
        }
147
    }
148
}
149
 
150
void
151
print_table (char *name, FILE *out)
152
{
153
  assign (table, 3);
154
 
155
  fprintf(out, "/* This file is automatically generated. */\n");
156
  fprintf(out, "unsigned short %s[] = {\n", name);
157
  print (table, 0x0000, 3, out);
158
  fprintf(out, "};\n");
159
}
160
 
161
#if 0
162
int
163
main (int argc, char **argv)
164
{
165
  int count = 0;
166
  for (;;)
167
    {
168
      int key, value;
169
      int i = scanf (" 0x%x 0x%x", &key, &value);
170
      if (i < 2)
171
        break;
172
      count++;
173
      enter (key, value);
174
    }
175
  return 0;
176
}
177
#endif

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.