photo_build.c
来自「ftam等标准协议服务器和客户端的源代码。」· C语言 代码 · 共 417 行
C
417 行
/* build_trees.c - build photo decode trees */#ifndef lintstatic char *rcsid = "$Header: /xtel/isode/isode/dsap/common/RCS/photo_build.c,v 9.0 1992/06/16 12:12:39 isode Rel $";#endif/* * $Header: /xtel/isode/isode/dsap/common/RCS/photo_build.c,v 9.0 1992/06/16 12:12:39 isode Rel $ * * * $Log: photo_build.c,v $ * Revision 9.0 1992/06/16 12:12:39 isode * Release 8.0 * *//* * NOTICE * * Acquisition, use, and distribution of this module and related * materials are subject to the restrictions of a license agreement. * Consult the Preface in the User's Manual for the full terms of * this agreement. * */#include <stdio.h>#include "quipu/photo.h"#include "general.h"int built = 0;extern node * bl_tree_top; /* pointers to the decode trees */extern node * wt_tree_top;extern node * two_tree_top;/* * Decoding tables */static char *bl_make [] = {"0000001111","000011001000","000011001001","000001011011","000000110011","000000110100","000000110101","0000001101100","0000001101101","0000001001010","0000001001011","0000001001100","0000001001101","0000001110010","0000001110011","0000001110100","0000001110101","0000001110110","0000001110111","0000001010010","0000001010011","0000001010100","0000001010101","0000001011010","0000001011011","0000001100100","0000001100101","00000001000","00000001100","00000001101","000000010010","000000010011","000000010100","000000010101","000000010110","000000010111","000000011100","000000011101","000000011110","000000011111",NULL};static char *bl_term [] = {"0000110111","010","11","10","011","0011","0010","00011","000101","000100","0000100","0000101","0000111","00000100","00000111","000011000","0000010111","0000011000","0000001000","00001100111","00001101000","00001101100","00000110111","00000101000","00000010111","00000011000","000011001010","000011001011","000011001100","000011001101","000001101000","000001101001","000001101010","000001101011","000011010010","000011010011","000011010100","000011010101","000011010110","000011010111","000001101100","000001101101","000011011010","000011011011","000001010100","000001010101","000001010110","000001010111","000001100100","000001100101","000001010010","000001010011","000000100100","000000110111","000000111000","000000100111","000000101000","000001011000","000001011001","000000101011","000000101100","000001011010","000001100110","000001100111",NULL};static char *two_dim [] = {"0001","001","0000010","000010","010","1","011","000011","0000011",NULL};static char *wt_make [] = {"11011","10010","010111","0110111","00110110","00110111","01100100","01100101","01101000","01100111","011001100","011001101","011010010","011010011","011010100","011010101","011010110","011010111","011011000","011011001","011011010","011011011","010011000","010011001","010011010","011000","010011011","00000001000","00000001100","00000001101","000000010010","000000010011","000000010100","000000010101","000000010110","000000010111","000000011100","000000011101","000000011110","000000011111",NULL};static char *wt_term [] = {"00110101","000111","0111","1000","1011","1100","1110","1111","10011","10100","00111","01000","001000","000011","110100","110101","101010","101011","0100111","0001100","0001000","0010111","0000011","0000100","0101000","0101011","0010011","0100100","0011000","00000010","00000011","00011010","00011011","00010010","00010011","00010100","00010101","00010110","00010111","00101000","00101001","00101010","00101011","00101100","00101101","00000100","00000101","00001010","00001011","01010010","01010011","01010100","01010101","00100100","00100101","01011000","01011001","01011010","01011011","01001010","01001011","00110010","00110011","00110100",NULL};static char * uncompressed_1d = "000000001111";static char * uncompressed_2d = "0000001111";/* ROUTINE: get_node *//* *//* SYNOPSIS: creates a new node. *//* *//* DESCRIPTION: Uses malloc to allocate sufficient memory for a node to *//* be stored, and the sets all the pointer fields of the *//* node to NULL, and initialises the other fields */node *get_node (){node * mem; mem = (node *) malloc (sizeof (node)); mem->n_type = INTERNAL; /* The most common node type */ mem->zero = NULL; mem->one = NULL; return (mem);}/* ROUTINE: build_trees./*/* SYNOPSIS: build the decode tree./*/* DESCRIPTION: For each of the three trees, read the data in from a file/* in string form, convert this into an integer, then add this integer to the/* tree./* Also contained in the node is the value associated with the string read in,/* so we need to count each string as it is read in.*/build_trees (){ register i; char ** string; if (built) return (0); /* create the tops of the trees */ bl_tree_top = get_node (); wt_tree_top = get_node (); two_tree_top = get_node ();/* Add the white terminals to the white tree */ i=0; for (string = wt_term; *string; ++string) add_tree (*string,i++,WT_TERM,wt_tree_top); /* Add the black terminals to the black tree */ i=0; for (string = bl_term; *string; ++string) add_tree (*string,i++,BL_TERM,bl_tree_top); /* Add the white make codes to the white tree */ i = 64; for (string = wt_make; *string; ++string) { add_tree (*string,i,MAKE,wt_tree_top); i += 64; } /* Add the black make up codes to the black tree */ i = 64; for (string = bl_make; *string; ++string) { add_tree (*string,i,MAKE,bl_tree_top); i += 64; } /* make the two dimensional decode tree */ i = 1; for (string = two_dim; *string; ++string) add_tree (*string,i++,MAKE,two_tree_top); /* put uncompressed mode entrance codewords on all three trees */ add_tree (uncompressed_1d,-1,MAKE,bl_tree_top); add_tree (uncompressed_1d,-1,MAKE,wt_tree_top); add_tree (uncompressed_2d,-1,MAKE,two_tree_top); /* put end of line markers on all three trees */ add_tree ("00000000000",EOLN,EOLN,bl_tree_top); add_tree ("00000000000",EOLN,EOLN,wt_tree_top); add_tree ("00000000000",EOLN,EOLN,two_tree_top); built = 1; return(0);}/* ROUTINE: add_tree *//* *//* SYNOPSIS: adds a run to the tree *//* */add_tree (string,run,mode,root)char * string; /* string containing the bit sequence */int run; /* the run length associated with the sequence */char mode; /* the type of data we are entering */node * root; /* top of the tree string should be added to */{char * ptr;node * treeptr;register i; ptr = string; treeptr = root; for ( i=0; i< (int)strlen(string); i++,ptr++) if (*ptr == '0') { if (treeptr->zero == NULL) treeptr->zero = get_node (); treeptr = treeptr->zero; } else { if (treeptr->one == NULL) treeptr->one = get_node (); treeptr = treeptr->one; } treeptr->n_type = mode; treeptr->value = run;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?