Mercurial > ecos
annotate packages/redboot/current/src/decompress.c @ 1959:81a7ecadf7d3
* src/decompress.c (zcfree): Remove unnecessary variable
reinitialisation.
| author | asl |
|---|---|
| date | Thu, 21 Apr 2005 18:39:28 +0000 |
| parents | d5f61a251ca3 |
| children | 74dbf4c3f2e1 |
| 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 //========================================================================== |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
191
diff
changeset
|
8 //####ECOSGPLCOPYRIGHTBEGIN#### |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
191
diff
changeset
|
9 // ------------------------------------------- |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
191
diff
changeset
|
10 // This file is part of eCos, the Embedded Configurable Operating System. |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
191
diff
changeset
|
11 // Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc. |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
191
diff
changeset
|
12 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
191
diff
changeset
|
13 // eCos is free software; you can redistribute it and/or modify it under |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
191
diff
changeset
|
14 // the terms of the GNU General Public License as published by the Free |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
191
diff
changeset
|
15 // Software Foundation; either version 2 or (at your option) any later version. |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
191
diff
changeset
|
16 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
191
diff
changeset
|
17 // eCos is distributed in the hope that it will be useful, but WITHOUT ANY |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
191
diff
changeset
|
18 // WARRANTY; without even the implied warranty of MERCHANTABILITY or |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
191
diff
changeset
|
19 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
191
diff
changeset
|
20 // for more details. |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
191
diff
changeset
|
21 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
191
diff
changeset
|
22 // You should have received a copy of the GNU General Public License along |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
191
diff
changeset
|
23 // with eCos; if not, write to the Free Software Foundation, Inc., |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
191
diff
changeset
|
24 // 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
191
diff
changeset
|
25 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
191
diff
changeset
|
26 // As a special exception, if other files instantiate templates or use macros |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
191
diff
changeset
|
27 // or inline functions from this file, or you compile this file and link it |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
191
diff
changeset
|
28 // with other works to produce a work based on this file, this file does not |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
191
diff
changeset
|
29 // by itself cause the resulting work to be covered by the GNU General Public |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
191
diff
changeset
|
30 // License. However the source code for this file must still be made available |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
191
diff
changeset
|
31 // in accordance with section (3) of the GNU General Public License. |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
191
diff
changeset
|
32 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
191
diff
changeset
|
33 // This exception does not invalidate any other reasons why a work based on |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
191
diff
changeset
|
34 // this file might be covered by the GNU General Public License. |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
191
diff
changeset
|
35 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
191
diff
changeset
|
36 // Alternative licenses for eCos may be arranged by contacting Red Hat, Inc. |
|
210
d2c90368aeef
Merge from eCos master repository on 2002-05-23-21:39:14-BST
jlarmour
parents:
208
diff
changeset
|
37 // at http://sources.redhat.com/ecos/ecos-license/ |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
191
diff
changeset
|
38 // ------------------------------------------- |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
191
diff
changeset
|
39 //####ECOSGPLCOPYRIGHTEND#### |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
40 //========================================================================== |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
41 //#####DESCRIPTIONBEGIN#### |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
42 // |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
43 // Author(s): jskov |
|
307
906a5d289c6d
Better memory use vis FIS & ZLIB - from Thomas Koeller
gthomas
parents:
210
diff
changeset
|
44 // Contributors: jskov, gthomas, tkoeller |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
45 // Date: 2001-03-08 |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
46 // Purpose: |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
47 // Description: |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
48 // |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
49 // 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
|
50 // |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
51 //####DESCRIPTIONEND#### |
|
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 |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
55 #include <redboot.h> |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
56 |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
57 #ifdef CYGPKG_COMPRESS_ZLIB |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
58 #include <cyg/compress/zlib.h> |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
59 static z_stream stream; |
| 331 | 60 static bool stream_end; |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
61 |
|
191
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
62 #define __ZLIB_MAGIC__ 0x5A4C4942 // 'ZLIB' |
|
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 // |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
65 // 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
|
66 // 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
|
67 // |
| 1420 | 68 // One of either next or size might be removable, if a sentinal block |
| 69 // 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
|
70 struct _block { |
| 1420 | 71 int size; // always the total length of the block, including this header |
| 72 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
|
73 struct _block *next; |
| 1420 | 74 struct _block *prev; |
|
191
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
75 }; |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
76 static struct _block *memlist; |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
77 |
|
307
906a5d289c6d
Better memory use vis FIS & ZLIB - from Thomas Koeller
gthomas
parents:
210
diff
changeset
|
78 #ifdef CYGOPT_REDBOOT_FIS_ZLIB_COMMON_BUFFER |
|
906a5d289c6d
Better memory use vis FIS & ZLIB - from Thomas Koeller
gthomas
parents:
210
diff
changeset
|
79 # 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
|
80 #else |
|
906a5d289c6d
Better memory use vis FIS & ZLIB - from Thomas Koeller
gthomas
parents:
210
diff
changeset
|
81 # define ZLIB_COMPRESSION_OVERHEAD 0xC000 |
|
906a5d289c6d
Better memory use vis FIS & ZLIB - from Thomas Koeller
gthomas
parents:
210
diff
changeset
|
82 #endif |
|
191
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
83 static void *zlib_workspace; |
|
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 // |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
86 // 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
|
87 // 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
|
88 // 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
|
89 // 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
|
90 // 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
|
91 // |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
92 static void |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
93 _zlib_init(void) |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
94 { |
| 1420 | 95 struct _block *bp; |
|
307
906a5d289c6d
Better memory use vis FIS & ZLIB - from Thomas Koeller
gthomas
parents:
210
diff
changeset
|
96 #ifdef CYGOPT_REDBOOT_FIS_ZLIB_COMMON_BUFFER |
|
906a5d289c6d
Better memory use vis FIS & ZLIB - from Thomas Koeller
gthomas
parents:
210
diff
changeset
|
97 zlib_workspace = fis_zlib_common_buffer; |
|
906a5d289c6d
Better memory use vis FIS & ZLIB - from Thomas Koeller
gthomas
parents:
210
diff
changeset
|
98 #else |
|
191
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
99 // 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
|
100 workspace_end -= ZLIB_COMPRESSION_OVERHEAD; |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
101 zlib_workspace = workspace_end; |
|
307
906a5d289c6d
Better memory use vis FIS & ZLIB - from Thomas Koeller
gthomas
parents:
210
diff
changeset
|
102 #endif |
| 1420 | 103 bp = (struct _block *)zlib_workspace; |
| 104 memlist = bp; | |
| 105 bp->next = bp->prev = 0; | |
| 106 bp->size = ZLIB_COMPRESSION_OVERHEAD; | |
| 107 bp->magic = 0; | |
| 108 #ifdef DEBUG_ZLIB_MALLOC | |
| 109 show_memlist(__FUNCTION__); | |
| 110 #endif | |
|
191
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 |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
113 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
|
114 |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
115 // #define DEBUG_ZLIB_MALLOC |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
116 #ifdef DEBUG_ZLIB_MALLOC |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
117 static void |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
118 show_memlist(char *when) |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
119 { |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
120 struct _block *bp = memlist; |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
121 |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
122 diag_printf("memory list after %s\n", when); |
| 1420 | 123 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
|
124 while (bp != (struct _block *)0) { |
| 1420 | 125 diag_printf(" %08p-%08p 0x%08x %08p %08p %s\n", bp, (unsigned char *)bp+bp->size, |
| 126 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
|
127 bp = bp->next; |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
128 } |
| 1420 | 129 diag_printf("\n"); |
|
191
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
130 } |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
131 #endif |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
132 |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
133 // 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
|
134 // 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
|
135 |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
136 void |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
137 *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
|
138 { |
| 1420 | 139 voidpf res = 0; |
| 140 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
|
141 struct _block *bp = memlist; |
| 1420 | 142 struct _block *nbp; |
| 143 | |
| 144 #ifdef DEBUG_ZLIB_MALLOC | |
| 145 /* do this here because when int is called output is not setup yet */ | |
| 146 static int first_alloc = 1; | |
| 147 if ( first_alloc ) { | |
| 148 show_memlist("initialization"); | |
| 149 first_alloc = 0; | |
| 150 } | |
| 151 #endif | |
|
191
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
152 |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
153 // Simple, first-fit algorithm |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
154 while (bp) { |
| 1420 | 155 if (bp->magic == 0 && bp->size > len) { |
| 156 nbp = (struct _block *)((char *)bp + len); | |
| 157 /* 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
|
158 nbp->next = bp->next; |
| 1420 | 159 bp->next = nbp; |
| 160 nbp->prev = bp; | |
| 161 /* 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
|
162 nbp->size = bp->size - len; |
| 1420 | 163 bp->size = len; |
| 164 /* mark the new block as free */ | |
| 165 nbp->magic = 0; | |
| 166 /* mark allocated block as allocated */ | |
| 167 bp->magic = __ZLIB_MAGIC__; | |
| 168 res = bp +1; | |
| 169 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
|
170 break; |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
171 } |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
172 bp = bp->next; |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
173 } |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
174 #ifdef DEBUG_ZLIB_MALLOC |
| 1420 | 175 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
|
176 show_memlist(__FUNCTION__); |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
177 #endif |
| 1420 | 178 if ( res == NULL ) |
| 179 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
|
180 return res; |
|
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 |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
183 void |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
184 zcfree(void *opaque, void *ptr) |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
185 { |
| 1420 | 186 struct _block *bp; |
|
191
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
187 |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
188 if (!ptr) return; // Safety |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
189 bp = (struct _block *)((char *)ptr - sizeof(struct _block)); |
| 1420 | 190 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
|
191 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
|
192 return; |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
193 } |
| 1420 | 194 |
| 195 /* mark as free */ | |
| 196 bp->magic = 0; | |
| 197 | |
|
191
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
198 #ifdef DEBUG_ZLIB_MALLOC |
| 1420 | 199 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
|
200 #endif |
| 1420 | 201 |
| 202 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
|
203 #ifdef DEBUG_ZLIB_MALLOC |
| 1420 | 204 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
|
205 #endif |
| 1420 | 206 bp->size += bp->next->size; |
| 207 bp->next = bp->next->next; | |
| 208 } | |
| 209 | |
| 210 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
|
211 #ifdef DEBUG_ZLIB_MALLOC |
| 1420 | 212 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
|
213 #endif |
| 1420 | 214 bp->prev->size += bp->size; |
| 215 bp->prev->next = bp->next; | |
| 216 bp = bp->prev; | |
| 217 } | |
| 218 | |
|
191
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
219 #ifdef DEBUG_ZLIB_MALLOC |
| 1420 | 220 show_memlist(__FUNCTION__); |
|
191
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
221 #endif |
|
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 // |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
225 // 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
|
226 // |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
227 static int |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
228 gzip_init(_pipe_t* p) |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
229 { |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
230 int err; |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
231 |
| 1421 | 232 // Note: this code used to [re]initialize the memory pool used |
| 233 // 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
|
234 stream.zalloc = zcalloc; |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
235 stream.zfree = zcfree; |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
236 stream.next_in = NULL; |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
237 stream.avail_in = 0; |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
238 stream.next_out = NULL; |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
239 stream.avail_out = 0; |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
240 err = inflateInit(&stream); |
| 331 | 241 stream_end = false; |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
242 |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
243 return err; |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
244 } |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
245 |
|
191
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
246 // |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
247 // 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
|
248 // 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
|
249 // |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
250 static int |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
251 gzip_inflate(_pipe_t* p) |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
252 { |
| 330 | 253 int err, bytes_out; |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
254 |
| 331 | 255 if (stream_end) |
| 256 return Z_STREAM_END; | |
| 257 | |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
258 stream.next_in = p->in_buf; |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
259 stream.avail_in = p->in_avail; |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
260 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
|
261 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
|
262 err = inflate(&stream, Z_SYNC_FLUSH); |
| 330 | 263 bytes_out = stream.next_out - p->out_buf; |
| 264 p->out_size += bytes_out; | |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
265 p->out_buf = stream.next_out; |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
266 p->msg = stream.msg; |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
191
diff
changeset
|
267 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
|
268 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
|
269 |
| 331 | 270 // Let upper layers process any inflated bytes at |
| 271 // end of stream. | |
| 272 if (err == Z_STREAM_END && bytes_out) { | |
| 273 stream_end = true; | |
| 274 err = Z_OK; | |
| 330 | 275 } |
| 331 | 276 |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
277 return err; |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
278 } |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
279 |
|
191
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
280 // |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
281 // 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
|
282 // 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
|
283 // information up. |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
284 // |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
285 static int |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
286 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
|
287 { |
| 331 | 288 switch (err) { |
| 289 case Z_STREAM_END: | |
| 290 err = 0; | |
| 291 break; | |
| 292 case Z_OK: | |
| 474 | 293 if (stream_end) { |
| 294 break; | |
| 295 } | |
| 331 | 296 // Decompression didn't complete |
| 297 p->msg = "premature end of input"; | |
| 298 // fall-through | |
| 299 default: | |
| 300 err = -1; | |
| 301 break; | |
| 302 } | |
| 303 | |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
304 inflateEnd(&stream); |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
305 |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
306 return err; |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
307 } |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
308 |
|
191
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
309 // |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
310 // Exported interfaces |
|
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
156
diff
changeset
|
311 // |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
diff
changeset
|
312 _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
|
313 _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
|
314 _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
|
315 #endif // CYGPKG_COMPRESS_ZLIB |
