X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fengine%2FAny.cxx;h=c4a8e09fc87d88aee0a122127fe3a3617416981e;hb=refs%2Ftags%2FEMC2P_V1_1_0;hp=633f348c4c49035656c230c1f2f4d45bf39c9f70;hpb=e3255204c864201f5bc1aa040d4273ed2f44e8cd;p=modules%2Fyacs.git diff --git a/src/engine/Any.cxx b/src/engine/Any.cxx index 633f348c4..c4a8e09fc 100644 --- a/src/engine/Any.cxx +++ b/src/engine/Any.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2006-2016 CEA/DEN, EDF R&D +// Copyright (C) 2006-2019 CEA/DEN, EDF R&D // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public @@ -22,6 +22,13 @@ #include "TypeCode.hxx" #include "InvalidExtractionException.hxx" +#include +#include +#include +#include +#include + +#include #include #include @@ -31,12 +38,160 @@ using namespace std; // forbidden value int=-269488145 double=-1.54947e+231 bool=239 const char SeqAlloc::DFT_CHAR_VAR=-17;//0xEF -StringOnHeap::StringOnHeap(const char *val):_dealloc(0),_str(strdup(val)) +constexpr unsigned NB_BITS = 6; + +constexpr unsigned char TAB[64]={46, 61, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122}; + +unsigned char BitAtPosSimple(char val, std::size_t bitPos) { + return (val >> bitPos) & 0x1; } -StringOnHeap::StringOnHeap(const std::string& val):_dealloc(0),_str(strdup(val.c_str())) +unsigned char BitAtPos(char pt0, char pt1, std::size_t bitPos) { + if(bitPos<8) + return BitAtPosSimple(pt0,bitPos); + else + return BitAtPosSimple(pt1,bitPos-8); +} + +unsigned char ChunkInternal(char pt0, char pt1, std::size_t startBitIdInByte) +{ + unsigned char ret(0); + for(unsigned i = 0; i>= 1; + return ret; +} + +unsigned char ChunkAtPos(const char *pt, std::size_t len, std::size_t posChunk) +{ + std::size_t startByte((posChunk*NB_BITS)/8); + std::size_t startBitIdInByte((posChunk*NB_BITS)%8); + char pt1(startByte!=len-1?pt[startByte+1]:pt[startByte]); + return ChunkInternal(pt[startByte],pt1,startBitIdInByte); +} + +std::size_t OnOff(std::size_t i) +{ + if(i!=0) + return 1; + return 0; +} + +std::string YACS::ENGINE::ToBase64(const std::string& bytes) +{//64 == 2**6 + const char *bytesPt(bytes.c_str()); + std::size_t input_len(bytes.size()); + std::size_t input_len_bit(input_len*8); + std::size_t nb_chunks( input_len_bit/NB_BITS + OnOff((NB_BITS - input_len_bit%NB_BITS)%NB_BITS) ); + std::string ret(nb_chunks,'\0'); + for(std::size_t i=0;i> (5-bitPos) ) & 0x1; +} + +char BitAtPosOnChunk(char pt0, char pt1, std::size_t bitPos) +{ + if(bitPos<6) + return BitAtPosSimple2(pt0,bitPos); + else + return BitAtPosSimple2(pt1,bitPos-6); +} + +unsigned char CheckEntry(char c) +{ + if( ((unsigned) c) < MAX_VAL_TAB2 ) + { + unsigned char ret(TAB2[(unsigned char)c]); + if(ret != NOT_OK_VAL) + return ret; + throw YACS::Exception("Invalid character found !"); + } + throw YACS::Exception("Invalid character found !"); +} + +char ByteInternal(char c0, char c1, std::size_t startBitIdInByte) +{ + unsigned char ret(0); + char ct0(CheckEntry(c0)),ct1(CheckEntry(c1)); + for(int i = 7; i>=0; --i) + { + ret |= BitAtPosOnChunk(ct0,ct1,startBitIdInByte+i); + if(i!=0) + ret <<= 1; + } + return ret; +} + +char ByteAtPos(const char *chunckPt, std::size_t bytePos) +{ + std::size_t startChunk((bytePos*8)/NB_BITS); + std::size_t startBitId((bytePos*8)%NB_BITS); + return ByteInternal(chunckPt[startChunk],chunckPt[startChunk+1],startBitId); +} + +std::string YACS::ENGINE::FromBase64(const std::string& bytes) +{ + std::size_t nb_chunks(bytes.size()); + const char *chunckPt(bytes.c_str()); + std::size_t nb_bytes_output((nb_chunks*NB_BITS)/8); + std::string ret(nb_bytes_output,'\0'); + for(std::size_t i = 0; iisA(Runtime::_tc_string)) - return string(_value._s->cStr()); + { + std::size_t sz(_value._s->size()); + if(sz==0) + return string(_value._s->cStr()); + else + return string(_value._s->cStr(),sz); + } + else + throw Exception("Value is not a string"); +} + +const char *AtomAny::getBytesValue(std::size_t& len) const +{ + if(_type->isA(Runtime::_tc_string)) + { + len=_value._s->size(); + return _value._s->cStr(); + } else throw Exception("Value is not a string"); }