⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 make-trie.c

📁 this gcc-g++-3.3.1.tar.gz is a source file of gcc, you can learn more about gcc through this codes f
💻 C
字号:
/* Copyright (C) 1999  Free Software Foundation   This file is part of libgcj.This software is copyrighted work licensed under the terms of theLibgcj License.  Please consult the file "LIBGCJ_LICENSE" fordetails.  */#include <stdio.h>#include <stdlib.h>typedef struct trie_node{  int key;  int level;  int position;  union  {    int value;    struct trie_node *node;  } u[16];} trie_node;trie_node *make_node (){  trie_node *node = (trie_node *) malloc (sizeof(trie_node));  if (node == NULL)    abort();  return node;}trie_node *make_leaf_node (){  trie_node *node = make_node ();  int i = 16;  while (--i >= 0)    node->u[i].value = -1;  return node;}trie_node *make_branch_node (){  trie_node *node = make_node ();  int i = 16;  while (--i >= 0)    node->u[i].node = NULL;  return node;}trie_node *table = NULL;voidenter (int key, int value){  trie_node **ptr = &table;  int shift = 12;  for (; shift > 0;  shift -= 4)    {      if (*ptr == NULL)	{	  *ptr = make_branch_node ();	  (*ptr)->key = key & (0xFFFF << (shift + 4));	  (*ptr)->level = shift / 4;	}      ptr = &(*ptr)->u[(key >> shift) & 0xF].node;    }  if (*ptr == NULL)    {      *ptr = make_leaf_node ();      (*ptr)->key = key & 0xFFF0;      (*ptr)->level = 0;    }  if ((*ptr)->u[key & 0xF].value != -1      && (*ptr)->u[key & 0xF].value != value)    fprintf(stderr, "duplicate value for key: %d, %d!\n", key, value);  (*ptr)->u[key & 0xF].value = value;}int assigned = 0;voidassign (trie_node *node, int level){  int i;  if (node == NULL)    return;  if (node->level != level)    abort();  node->position = assigned;  assigned++;  if (level == 0)    return;  for (i = 0;  i < 16;  i++)    {      assign (node->u[i].node, level-1);    }}int next_node_index_toprint = 0;voidprint (trie_node *node, int index, int level, FILE *out){  int i;  if (node->key != index || node->level != level)    abort();  if (level == 0) /* leaf node */    {      for (i = 0;  i < 16;  i++)	{	  int node_index = index | (i << (level * 4));	  if (node_index < next_node_index_toprint)	    abort();	  if (node->u[i].value == -1)	    fprintf (out, " /* key: 0x%x */ 0xffff,\n", node_index);	  else	    fprintf (out, " /* key: 0x%x */ 0x%x,\n",		     node_index, node->u[i].value);	  next_node_index_toprint = node_index + 1;	}    }  else    {      for (i = 0;  i < 16;  i++)	{	  int node_index = index | (i << (level * 4));	  fprintf (out, " /* branch: 0x%0*x%.*s */ ",		  4 - level, node_index  >> ( 4 * level),		  level, "XXXX");	  if (node->u[i].node == NULL)	    fprintf (out, "0,\n");	  else	    fprintf (out, "%d,\n", 16 * node->u[i].node->position);	}      for (i = 0;  i < 16;  i++)	{	  int node_index = index | (i << (level * 4));	  if (node->u[i].node != NULL)	    print (node->u[i].node, node_index, level-1, out);	}    }}voidprint_table (char *name, FILE *out){  assign (table, 3);  fprintf(out, "/* This file is automatically generated. */\n");  fprintf(out, "unsigned short %s[] = {\n", name);  print (table, 0x0000, 3, out);  fprintf(out, "};\n");}#if 0intmain (int argc, char **argv){  int count = 0;  for (;;)    {      int key, value;      int i = scanf (" 0x%x 0x%x", &key, &value);      if (i < 2)	break;      count++;      enter (key, value);    }  return 0;}#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -