Mercurial > ecos
annotate packages/redboot/current/src/decompress.c @ 3237:70cba7faa5f7
* ecos.db: Add CAN driver entry for olcpe2294 target (Olimex
LPC-E2294 development board).
| author | sergeig |
|---|---|
| date | Tue, 21 May 2013 18:58:25 +0000 |
| parents | 74dbf4c3f2e1 |
| children |
| rev | line source |
|---|---|
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
1 //========================================================================== |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
2 // |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
3 // decompress.c |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
4 // |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
5 // RedBoot decompress support |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
6 // |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
7 //========================================================================== |
|
2729
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
1959
diff
changeset
|
8 // ####ECOSGPLCOPYRIGHTBEGIN#### |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
1959
diff
changeset
|
9 // ------------------------------------------- |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
1959
diff
changeset
|
10 // This file is part of eCos, the Embedded Configurable Operating System. |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
1959
diff
changeset
|
11 // Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
191
diff
changeset
|
12 // |
|
2729
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
1959
diff
changeset
|
13 // eCos is free software; you can redistribute it and/or modify it under |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
1959
diff
changeset
|
14 // the terms of the GNU General Public License as published by the Free |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
1959
diff
changeset
|
15 // Software Foundation; either version 2 or (at your option) any later |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
1959
diff
changeset
|
16 // version. |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
191
diff
changeset
|
17 // |
|
2729
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
1959
diff
changeset
|
18 // eCos is distributed in the hope that it will be useful, but WITHOUT |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
1959
diff
changeset
|
19 // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
1959
diff
changeset
|
20 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
1959
diff
changeset
|
21 // for more details. |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
191
diff
changeset
|
22 // |
|
2729
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
1959
diff
changeset
|
23 // You should have received a copy of the GNU General Public License |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
1959
diff
changeset
|
24 // along with eCos; if not, write to the Free Software Foundation, Inc., |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
1959
diff
changeset
|
25 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
191
diff
changeset
|
26 // |
|
2729
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
1959
diff
changeset
|
27 // As a special exception, if other files instantiate templates or use |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
1959
diff
changeset
|
28 // macros or inline functions from this file, or you compile this file |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
1959
diff
changeset
|
29 // and link it with other works to produce a work based on this file, |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
1959
diff
changeset
|
30 // this file does not by itself cause the resulting work to be covered by |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
1959
diff
changeset
|
31 // the GNU General Public License. However the source code for this file |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
1959
diff
changeset
|
32 // must still be made available in accordance with section (3) of the GNU |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
1959
diff
changeset
|
33 // General Public License v2. |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
191
diff
changeset
|
34 // |
|
2729
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
1959
diff
changeset
|
35 // This exception does not invalidate any other reasons why a work based |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
1959
diff
changeset
|
36 // on this file might be covered by the GNU General Public License. |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
1959
diff
changeset
|
37 // ------------------------------------------- |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
1959
diff
changeset
|
38 // ####ECOSGPLCOPYRIGHTEND#### |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
39 //========================================================================== |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
40 //#####DESCRIPTIONBEGIN#### |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
41 // |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
42 // Author(s): jskov |
|
307
906a5d289c6d
Better memory use vis FIS & ZLIB - from Thomas Koeller
gthomas
parents:
210
diff
changeset
|
43 // Contributors: jskov, gthomas, tkoeller |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
44 // Date: 2001-03-08 |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
45 // Purpose: |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
46 // Description: |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
47 // |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
48 // This code is part of RedBoot (tm). |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
49 // |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
50 //####DESCRIPTIONEND#### |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
51 // |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
52 //========================================================================== |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
53 |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
54 #include <redboot.h> |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
55 |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
56 #ifdef CYGPKG_COMPRESS_ZLIB |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
57 #include <cyg/compress/zlib.h> |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
58 static z_stream stream; |
| 331 | 59 static bool stream_end; |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
60 |
|
191
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
61 #define __ZLIB_MAGIC__ 0x5A4C4942 // 'ZLIB' |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
62 |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
63 // |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
64 // Free memory [blocks] are stored as a linked list of "struct _block" |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
65 // The 'magic' is kept to insure that the block being freed is reasonable |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
66 // |
| 1420 | 67 // One of either next or size might be removable, if a sentinal block |
| 68 // is placed at the end of the region at initialisation time. | |
|
191
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
69 struct _block { |
| 1420 | 70 int size; // always the total length of the block, including this header |
| 71 long magic; // Must be __ZLIB_MAGIC__ if allocated and 0 if free | |
|
191
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
72 struct _block *next; |
| 1420 | 73 struct _block *prev; |
|
191
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
74 }; |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
75 static struct _block *memlist; |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
76 |
|
307
906a5d289c6d
Better memory use vis FIS & ZLIB - from Thomas Koeller
gthomas
parents:
210
diff
changeset
|
77 #ifdef CYGOPT_REDBOOT_FIS_ZLIB_COMMON_BUFFER |
|
906a5d289c6d
Better memory use vis FIS & ZLIB - from Thomas Koeller
gthomas
parents:
210
diff
changeset
|
78 # define ZLIB_COMPRESSION_OVERHEAD CYGNUM_REDBOOT_FIS_ZLIB_COMMON_BUFFER_SIZE |
|
906a5d289c6d
Better memory use vis FIS & ZLIB - from Thomas Koeller
gthomas
parents:
210
diff
changeset
|
79 #else |
|
906a5d289c6d
Better memory use vis FIS & ZLIB - from Thomas Koeller
gthomas
parents:
210
diff
changeset
|
80 # define ZLIB_COMPRESSION_OVERHEAD 0xC000 |
|
906a5d289c6d
Better memory use vis FIS & ZLIB - from Thomas Koeller
gthomas
parents:
210
diff
changeset
|
81 #endif |
|
191
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
82 static void *zlib_workspace; |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
83 |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
84 // |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
85 // This function is run as part of RedBoot's initialization. |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
86 // It will allocate some memory from the "workspace" pool for |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
87 // use by the gzip/zlib routines. This allows the memory usage |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
88 // of RedBoot to be more finely controlled than if we simply |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
89 // used the generic 'malloc() from the heap' functionality. |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
90 // |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
91 static void |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
92 _zlib_init(void) |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
93 { |
| 1420 | 94 struct _block *bp; |
|
307
906a5d289c6d
Better memory use vis FIS & ZLIB - from Thomas Koeller
gthomas
parents:
210
diff
changeset
|
95 #ifdef CYGOPT_REDBOOT_FIS_ZLIB_COMMON_BUFFER |
|
906a5d289c6d
Better memory use vis FIS & ZLIB - from Thomas Koeller
gthomas
parents:
210
diff
changeset
|
96 zlib_workspace = fis_zlib_common_buffer; |
|
906a5d289c6d
Better memory use vis FIS & ZLIB - from Thomas Koeller
gthomas
parents:
210
diff
changeset
|
97 #else |
|
191
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
98 // Allocate some RAM for use by the gzip/zlib routines |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
99 workspace_end -= ZLIB_COMPRESSION_OVERHEAD; |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
100 zlib_workspace = workspace_end; |
|
307
906a5d289c6d
Better memory use vis FIS & ZLIB - from Thomas Koeller
gthomas
parents:
210
diff
changeset
|
101 #endif |
| 1420 | 102 bp = (struct _block *)zlib_workspace; |
| 103 memlist = bp; | |
| 104 bp->next = bp->prev = 0; | |
| 105 bp->size = ZLIB_COMPRESSION_OVERHEAD; | |
| 106 bp->magic = 0; | |
| 107 #ifdef DEBUG_ZLIB_MALLOC | |
| 108 show_memlist(__FUNCTION__); | |
| 109 #endif | |
|
191
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
110 } |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
111 |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
112 RedBoot_init(_zlib_init, RedBoot_INIT_FIRST); |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
113 |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
114 // #define DEBUG_ZLIB_MALLOC |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
115 #ifdef DEBUG_ZLIB_MALLOC |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
116 static void |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
117 show_memlist(char *when) |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
118 { |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
119 struct _block *bp = memlist; |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
120 |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
121 diag_printf("memory list after %s\n", when); |
| 1420 | 122 diag_printf(" --START--- --END----- --SIZE---- --PREV---- --NEXT---- TYPE-----\n"); |
|
191
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
123 while (bp != (struct _block *)0) { |
| 1420 | 124 diag_printf(" %08p-%08p 0x%08x %08p %08p %s\n", bp, (unsigned char *)bp+bp->size, |
| 125 bp->size, bp->prev, bp->next, bp->magic == 0 ? "FREE" : "ALLOCATED" ); | |
|
191
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
126 bp = bp->next; |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
127 } |
| 1420 | 128 diag_printf("\n"); |
|
191
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
129 } |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
130 #endif |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
131 |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
132 // Note: these have to be global and match the prototype used by the |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
133 // gzip/zlib package since we are exactly replacing them. |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
134 |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
135 void |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
136 *zcalloc(void *opaque, unsigned int items, unsigned int size) |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
137 { |
| 1420 | 138 voidpf res = 0; |
| 139 int len = (items*size) + sizeof(struct _block); | |
|
191
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
140 struct _block *bp = memlist; |
| 1420 | 141 struct _block *nbp; |
| 142 | |
| 143 #ifdef DEBUG_ZLIB_MALLOC | |
| 144 /* do this here because when int is called output is not setup yet */ | |
| 145 static int first_alloc = 1; | |
| 146 if ( first_alloc ) { | |
| 147 show_memlist("initialization"); | |
| 148 first_alloc = 0; | |
| 149 } | |
| 150 #endif | |
|
191
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
151 |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
152 // Simple, first-fit algorithm |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
153 while (bp) { |
| 1420 | 154 if (bp->magic == 0 && bp->size > len) { |
| 155 nbp = (struct _block *)((char *)bp + len); | |
| 156 /* link new block into chain */ | |
|
191
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
157 nbp->next = bp->next; |
| 1420 | 158 bp->next = nbp; |
| 159 nbp->prev = bp; | |
| 160 /* split size between the two blocks */ | |
|
191
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
161 nbp->size = bp->size - len; |
| 1420 | 162 bp->size = len; |
| 163 /* mark the new block as free */ | |
| 164 nbp->magic = 0; | |
| 165 /* mark allocated block as allocated */ | |
| 166 bp->magic = __ZLIB_MAGIC__; | |
| 167 res = bp +1; | |
| 168 memset(res, 0, len - sizeof(struct _block)); | |
|
191
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
169 break; |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
170 } |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
171 bp = bp->next; |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
172 } |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
173 #ifdef DEBUG_ZLIB_MALLOC |
| 1420 | 174 diag_printf("%s(0x%x,0x%x) = %p\n", __FUNCTION__, items, size, res); |
|
191
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
175 show_memlist(__FUNCTION__); |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
176 #endif |
| 1420 | 177 if ( res == NULL ) |
| 178 diag_printf("zcalloc: failed to allocate 0x%x items of 0x%x bytes == 0x%x bytes\n", items, size, len); | |
|
191
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
179 return res; |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
180 } |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
181 |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
182 void |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
183 zcfree(void *opaque, void *ptr) |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
184 { |
| 1420 | 185 struct _block *bp; |
|
191
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
186 |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
187 if (!ptr) return; // Safety |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
188 bp = (struct _block *)((char *)ptr - sizeof(struct _block)); |
| 1420 | 189 if (bp->magic != __ZLIB_MAGIC__) { |
|
191
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
190 diag_printf("%s(%p) - invalid block\n", __FUNCTION__, ptr); |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
191 return; |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
192 } |
| 1420 | 193 |
| 194 /* mark as free */ | |
| 195 bp->magic = 0; | |
| 196 | |
|
191
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
197 #ifdef DEBUG_ZLIB_MALLOC |
| 1420 | 198 diag_printf("%s(%p) = 0x%x bytes\n", __FUNCTION__, ptr, bp->size); |
|
191
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
199 #endif |
| 1420 | 200 |
| 201 while(bp->next && bp->next->magic == 0) { | |
|
191
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
202 #ifdef DEBUG_ZLIB_MALLOC |
| 1420 | 203 diag_printf(" merging %08p and %08p (after)\n", bp, bp->next); |
|
191
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
204 #endif |
| 1420 | 205 bp->size += bp->next->size; |
| 206 bp->next = bp->next->next; | |
| 207 } | |
| 208 | |
| 209 while(bp->prev && bp->prev->magic == 0) { | |
|
191
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
210 #ifdef DEBUG_ZLIB_MALLOC |
| 1420 | 211 diag_printf(" merging %08p and %08p (before)\n", bp->prev, bp); |
|
191
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
212 #endif |
| 1420 | 213 bp->prev->size += bp->size; |
| 214 bp->prev->next = bp->next; | |
| 215 bp = bp->prev; | |
| 216 } | |
| 217 | |
|
191
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
218 #ifdef DEBUG_ZLIB_MALLOC |
| 1420 | 219 show_memlist(__FUNCTION__); |
|
191
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
220 #endif |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
221 } |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
222 |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
223 // |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
224 // This function is called to initialize a gzip/zlib stream. |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
225 // |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
226 static int |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
227 gzip_init(_pipe_t* p) |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
228 { |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
229 int err; |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
230 |
| 1421 | 231 // Note: this code used to [re]initialize the memory pool used |
| 232 // by zlib. This is now done in _zlib_init(), but only once. | |
|
191
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
233 stream.zalloc = zcalloc; |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
234 stream.zfree = zcfree; |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
235 stream.next_in = NULL; |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
236 stream.avail_in = 0; |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
237 stream.next_out = NULL; |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
238 stream.avail_out = 0; |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
239 err = inflateInit(&stream); |
| 331 | 240 stream_end = false; |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
241 |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
242 return err; |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
243 } |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
244 |
|
191
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
245 // |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
246 // This function is called during the decompression cycle to |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
247 // actually cause a buffer to be filled with uncompressed data. |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
248 // |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
249 static int |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
250 gzip_inflate(_pipe_t* p) |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
251 { |
| 330 | 252 int err, bytes_out; |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
253 |
| 331 | 254 if (stream_end) |
| 255 return Z_STREAM_END; | |
| 256 | |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
257 stream.next_in = p->in_buf; |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
258 stream.avail_in = p->in_avail; |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
259 stream.next_out = p->out_buf; |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
191
diff
changeset
|
260 stream.avail_out = p->out_max; |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
261 err = inflate(&stream, Z_SYNC_FLUSH); |
| 330 | 262 bytes_out = stream.next_out - p->out_buf; |
| 263 p->out_size += bytes_out; | |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
264 p->out_buf = stream.next_out; |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
265 p->msg = stream.msg; |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
191
diff
changeset
|
266 p->in_avail = stream.avail_in; |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
191
diff
changeset
|
267 p->in_buf = stream.next_in; |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
268 |
| 331 | 269 // Let upper layers process any inflated bytes at |
| 270 // end of stream. | |
| 271 if (err == Z_STREAM_END && bytes_out) { | |
| 272 stream_end = true; | |
| 273 err = Z_OK; | |
| 330 | 274 } |
| 331 | 275 |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
276 return err; |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
277 } |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
278 |
|
191
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
279 // |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
280 // Called when the input data is completed or an error has |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
281 // occured. This allows for clean up as well as passing error |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
282 // information up. |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
283 // |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
284 static int |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
285 gzip_close(_pipe_t* p, int err) |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
286 { |
| 331 | 287 switch (err) { |
| 288 case Z_STREAM_END: | |
| 289 err = 0; | |
| 290 break; | |
| 291 case Z_OK: | |
| 474 | 292 if (stream_end) { |
| 293 break; | |
| 294 } | |
| 331 | 295 // Decompression didn't complete |
| 296 p->msg = "premature end of input"; | |
| 297 // fall-through | |
| 298 default: | |
| 299 err = -1; | |
| 300 break; | |
| 301 } | |
| 302 | |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
303 inflateEnd(&stream); |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
304 |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
305 return err; |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
306 } |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
307 |
|
191
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
308 // |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
309 // Exported interfaces |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
310 // |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
311 _decompress_fun_init* _dc_init = gzip_init; |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
312 _decompress_fun_inflate* _dc_inflate = gzip_inflate; |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
313 _decompress_fun_close* _dc_close = gzip_close; |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
314 #endif // CYGPKG_COMPRESS_ZLIB |
