diff --git a/src/calibre/utils/chm/extra.c b/src/calibre/utils/chm/extra.c index b4fc13488a..ec884fa2f0 100644 --- a/src/calibre/utils/chm/extra.c +++ b/src/calibre/utils/chm/extra.c @@ -32,7 +32,7 @@ #include #ifdef _MSC_VER -#include "stdint.h" +#include #define strcasecmp stricmp #define strncasecmp strnicmp #else @@ -76,13 +76,13 @@ #define FREE(x) free (x); x = NULL -inline uint16_t +inline uint16_t get_uint16 (uint8_t* b) { return b[0] | b[1]<<8; } -inline uint32_t +inline uint32_t get_uint32 (uint8_t* b) { return b[0] | b[1]<<8 | @@ -90,7 +90,7 @@ get_uint32 (uint8_t* b) { b[3]<<24; } -inline uint64_t +inline uint64_t get_uint64 (uint8_t* b) { return b[0] | b[1]<<8 | @@ -102,20 +102,20 @@ get_uint64 (uint8_t* b) { (uint64_t) b[7]<<56; } -inline uint64_t +inline uint64_t be_encint (unsigned char *buffer, size_t *length) { uint64_t result = 0; int shift=0; *length = 0; - + do { result |= ((*buffer) & 0x7f) << shift; shift += 7; *length = *length + 1; - + } while (*(buffer++) & 0x80); - + return result; } @@ -127,7 +127,7 @@ inline int ffus (unsigned char* byte, int* bit, size_t *length) { int bits = 0; *length = 0; - + while(*byte & (1 << *bit)){ if(*bit) --(*bit); @@ -138,14 +138,14 @@ ffus (unsigned char* byte, int* bit, size_t *length) { } ++bits; } - + if(*bit) --(*bit); else { ++(*length); *bit = 7; } - + return bits; } @@ -160,21 +160,21 @@ sr_int(unsigned char* byte, int* bit, size_t fflen; *length = 0; - + if(!bit || *bit > 7 || s != 2) return ~(uint64_t)0; ret = 0; - + count = ffus(byte, bit, &fflen); *length += fflen; byte += *length; - + n_bits = n = r + (count ? count-1 : 0) ; - + while (n > 0) { num_bits = n > *bit ? *bit : n-1; base = n > *bit ? 0 : *bit - (n-1); - + switch (num_bits){ case 0: mask = 1; @@ -204,11 +204,11 @@ sr_int(unsigned char* byte, int* bit, mask = 0xff; break; } - + mask <<= base; ret = (ret << (num_bits+1)) | (uint64_t)((*byte & mask) >> base); - + if( n > *bit ){ ++byte; ++(*length); @@ -219,14 +219,14 @@ sr_int(unsigned char* byte, int* bit, n = 0; } } - + if(count) ret |= (uint64_t)1 << n_bits; - + return ret; } - + static inline uint32_t get_leaf_node_offset(struct chmFile *chmfile, const char *text, @@ -246,31 +246,31 @@ get_leaf_node_offset(struct chmFile *chmfile, if (NULL == buffer) return 0; - + while (--tree_depth) { if (initial_offset == test_offset) { FREE(buffer); return 0; } - + test_offset = initial_offset; - if (chm_retrieve_object (chmfile, ui, buffer, + if (chm_retrieve_object (chmfile, ui, buffer, initial_offset, buff_size) == 0) { FREE(buffer); return 0; } - + free_space = get_uint16 (buffer); - + while (i < buff_size - free_space) { word_len = *(buffer + i); pos = *(buffer + i + 1); - + wrd_buf = (char*)malloc (word_len); memcpy (wrd_buf, buffer + i + 2, word_len - 1); wrd_buf[word_len - 1] = 0; - + if (pos == 0) { FREE (word); word = (char *) strdup (wrd_buf); @@ -280,17 +280,17 @@ get_leaf_node_offset(struct chmFile *chmfile, } FREE(wrd_buf); - + if (strcasecmp (text, word) <= 0) { initial_offset = get_uint32 (buffer + i + word_len + 1); break; } - - i += word_len + sizeof (unsigned char) + sizeof(uint32_t) + + + i += word_len + sizeof (unsigned char) + sizeof(uint32_t) + sizeof(uint16_t); } } - + if(initial_offset == test_offset) initial_offset = 0; @@ -300,7 +300,7 @@ get_leaf_node_offset(struct chmFile *chmfile, return initial_offset; } -static inline int +static inline int pychm_process_wlc (struct chmFile *chmfile, uint64_t wlc_count, uint64_t wlc_size, uint32_t wlc_offset, unsigned char ds, @@ -325,14 +325,14 @@ pychm_process_wlc (struct chmFile *chmfile, char *url = NULL; char *topic = NULL; - if (chm_retrieve_object(chmfile, uimain, buffer, + if (chm_retrieve_object(chmfile, uimain, buffer, wlc_offset, wlc_size) == 0) { FREE(buffer); return false; } for (i = 0; i < wlc_count; ++i) { - + if(wlc_bit != 7) { ++off; wlc_bit = 7; @@ -341,7 +341,7 @@ pychm_process_wlc (struct chmFile *chmfile, index += sr_int(buffer + off, &wlc_bit, ds, dr, &length); off += length; - if(chm_retrieve_object(chmfile, topics, entry, + if(chm_retrieve_object(chmfile, topics, entry, index * 16, TOPICS_ENTRY_LEN) == 0) { FREE(topic); FREE(url); @@ -353,34 +353,34 @@ pychm_process_wlc (struct chmFile *chmfile, stroff = get_uint32 (entry + 4); FREE (topic); - if (chm_retrieve_object (chmfile, uistrings, combuf, + if (chm_retrieve_object (chmfile, uistrings, combuf, stroff, COMMON_BUF_LEN - 1) == 0) { topic = strdup ("Untitled in index"); } else { combuf[COMMON_BUF_LEN - 1] = 0; - + topic = strdup ((char*)combuf); } - + urloff = get_uint32 (entry + 8); - if(chm_retrieve_object (chmfile, uitbl, combuf, + if(chm_retrieve_object (chmfile, uitbl, combuf, urloff, 12) == 0) { FREE(buffer); return false; } urloff = get_uint32 (combuf + 8); - - if (chm_retrieve_object (chmfile, urlstr, combuf, + + if (chm_retrieve_object (chmfile, urlstr, combuf, urloff + 8, COMMON_BUF_LEN - 1) == 0) { FREE(topic); FREE(url); FREE(buffer); return false; } - + combuf[COMMON_BUF_LEN - 1] = 0; FREE (url); @@ -388,16 +388,16 @@ pychm_process_wlc (struct chmFile *chmfile, if (url && topic) { #ifdef __PYTHON__ - PyDict_SetItemString (dict, topic, + PyDict_SetItemString (dict, topic, PyString_FromString (url)); #else printf ("%s ==> %s\n", url, topic); #endif } - + count = sr_int (buffer + off, &wlc_bit, cs, cr, &length); off += length; - + for (j = 0; j < count; ++j) { sr_int (buffer + off, &wlc_bit, ls, lr, &length); off += length; @@ -411,9 +411,9 @@ pychm_process_wlc (struct chmFile *chmfile, return true; } -int +int chm_search (struct chmFile *chmfile, - const char *text, int whole_words, + const char *text, int whole_words, int titles_only, PyObject *dict) { unsigned char header[FTS_HEADER_LEN]; @@ -443,7 +443,7 @@ chm_search (struct chmFile *chmfile, return -1; if (chm_resolve_object (chmfile, "/$FIftiMain", &ui) != - CHM_RESOLVE_SUCCESS || + CHM_RESOLVE_SUCCESS || chm_resolve_object (chmfile, "/#TOPICS", &uitopics) != CHM_RESOLVE_SUCCESS || chm_resolve_object (chmfile, "/#STRINGS", &uistrings) != @@ -456,7 +456,7 @@ chm_search (struct chmFile *chmfile, if(chm_retrieve_object(chmfile, &ui, header, 0, FTS_HEADER_LEN) == 0) return false; - + doc_index_s = header[0x1E]; doc_index_r = header[0x1F]; code_count_s = header[0x20]; @@ -473,40 +473,40 @@ chm_search (struct chmFile *chmfile, tree_depth = get_uint16 (header + 0x18); i = sizeof(uint16_t); - + buffer = (unsigned char*)malloc (node_len); - + node_offset = get_leaf_node_offset (chmfile, text, node_offset, node_len, tree_depth, &ui); - - if (!node_offset) { + + if (!node_offset) { FREE(buffer); return false; } - + do { - - if (chm_retrieve_object (chmfile, &ui, buffer, + + if (chm_retrieve_object (chmfile, &ui, buffer, node_offset, node_len) == 0) { FREE(word); FREE(buffer); return false; } - + free_space = get_uint16 (buffer + 6); - + i = sizeof(uint32_t) + sizeof(uint16_t) + sizeof(uint16_t); - + encsz = 0; while (i < node_len - free_space) { word_len = *(buffer + i); pos = *(buffer + i + 1); - + wrd_buf = (char*)malloc (word_len); memcpy (wrd_buf, buffer + i + 2, word_len - 1); wrd_buf[word_len - 1] = 0; - + if (pos == 0) { FREE(word); word = (char *) strdup (wrd_buf); @@ -516,29 +516,29 @@ chm_search (struct chmFile *chmfile, } FREE(wrd_buf); - + i += 2 + word_len; title = *(buffer + i - 1); wlc_count = be_encint (buffer + i, &encsz); i += encsz; - + wlc_offset = get_uint32 (buffer + i); i += sizeof(uint32_t) + sizeof(uint16_t); wlc_size = be_encint (buffer + i, &encsz); i += encsz; - + node_offset = get_uint32 (buffer); if (!title && titles_only) continue; - + if (whole_words && !strcasecmp(text, word)) { - partial = pychm_process_wlc (chmfile, wlc_count, wlc_size, - wlc_offset, doc_index_s, - doc_index_r,code_count_s, - code_count_r, loc_codes_s, + partial = pychm_process_wlc (chmfile, wlc_count, wlc_size, + wlc_offset, doc_index_s, + doc_index_r,code_count_s, + code_count_r, loc_codes_s, loc_codes_r, &ui, &uiurltbl, &uistrings, &uitopics, &uiurlstr, dict); @@ -546,27 +546,27 @@ chm_search (struct chmFile *chmfile, FREE(buffer); return partial; } - + if (!whole_words) { if (!strncasecmp (word, text, strlen(text))) { partial = true; - pychm_process_wlc (chmfile, wlc_count, wlc_size, - wlc_offset, doc_index_s, - doc_index_r,code_count_s, - code_count_r, loc_codes_s, + pychm_process_wlc (chmfile, wlc_count, wlc_size, + wlc_offset, doc_index_s, + doc_index_r,code_count_s, + code_count_r, loc_codes_s, loc_codes_r, &ui, &uiurltbl, &uistrings, &uitopics, &uiurlstr, dict); - + } else if (strncasecmp (text, word, strlen(text)) < -1) break; } } - } while (!whole_words && - !strncmp (word, text, strlen(text)) && + } while (!whole_words && + !strncmp (word, text, strlen(text)) && node_offset); - + FREE(word); FREE(buffer); @@ -593,11 +593,11 @@ chm_get_lcid (struct chmFile *chmfile) { int i; for (i=0; i \n"); printf ("> "); if (scanf ("%d %d %s", &whole_words, &titles_only, text)) - partial = chm_search (file, + partial = chm_search (file, text, whole_words, titles_only, NULL); - else + else break; - + printf ("Partial = %d\n", partial); } diff --git a/src/calibre/utils/chm/stdint.h b/src/calibre/utils/chm/stdint.h deleted file mode 100644 index 59d067302f..0000000000 --- a/src/calibre/utils/chm/stdint.h +++ /dev/null @@ -1,247 +0,0 @@ -// ISO C9x compliant stdint.h for Microsoft Visual Studio -// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 -// -// Copyright (c) 2006-2008 Alexander Chemeris -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, -// this list of conditions and the following disclaimer. -// -// 2. Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// 3. The name of the author may be used to endorse or promote products -// derived from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED -// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO -// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -/////////////////////////////////////////////////////////////////////////////// - -#ifndef _MSC_VER // [ -#error "Use this header only with Microsoft Visual C++ compilers!" -#endif // _MSC_VER ] - -#ifndef _MSC_STDINT_H_ // [ -#define _MSC_STDINT_H_ - -#if _MSC_VER > 1000 -#pragma once -#endif - -#include - -// For Visual Studio 6 in C++ mode and for many Visual Studio versions when -// compiling for ARM we should wrap include with 'extern "C++" {}' -// or compiler give many errors like this: -// error C2733: second C linkage of overloaded function 'wmemchr' not allowed -#ifdef __cplusplus -extern "C" { -#endif -# include -#ifdef __cplusplus -} -#endif - -// Define _W64 macros to mark types changing their size, like intptr_t. -#ifndef _W64 -# if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300 -# define _W64 __w64 -# else -# define _W64 -# endif -#endif - - -// 7.18.1 Integer types - -// 7.18.1.1 Exact-width integer types - -// Visual Studio 6 and Embedded Visual C++ 4 doesn't -// realize that, e.g. char has the same size as __int8 -// so we give up on __intX for them. -#if (_MSC_VER < 1300) - typedef signed char int8_t; - typedef signed short int16_t; - typedef signed int int32_t; - typedef unsigned char uint8_t; - typedef unsigned short uint16_t; - typedef unsigned int uint32_t; -#else - typedef signed __int8 int8_t; - typedef signed __int16 int16_t; - typedef signed __int32 int32_t; - typedef unsigned __int8 uint8_t; - typedef unsigned __int16 uint16_t; - typedef unsigned __int32 uint32_t; -#endif -typedef signed __int64 int64_t; -typedef unsigned __int64 uint64_t; - - -// 7.18.1.2 Minimum-width integer types -typedef int8_t int_least8_t; -typedef int16_t int_least16_t; -typedef int32_t int_least32_t; -typedef int64_t int_least64_t; -typedef uint8_t uint_least8_t; -typedef uint16_t uint_least16_t; -typedef uint32_t uint_least32_t; -typedef uint64_t uint_least64_t; - -// 7.18.1.3 Fastest minimum-width integer types -typedef int8_t int_fast8_t; -typedef int16_t int_fast16_t; -typedef int32_t int_fast32_t; -typedef int64_t int_fast64_t; -typedef uint8_t uint_fast8_t; -typedef uint16_t uint_fast16_t; -typedef uint32_t uint_fast32_t; -typedef uint64_t uint_fast64_t; - -// 7.18.1.4 Integer types capable of holding object pointers -#ifdef _WIN64 // [ - typedef signed __int64 intptr_t; - typedef unsigned __int64 uintptr_t; -#else // _WIN64 ][ - typedef _W64 signed int intptr_t; - typedef _W64 unsigned int uintptr_t; -#endif // _WIN64 ] - -// 7.18.1.5 Greatest-width integer types -typedef int64_t intmax_t; -typedef uint64_t uintmax_t; - - -// 7.18.2 Limits of specified-width integer types - -#if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS) // [ See footnote 220 at page 257 and footnote 221 at page 259 - -// 7.18.2.1 Limits of exact-width integer types -#define INT8_MIN ((int8_t)_I8_MIN) -#define INT8_MAX _I8_MAX -#define INT16_MIN ((int16_t)_I16_MIN) -#define INT16_MAX _I16_MAX -#define INT32_MIN ((int32_t)_I32_MIN) -#define INT32_MAX _I32_MAX -#define INT64_MIN ((int64_t)_I64_MIN) -#define INT64_MAX _I64_MAX -#define UINT8_MAX _UI8_MAX -#define UINT16_MAX _UI16_MAX -#define UINT32_MAX _UI32_MAX -#define UINT64_MAX _UI64_MAX - -// 7.18.2.2 Limits of minimum-width integer types -#define INT_LEAST8_MIN INT8_MIN -#define INT_LEAST8_MAX INT8_MAX -#define INT_LEAST16_MIN INT16_MIN -#define INT_LEAST16_MAX INT16_MAX -#define INT_LEAST32_MIN INT32_MIN -#define INT_LEAST32_MAX INT32_MAX -#define INT_LEAST64_MIN INT64_MIN -#define INT_LEAST64_MAX INT64_MAX -#define UINT_LEAST8_MAX UINT8_MAX -#define UINT_LEAST16_MAX UINT16_MAX -#define UINT_LEAST32_MAX UINT32_MAX -#define UINT_LEAST64_MAX UINT64_MAX - -// 7.18.2.3 Limits of fastest minimum-width integer types -#define INT_FAST8_MIN INT8_MIN -#define INT_FAST8_MAX INT8_MAX -#define INT_FAST16_MIN INT16_MIN -#define INT_FAST16_MAX INT16_MAX -#define INT_FAST32_MIN INT32_MIN -#define INT_FAST32_MAX INT32_MAX -#define INT_FAST64_MIN INT64_MIN -#define INT_FAST64_MAX INT64_MAX -#define UINT_FAST8_MAX UINT8_MAX -#define UINT_FAST16_MAX UINT16_MAX -#define UINT_FAST32_MAX UINT32_MAX -#define UINT_FAST64_MAX UINT64_MAX - -// 7.18.2.4 Limits of integer types capable of holding object pointers -#ifdef _WIN64 // [ -# define INTPTR_MIN INT64_MIN -# define INTPTR_MAX INT64_MAX -# define UINTPTR_MAX UINT64_MAX -#else // _WIN64 ][ -# define INTPTR_MIN INT32_MIN -# define INTPTR_MAX INT32_MAX -# define UINTPTR_MAX UINT32_MAX -#endif // _WIN64 ] - -// 7.18.2.5 Limits of greatest-width integer types -#define INTMAX_MIN INT64_MIN -#define INTMAX_MAX INT64_MAX -#define UINTMAX_MAX UINT64_MAX - -// 7.18.3 Limits of other integer types - -#ifdef _WIN64 // [ -# define PTRDIFF_MIN _I64_MIN -# define PTRDIFF_MAX _I64_MAX -#else // _WIN64 ][ -# define PTRDIFF_MIN _I32_MIN -# define PTRDIFF_MAX _I32_MAX -#endif // _WIN64 ] - -#define SIG_ATOMIC_MIN INT_MIN -#define SIG_ATOMIC_MAX INT_MAX - -#ifndef SIZE_MAX // [ -# ifdef _WIN64 // [ -# define SIZE_MAX _UI64_MAX -# else // _WIN64 ][ -# define SIZE_MAX _UI32_MAX -# endif // _WIN64 ] -#endif // SIZE_MAX ] - -// WCHAR_MIN and WCHAR_MAX are also defined in -#ifndef WCHAR_MIN // [ -# define WCHAR_MIN 0 -#endif // WCHAR_MIN ] -#ifndef WCHAR_MAX // [ -# define WCHAR_MAX _UI16_MAX -#endif // WCHAR_MAX ] - -#define WINT_MIN 0 -#define WINT_MAX _UI16_MAX - -#endif // __STDC_LIMIT_MACROS ] - - -// 7.18.4 Limits of other integer types - -#if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) // [ See footnote 224 at page 260 - -// 7.18.4.1 Macros for minimum-width integer constants - -#define INT8_C(val) val##i8 -#define INT16_C(val) val##i16 -#define INT32_C(val) val##i32 -#define INT64_C(val) val##i64 - -#define UINT8_C(val) val##ui8 -#define UINT16_C(val) val##ui16 -#define UINT32_C(val) val##ui32 -#define UINT64_C(val) val##ui64 - -// 7.18.4.2 Macros for greatest-width integer constants -#define INTMAX_C INT64_C -#define UINTMAX_C UINT64_C - -#endif // __STDC_CONSTANT_MACROS ] - - -#endif // _MSC_STDINT_H_ ]