Warning, file /graphics/okular/generators/chm/lib/bitfiddle.h was not indexed or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).
0001 /* 0002 SPDX-FileCopyrightText: 2003 Razvan Cojocaru <razvanco@gmx.net> 0003 Most of the code in this file is a modified version of code from 0004 Pabs' GPL chmdeco project, credits and thanks go to him. 0005 0006 SPDX-License-Identifier: GPL-2.0-or-later 0007 */ 0008 0009 inline unsigned short UINT16ARRAY(const void *x) 0010 { 0011 unsigned char *p = (unsigned char *)x; 0012 return p[0] | (p[1] << 8); 0013 } 0014 0015 inline unsigned int UINT32ARRAY(const void *x) 0016 { 0017 unsigned char *p = (unsigned char *)x; 0018 return p[0] | (p[1] << 8) | (p[2] << 16) | (p[3] << 24); 0019 } 0020 0021 inline int INT32ARRAY(const void *x) 0022 { 0023 char *p = (char *)x; 0024 return p[0] | (p[1] << 8) | (p[2] << 16) | (p[3] << 24); 0025 } 0026 0027 inline unsigned int get_int32_le(void *addr) 0028 { 0029 unsigned char *p = (unsigned char *)addr; 0030 return (unsigned int)(p[0] | (p[1] << 8) | (p[2] << 16) | (p[3] << 24)); 0031 } 0032 0033 inline quint64 be_encint(unsigned char *buffer, size_t &length) 0034 { 0035 quint64 result = 0; 0036 int shift = 0; 0037 length = 0; 0038 0039 do { 0040 result |= ((*buffer) & 0x7f) << shift; 0041 shift += 7; 0042 ++length; 0043 0044 } while (*(buffer++) & 0x80); 0045 0046 return result; 0047 } 0048 0049 /* 0050 Finds the first unset bit in memory. Returns the number of set bits found. 0051 Returns -1 if the buffer runs out before we find an unset bit. 0052 */ 0053 inline int ffus(unsigned char *byte, int *bit, size_t &length) 0054 { 0055 int bits = 0; 0056 length = 0; 0057 0058 while (*byte & (1 << *bit)) { 0059 if (*bit) { 0060 --(*bit); 0061 } else { 0062 ++byte; 0063 ++length; 0064 *bit = 7; 0065 } 0066 ++bits; 0067 } 0068 0069 if (*bit) { 0070 --(*bit); 0071 } else { 0072 ++length; 0073 *bit = 7; 0074 } 0075 0076 return bits; 0077 } 0078 0079 inline quint64 sr_int(unsigned char *byte, int *bit, unsigned char s, unsigned char r, size_t &length) 0080 { 0081 quint64 ret; 0082 unsigned char mask; 0083 int n, n_bits, num_bits, base, count; 0084 length = 0; 0085 size_t fflen; 0086 0087 if (!bit || *bit > 7 || s != 2) { 0088 return ~(quint64)0; 0089 } 0090 ret = 0; 0091 0092 count = ffus(byte, bit, fflen); 0093 length += fflen; 0094 byte += length; 0095 0096 n_bits = n = r + (count ? count - 1 : 0); 0097 0098 while (n > 0) { 0099 num_bits = n > *bit ? *bit : n - 1; 0100 base = n > *bit ? 0 : *bit - (n - 1); 0101 0102 switch (num_bits) { 0103 case 0: 0104 mask = 1; 0105 break; 0106 case 1: 0107 mask = 3; 0108 break; 0109 case 2: 0110 mask = 7; 0111 break; 0112 case 3: 0113 mask = 0xf; 0114 break; 0115 case 4: 0116 mask = 0x1f; 0117 break; 0118 case 5: 0119 mask = 0x3f; 0120 break; 0121 case 6: 0122 mask = 0x7f; 0123 break; 0124 case 7: 0125 mask = 0xff; 0126 break; 0127 default: 0128 mask = 0xff; 0129 break; 0130 } 0131 0132 mask <<= base; 0133 ret = (ret << (num_bits + 1)) | (quint64)((*byte & mask) >> base); 0134 0135 if (n > *bit) { 0136 ++byte; 0137 ++length; 0138 n -= *bit + 1; 0139 *bit = 7; 0140 } else { 0141 *bit -= n; 0142 n = 0; 0143 } 0144 } 0145 0146 if (count) { 0147 ret |= (quint64)1 << n_bits; 0148 } 0149 0150 return ret; 0151 }