114 return createDescriptor(it.
i,
true);
124 const unsigned char *end=p+len-it.
i;
127 d=createDescriptor(it.
i, returnUnimplemetedDescriptor);
143 const unsigned char *end=p+len-it.
i;
145 for (
int u=0; u<arrayLength;u++)
147 d=createDescriptor(it.
i, returnUnimplementedDescriptor);
184 deleteOnDesctruction=del;
188 if (deleteOnDesctruction)
194 for (
int i=0;i<length;i++)
205 for (
int i=0;i<length;i++)
209 if (length <= d->getDescriptorNumber())
216 for (
int i=0;i<length;i++)
224 if (len < 0 || len > 4095)
225 return strdup(
"text error");
226 char *
data=
new char(len+1);
229 decodeText(data, len+1);
235 if (len < 0 || len >= size) {
236 strncpy(buffer,
"text error", size);
240 decodeText(buffer, size);
244 char *
String::getText(
char *buffer,
char *shortVersion,
int sizeBuffer,
int sizeShortVersion) {
246 if (len < 0 || len >= sizeBuffer) {
247 strncpy(buffer,
"text error", sizeBuffer);
248 buffer[sizeBuffer-1] = 0;
252 decodeText(buffer, shortVersion, sizeBuffer, sizeShortVersion);
291 #define SingleByteLimit 0x0B 312 #define NumEntries(Table) (sizeof(Table) / sizeof(char *)) 326 free(OverrideCharacterTable);
327 OverrideCharacterTable = CharacterTable ? strdup(CharacterTable) : NULL;
331 if (CharacterTable) {
332 for (
unsigned int i = 0; i <
NumEntries(CharacterTables1); i++) {
333 if (CharacterTables1[i] && strcasecmp(CharacterTable, CharacterTables1[i]) == 0) {
334 SystemCharacterTable = CharacterTables1[i];
339 for (
unsigned int i = 0; i <
NumEntries(CharacterTables2); i++) {
340 if (CharacterTables2[i] && strcasecmp(CharacterTable, CharacterTables2[i]) == 0) {
341 SystemCharacterTable = CharacterTables2[i];
342 SystemCharacterTableIsSingleByte =
true;
347 SystemCharacterTable = NULL;
348 SystemCharacterTableIsSingleByte =
true;
355 const char *cs =
"ISO6937";
359 if (OverrideCharacterTable)
362 *isSingleByte =
false;
365 unsigned int tag = buffer[0];
370 tag = (buffer[1] << 8) | buffer[2];
371 if (tag <
NumEntries(CharacterTables2) && CharacterTables2[tag]) {
375 *isSingleByte =
true;
376 return CharacterTables2[tag];
379 }
else if (tag <
NumEntries(CharacterTables1) && CharacterTables1[tag]) {
384 return CharacterTables1[tag];
391 if (SystemCharacterTable) {
392 iconv_t cd = iconv_open(SystemCharacterTable, fromCode);
393 if (cd != (iconv_t)-1) {
394 char *fromPtr = (
char *)from;
395 while (fromLength > 0 && toLength > 1) {
396 if (iconv(cd, &fromPtr, &fromLength, &to, &toLength) == size_t(-1)) {
397 if (errno == EILSEQ) {
419 if (SystemCharacterTableIsSingleByte)
421 #define MT(s, m, v) ((*(s) & (m)) == (v)) // Mask Test 422 if (
MT(s, 0xE0, 0xC0) &&
MT(s + 1, 0xC0, 0x80))
424 if (
MT(s, 0xF0, 0xE0) &&
MT(s + 1, 0xC0, 0x80) &&
MT(s + 2, 0xC0, 0x80))
426 if (
MT(s, 0xF8, 0xF0) &&
MT(s + 1, 0xC0, 0x80) &&
MT(s + 2, 0xC0, 0x80) &&
MT(s + 3, 0xC0, 0x80))
442 if (singleByte && SystemCharacterTableIsSingleByte || !
convertCharacterTable((
const char *)from, len, to, size, cs)) {
445 strncpy(to, (
const char *)from, len);
454 unsigned char *p = (
unsigned char *)to;
455 if (l == 2 && *p == 0xC2)
459 case 0x8A: *to =
'\n';
break;
460 case 0xA0: *to =
' ';
break;
461 default: Move =
false;
463 if (l == 2 && Move) {
464 memmove(p, p + 1, len - 1);
475 decodeText(buffer, sizeBuffer);
477 *shortVersion =
'\0';
486 unsigned char *p = (
unsigned char *)to;
487 if (l == 2 && *p == 0xC2)
489 if (*p == 0x86 || *p == 0x87) {
490 IsShortName += (*p == 0x86) ? 1 : -1;
491 memmove(to, to + l, len - l + 1);
495 if (l && IsShortName) {
496 if (l < sizeShortVersion) {
497 for (
int i = 0; i < l; i++)
498 *shortVersion++ = to[i];
499 sizeShortVersion -= l;
505 *shortVersion =
'\0';
692 if (!returnUnimplemetedDescriptor)
731 if (!returnUnimplemetedDescriptor)
752 if (!returnUnimplemetedDescriptor)
bool convertCharacterTable(const char *from, size_t fromLength, char *to, size_t toLength, const char *fromCode)
static Descriptor * getDescriptor(CharArray d, DescriptorTagDomain domain, bool returnUnimplemetedDescriptor)
bool systemCharacterTableIsSingleByte(void)
bool getCurrentNextIndicator() const
Descriptor * createDescriptor(int &i, bool returnUnimplemetedDescriptor)
const char * getCharacterTable(const unsigned char *&buffer, int &length, bool *isSingleByte)
int getNumberOfDescriptors()
#define NumEntries(Table)
DescriptorTag getDescriptorTag() const
TableId getTableId() const
virtual int getLastDescriptorNumber()=0
int getSectionNumber() const
static const char * CharacterTables1[]
bool checkSize(int offset)
static char * OverrideCharacterTable
int getTableIdExtension() const
virtual int getLength()=0
bool Add(GroupDescriptor *d)
void setData(const unsigned char *data, int size, bool doCopy=true)
void assign(const unsigned char *data, int size, bool doCopy=true)
static int Utf8CharLen(const char *s)
virtual int getDescriptorNumber()=0
bool SetSystemCharacterTable(const char *CharacterTable)
void decodeText(char *buffer, int size)
int getVersionNumber() const
int getLastSectionNumber() const
static const char * SystemCharacterTable
bool checkSize(int offset)
bool SystemCharacterTableIsSingleByte
const unsigned char * getData() const
void SetOverrideCharacterTable(const char *CharacterTable)
Descriptor * getNext(Iterator &it)
DescriptorGroup(bool deleteOnDesctruction=true)
static const char * CharacterTables2[]