* Fixed broken CodeConv semantics (missing length parameter).

* No longer writes to the message data from clipboard.
* some cleanup.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15153 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler
2005-11-25 17:57:52 +00:00
parent 498cd44c3a
commit 8eb8269db6
6 changed files with 1339 additions and 1496 deletions
+54 -104
View File
@@ -1,34 +1,11 @@
/*
* Copyright (c) 2001-2005, Haiku, Inc.
* Copyright (c) 2003-4 Kian Duffy <[email protected]>
* Parts Copyright (C) 1998,99 Kazuho Okui and Takashi Murai.
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files or portions
* thereof (the "Software"), to deal in the Software without restriction,
* including without limitation the rights to use, copy, modify, merge,
* publish, distribute, sublicense, and/or sell copies of the Software,
* and to permit persons to whom the Software is furnished to do so, subject
* to the following conditions:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright notice
* in the binary, as well as this list of conditions and the following
* disclaimer in the documentation and/or other materials provided with
* the distribution.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*
* Distributed under the terms of the MIT license.
*/
/************************************************************************
/*********************************************************************
MuTerminal Code Conversion class (MC3).
version 1.1 Internal coding system is UTF8.
@@ -52,26 +29,20 @@ UTF8
extern char utf8_width_table[]; /* define UTF8WidthTbl.c */
//////////////////////////////////////////////////////////////////////
// Constructor
//////////////////////////////////////////////////////////////////////
CodeConv::CodeConv (void)
{
}
//////////////////////////////////////////////////////////////////////
// Destructor
//////////////////////////////////////////////////////////////////////
CodeConv::~CodeConv (void)
CodeConv::CodeConv()
{
}
//////////////////////////////////////////////////////////////////////
// UTF8GetFontWidth (const uchar *string)
// get font width in coding.
//////////////////////////////////////////////////////////////////////
int
CodeConv::UTF8GetFontWidth (const uchar *string)
CodeConv::~CodeConv()
{
}
//! get font width in coding.
int32
CodeConv::UTF8GetFontWidth(const char *string)
{
uchar width, point;
ushort unicode, offset;
@@ -82,33 +53,34 @@ CodeConv::UTF8GetFontWidth (const uchar *string)
point = 0x80 >> offset;
return ((width & point) > 0 ) ? 2 : 1;
return (width & point) > 0 ? 2 : 1;
}
//////////////////////////////////////////////////////////////////////
// ConvertFromInternal (const uchar *src, uchar *dst, int coding)
// Convert internal coding from src coding.
//////////////////////////////////////////////////////////////////////
int
CodeConv::ConvertFromInternal (const uchar *src, uchar *dst, int coding)
//! Convert internal coding from src coding.
int32
CodeConv::ConvertFromInternal(const char *src, int32 srclen, char *dst, int coding)
{
const uchar *src_p = src;
long srclen = 0, dstlen = 0;
int32 dstlen = 0;
long state = 0;
int theCoding;
if (coding == M_UTF8) return 0;
if (srclen == -1)
srclen = strlen(src);
if (coding == M_UTF8) {
memcpy(dst, src, srclen);
dst[srclen] = '\0';
return srclen;
}
theCoding = coding_translation_table[coding];
while (*src_p++) srclen++;
dstlen = srclen * 256;
convert_from_utf8 (theCoding,
(char *)src, &srclen,
(char *)dst, &dstlen,
&state, '?');
convert_from_utf8(theCoding, (char *)src, &srclen,
(char *)dst, &dstlen, &state, '?');
if (coding == M_ISO_2022_JP && state != 0) {
const char *end_of_jis = "(B";
@@ -117,24 +89,26 @@ CodeConv::ConvertFromInternal (const uchar *src, uchar *dst, int coding)
}
dst[dstlen] = '\0';
return dstlen;
}
//////////////////////////////////////////////////////////////////////
// ConvertToInternal (const uchar *src, uchar *dst, int coding)
// Convert internal coding to src coding.
//////////////////////////////////////////////////////////////////////
void
CodeConv::ConvertToInternal (const uchar *src, uchar *dst, int coding)
//! Convert internal coding to src coding.
int32
CodeConv::ConvertToInternal(const char *src, int32 srclen, char *dst, int coding)
{
const uchar *src_p = src;
long srclen = 0, dstlen = 4;
int32 dstlen = 4;
long state = 0;
int theCoding;
if (srclen == -1)
srclen = strlen(src);
if (coding == M_UTF8) return;
if (coding == M_UTF8) {
memcpy(dst, src, srclen);
dst[srclen] = '\0';
return srclen;
}
#if 0
#ifndef __INTEL__
@@ -149,34 +123,21 @@ CodeConv::ConvertToInternal (const uchar *src, uchar *dst, int coding)
dst[dstlen] = '\0';
return;
}
#endif
#endif
theCoding = coding_translation_table[coding];
while (*src_p++) srclen++;
convert_to_utf8 (theCoding,
(char *)src, &srclen,
(char *)dst, &dstlen,
&state, '?');
convert_to_utf8(theCoding, (char *)src, &srclen,
(char *)dst, &dstlen, &state, '?');
dst[dstlen] = '\0';
return;
return dstlen;
}
/*
* Private member functions.
*/
//////////////////////////////////////////////////////////////////////
// UTF8toUnicode (uchar *utf8)
//
//////////////////////////////////////////////////////////////////////
unsigned short
CodeConv::UTF8toUnicode (const uchar *utf8)
CodeConv::UTF8toUnicode(const char *utf8)
{
uchar tmp;
unsigned short unicode = 0x0000;
@@ -185,13 +146,11 @@ CodeConv::UTF8toUnicode (const uchar *utf8)
if (tmp < 0x80) {
unicode = (unsigned short)*utf8;
}
else if (tmp < 0xe0) {
} else if (tmp < 0xe0) {
unicode = (unsigned short)*utf8++ & 0x1f;
unicode = unicode << 6;
unicode = unicode | ((unsigned short)*utf8 & 0x3f);
}
else if (tmp < 0xf0) {
} else if (tmp < 0xf0) {
unicode = (unsigned short)*utf8++ & 0x0f;
unicode = unicode << 6;
unicode = unicode | ((unsigned short)*utf8++ & 0x3f);
@@ -202,10 +161,7 @@ CodeConv::UTF8toUnicode (const uchar *utf8)
return unicode;
}
//////////////////////////////////////////////////////////////////////
// euc_to_sjis
//
//////////////////////////////////////////////////////////////////////
void
CodeConv::euc_to_sjis(uchar *buf)
{
@@ -223,22 +179,16 @@ CodeConv::euc_to_sjis (uchar *buf)
c1 = p / 188;
c2 = p % 188;
if (c1 >= 31) {
if (c1 >= 31)
c1 = c1 - 31 + 0xE0;
}
else {
else
c1 += 0x81;
}
if (c2 >= 63) {
if (c2 >= 63)
c2 = c2 - 63 + 0x80;
}
else {
else
c2 += 0x40;
}
*buf++ = c1;
*buf = c2;
return;
}
+10 -56
View File
@@ -1,83 +1,37 @@
/*
* Copyright (c) 2001-2005, Haiku, Inc.
* Copyright (c) 2003-4 Kian Duffy <[email protected]>
* Parts Copyright (C) 1998,99 Kazuho Okui and Takashi Murai.
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files or portions
* thereof (the "Software"), to deal in the Software without restriction,
* including without limitation the rights to use, copy, modify, merge,
* publish, distribute, sublicense, and/or sell copies of the Software,
* and to permit persons to whom the Software is furnished to do so, subject
* to the following conditions:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright notice
* in the binary, as well as this list of conditions and the following
* disclaimer in the documentation and/or other materials provided with
* the distribution.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*
* Distributed under the terms of the MIT license.
*/
#ifndef CODECONV_H
#define CODECONV_H
#include <SupportDefs.h>
#include "Coding.h"
#define BEGINS_CHAR(byte) ((byte & 0xc0) >= 0x80)
/*
* Coding system define.
*/
class CodeConv
{
/*
* Constructor and Destuructor.
*/
class CodeConv {
public:
CodeConv (void);
~CodeConv (void);
CodeConv();
~CodeConv();
/*
* Public member functions.
*/
int UTF8GetFontWidth (const uchar *string);
int32 UTF8GetFontWidth(const char *string);
/* internal(UTF8) -> coding */
int ConvertFromInternal (const uchar *src, uchar *dst, int coding);
int32 ConvertFromInternal(const char *src, int32 bytes, char *dst, int coding);
/* coding -> internal(UTF8) */
void ConvertToInternal (const uchar *src, uchar *dst, int coding);
/*
* PRIVATE MEMBER.
*/
int32 ConvertToInternal(const char *src, int32 bytes, char *dst, int coding);
private:
/*
* Private member functions.
*/
void euc_to_sjis(uchar *buf);
unsigned short UTF8toUnicode (const uchar *utf8);
/*
* DATA Member.
*/
unsigned short UTF8toUnicode(const char *utf8);
int fNowCoding;
};
#endif /* CODECONV_H */
+16 -8
View File
@@ -3,13 +3,19 @@
* Copyright (c) 2003-4 Kian Duffy <[email protected]>
* Parts Copyright (C) 1998,99 Kazuho Okui and Takashi Murai.
* Distributed under the terms of the MIT license.
*
* Authors:
* Kian Duffy <[email protected]>
*/
/*! This view is a shell for the TermView and makes sure it's always
resized in whole character sizes.
It doesn't serve any other purpose (and could possibly removed
with a tiny bit smarter programming).
*/
#include "TermBaseView.h"
#include "TermView.h"
TermBaseView::TermBaseView(BRect frame, TermView *inTermView)
: BView(frame, "baseview", B_FOLLOW_ALL_SIDES,
B_WILL_DRAW | B_FRAME_EVENTS)
@@ -17,20 +23,22 @@ TermBaseView::TermBaseView (BRect frame, TermView *inTermView)
fTermView = inTermView;
}
TermBaseView::~TermBaseView()
{
}
void
TermBaseView::FrameResized(float width, float height)
{
int font_width, font_height;
int fontWidth, fontHeight;
int cols, rows;
fTermView->GetFontInfo (&font_width, &font_height);
fTermView->GetFontInfo(&fontWidth, &fontHeight);
cols = (int)(width - VIEW_OFFSET * 2) / font_width;
rows = (int)(height - VIEW_OFFSET * 2)/ font_height;
cols = (int)(width - VIEW_OFFSET * 2) / fontWidth;
rows = (int)(height - VIEW_OFFSET * 2) / fontHeight;
fTermView->ResizeTo (cols * font_width - 1, rows * font_height - 1);
fTermView->ResizeTo(cols * fontWidth - 1, rows * fontHeight - 1);
}
+10 -39
View File
@@ -1,58 +1,29 @@
/*
* Copyright (c) 2001-2005, Haiku, Inc.
* Copyright (c) 2003-4 Kian Duffy <[email protected]>
* Parts Copyright (C) 1998,99 Kazuho Okui and Takashi Murai.
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files or portions
* thereof (the "Software"), to deal in the Software without restriction,
* including without limitation the rights to use, copy, modify, merge,
* publish, distribute, sublicense, and/or sell copies of the Software,
* and to permit persons to whom the Software is furnished to do so, subject
* to the following conditions:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright notice
* in the binary, as well as this list of conditions and the following
* disclaimer in the documentation and/or other materials provided with
* the distribution.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*
* Distributed under the terms of the MIT license.
*/
#ifndef TERM_BASE_VIEW_H
#define TERM_BASE_VIEW_H
#ifndef TERMBASEVIEW_H_INCLUDED
#define TERMBASEVIEW_H_INCLUDED
#include <View.h>
class TermView;
class TermBaseView : public BView
{
class TermBaseView : public BView {
public:
//
// Constructor and Desctructor
//
TermBaseView(BRect frame, TermView *);
~TermBaseView();
private:
//
// Hook Functions.
//
void SetBaseColor(rgb_color);
void FrameResized (float, float);
virtual void FrameResized(float newWidth, float newHeight);
TermView *fTermView;
};
#endif /* TERMBASEVIEW_H_INCLUDED */
#endif /* TERM_BASE_VIEW_H */
+26 -53
View File
@@ -1,33 +1,11 @@
/*
* Copyright (c) 2001-2005, Haiku, Inc.
* Copyright (c) 2003-4 Kian Duffy <[email protected]>
* Parts Copyright (C) 1998,99 Kazuho Okui and Takashi Murai.
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files or portions
* thereof (the "Software"), to deal in the Software without restriction,
* including without limitation the rights to use, copy, modify, merge,
* publish, distribute, sublicense, and/or sell copies of the Software,
* and to permit persons to whom the Software is furnished to do so, subject
* to the following conditions:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright notice
* in the binary, as well as this list of conditions and the following
* disclaimer in the documentation and/or other materials provided with
* the distribution.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*
* Distributed under the terms of the MIT license.
*/
#include <errno.h>
#include <stdio.h>
#include <signal.h>
@@ -253,6 +231,7 @@ int gNowCoding = M_UTF8;
#define DEFAULT -1
#define NPARAM 10 // Max parameters
int32
TermParse::EscParse(void *data)
{
@@ -322,9 +301,8 @@ TermParse::EscParse (void *data)
}
switch (parsestate[c]) {
case CASE_PRINT:
cbuf[0] = (uchar) c;
cbuf[0] = c;
cbuf[1] = '\0';
width = HALF_WIDTH;
viewObj->PutChar(cbuf, attr, width);
@@ -333,9 +311,8 @@ TermParse::EscParse (void *data)
case CASE_PRINT_GR:
/* case iso8859 gr character, or euc */
ptr = cbuf;
if (now_coding == M_EUC_JP || now_coding == M_EUC_KR ||
now_coding == M_ISO_2022_JP) {
if (now_coding == M_EUC_JP || now_coding == M_EUC_KR
|| now_coding == M_ISO_2022_JP) {
switch (parsestate[curess]) {
case CASE_SS2: /* JIS X 0201 */
*ptr++ = curess;
@@ -361,17 +338,17 @@ TermParse::EscParse (void *data)
width = 2;
break;
}
} else { /* ISO-8859-1...10 and MacRoman */
} else {
/* ISO-8859-1...10 and MacRoman */
*ptr++ = c;
*ptr = 0;
width = 1;
}
if (now_coding != M_ISO_2022_JP) {
convObj->ConvertToInternal (cbuf, dstbuf, now_coding);
}
else {
convObj->ConvertToInternal (cbuf, dstbuf, M_EUC_JP);
}
if (now_coding != M_ISO_2022_JP)
convObj->ConvertToInternal((char*)cbuf, -1, (char*)dstbuf, now_coding);
else
convObj->ConvertToInternal((char*)cbuf, -1, (char*)dstbuf, M_EUC_JP);
viewObj->PutChar(dstbuf, attr, width);
break;
@@ -381,7 +358,7 @@ TermParse::EscParse (void *data)
cbuf[1] = theObj->GetReaderBuf() | 0x80;
cbuf[2] = 0;
width = 2;
convObj->ConvertToInternal (cbuf, dstbuf, M_EUC_JP);
convObj->ConvertToInternal((char*)cbuf, 2, (char*)dstbuf, M_EUC_JP);
viewObj->PutChar(dstbuf, attr, width);
break;
@@ -396,7 +373,7 @@ TermParse::EscParse (void *data)
case CASE_SJIS_KANA:
cbuf[0] = (uchar)c;
cbuf[1] = '\0';
convObj->ConvertToInternal (cbuf, dstbuf, now_coding);
convObj->ConvertToInternal((char*)cbuf, 1, (char*)dstbuf, now_coding);
width = 1;
viewObj->PutChar(dstbuf, attr, width);
break;
@@ -405,7 +382,7 @@ TermParse::EscParse (void *data)
cbuf[0] = (uchar)c;
cbuf[1] = theObj->GetReaderBuf();
cbuf[2] = '\0';
convObj->ConvertToInternal (cbuf, dstbuf, now_coding);
convObj->ConvertToInternal((char*)cbuf, 2, (char*)dstbuf, now_coding);
width = 2;
viewObj->PutChar(dstbuf, attr, width);
break;
@@ -417,24 +394,23 @@ TermParse::EscParse (void *data)
break;
cbuf[1] = (uchar)c;
cbuf[2] = '\0';
width = convObj->UTF8GetFontWidth (cbuf);
width = convObj->UTF8GetFontWidth((char*)cbuf);
viewObj->PutChar(cbuf, attr, width);
break;
case CASE_UTF8_3BYTE:
cbuf[0] = (uchar) c;
cbuf[0] = c;
c = theObj->GetReaderBuf();
if (groundtable[c] != CASE_UTF8_INSTRING)
break;
cbuf[1] = (uchar) c;
cbuf[1] = c;
c = theObj->GetReaderBuf();
if (groundtable[c] != CASE_UTF8_INSTRING)
break;
cbuf[2] = (uchar) c;
cbuf[2] = c;
cbuf[3] = '\0';
width = convObj->UTF8GetFontWidth (cbuf);
width = convObj->UTF8GetFontWidth((char*)cbuf);
viewObj->PutChar (cbuf, attr, width);
break;
@@ -575,7 +551,6 @@ TermParse::EscParse (void *data)
col = 1;
viewObj->SetCurPos(col - 1, row - 1 );
parsestate = groundtable;
break;
@@ -713,19 +688,17 @@ TermParse::EscParse (void *data)
if ((top = param[0]) < 1)
top = 1;
if(nparam < 2) {
if (nparam < 2)
bot = -1;
}
else {
else
bot = param[1];
}
top--;
bot--;
if (bot > top) {
if (bot > top)
viewObj->SetScrollRegion(top, bot);
}
parsestate = groundtable;
break;
File diff suppressed because it is too large Load Diff