mirror of
https://github.com/qpdf/qpdf.git
synced 2024-09-28 04:59:05 +00:00
6b9297882e
Put a specific comment marker next to every piece of code that MSVC gives warning 4996 for. This warning is generated for calls to functions that Microsoft considers insecure or deprecated. This change is in preparation for fixing all these cases even though none of them are actually incorrect or insecure as used in qpdf. The comment marker makes them easier to find so they can be fixed in subsequent commits.
114 lines
2.6 KiB
C++
114 lines
2.6 KiB
C++
|
|
#include <qpdf/Pl_Flate.hh>
|
|
#include <qpdf/Pl_StdioFile.hh>
|
|
#include <qpdf/Pl_Count.hh>
|
|
|
|
#include <iostream>
|
|
#include <errno.h>
|
|
#include <string.h>
|
|
#include <stdlib.h>
|
|
|
|
FILE* safe_fopen(char const* filename, char const* mode)
|
|
{
|
|
FILE* result = fopen(filename, mode); // XXXX
|
|
if (result == 0)
|
|
{
|
|
std::cerr << "fopen " << filename << " failed: " << strerror(errno) // XXXX
|
|
<< std::endl;
|
|
exit(2);
|
|
}
|
|
return result;
|
|
}
|
|
|
|
void run(char const* filename)
|
|
{
|
|
std::string n1 = std::string(filename) + ".1";
|
|
std::string n2 = std::string(filename) + ".2";
|
|
std::string n3 = std::string(filename) + ".3";
|
|
|
|
FILE* o1 = safe_fopen(n1.c_str(), "wb");
|
|
FILE* o2 = safe_fopen(n2.c_str(), "wb");
|
|
FILE* o3 = safe_fopen(n3.c_str(), "wb");
|
|
Pipeline* out1 = new Pl_StdioFile("o1", o1);
|
|
Pipeline* out2 = new Pl_StdioFile("o2", o2);
|
|
Pipeline* out3 = new Pl_StdioFile("o3", o3);
|
|
|
|
// Compress the file
|
|
Pipeline* def1 = new Pl_Flate("def1", out1, Pl_Flate::a_deflate);
|
|
|
|
// Decompress the file
|
|
Pipeline* inf2 = new Pl_Flate("inf2", out2, Pl_Flate::a_inflate);
|
|
|
|
// Count bytes written to o3
|
|
Pl_Count* count3 = new Pl_Count("count3", out3);
|
|
|
|
// Do both simultaneously
|
|
Pipeline* inf3 = new Pl_Flate("inf3", count3, Pl_Flate::a_inflate);
|
|
Pipeline* def3 = new Pl_Flate("def3", inf3, Pl_Flate::a_deflate);
|
|
|
|
FILE* in1 = safe_fopen(filename, "rb");
|
|
unsigned char buf[1024];
|
|
size_t len;
|
|
while ((len = fread(buf, 1, sizeof(buf), in1)) > 0)
|
|
{
|
|
// Write to the compression pipeline
|
|
def1->write(buf, len);
|
|
|
|
// Write to the both pipeline
|
|
def3->write(buf, len);
|
|
}
|
|
|
|
def1->finish();
|
|
delete def1;
|
|
delete out1;
|
|
fclose(o1);
|
|
|
|
def3->finish();
|
|
|
|
std::cout << "bytes written to o3: " << count3->getCount() << std::endl;
|
|
|
|
|
|
delete def3;
|
|
delete inf3;
|
|
delete count3;
|
|
delete out3;
|
|
fclose(o3);
|
|
|
|
// Now read the compressed data and write to the output uncompress pipeline
|
|
FILE* in2 = safe_fopen(n1.c_str(), "rb");
|
|
while ((len = fread(buf, 1, sizeof(buf), in2)) > 0)
|
|
{
|
|
inf2->write(buf, len);
|
|
}
|
|
|
|
inf2->finish();
|
|
delete inf2;
|
|
delete out2;
|
|
fclose(o2);
|
|
|
|
// At this point, filename, filename.2, and filename.3 should have
|
|
// identical contents. filename.1 should be a compressed version.
|
|
|
|
std::cout << "done" << std::endl;
|
|
}
|
|
|
|
int main(int argc, char* argv[])
|
|
{
|
|
if (argc != 2)
|
|
{
|
|
std::cerr << "Usage: pipeline filename" << std::endl;
|
|
exit(2);
|
|
}
|
|
char* filename = argv[1];
|
|
|
|
try
|
|
{
|
|
run(filename);
|
|
}
|
|
catch (std::exception& e)
|
|
{
|
|
std::cout << e.what() << std::endl;
|
|
}
|
|
return 0;
|
|
}
|