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 }