Home | History | Annotate | Download | only in gas
      1 /* compress-debug.c - compress debug sections
      2    Copyright (C) 2010-2016 Free Software Foundation, Inc.
      3 
      4    This file is part of GAS, the GNU Assembler.
      5 
      6    GAS is free software; you can redistribute it and/or modify
      7    it under the terms of the GNU General Public License as published by
      8    the Free Software Foundation; either version 3, or (at your option)
      9    any later version.
     10 
     11    GAS is distributed in the hope that it will be useful,
     12    but WITHOUT ANY WARRANTY; without even the implied warranty of
     13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     14    GNU General Public License for more details.
     15 
     16    You should have received a copy of the GNU General Public License
     17    along with GAS; see the file COPYING.  If not, write to the Free
     18    Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
     19    02110-1301, USA.  */
     20 
     21 #include "config.h"
     22 #include <stdio.h>
     23 #include <zlib.h>
     24 #include "ansidecl.h"
     25 #include "compress-debug.h"
     26 
     27 /* Initialize the compression engine.  */
     28 
     29 struct z_stream_s *
     30 compress_init (void)
     31 {
     32   static struct z_stream_s strm;
     33 
     34   strm.zalloc = NULL;
     35   strm.zfree = NULL;
     36   strm.opaque = NULL;
     37   deflateInit (&strm, Z_DEFAULT_COMPRESSION);
     38   return &strm;
     39 }
     40 
     41 /* Stream the contents of a frag to the compression engine.  Output
     42    from the engine goes into the current frag on the obstack.  */
     43 
     44 int
     45 compress_data (struct z_stream_s *strm, const char **next_in,
     46 	       int *avail_in, char **next_out, int *avail_out)
     47 {
     48   int out_size = 0;
     49   int x;
     50 
     51   strm->next_in = (Bytef *) (*next_in);
     52   strm->avail_in = *avail_in;
     53   strm->next_out = (Bytef *) (*next_out);
     54   strm->avail_out = *avail_out;
     55 
     56   x = deflate (strm, Z_NO_FLUSH);
     57   if (x != Z_OK)
     58     return -1;
     59 
     60   out_size = *avail_out - strm->avail_out;
     61   *next_in = (char *) (strm->next_in);
     62   *avail_in = strm->avail_in;
     63   *next_out = (char *) (strm->next_out);
     64   *avail_out = strm->avail_out;
     65 
     66   return out_size;
     67 }
     68 
     69 /* Finish the compression and consume the remaining compressed output.
     70    Returns -1 for error, 0 when done, 1 when more output buffer is
     71    needed.  */
     72 
     73 int
     74 compress_finish (struct z_stream_s *strm, char **next_out,
     75 		 int *avail_out, int *out_size)
     76 {
     77   int x;
     78 
     79   strm->avail_in = 0;
     80   strm->next_out = (Bytef *) (*next_out);
     81   strm->avail_out = *avail_out;
     82 
     83   x = deflate (strm, Z_FINISH);
     84 
     85   *out_size = *avail_out - strm->avail_out;
     86   *next_out = (char *) (strm->next_out);
     87   *avail_out = strm->avail_out;
     88 
     89   if (x == Z_STREAM_END)
     90     {
     91       deflateEnd (strm);
     92       return 0;
     93     }
     94   if (strm->avail_out != 0)
     95     return -1;
     96   return 1;
     97 }
     98