compr.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:6k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * JFFS2 -- Journalling Flash File System, Version 2.
  3.  *
  4.  * Copyright (C) 2001 Red Hat, Inc.
  5.  *
  6.  * Created by Arjan van de Ven <arjanv@redhat.com>
  7.  *
  8.  * The original JFFS, from which the design for JFFS2 was derived,
  9.  * was designed and implemented by Axis Communications AB.
  10.  *
  11.  * The contents of this file are subject to the Red Hat eCos Public
  12.  * License Version 1.1 (the "Licence"); you may not use this file
  13.  * except in compliance with the Licence.  You may obtain a copy of
  14.  * the Licence at http://www.redhat.com/
  15.  *
  16.  * Software distributed under the Licence is distributed on an "AS IS"
  17.  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied.
  18.  * See the Licence for the specific language governing rights and
  19.  * limitations under the Licence.
  20.  *
  21.  * The Original Code is JFFS2 - Journalling Flash File System, version 2
  22.  *
  23.  * Alternatively, the contents of this file may be used under the
  24.  * terms of the GNU General Public License version 2 (the "GPL"), in
  25.  * which case the provisions of the GPL are applicable instead of the
  26.  * above.  If you wish to allow the use of your version of this file
  27.  * only under the terms of the GPL and not to allow others to use your
  28.  * version of this file under the RHEPL, indicate your decision by
  29.  * deleting the provisions above and replace them with the notice and
  30.  * other provisions required by the GPL.  If you do not delete the
  31.  * provisions above, a recipient may use your version of this file
  32.  * under either the RHEPL or the GPL.
  33.  *
  34.  * $Id: compr.c,v 1.17 2001/09/23 09:56:46 dwmw2 Exp $
  35.  *
  36.  */
  37. #include <linux/kernel.h>
  38. #include <linux/string.h>
  39. #include <linux/types.h>
  40. #include <linux/errno.h>
  41. #include <linux/jffs2.h>
  42. int zlib_compress(unsigned char *data_in, unsigned char *cpage_out, __u32 *sourcelen, __u32 *dstlen);
  43. void zlib_decompress(unsigned char *data_in, unsigned char *cpage_out, __u32 srclen, __u32 destlen);
  44. int rtime_compress(unsigned char *data_in, unsigned char *cpage_out, __u32 *sourcelen, __u32 *dstlen);
  45. void rtime_decompress(unsigned char *data_in, unsigned char *cpage_out, __u32 srclen, __u32 destlen);
  46. int rubinmips_compress(unsigned char *data_in, unsigned char *cpage_out, __u32 *sourcelen, __u32 *dstlen);
  47. void rubinmips_decompress(unsigned char *data_in, unsigned char *cpage_out, __u32 srclen, __u32 destlen);
  48. int dynrubin_compress(unsigned char *data_in, unsigned char *cpage_out, __u32 *sourcelen, __u32 *dstlen);
  49. void dynrubin_decompress(unsigned char *data_in, unsigned char *cpage_out, __u32 srclen, __u32 destlen);
  50. /* jffs2_compress:
  51.  * @data: Pointer to uncompressed data
  52.  * @cdata: Pointer to buffer for compressed data
  53.  * @datalen: On entry, holds the amount of data available for compression.
  54.  * On exit, expected to hold the amount of data actually compressed.
  55.  * @cdatalen: On entry, holds the amount of space available for compressed
  56.  * data. On exit, expected to hold the actual size of the compressed
  57.  * data.
  58.  *
  59.  * Returns: Byte to be stored with data indicating compression type used.
  60.  * Zero is used to show that the data could not be compressed - the 
  61.  * compressed version was actually larger than the original.
  62.  *
  63.  * If the cdata buffer isn't large enough to hold all the uncompressed data,
  64.  * jffs2_compress should compress as much as will fit, and should set 
  65.  * *datalen accordingly to show the amount of data which were compressed.
  66.  */
  67. unsigned char jffs2_compress(unsigned char *data_in, unsigned char *cpage_out, 
  68.     __u32 *datalen, __u32 *cdatalen)
  69. {
  70. int ret;
  71. ret = zlib_compress(data_in, cpage_out, datalen, cdatalen);
  72. if (!ret) {
  73. return JFFS2_COMPR_ZLIB;
  74. }
  75. #if 0 /* Disabled 23/9/1. With zlib it hardly ever gets a look in */
  76. ret = dynrubin_compress(data_in, cpage_out, datalen, cdatalen);
  77. if (!ret) {
  78. return JFFS2_COMPR_DYNRUBIN;
  79. }
  80. #endif
  81. #if 0 /* Disabled 26/2/1. Obsoleted by dynrubin */
  82. ret = rubinmips_compress(data_in, cpage_out, datalen, cdatalen);
  83. if (!ret) {
  84. return JFFS2_COMPR_RUBINMIPS;
  85. }
  86. #endif
  87. /* rtime does manage to recompress already-compressed data */
  88. ret = rtime_compress(data_in, cpage_out, datalen, cdatalen);
  89. if (!ret) {
  90. return JFFS2_COMPR_RTIME;
  91. }
  92. #if 0
  93. /* We don't need to copy. Let the caller special-case the COMPR_NONE case. */
  94. /* If we get here, no compression is going to work */
  95. /* But we might want to use the fragmentation part -- Arjan */
  96. memcpy(cpage_out,data_in,min(*datalen,*cdatalen));
  97. if (*datalen > *cdatalen)
  98. *datalen = *cdatalen;
  99. #endif
  100. return JFFS2_COMPR_NONE; /* We failed to compress */
  101. }
  102. int jffs2_decompress(unsigned char comprtype, unsigned char *cdata_in, 
  103.      unsigned char *data_out, __u32 cdatalen, __u32 datalen)
  104. {
  105. switch (comprtype) {
  106. case JFFS2_COMPR_NONE:
  107. /* This should be special-cased elsewhere, but we might as well deal with it */
  108. memcpy(data_out, cdata_in, datalen);
  109. break;
  110. case JFFS2_COMPR_ZERO:
  111. memset(data_out, 0, datalen);
  112. break;
  113. case JFFS2_COMPR_ZLIB:
  114. zlib_decompress(cdata_in, data_out, cdatalen, datalen);
  115. break;
  116. case JFFS2_COMPR_RTIME:
  117. rtime_decompress(cdata_in, data_out, cdatalen, datalen);
  118. break;
  119. case JFFS2_COMPR_RUBINMIPS:
  120. #if 0 /* Disabled 23/9/1 */
  121. rubinmips_decompress(cdata_in, data_out, cdatalen, datalen);
  122. #else
  123. printk(KERN_WARNING "JFFS2: Rubinmips compression encountered but support not compiled in!n");
  124. #endif
  125. break;
  126. case JFFS2_COMPR_DYNRUBIN:
  127. #if 1 /* Phase this one out */
  128. dynrubin_decompress(cdata_in, data_out, cdatalen, datalen);
  129. #else
  130. printk(KERN_WARNING "JFFS2: Dynrubin compression encountered but support not compiled in!n");
  131. #endif
  132. break;
  133. default:
  134. printk(KERN_NOTICE "Unknown JFFS2 compression type 0x%02xn", comprtype);
  135. return -EIO;
  136. }
  137. return 0;
  138. }