Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
C
coverind
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Model registry
Operate
Environments
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
GitLab community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Salson Mikael
coverind
Commits
8372b34e
Commit
8372b34e
authored
5 years ago
by
Salson Mikael
Browse files
Options
Downloads
Patches
Plain Diff
Add gzstream lib
parent
f7137422
No related branches found
No related tags found
No related merge requests found
Changes
3
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
Makefile
+3
-3
3 additions, 3 deletions
Makefile
lib/gzstream.cpp
+165
-0
165 additions, 0 deletions
lib/gzstream.cpp
lib/gzstream.h
+121
-0
121 additions, 0 deletions
lib/gzstream.h
with
289 additions
and
3 deletions
Makefile
+
3
−
3
View file @
8372b34e
...
...
@@ -6,11 +6,11 @@ EXE=$(SRC:.cpp=)
all
:
$(EXE)
$(EXE)
:
%: %.o
$(
CXX
)
-o
$@
$^
-l
sdsl
$(EXE)
:
%: %.o
lib/gzstream.o
$(
CXX
)
-o
$@
$^
-l
sdsl
-lz
%.o
:
%.cpp
$(
CXX
)
$(
CXXFLAGS
)
-c
$^
$(
CXX
)
$(
CXXFLAGS
)
-c
$^
-o
$@
clean
:
rm
-f
$(
OBJ
)
$(
EXE
)
...
...
This diff is collapsed.
Click to expand it.
lib/gzstream.cpp
0 → 100644
+
165
−
0
View file @
8372b34e
// ============================================================================
// gzstream, C++ iostream classes wrapping the zlib compression library.
// Copyright (C) 2001 Deepak Bandyopadhyay, Lutz Kettner
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
// ============================================================================
//
// File : gzstream.C
// Revision : $Revision: 1.7 $
// Revision_date : $Date: 2003/01/08 14:41:27 $
// Author(s) : Deepak Bandyopadhyay, Lutz Kettner
//
// Standard streambuf implementation following Nicolai Josuttis, "The
// Standard C++ Library".
// ============================================================================
#include
"gzstream.h"
#include
<iostream>
#include
<string.h>
// for memcpy
#ifdef GZSTREAM_NAMESPACE
namespace
GZSTREAM_NAMESPACE
{
#endif
// ----------------------------------------------------------------------------
// Internal classes to implement gzstream. See header file for user classes.
// ----------------------------------------------------------------------------
// --------------------------------------
// class gzstreambuf:
// --------------------------------------
gzstreambuf
*
gzstreambuf
::
open
(
const
char
*
name
,
int
open_mode
)
{
if
(
is_open
())
return
(
gzstreambuf
*
)
0
;
mode
=
open_mode
;
// no append nor read/write mode
if
((
mode
&
std
::
ios
::
ate
)
||
(
mode
&
std
::
ios
::
app
)
||
((
mode
&
std
::
ios
::
in
)
&&
(
mode
&
std
::
ios
::
out
)))
return
(
gzstreambuf
*
)
0
;
char
fmode
[
10
];
char
*
fmodeptr
=
fmode
;
if
(
mode
&
std
::
ios
::
in
)
*
fmodeptr
++
=
'r'
;
else
if
(
mode
&
std
::
ios
::
out
)
*
fmodeptr
++
=
'w'
;
*
fmodeptr
++
=
'b'
;
*
fmodeptr
=
'\0'
;
file
=
gzopen
(
name
,
fmode
);
if
(
file
==
0
)
return
(
gzstreambuf
*
)
0
;
opened
=
1
;
return
this
;
}
gzstreambuf
*
gzstreambuf
::
close
()
{
if
(
is_open
())
{
sync
();
opened
=
0
;
if
(
gzclose
(
file
)
==
Z_OK
)
return
this
;
}
return
(
gzstreambuf
*
)
0
;
}
int
gzstreambuf
::
underflow
()
{
// used for input buffer only
if
(
gptr
()
&&
(
gptr
()
<
egptr
()))
return
*
reinterpret_cast
<
unsigned
char
*>
(
gptr
());
if
(
!
(
mode
&
std
::
ios
::
in
)
||
!
opened
)
return
EOF
;
// Josuttis' implementation of inbuf
int
n_putback
=
gptr
()
-
eback
();
if
(
n_putback
>
4
)
n_putback
=
4
;
memcpy
(
buffer
+
(
4
-
n_putback
),
gptr
()
-
n_putback
,
n_putback
);
int
num
=
gzread
(
file
,
buffer
+
4
,
bufferSize
-
4
);
if
(
num
<=
0
)
// ERROR or EOF
return
EOF
;
// reset buffer pointers
setg
(
buffer
+
(
4
-
n_putback
),
// beginning of putback area
buffer
+
4
,
// read position
buffer
+
4
+
num
);
// end of buffer
// return next character
return
*
reinterpret_cast
<
unsigned
char
*>
(
gptr
());
}
int
gzstreambuf
::
flush_buffer
()
{
// Separate the writing of the buffer from overflow() and
// sync() operation.
int
w
=
pptr
()
-
pbase
();
if
(
gzwrite
(
file
,
pbase
(),
w
)
!=
w
)
return
EOF
;
pbump
(
-
w
);
return
w
;
}
int
gzstreambuf
::
overflow
(
int
c
)
{
// used for output buffer only
if
(
!
(
mode
&
std
::
ios
::
out
)
||
!
opened
)
return
EOF
;
if
(
c
!=
EOF
)
{
*
pptr
()
=
c
;
pbump
(
1
);
}
if
(
flush_buffer
()
==
EOF
)
return
EOF
;
return
c
;
}
int
gzstreambuf
::
sync
()
{
// Changed to use flush_buffer() instead of overflow( EOF)
// which caused improper behavior with std::endl and flush(),
// bug reported by Vincent Ricard.
if
(
pptr
()
&&
pptr
()
>
pbase
())
{
if
(
flush_buffer
()
==
EOF
)
return
-
1
;
}
return
0
;
}
// --------------------------------------
// class gzstreambase:
// --------------------------------------
gzstreambase
::
gzstreambase
(
const
char
*
name
,
int
mode
)
{
init
(
&
buf
);
open
(
name
,
mode
);
}
gzstreambase
::~
gzstreambase
()
{
buf
.
close
();
}
void
gzstreambase
::
open
(
const
char
*
name
,
int
open_mode
)
{
if
(
!
buf
.
open
(
name
,
open_mode
))
clear
(
rdstate
()
|
std
::
ios
::
badbit
);
}
void
gzstreambase
::
close
()
{
if
(
buf
.
is_open
())
if
(
!
buf
.
close
())
clear
(
rdstate
()
|
std
::
ios
::
badbit
);
}
#ifdef GZSTREAM_NAMESPACE
}
// namespace GZSTREAM_NAMESPACE
#endif
// ============================================================================
// EOF //
This diff is collapsed.
Click to expand it.
lib/gzstream.h
0 → 100644
+
121
−
0
View file @
8372b34e
// ============================================================================
// gzstream, C++ iostream classes wrapping the zlib compression library.
// Copyright (C) 2001 Deepak Bandyopadhyay, Lutz Kettner
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
// ============================================================================
//
// File : gzstream.h
// Revision : $Revision: 1.5 $
// Revision_date : $Date: 2002/04/26 23:30:15 $
// Author(s) : Deepak Bandyopadhyay, Lutz Kettner
//
// Standard streambuf implementation following Nicolai Josuttis, "The
// Standard C++ Library".
// ============================================================================
#ifndef GZSTREAM_H
#define GZSTREAM_H 1
// standard C++ with new header file names and std:: namespace
#include
<iostream>
#include
<fstream>
#include
<zlib.h>
#ifdef GZSTREAM_NAMESPACE
namespace
GZSTREAM_NAMESPACE
{
#endif
// ----------------------------------------------------------------------------
// Internal classes to implement gzstream. See below for user classes.
// ----------------------------------------------------------------------------
class
gzstreambuf
:
public
std
::
streambuf
{
private:
static
const
int
bufferSize
=
47
+
256
;
// size of data buff
// totals 512 bytes under g++ for igzstream at the end.
gzFile
file
;
// file handle for compressed file
char
buffer
[
bufferSize
];
// data buffer
char
opened
;
// open/close state of stream
int
mode
;
// I/O mode
int
flush_buffer
();
public:
gzstreambuf
()
:
opened
(
0
)
{
setp
(
buffer
,
buffer
+
(
bufferSize
-
1
));
setg
(
buffer
+
4
,
// beginning of putback area
buffer
+
4
,
// read position
buffer
+
4
);
// end position
// ASSERT: both input & output capabilities will not be used together
}
int
is_open
()
{
return
opened
;
}
gzstreambuf
*
open
(
const
char
*
name
,
int
open_mode
);
gzstreambuf
*
close
();
~
gzstreambuf
()
{
close
();
}
virtual
int
overflow
(
int
c
=
EOF
);
virtual
int
underflow
();
virtual
int
sync
();
};
class
gzstreambase
:
virtual
public
std
::
ios
{
protected:
gzstreambuf
buf
;
public:
gzstreambase
()
{
init
(
&
buf
);
}
gzstreambase
(
const
char
*
name
,
int
open_mode
);
~
gzstreambase
();
void
open
(
const
char
*
name
,
int
open_mode
);
void
close
();
gzstreambuf
*
rdbuf
()
{
return
&
buf
;
}
};
// ----------------------------------------------------------------------------
// User classes. Use igzstream and ogzstream analogously to ifstream and
// ofstream respectively. They read and write files based on the gz*
// function interface of the zlib. Files are compatible with gzip compression.
// ----------------------------------------------------------------------------
class
igzstream
:
public
std
::
istream
,
public
gzstreambase
{
public:
igzstream
()
:
std
::
istream
(
&
buf
)
{}
igzstream
(
const
char
*
name
,
int
open_mode
=
std
::
ios
::
in
)
:
std
::
istream
(
&
buf
),
gzstreambase
(
name
,
open_mode
)
{}
gzstreambuf
*
rdbuf
()
{
return
gzstreambase
::
rdbuf
();
}
void
open
(
const
char
*
name
,
int
open_mode
=
std
::
ios
::
in
)
{
gzstreambase
::
open
(
name
,
open_mode
);
}
};
class
ogzstream
:
public
std
::
ostream
,
public
gzstreambase
{
public:
ogzstream
()
:
std
::
ostream
(
&
buf
)
{}
ogzstream
(
const
char
*
name
,
int
mode
=
std
::
ios
::
out
)
:
std
::
ostream
(
&
buf
),
gzstreambase
(
name
,
mode
)
{}
gzstreambuf
*
rdbuf
()
{
return
gzstreambase
::
rdbuf
();
}
void
open
(
const
char
*
name
,
int
open_mode
=
std
::
ios
::
out
)
{
gzstreambase
::
open
(
name
,
open_mode
);
}
};
#ifdef GZSTREAM_NAMESPACE
}
// namespace GZSTREAM_NAMESPACE
#endif
#endif // GZSTREAM_H
// ============================================================================
// EOF //
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment