новые иконки в OpenBoard
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 
OpenBoard/src/pdf-merger/Utils.cpp

219 lines
5.2 KiB

/*
* Copyright (C) 2012 Webdoc SA
*
* This file is part of Open-Sankoré.
*
* Open-Sankoré is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation, version 2,
* with a specific linking exception for the OpenSSL project's
* "OpenSSL" library (or with modified versions of it that use the
* same license as the "OpenSSL" library).
*
* Open-Sankoré 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
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with Open-Sankoré; if not, see
* <http://www.gnu.org/licenses/>.
*/
#include <QtGlobal>
#include <QString>
#include "Config.h"
#include "Utils.h"
#include "Exception.h"
#include <iostream>
#include <cmath>
#include <sstream>
#include <fstream>
#include <string.h>
#include "core/memcheck.h"
using namespace merge_lib;
int Utils::stringToInt(const std::string & str) //throw ConvertException
{
//skip zeros
unsigned int lastZero = 0;str.find_last_of("0");
while(str[lastZero++] == '0')
{
if(lastZero == str.size())
{
return 0;
}
}
//if lastZero = 1, then 0 is not first symbol
lastZero--;
if((str.size() > 1) && (lastZero != 0))
{
//all number is zero, for ex. 00000000
std::string copy = str;
const std::string & cutedStr = copy.erase(0, lastZero);
return _stringToInt(cutedStr) ;
}
else
{
return _stringToInt(str);
}
}
double Utils::stringToDouble(const std::string & s )
{
std::istringstream i(s);
double x;
if (!(i >> x))
//TODO or throw exception? Think about!
return 0;
return x;
}
std::string Utils::uIntToStr(unsigned int integer)
{
return std::string(QString::number(integer).toAscii());
}
std::string Utils::doubleToStr(double doubleValue)
{
return std::string(QString::number(doubleValue).toAscii());
}
int Utils::_stringToInt(const std::string & str) //throw ConvertException
{
int intValue = atoi(str.c_str());
if(((intValue == 0) && (str.size() > 1)) || // for ex string = xxx and integer = 0
((intValue == 0) && (str[0] != '0')))
{
throw Exception("Internal error");
}
if((intValue != 0) && (static_cast<unsigned int>(std::log10(static_cast<double>(intValue))) + 1) != str.size()) //for ex. string = 5x and integer = 5)
{
throw Exception("Internal error");
}
return intValue;
}
bool Utils::doubleEquals(const double left, const double right, const double epsilon)
{
return ( fabs (left - right) < epsilon);
}
double Utils::normalizeValue(double &val, const double epsilon )
{
Q_UNUSED(epsilon);
if( Utils::doubleEquals(val,0))
{
val = 0;
}
return val;
}
unsigned long Utils::getFileSize(const char * fileName)
{
std::ifstream pdfFile;
pdfFile.open (fileName, std::ios::binary );
if (pdfFile.fail())
{
std::stringstream errorMessage("File ");
errorMessage << fileName << " is absent" << "\0";
throw Exception(errorMessage);
}
// get length of file:
pdfFile.seekg (0, std::ios::end);
unsigned long length = pdfFile.tellg();
pdfFile.close();
return length;
}
#ifdef DEBUG_VERBOSE
#define TO_HEX_CHAR(char_c) (char_c)>9?'A'+(char_c)-10:'0'+(char_c);
static void hex_dump_one_line(int numberChars_n,
const char *input_p,
char *output_p)
{
int i;
char* to_hex_p;
char* to_char_p;
char char_c;
/* Set pointer to the begining of hexadecimal area */
to_hex_p=output_p;
/* Set pointer to the begining of textual area */
to_char_p=output_p+56;
/* Write spaces between hexadecimal and textual areas */
memset(output_p+50,' ',6);
/* some kind of delimeter */
*(output_p+53) = '#';
/* Print out the hex area */
for (i = 0 ; i < 16 ; i++)
{
/* Two spaces beetwen "four columns" */
if (!(i&3))
{
*to_hex_p++=' ';
}
/* One space between columns */
*to_hex_p++=' ';
if (i < numberChars_n)
{
/* Print out byte in hexadecimal form */
*to_hex_p++=TO_HEX_CHAR((input_p[i]>>4)&0xF);
*to_hex_p++=TO_HEX_CHAR(input_p[i]&0xF);
/* Output the char */
char_c = input_p[i]&0xFF;
if ( char_c<0x20 || char_c>0x7E )
{
char_c = '.';
}
*to_char_p=char_c;
to_char_p++;
}
else
{
*to_hex_p++=' ';
*to_hex_p++=' ';
*to_char_p++=' ';
}
} /* for */
}
void trace_buffer(const void *buf, int len)
{
char dump[160];
int line_n = len/16;
int rest_n = len- line_n*16;
int i;
memset(dump,0,160);
printf(" length:%d\n",len);
for (i = 0;i<line_n;i++)
{
hex_dump_one_line(16,
(char*)buf+(i*16),
dump);
printf("%s\n",dump);;
}
if ( rest_n)
{
hex_dump_one_line(rest_n,
(char*)buf+(line_n*16),
dump);
printf("%s\n",dump);
}
}
#endif