This commit is contained in:
parent
7a42c1a566
commit
a34f07186b
21 changed files with 1003 additions and 0 deletions
1
Makefile.am
Normal file
1
Makefile.am
Normal file
|
@ -0,0 +1 @@
|
|||
SUBDIRS = src
|
9
autogen
Executable file
9
autogen
Executable file
|
@ -0,0 +1,9 @@
|
|||
echo "aclocal..."
|
||||
aclocal
|
||||
echo "autoheader..."
|
||||
autoheader
|
||||
echo "autoconf..."
|
||||
autoconf
|
||||
echo "automake..."
|
||||
automake -a
|
||||
echo "ok."
|
172
configure.in
Normal file
172
configure.in
Normal file
|
@ -0,0 +1,172 @@
|
|||
dnl Copyright (C) 2004-2005 Glenn ROLLAND.
|
||||
dnl
|
||||
dnl This program is free software; you can redistribute it and/or modify
|
||||
dnl it under the terms of the GNU General Public License as published by
|
||||
dnl the Free Software Foundation; either version 2 of the License, or
|
||||
dnl (at your option) any later version.
|
||||
dnl
|
||||
dnl This program is distributed in the hope that it will be useful,
|
||||
dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
dnl GNU General Public License for more details.
|
||||
dnl
|
||||
dnl You should have received a copy of the GNU General Public License
|
||||
dnl along with this program; if not, write to the Free Software
|
||||
dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
dnl
|
||||
|
||||
## Autoconf requirements
|
||||
AC_INIT([eyd], [0.1], [glenux@fr.st])
|
||||
AC_PREREQ(2.50)
|
||||
|
||||
AC_CANONICAL_HOST
|
||||
AC_CANONICAL_TARGET
|
||||
|
||||
|
||||
AM_INIT_AUTOMAKE([eyd],[0.1])
|
||||
|
||||
#AC_CANONICAL_SYSTEM
|
||||
|
||||
|
||||
|
||||
AM_CONFIG_HEADER(src/config.h)
|
||||
AC_CONFIG_SRCDIR([src/lib/eyd.hh])
|
||||
AC_PROG_INSTALL
|
||||
|
||||
## information on the package
|
||||
## ## checks for programs
|
||||
## checks for libraries
|
||||
## checks for header files
|
||||
## checks for types
|
||||
## checks for structures
|
||||
## checks for compiler characteristics
|
||||
## checks for library functions
|
||||
## checks for system services
|
||||
|
||||
AM_CONFIG_HEADER(config.h)
|
||||
## required for c sources
|
||||
|
||||
AC_ISC_POSIX
|
||||
AC_PROG_CC
|
||||
## required for c++ sources
|
||||
AC_PROG_CXX
|
||||
AC_PROG_CPP
|
||||
# AC_PROG_RANLIB obsoleted bu LIBTOOL
|
||||
|
||||
AC_LANG_SAVE
|
||||
AC_LANG_CPLUSPLUS
|
||||
|
||||
# AC_PROG_YACC
|
||||
# AC_PROG_LEX
|
||||
# AM_PROG_LEX
|
||||
|
||||
dnl Checks for library functions.
|
||||
AC_HEADER_STDC([])
|
||||
|
||||
#TODO: uncomment
|
||||
AC_CHECK_HEADERS([vector set map iostream sstream string algorithm list memory iterator exception utility],,
|
||||
AC_MSG_ERROR([You need to have the libstdc++ headers installed]))
|
||||
|
||||
|
||||
|
||||
dnl ***************************************************************************
|
||||
dnl Gettext stuff.
|
||||
dnl ***************************************************************************
|
||||
|
||||
#GETTEXT_PACKAGE=yalag-0.1
|
||||
#AC_SUBST(GETTEXT_PACKAGE)
|
||||
#AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE,"$GETTEXT_PACKAGE", [Gettext package.])
|
||||
|
||||
#ALL_LINGUAS="fr"
|
||||
#AM_GLIB_GNU_GETTEXT
|
||||
|
||||
|
||||
dnl Check for programs
|
||||
|
||||
dnl Check for build configuration.
|
||||
#AC_PROG_INTLTOOL
|
||||
|
||||
AM_PROG_LIBTOOL
|
||||
|
||||
dnl Checks for header files.
|
||||
|
||||
#AC_MSG_NOTICE([checking presence of SQLite])
|
||||
#AC_CHECK_HEADERS([sqlite.h],[],
|
||||
# [
|
||||
# AC_MSG_NOTICE([*** Please install/upgrade SQLite before proceeding])
|
||||
# AC_MSG_NOTICE([*** with Unlost Memories installation.])
|
||||
# AC_MSG_ERROR([cannot find sqlite.h])
|
||||
# ])
|
||||
|
||||
#sqlite_deps="sqlite3 >= 3.0"
|
||||
#PKG_CHECK_MODULES(SQLITE3,$sqlite_deps,build_sqlite=yes,build_sqlite=no)
|
||||
#AC_SUBST(SQLITE3_CFLAGS)
|
||||
#AC_SUBST(SQLITE3_LIBS)
|
||||
|
||||
glib_deps="glib-2.0 >= 2.0"
|
||||
PKG_CHECK_MODULES(GLIB2,$glib_deps, build_glib=yes, build_glib=no)
|
||||
AC_SUBST(GLIB2_CFLAGS)
|
||||
AC_SUBST(GLIB2_LIBS)
|
||||
|
||||
##########
|
||||
# Figure out where to get the READLINE header files.
|
||||
#
|
||||
AC_MSG_CHECKING([readline header files])
|
||||
found=no
|
||||
if test "$config_TARGET_READLINE_INC" != ""; then
|
||||
TARGET_READLINE_INC=$config_TARGET_READLINE_INC
|
||||
found=yes
|
||||
fi
|
||||
if test "$found" = "yes"; then
|
||||
AC_MSG_RESULT($TARGET_READLINE_INC)
|
||||
else
|
||||
AC_MSG_RESULT(not specified: still searching...)
|
||||
AC_CHECK_HEADER(readline.h, [found=yes])
|
||||
fi
|
||||
if test "$found" = "no"; then
|
||||
for dir in /usr /usr/local /usr/local/readline /usr/contrib /mingw; do
|
||||
AC_CHECK_FILE($dir/include/readline.h, found=yes)
|
||||
if test "$found" = "yes"; then
|
||||
TARGET_READLINE_INC="-I$dir/include"
|
||||
break
|
||||
fi
|
||||
AC_CHECK_FILE($dir/include/readline/readline.h, found=yes)
|
||||
if test "$found" = "yes"; then
|
||||
TARGET_READLINE_INC="-I$dir/include/readline"
|
||||
break
|
||||
fi
|
||||
done
|
||||
fi
|
||||
if test "$found" = "yes"; then
|
||||
if test "$TARGET_READLINE_LIBS" = ""; then
|
||||
TARGET_HAVE_READLINE=0
|
||||
else
|
||||
TARGET_HAVE_READLINE=1
|
||||
fi
|
||||
else
|
||||
TARGET_HAVE_READLINE=0
|
||||
fi
|
||||
AC_SUBST(TARGET_READLINE_INC)
|
||||
AC_SUBST(TARGET_HAVE_READLINE)
|
||||
|
||||
#libxml2_deps="libxml-2.0 >= 2.4.1"
|
||||
#PKG_CHECK_MODULES(LIBXML2,$libxml2_deps, build_libxml2=yes, build_libxml2=no)
|
||||
#AC_SUBST(LIBXML2_CFLAGS)
|
||||
#AC_SUBST(LIBXML2_LIBS)
|
||||
|
||||
#if test $build_libxml2 == yes ; then
|
||||
# AC_DEFINE(HAVE_LIBXML2_H,1,[Vaut 1 lorsque l'on utilise LIBXML2.])
|
||||
#else
|
||||
# AC_DEFINE(HAVE_LIBXML2_H,0,[Vaut 1 lorsque l'on utilise LIBXML2.])
|
||||
#fi
|
||||
|
||||
#libxmlpp_deps="libxml++-2.6 >= 2.8"
|
||||
#PKG_CHECK_MODULES(LIBXMLPP,$libxmlpp_deps, build_libxmlpp=yes, build_libxmlpp=no)
|
||||
#AC_SUBST(LIBXMLPP_CFLAGS)
|
||||
#AC_SUBST(LIBXMLPP_LIBS)
|
||||
|
||||
|
||||
AC_CONFIG_FILES([Makefile src/Makefile src/lib/Makefile src/tools/Makefile])
|
||||
AC_OUTPUT
|
||||
|
||||
dnl configure.in ends here
|
2
src/Makefile.am
Normal file
2
src/Makefile.am
Normal file
|
@ -0,0 +1,2 @@
|
|||
SUBDIRS = lib tools
|
||||
|
21
src/lib/Makefile.am
Normal file
21
src/lib/Makefile.am
Normal file
|
@ -0,0 +1,21 @@
|
|||
SUBDIRS = .
|
||||
|
||||
lib_LTLIBRARIES = libeyd.la
|
||||
|
||||
#bin_PROGRAMS = libulm.o
|
||||
|
||||
libeyd_la_SOURCES = eyd_bitreader.cpp \
|
||||
eyd_bitwriter.cpp \
|
||||
eyd_bitgroup.cpp
|
||||
|
||||
libeyd_la_CFLAGS = -DTRACE -static
|
||||
libeyd_la_LDFLAGS = -version-info 3:12:1
|
||||
|
||||
#INCLUDES= SQLITE3_CFLAGS@ \
|
||||
# LIBXMLPP_CFLAGS@ \
|
||||
# -I./
|
||||
|
||||
#libxionfs_a_LDFLAGS= @LDFLAGS@
|
||||
|
||||
#SQLITE3_LIBS@ LIBPCRE_LIBS@
|
||||
|
8
src/lib/eyd.hh
Normal file
8
src/lib/eyd.hh
Normal file
|
@ -0,0 +1,8 @@
|
|||
#ifndef _EYD_HH
|
||||
#define _EYD_HH 1
|
||||
|
||||
#include "eyd_global.hh"
|
||||
#include "eyd_iface.hh"
|
||||
#include "eyd_proto.hh"
|
||||
|
||||
#endif
|
137
src/lib/eyd_bitgroup.cpp
Normal file
137
src/lib/eyd_bitgroup.cpp
Normal file
|
@ -0,0 +1,137 @@
|
|||
|
||||
#include "eyd_bitgroup.hh"
|
||||
|
||||
namespace EydLib {
|
||||
BitGroup::BitGroup(){
|
||||
this->init(4); /* default size */
|
||||
}
|
||||
|
||||
BitGroup::BitGroup(int size){
|
||||
this->init(size);
|
||||
}
|
||||
|
||||
int BitGroup::size(){
|
||||
return this->_group_size;
|
||||
}
|
||||
|
||||
void BitGroup::copy(const BitGroup &original){
|
||||
int i;
|
||||
int size_of_int = 8 * sizeof(unsigned int);
|
||||
int nb_int = (original._group_size / size_of_int) + 1;
|
||||
this->init(original._group_size);
|
||||
for (i=0; i < nb_int; i++){
|
||||
this->_bitgroup[i] = original._bitgroup[i];
|
||||
}
|
||||
}
|
||||
|
||||
bool BitGroup::operator==(const BitGroup &original){
|
||||
bool identity = true;
|
||||
if (this->_group_size == original._group_size){
|
||||
int size_of_int = 8 * sizeof(unsigned int);
|
||||
int nb_int = (original._group_size / size_of_int) + 1;
|
||||
for (int i=0; i < nb_int; i++){
|
||||
if (this->_bitgroup[i] != original._bitgroup[i]){
|
||||
// not the same content
|
||||
identity = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// not the same length
|
||||
identity=false;
|
||||
}
|
||||
return identity;
|
||||
}
|
||||
|
||||
BitGroup BitGroup::operator=(BitGroup &original){
|
||||
this->copy(original);
|
||||
return (*this);
|
||||
}
|
||||
|
||||
BitGroup BitGroup::operator=(const BitGroup &original){
|
||||
this->copy(original);
|
||||
return (*this);
|
||||
}
|
||||
|
||||
BitGroup::BitGroup(const BitGroup &original){
|
||||
this->copy(original);
|
||||
}
|
||||
|
||||
BitGroup::~BitGroup(){
|
||||
delete(this->_bitgroup);
|
||||
}
|
||||
|
||||
void BitGroup::init(int size){
|
||||
int i;
|
||||
int size_of_int = 8 * sizeof(unsigned int);
|
||||
int nb_int = (size / size_of_int) + 1;
|
||||
this->_bitgroup = new unsigned int[nb_int];
|
||||
this->_group_size = size;
|
||||
for (i=0; i < nb_int; i++){
|
||||
this->_bitgroup[i] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void BitGroup::setBitAt(int position, bool value){
|
||||
if (position > this->_group_size){
|
||||
throw eBitGroupOutOfBound();
|
||||
} else {
|
||||
int i;
|
||||
int size_of_int = 8 * sizeof(int);
|
||||
int index_of_int = position / size_of_int;
|
||||
int shift_of_int = position % size_of_int;
|
||||
unsigned int mask_fill;
|
||||
unsigned int mask_hole;
|
||||
mask_fill = 0;
|
||||
mask_hole = 0;
|
||||
for (i=0; i< size_of_int; i++){
|
||||
mask_fill = (mask_fill << 1) | 1;
|
||||
if (shift_of_int == i){
|
||||
mask_hole = ( mask_hole << 1 ) | 0;
|
||||
} else {
|
||||
mask_hole = ( mask_hole << 1 ) | 1;
|
||||
}
|
||||
}
|
||||
if (value){
|
||||
this->_bitgroup[index_of_int] = ((this->_bitgroup[index_of_int] ^ mask_fill) & mask_hole ) ^ mask_fill;
|
||||
} else {
|
||||
this->_bitgroup[index_of_int] = this->_bitgroup[index_of_int] & mask_hole;
|
||||
}
|
||||
//printf("0x%u\n",this->_bitgroup[index_of_int]);
|
||||
}
|
||||
}
|
||||
|
||||
bool BitGroup::getBitAt(int position){
|
||||
if (position > this->_group_size){
|
||||
//FIXME: throw exception
|
||||
throw eBitGroupOutOfBound();
|
||||
} else {
|
||||
int i;
|
||||
int size_of_int = 8 * sizeof(unsigned int);
|
||||
int index_of_int = position / size_of_int;
|
||||
int shift_of_int = position % size_of_int;
|
||||
unsigned int reader = this->_bitgroup[index_of_int];
|
||||
if (shift_of_int > 0){ reader = reader << shift_of_int; reader = reader >> shift_of_int; }
|
||||
reader = reader >> (size_of_int - shift_of_int - 1 );
|
||||
return reader;
|
||||
}
|
||||
}
|
||||
|
||||
void BitGroup::setValue(unsigned long int value){
|
||||
|
||||
}
|
||||
|
||||
unsigned long int BitGroup::getValue(){
|
||||
}
|
||||
|
||||
std::string BitGroup::toString(){
|
||||
// faire un nouveau string
|
||||
std::string s;
|
||||
int i;
|
||||
for (i=0; i<this->_group_size; i++){
|
||||
s += (this->getBitAt(i)?"1":"0");
|
||||
}
|
||||
return s;
|
||||
}
|
||||
|
||||
}
|
42
src/lib/eyd_bitgroup.hh
Normal file
42
src/lib/eyd_bitgroup.hh
Normal file
|
@ -0,0 +1,42 @@
|
|||
#ifndef _EYD_BITGROUP_HH
|
||||
#define _EYD_BITGROUP_HH
|
||||
|
||||
#include "stdio.h"
|
||||
#include <string>
|
||||
#include <exception>
|
||||
|
||||
namespace EydLib {
|
||||
class eBitGroupOutOfBound : public std::exception { };
|
||||
|
||||
class BitGroup {
|
||||
private:
|
||||
unsigned int * _bitgroup;
|
||||
int _group_size;
|
||||
void copy(const BitGroup &original);
|
||||
|
||||
public:
|
||||
BitGroup();
|
||||
BitGroup(int size);
|
||||
BitGroup(const BitGroup &original);
|
||||
~BitGroup();
|
||||
|
||||
void BitGroup::init(int size);
|
||||
void setBitAt(int pos, bool value);
|
||||
bool getBitAt(int pos);
|
||||
|
||||
void setValue(unsigned long value);
|
||||
unsigned long getValue();
|
||||
|
||||
int size();
|
||||
|
||||
std::string toString();
|
||||
BitGroup operator=(BitGroup &original);
|
||||
BitGroup operator=(const BitGroup &original);
|
||||
bool operator==(const BitGroup &original);
|
||||
|
||||
// comparer les groupes
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
110
src/lib/eyd_bitreader.cpp
Normal file
110
src/lib/eyd_bitreader.cpp
Normal file
|
@ -0,0 +1,110 @@
|
|||
#define DEBUG 0
|
||||
|
||||
#include "eyd_bitreader.hh"
|
||||
|
||||
namespace EydLib {
|
||||
/*
|
||||
* int _group_pos;
|
||||
int _fd;
|
||||
*/
|
||||
|
||||
BitReader::BitReader(int size, int buffer_size = 1024){
|
||||
// tous les groupes de bits seront de la taille donnée
|
||||
this->_bitgroup_size = size;
|
||||
this->_wanted_buffer_size = buffer_size;
|
||||
this->_real_buffer_size = 0;
|
||||
this->_read_buffer = new char[this->_wanted_buffer_size];
|
||||
this->_file_desc = -1;
|
||||
this->_current_bit_position = (8 * buffer_size) + 1; // on dépasse volontairement
|
||||
}
|
||||
|
||||
BitReader::~BitReader(){
|
||||
delete(this->_read_buffer);
|
||||
}
|
||||
|
||||
void BitReader::open(std::string filename){
|
||||
this->_file_desc = ::open(filename.c_str(), O_RDONLY);
|
||||
this->_eof = false;
|
||||
}
|
||||
|
||||
/*
|
||||
BitGroup * BitReader::read(int size){
|
||||
int i;
|
||||
BitGroup * result = new BitGroup[size];
|
||||
|
||||
for (i=0; i<size; i++){
|
||||
result[i] = this->read_once();
|
||||
}
|
||||
return result;
|
||||
}
|
||||
*/
|
||||
|
||||
bool BitReader::getBitAt(int position){
|
||||
// on attrappe la bonne case du tableau
|
||||
// on shift dans le bon sens
|
||||
// on retourne la valeur du bit.
|
||||
int size_of_char = 8 * sizeof(char);
|
||||
int i;
|
||||
int index_of_char = position / size_of_char;
|
||||
int shift_of_char = position % size_of_char;
|
||||
|
||||
char reader;
|
||||
if (position > this->_real_buffer_size * size_of_char){
|
||||
//FIXME: throw exception
|
||||
} else {
|
||||
reader = this->_read_buffer[index_of_char];
|
||||
if (shift_of_char > 0){ reader = reader << shift_of_char; reader = reader >> shift_of_char; }
|
||||
reader = reader >> (size_of_char - shift_of_char - 1 );
|
||||
printf("->%c<- shift %d = %d\n",this->_read_buffer[index_of_char], shift_of_char, reader);
|
||||
}
|
||||
return reader;
|
||||
}
|
||||
|
||||
BitGroup BitReader::read(){
|
||||
int i;
|
||||
bool bitValue;
|
||||
int size_of_char = 8 * sizeof(char);
|
||||
BitGroup result(this->_bitgroup_size);
|
||||
if (this->_eof) { throw eBitReaderEndOfFile(); }
|
||||
if (this->_file_desc < 0){ throw eBitReaderBadFileDescriptor(); }
|
||||
|
||||
for (i=0; i < this->_bitgroup_size; i++){
|
||||
if (this->_current_bit_position >= (this->_wanted_buffer_size * 8)){
|
||||
// on charge un nouveau bout de fichier
|
||||
this->_real_buffer_size = ::read(this->_file_desc, this->_read_buffer, this->_wanted_buffer_size);
|
||||
printf("BitReader::read / read() -> buffer()\n");
|
||||
printf("READ BUFFER(%d): %s\n",this->_real_buffer_size, this->_read_buffer);
|
||||
this->_current_bit_position = 0;
|
||||
}
|
||||
if (this->_current_bit_position < this->_real_buffer_size * 8){
|
||||
//printf("TMP result = %s",result.toString().c_str());
|
||||
bitValue = this->getBitAt(this->_current_bit_position);
|
||||
result.setBitAt(i, bitValue);
|
||||
} else {
|
||||
// dans le cas ou on dépasse la fin du fichier avec un mauvais alignement
|
||||
this->_eof = true;
|
||||
if (i==0){ // on est sur le premier caractère
|
||||
throw eBitReaderEndOfFile();
|
||||
} else {
|
||||
BitGroup eof_bg(i);
|
||||
printf("SMALLER BITGROUP ! (%d)\n",i);
|
||||
for (int j=0; j<i; j++){
|
||||
eof_bg.setBitAt(j, result.getBitAt(j));
|
||||
}
|
||||
printf("pre-copy\n");
|
||||
result = eof_bg;
|
||||
printf("post-copy\n");
|
||||
break;
|
||||
}
|
||||
}
|
||||
this->_current_bit_position += 1;
|
||||
}
|
||||
printf("END result = %s",result.toString().c_str());
|
||||
return result;
|
||||
}
|
||||
|
||||
void BitReader::close(){
|
||||
::close(this->_file_desc);
|
||||
}
|
||||
|
||||
}
|
43
src/lib/eyd_bitreader.hh
Normal file
43
src/lib/eyd_bitreader.hh
Normal file
|
@ -0,0 +1,43 @@
|
|||
#ifndef _EYD_BITREADER_HH
|
||||
#define _EYD_BITREADER_HH
|
||||
|
||||
#include <string>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
#include <exception>
|
||||
|
||||
#include "eyd_bitgroup.hh"
|
||||
|
||||
#include "eyd_global.hh"
|
||||
#include "eyd_iface.hh"
|
||||
|
||||
|
||||
namespace EydLib {
|
||||
class eBitReaderEndOfFile : public std::exception { };
|
||||
class eBitReaderBadFileDescriptor : public std::exception { };
|
||||
|
||||
class BitReader {
|
||||
private:
|
||||
char * _read_buffer;
|
||||
int _real_buffer_size;
|
||||
int _wanted_buffer_size;
|
||||
int _bitgroup_size;
|
||||
int _current_bit_position;
|
||||
int _file_desc;
|
||||
bool _eof;
|
||||
|
||||
bool getBitAt(int position);
|
||||
|
||||
public:
|
||||
BitReader(int size, int buffer_size);
|
||||
~BitReader();
|
||||
|
||||
void open(std::string filename);
|
||||
/* BitGroup * BitReader::read(int size); */
|
||||
BitGroup BitReader::read();
|
||||
void close();
|
||||
};
|
||||
}
|
||||
|
||||
#endif
|
130
src/lib/eyd_bitwriter.cpp
Normal file
130
src/lib/eyd_bitwriter.cpp
Normal file
|
@ -0,0 +1,130 @@
|
|||
|
||||
#include "eyd_bitwriter.hh"
|
||||
|
||||
#define DEBUG 0
|
||||
namespace EydLib {
|
||||
/*
|
||||
* int _group_pos;
|
||||
int _fd;
|
||||
*/
|
||||
|
||||
BitWriter::BitWriter(int size, int buffer_size = 1024){
|
||||
// tous les groupes de bits seront de la taille donnée
|
||||
this->_bitgroup_size = size;
|
||||
this->_wanted_buffer_size = buffer_size;
|
||||
this->_write_buffer = new char[this->_wanted_buffer_size];
|
||||
this->_file_desc = -1;
|
||||
this->_ready = false;
|
||||
}
|
||||
|
||||
BitWriter::~BitWriter(){
|
||||
delete(this->_write_buffer);
|
||||
}
|
||||
|
||||
void BitWriter::open(std::string filename){
|
||||
this->_file_desc = ::open(filename.c_str(), O_WRONLY | O_CREAT | O_TRUNC,
|
||||
S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP);
|
||||
if (this->_file_desc < 0){
|
||||
throw eBitWriterBadFileDescriptor();
|
||||
}
|
||||
|
||||
this->_real_buffer_size_in_bits = 0;
|
||||
this->_current_bit_position = 0;
|
||||
this->_ready = true;
|
||||
}
|
||||
|
||||
|
||||
void BitWriter::setBitAt(int position, bool value){
|
||||
// on attrappe la bonne case du tableau
|
||||
// on shift dans le bon sens
|
||||
// on retourne la valeur du bit.
|
||||
int size_of_char = 8 * sizeof(char);
|
||||
int i;
|
||||
int index_of_char = position / size_of_char;
|
||||
int shift_of_char = position % size_of_char;
|
||||
|
||||
char writer;
|
||||
printf("BitWriter::setBitAt / pos %d - size %d\n", position, this->_real_buffer_size_in_bits );
|
||||
|
||||
if (position >= this->_real_buffer_size_in_bits){
|
||||
throw eBitWriterOutOfBound();
|
||||
} else {
|
||||
unsigned char mask_fill;
|
||||
unsigned char mask_hole;
|
||||
for (i=0; i < size_of_char; i++){
|
||||
mask_fill = (mask_fill << 1) | 1;
|
||||
if (shift_of_char == i){
|
||||
mask_hole = (mask_hole << 1) | 0;
|
||||
} else {
|
||||
mask_hole = (mask_hole << 1) | 1;
|
||||
}
|
||||
}
|
||||
writer = this->_write_buffer[index_of_char];
|
||||
if (value){
|
||||
writer = ((writer ^ mask_fill) & mask_hole) ^ mask_fill;
|
||||
} else {
|
||||
writer = writer & mask_hole;
|
||||
}
|
||||
this->_write_buffer[index_of_char] = writer;
|
||||
}
|
||||
}
|
||||
|
||||
void BitWriter::flush(){
|
||||
int nb_chars;
|
||||
int size_of_char = 8 * sizeof(char);
|
||||
int right_bit_len;
|
||||
//nb_chars = ((this->_real_buffer_size_in_bits) / size_of_char);
|
||||
// au pire on fait un write de trop
|
||||
// donc la derniere "bonne valeur" se situe à
|
||||
right_bit_len = this->_real_buffer_size_in_bits;
|
||||
nb_chars = (right_bit_len / size_of_char);
|
||||
|
||||
// sauf qu'il reste de quoi finir un octet
|
||||
if (nb_chars > this->_wanted_buffer_size) {
|
||||
nb_chars = this->_wanted_buffer_size;
|
||||
}
|
||||
|
||||
if ((this->_real_buffer_size_in_bits - 1) > this->_bitgroup_size) {
|
||||
// on flush seulement si on a écrit + de 1 bitgroup dans le nouveau
|
||||
// buffer
|
||||
printf("BitWriter::write / buffer() -> write()\n");
|
||||
printf("WRITE_BUFFER(%d chars) = %s\n",nb_chars, this->_write_buffer);
|
||||
|
||||
::write(this->_file_desc, this->_write_buffer, nb_chars);
|
||||
}
|
||||
this->_current_bit_position = 0;
|
||||
this->_real_buffer_size_in_bits=1;
|
||||
}
|
||||
|
||||
void BitWriter::write(BitGroup data){
|
||||
int i;
|
||||
bool bitValue;
|
||||
int size_of_char = 8 * sizeof(char);
|
||||
|
||||
if (this->_file_desc < 0){
|
||||
throw eBitWriterBadFileDescriptor();
|
||||
}
|
||||
|
||||
for (i=0; i < this->_bitgroup_size; i++){
|
||||
if (i < data.size()){
|
||||
bitValue = data.getBitAt(i);
|
||||
this->_real_buffer_size_in_bits += 1;
|
||||
if (this->_real_buffer_size_in_bits > (this->_wanted_buffer_size * size_of_char)){
|
||||
this->flush();
|
||||
}
|
||||
this->setBitAt(this->_current_bit_position, bitValue);
|
||||
this->_current_bit_position += 1;
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
void BitWriter::close(){
|
||||
// on vide le dernier buffer jusqu'a la position réelle...
|
||||
printf("Remaining %d\n",this->_real_buffer_size_in_bits);
|
||||
this->flush();
|
||||
::close(this->_file_desc);
|
||||
}
|
||||
|
||||
}
|
||||
#undef DEBUG
|
43
src/lib/eyd_bitwriter.hh
Normal file
43
src/lib/eyd_bitwriter.hh
Normal file
|
@ -0,0 +1,43 @@
|
|||
#ifndef _EYD_BITWRITER_HH
|
||||
#define _EYD_BITWRITER_HH
|
||||
|
||||
#include <string>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
#include <exception>
|
||||
#include "eyd_bitgroup.hh"
|
||||
|
||||
#include "eyd_global.hh"
|
||||
#include "eyd_iface.hh"
|
||||
|
||||
|
||||
namespace EydLib {
|
||||
class eBitWriterOutOfBound : public std::exception { };
|
||||
class eBitWriterBadFileDescriptor : public std::exception { };
|
||||
|
||||
class BitWriter {
|
||||
private:
|
||||
int _bitgroup_size;
|
||||
int _real_buffer_size_in_bits;
|
||||
int _wanted_buffer_size;
|
||||
char * _write_buffer;
|
||||
int _file_desc;
|
||||
int _current_bit_position;
|
||||
bool _ready;
|
||||
|
||||
void setBitAt(int position, bool value);
|
||||
|
||||
public:
|
||||
BitWriter(int size, int buffer_size);
|
||||
~BitWriter();
|
||||
|
||||
void init(int size);
|
||||
void open(std::string filename);
|
||||
void write(BitGroup data);
|
||||
void flush();
|
||||
void close();
|
||||
};
|
||||
}
|
||||
|
||||
#endif
|
34
src/lib/eyd_global.hh
Normal file
34
src/lib/eyd_global.hh
Normal file
|
@ -0,0 +1,34 @@
|
|||
#ifndef _EYD_GLOBAL_HH
|
||||
#define _EYD_GLOBAL_HH 1
|
||||
|
||||
#include "../config.h"
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <iostream>
|
||||
#include <iterator>
|
||||
#include <sstream>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <set>
|
||||
#include <map>
|
||||
#include <list>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
#include <assert.h>
|
||||
#include <errno.h>
|
||||
|
||||
#define COLOR_GREEN "\x1B[33m"
|
||||
#define COLOR_NORMAL "\x1B[0m"
|
||||
|
||||
#define COLOR_GREEN "\x1B[33m"
|
||||
#define COLOR_NORMAL "\x1B[0m"
|
||||
|
||||
#define EYD_DEBUG 0
|
||||
|
||||
#define pDEBUG(x,...) if (DEBUG | EYD_DEBUG){ \
|
||||
printf("%s:%d/ %s",x,__LINE__,COLOR_GREEN); \
|
||||
printf(__VA_ARGS__); \
|
||||
printf("%s",COLOR_NORMAL); }
|
||||
|
||||
#endif
|
7
src/lib/eyd_iface.hh
Normal file
7
src/lib/eyd_iface.hh
Normal file
|
@ -0,0 +1,7 @@
|
|||
#ifndef _EYD_IFACE_HH
|
||||
#define _EYD_IFACE_HH 1
|
||||
|
||||
/* user def types ... */
|
||||
|
||||
#endif
|
||||
|
16
src/lib/eyd_proto.hh
Normal file
16
src/lib/eyd_proto.hh
Normal file
|
@ -0,0 +1,16 @@
|
|||
#ifndef _EYD_PROTO_HH
|
||||
#define _EYD_PROTO_HH 1
|
||||
|
||||
/*#include "regexptree.hh"
|
||||
#include "transition.hh"
|
||||
#include "state.hh"
|
||||
#include "stateclass.hh"
|
||||
#include "automata.hh"
|
||||
*/
|
||||
|
||||
#include "eyd_bitgroup.hh"
|
||||
#include "eyd_bitreader.hh"
|
||||
#include "eyd_bitwriter.hh"
|
||||
|
||||
#endif
|
||||
|
35
src/tools/Makefile.am
Normal file
35
src/tools/Makefile.am
Normal file
|
@ -0,0 +1,35 @@
|
|||
#AM_YFLAGS = -d -v
|
||||
|
||||
SUBDIRS = .
|
||||
|
||||
bin_PROGRAMS = eyd bittest bitcopy
|
||||
|
||||
eyd_SOURCES = eyd_console.cpp eyd_init.cpp
|
||||
eyd_LDADD = -leyd
|
||||
eyd_LDFLAGS = @LDFLAGS@ -L../lib -L../lib/.libs
|
||||
|
||||
|
||||
#eyd_SOURCES += parser.hh \
|
||||
# source_lexer.hh
|
||||
|
||||
eyd_SOURCES += eyd_console.hh
|
||||
|
||||
INCLUDES= -I../lib/ -I./ @GLIB2_CFLAGS@ @TARGET_READLINE_INC@
|
||||
|
||||
#BUILT_SOURCES = source_parser.h source_lexer.cc
|
||||
|
||||
|
||||
# LEXLIB@
|
||||
# libyalag.la
|
||||
|
||||
#eyd_INCLUDE =
|
||||
|
||||
|
||||
bittest_SOURCES = bittest.cpp
|
||||
bittest_LDADD = -leyd
|
||||
bittest_LDFLAGS = @LDFLAGS@ -L../lib -L../lib/.libs
|
||||
|
||||
bitcopy_SOURCES = bitcopy.cpp
|
||||
bitcopy_LDADD = -leyd
|
||||
bitcopy_LDFLAGS = @LDFLAGS@ -L../lib -L../lib/.libs
|
||||
|
43
src/tools/bitcopy.cpp
Normal file
43
src/tools/bitcopy.cpp
Normal file
|
@ -0,0 +1,43 @@
|
|||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <eyd.hh>
|
||||
#include <exception>
|
||||
|
||||
void usage(){
|
||||
printf("usage : bitcopy <int> <file>\n");
|
||||
}
|
||||
|
||||
int main(int argc, char ** argv){
|
||||
if (argc<2){ usage(); exit(-1); }
|
||||
int size = atoi(argv[1]);
|
||||
std::string original = argv[2];
|
||||
std::string copy = original + ".copy";
|
||||
|
||||
EydLib::BitReader bitread(size, 256);
|
||||
bitread.open(original);
|
||||
|
||||
EydLib::BitWriter bitwrite(size,256);
|
||||
bitwrite.open(copy);
|
||||
|
||||
printf("File opened\n");
|
||||
|
||||
bool done=false;
|
||||
EydLib::BitGroup bg;
|
||||
while(!done){
|
||||
try{
|
||||
bg = bitread.read();
|
||||
printf("read = %s \n",bg.toString().c_str());
|
||||
bitwrite.write(bg);
|
||||
} catch (EydLib::eBitReaderEndOfFile& e) {
|
||||
done = true;
|
||||
} catch (std::exception& e){
|
||||
printf("ERROR\n");
|
||||
}
|
||||
}
|
||||
printf("copy done\n");
|
||||
|
||||
bitread.close();
|
||||
bitwrite.close();
|
||||
|
||||
printf("file closed\n");
|
||||
}
|
14
src/tools/bittest.cpp
Normal file
14
src/tools/bittest.cpp
Normal file
|
@ -0,0 +1,14 @@
|
|||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <eyd.hh>
|
||||
|
||||
int main(int argc, char ** argv){
|
||||
printf("hop\n");
|
||||
int size = atoi(argv[1]);
|
||||
int pos = atoi(argv[2]);
|
||||
EydLib::BitGroup bg(size);
|
||||
printf("bits = %s\n", bg.toString().c_str());
|
||||
bg.setBitAt(pos,1);
|
||||
//bg.setBit(2,1);
|
||||
printf("bits = %s\n", bg.toString().c_str());
|
||||
}
|
102
src/tools/eyd_console.cpp
Normal file
102
src/tools/eyd_console.cpp
Normal file
|
@ -0,0 +1,102 @@
|
|||
#include "eyd.hh"
|
||||
|
||||
using namespace std;
|
||||
|
||||
|
||||
|
||||
int main(int argc, char **argv){
|
||||
/*
|
||||
std::string *servermsgold, *usermsg, *userparam;
|
||||
int ret;
|
||||
char * tmp_c_string;
|
||||
ftp_cmd_t ftp_cmd;
|
||||
|
||||
ftp_connection_state_t cnx_state;
|
||||
FtpConfig * client_conf = NULL;
|
||||
|
||||
servermsgold = NULL;
|
||||
usermsg = NULL;
|
||||
userparam = NULL;
|
||||
cnx_state = FTP_STATE_DISCONNECTED;
|
||||
|
||||
client_conf = new FtpConfig();
|
||||
ret = miniftp_args(client_conf, argc, argv);
|
||||
if (ret < 0) { return EXIT_FAILURE; }
|
||||
|
||||
printf("Connecting to %s:%d\n... ",
|
||||
client_conf->server_conf->host->c_str(),
|
||||
client_conf->server_conf->port);
|
||||
fflush(stdout);
|
||||
|
||||
XionFS::XSock *cmdXSock; // *dataXSock;
|
||||
|
||||
cmdXSock = new XionFS::XSock(XionFS::CLIENT,XionFS::TCP);
|
||||
cmdXSock->port(client_conf->server_conf->port);
|
||||
cmdXSock->dns(client_conf->server_conf->host->c_str());
|
||||
|
||||
cmdXSock->launch();
|
||||
printf(" fait\n");
|
||||
client_conf->cmd_xsocket = cmdXSock;
|
||||
|
||||
// init sequence
|
||||
MiniFtp::ServerMsg * servermsg;
|
||||
// ("220 hophop");
|
||||
servermsg = ftp_cmd_recv(client_conf);
|
||||
|
||||
if ((servermsg->getStatus()/10) == 22){
|
||||
cnx_state = FTP_STATE_CONNECTED;
|
||||
} else {
|
||||
cout << "ERROR\n";
|
||||
return EXIT_FAILURE; // event system
|
||||
}
|
||||
delete(servermsg);
|
||||
// init
|
||||
|
||||
cout <<"Auth...\n";
|
||||
while(cnx_state == FTP_STATE_CONNECTED){
|
||||
|
||||
tmp_c_string = readline("Login...: ");
|
||||
usermsg = new std::string(tmp_c_string);
|
||||
ftp_cmd_send(client_conf, FTP_CMD_USER, (char*)usermsg->c_str());
|
||||
free(tmp_c_string);
|
||||
delete(usermsg);
|
||||
|
||||
servermsg = ftp_cmd_recv(client_conf);
|
||||
if (servermsg->getStatus() != 331){
|
||||
continue;
|
||||
}
|
||||
delete(servermsg);
|
||||
|
||||
tmp_c_string = readline("Password: ");
|
||||
usermsg = new std::string(tmp_c_string);
|
||||
ftp_cmd_send(client_conf, FTP_CMD_PASS, (char*)usermsg->c_str());
|
||||
delete(usermsg);
|
||||
|
||||
servermsg = ftp_cmd_recv(client_conf);
|
||||
if ((servermsg->getStatus() / 10) == 23){
|
||||
cnx_state = FTP_STATE_LOGGED_IN;
|
||||
}
|
||||
delete(usermsg);
|
||||
|
||||
}
|
||||
while(cnx_state == FTP_STATE_LOGGED_IN){
|
||||
tmp_c_string = readline("ftp> ");
|
||||
usermsg = new std::string(tmp_c_string);
|
||||
//userparam = (char *) malloc(sizeof(char) * CLIENTQUERY_MAX_LENGTH);
|
||||
ftp_cmd = ftp_cmd_parse(usermsg, &userparam);
|
||||
//Think to keep FTP filesystem tree somewhere
|
||||
ftp_cmd_send(client_conf, ftp_cmd, userparam);
|
||||
if (ftp_cmd == FTP_CMD_QUIT){
|
||||
printf("Disconnecting...\n");
|
||||
cnx_state = FTP_STATE_DISCONNECTED;
|
||||
}
|
||||
free(userparam);
|
||||
delete(usermsg);
|
||||
free(tmp_c_string);
|
||||
}
|
||||
|
||||
// on le garde dans un coin au chaud en attendant
|
||||
// dataXSock->launch();
|
||||
*/
|
||||
return 0;
|
||||
}
|
0
src/tools/eyd_console.hh
Normal file
0
src/tools/eyd_console.hh
Normal file
34
src/tools/eyd_init.cpp
Normal file
34
src/tools/eyd_init.cpp
Normal file
|
@ -0,0 +1,34 @@
|
|||
#include "eyd.hh"
|
||||
|
||||
/*
|
||||
int miniftp_args(MiniFtp::FtpConfig * client_conf, int argc, char ** argv){ // GOOD
|
||||
int i;
|
||||
|
||||
for (i = 1; i + 1 < argc; i = i + 2){
|
||||
char * opt = argv[i]; //GOOD
|
||||
char * val = argv[i+1]; //GOOD
|
||||
if ( (strcmp(opt, "--port") == 0) || (strcmp(opt,"-p") == 0) ){
|
||||
client_conf->setServerPort(atoi(val));
|
||||
continue;
|
||||
}
|
||||
if ( (strcmp(opt, "--host") == 0) || (strcmp(opt,"-h") == 0) ){
|
||||
client_conf->setServerHost(std::string(val));
|
||||
continue;
|
||||
}
|
||||
|
||||
// printf("Option = %s, ",argv[i]);
|
||||
// printf("value = %s\n",argv[i+1]);
|
||||
}
|
||||
|
||||
if (!client_conf->hasServerHost()
|
||||
|| !client_conf->hasServerPort()) {
|
||||
printf("\nUsage: %s <options>\n", argv[0]);
|
||||
printf("\nWhere options could be:\n");
|
||||
printf("-p, --port <integer> Port to connect on host\n");
|
||||
printf("-h, --host <string> DNS or IP address of the FTP host\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
*/
|
Loading…
Reference in a new issue