1 /* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */ 2 /* ==================================================================== 3 * Copyright (c) 2009 Carnegie Mellon University. All rights 4 * reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in 15 * the documentation and/or other materials provided with the 16 * distribution. 17 * 18 * This work was supported in part by funding from the Defense Advanced 19 * Research Projects Agency and the National Science Foundation of the 20 * United States of America, and the CMU Sphinx Speech Consortium. 21 * 22 * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND 23 * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 24 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 25 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY 26 * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 27 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 28 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 29 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 30 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 31 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 32 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 33 * 34 * ==================================================================== 35 * 36 */ 37 38 /** 39 * @file huff_code.h 40 * @brief Huffman code and bitstream implementation 41 * 42 * This interface supports building canonical Huffman codes from 43 * string and integer values. It also provides support for encoding 44 * and decoding from strings and files, and for reading and writing 45 * codebooks from files. 46 */ 47 48 #ifndef __HUFF_CODE_H__ 49 #define __HUFF_CODE_H__ 50 51 #include <stdio.h> 52 53 #include <sphinxbase/sphinxbase_export.h> 54 #include <sphinxbase/prim_type.h> 55 #include <sphinxbase/cmd_ln.h> 56 57 typedef struct huff_code_s huff_code_t; 58 59 /** 60 * Create a codebook from 32-bit integer data. 61 */ 62 SPHINXBASE_EXPORT 63 huff_code_t *huff_code_build_int(int32 const *values, int32 const *frequencies, int nvals); 64 65 /** 66 * Create a codebook from string data. 67 */ 68 SPHINXBASE_EXPORT 69 huff_code_t *huff_code_build_str(char * const *values, int32 const *frequencies, int nvals); 70 71 /** 72 * Read a codebook from a file. 73 */ 74 SPHINXBASE_EXPORT 75 huff_code_t *huff_code_read(FILE *infh); 76 77 /** 78 * Write a codebook to a file. 79 */ 80 SPHINXBASE_EXPORT 81 int huff_code_write(huff_code_t *hc, FILE *outfh); 82 83 /** 84 * Print a codebook to a file as text (for debugging) 85 */ 86 SPHINXBASE_EXPORT 87 int huff_code_dump(huff_code_t *hc, FILE *dumpfh); 88 89 /** 90 * Retain a pointer to a Huffman codec object. 91 */ 92 SPHINXBASE_EXPORT 93 huff_code_t *huff_code_retain(huff_code_t *hc); 94 95 /** 96 * Release a pointer to a Huffman codec object. 97 */ 98 SPHINXBASE_EXPORT 99 int huff_code_free(huff_code_t *hc); 100 101 /** 102 * Attach a Huffman codec to a file handle for input/output. 103 */ 104 SPHINXBASE_EXPORT 105 FILE *huff_code_attach(huff_code_t *hc, FILE *fh, char const *mode); 106 107 /** 108 * Detach a Huffman codec from its file handle. 109 */ 110 SPHINXBASE_EXPORT 111 FILE *huff_code_detach(huff_code_t *hc); 112 113 /** 114 * Encode an integer, writing it to the file handle, if any. 115 */ 116 SPHINXBASE_EXPORT 117 int huff_code_encode_int(huff_code_t *hc, int32 sym, uint32 *outcw); 118 119 /** 120 * Encode a string, writing it to the file handle, if any. 121 */ 122 SPHINXBASE_EXPORT 123 int huff_code_encode_str(huff_code_t *hc, char const *sym, uint32 *outcw); 124 125 /** 126 * Decode an integer, reading it from the file if no data given. 127 */ 128 SPHINXBASE_EXPORT 129 int huff_code_decode_int(huff_code_t *hc, int *outval, 130 char const **inout_data, 131 size_t *inout_data_len, 132 int *inout_offset); 133 134 /** 135 * Decode a string, reading it from the file if no data given. 136 */ 137 SPHINXBASE_EXPORT 138 char const *huff_code_decode_str(huff_code_t *hc, 139 char const **inout_data, 140 size_t *inout_data_len, 141 int *inout_offset); 142 143 #endif /* __HUFF_CODE_H__ */ 144