안녕하세요.. 키즈의 아저씨 pkp 입니다.
HellCat, 일명 앙마님이 NETNEWS에 올리신 글을 이곳에 올립니다.
이용에 도움이 되시기를 바랍니다. :)
>>>>> 여기서부터 >>>>>
From: dkim@sprintf.merit.edu (Daeshik Kim)
Newsgroups: han.hangul
Subject: hanterm patch
Date: 19 May 1994 14:25:52 GMT
What's fixed:
1) This patch fixes some memory leak inherited from xterm code.
- VisualBell() does not do XtReleaseGC() after XtGetGC().
so are we keep losing memory whenever it beeps?
- VTRealize() keeps adding new fonts w/o freeing the previously
loaded ones.
2) 'cat some-large-hangul-file' will crash hanterm since
'fillgc' in hangul.c was being used uninitialized.
3) DGUX XServer does not handle XDrawImageString16() correctly -
leaving ASCENT area blank for the johab hangul fonts; but
XDrawString16() is being handled correctly.
In order to get around this problem, added XDrawString16() so
that this - 'XDrawString16()' - fills the foreground parts
again - well .. ugly but the life sucks anyway.
To apply this:
1) cd to hanterm302 dir
2) patch -p1 < this_patch_file
=============================== CUT HERE ======================================
diff -c hanterm302/DGUX.note hanterm302+/DGUX.note
*** hanterm302/DGUX.noteMon Sep 27 13:20:53 1993
--- hanterm302+/DGUX.noteTue May 10 09:41:03 1994
***************
*** 1,36 ****
Notes on DGUX port.
! For DATA GENERAL Aviion Series.
! Currently, johab style font only works on DGUX 5.4.2 version of X11R5
! server.
! Right now, I've set up font server on one server class machine
! and using this hanterm on my local DGUX 5.4.2.R2.01 with
! older version of X11R5 X server (DGUX 5.4.2) instead of the one
! came with the current OS.
! On DGUX 5.4.1 and DGUX 5.4.2.R2.01, you cannot combine multiple fonts
! which is required on the implementation of hanterm font handling.
! For example, let's say you are trying to combine 3 hangul characters.
! Then when you type each one it will show up on hanterm; however,
! as soon as hanterm took it as one combined hangul and try to combine
! 3 different hangul johab fonts, the last fonts will clear the
! other 2 previously loaded fonts.
! So in result, you'll always see the last character of one whole hangul
! character.
! So, if you have earlier version of X11 Server than DGUX 5.4.2,
! give it up. It does not work simply.
! If you have DGUX 5.4.2.R2.01 (the most rescent one),
! save the X11R5 server from DGUX 5.4.2 and use it insted of
! the one from DGUX 5.4.2.R2.01.
! DGUX 5.4.2 supposed to be System 5.4.2; however, tty related stuff
is heavily relying on BSD implementation, so use BSD flavor of tty.
Use __using_BSD and __using_DGUX together.
--- 1,35 ----
Notes on DGUX port.
! What's new:
! Couple of possible mem. leaks are fixed.
! I've found out why johab fonts on X11R5 X Server ever since
! since DGUX 5.4.R2.01 (so far the most rescent version is
! DGUX 5.4.3 - yes, with those good stuff posix thread).
! DGUX XServer does not handle XDrawImageString16() correctly-
! i.e. XServer does now show any johab hangul fonts
! of ASCENT Area of the font box.
! However, I found XDrawString16() is handled correctly by
! DGUX Xserver.
! Using this XDrawString16() in addition to the
! XDrwaImageString16(), we can fill up the missing
! ASCENT Area of the fonts.
! I know I know it's an overhead; but it works :)
! Now the problem is that whoever uses DGUX XServer but uses
! remote hanterm on other platform than DGUX also should use
! this changes since it is the XServer that cannot handle
! XDrawImageString16() with johab fonts.
! In this case, you will have to add -DDGUX_XSERVER to CFLAGS
! in the Makefile or add "#define DGUX_XSERVER" to hangul.h
! DGUX 5.4.* supposed to be USL System 5.4.*; however, tty related stuff
is heavily relying on BSD implementation, so use BSD flavor of tty.
Use __using_BSD and __using_DGUX together.
***************
*** 51,55 ****
--- 50,55 ----
P.S. 2: If someone can provide hanterm that do not use johab-style
fonts, it would be very portable.
+
As a matter of fact, I've seen the same problem on one version of
SGI.
Most version of X server on SGI can handle it.
diff -c hanterm302/Makefile.dgux hanterm302+/Makefile.dgux
*** hanterm302/Makefile.dguxMon Sep 27 13:24:52 1993
--- hanterm302+/Makefile.dguxTue May 10 09:24:36 1994
***************
*** 4,10 ****
OBJS = $(SRCS:.c=.o)
TERMCAPLIB = -ltermcap
! CFLAGS = -DUSE_SYSV_UTMP -DUSE_TTY_GROUP -DUTMP \
-D_BSD_TTY_FLAVOR -D__using_BSD -D__using_DGUX
hanterm: $(OBJS)
--- 4,10 ----
OBJS = $(SRCS:.c=.o)
TERMCAPLIB = -ltermcap
! CFLAGS = -O2 -DUSE_SYSV_UTMP -DUSE_TTY_GROUP -DUTMP \
-D_BSD_TTY_FLAVOR -D__using_BSD -D__using_DGUX
hanterm: $(OBJS)
Common subdirectories: hanterm302/X11 and hanterm302+/X11
diff -c hanterm302/charproc.c hanterm302+/charproc.c
*** hanterm302/charproc.cWed Nov 17 07:46:18 1993
--- hanterm302+/charproc.cWed May 18 17:57:00 1994
***************
*** 86,92 ****
static void bitset(), bitclr();
#defineDEFAULT-1
- #defineTEXT_BUF_SIZE256
#define TRACKTIMESEC4L
#define TRACKTIMEUSEC0L
#define BELLSUPPRESSMSEC 200
--- 86,91 ----
***************
*** 2397,2402 ****
--- 2396,2413 ----
TabReset (term->tabs);
screen->menu_font_names[fontMenu_fontdefault] = term->misc.f_n;
+
+ /*
+ * mem. leak?
+ * Daeshik Kim (dkim@sprint.com) - DKIM
+ */
+ if (screen->fnt_norm)
+ XFreeFont (screen->display, screen->fnt_norm);
+ if (screen->fnt_bold)
+ XFreeFont (screen->display, screen->fnt_bold);
+ if (screen->fnt_hangul)
+ XFreeFont (screen->display, screen->fnt_hangul);
+
screen->fnt_norm = screen->fnt_bold = screen->fnt_hangul = NULL;
if (!LoadNewFont(screen, term->misc.f_n, term->misc.f_b,
term->misc.f_h, False, 0)) {
diff -c hanterm302/hangul.c hanterm302+/hangul.c
*** hanterm302/hangul.cTue Sep 7 17:05:22 1993
--- hanterm302+/hangul.cTue May 10 09:37:35 1994
***************
*** 152,159 ****
--- 152,165 ----
show_chat_buf();
}
+ /*
GC fillgc;
+ This can be used as unintialized; in result, it can crash hanterm
+ - Daeshik Kim (dkim@sprint.com) - DKIM
+ */
+ GC fillgc = NULL;
+
/* str 은 2 byte 조합형 */
HDrawImageString(d, w, gc, hgc, x, y, str, len)
***************
*** 164,171 ****
char* str;
int len;
{
! register TScreen *screen = &term->screen;
! XChar2b buf[200];
int n, width;
char *p;
XGCValues values;
--- 170,177 ----
char* str;
int len;
{
! TScreen *screen = &term->screen;
! static XChar2b buf[TEXT_BUF_SIZE];
int n, width;
char *p;
XGCValues values;
***************
*** 176,181 ****
--- 182,203 ----
;
n = convert_johab_to_display(str, buf, p - str);
XDrawImageString16(d, w, hgc, x, y, buf, n);
+ #if defined(DGUX_XSERVER) || defined(DGUX)
+ /*
+ * In DGUX XServer, XDrawImageString16() with hangul johab fonts which
+ * uses ASCENT area does not work.
+ *
+ * Beware, it's the DG XServer so even when you use remote
+ * hanterm from Sun4 machines; you sill get the same result.
+ *
+ * However, fortunately, XDrawString16() works - so
+ * let XDrawImageString16() draw whatever needs to be done; then
+ * add the broken ASCENT area with XDrawString16().
+ *
+ * Daeshik Kim - DKIM
+ */
+ XDrawString16(d, w, hgc, x, y, buf, n);
+ #endif
width = (p - str) * FontWidth(screen);
if (screen->ascent > screen->fnt_hangul->ascent) {
XGetGCValues(d, hgc, GCBackground, &values);
***************
*** 1174,1180 ****
int convert_3_to_johab( f , m , l , buf )
int f, m, l;
! char *buf;
{
if (f == 0xff) {
if (m >= 0xa1 && m <= 0xac) {
--- 1196,1202 ----
int convert_3_to_johab( f , m , l , buf )
int f, m, l;
! unsigned char *buf;
{
if (f == 0xff) {
if (m >= 0xa1 && m <= 0xac) {
diff -c hanterm302/hangul.h hanterm302+/hangul.h
*** hanterm302/hangul.hMon Sep 6 00:02:30 1993
--- hanterm302+/hangul.hWed May 18 16:48:45 1994
***************
*** 21,23 ****
--- 21,27 ----
#define ST_CODE_LEN6
#define ST_KBD_X12
#define ST_KBD_LEN7
+
+ #ifndef TEXT_BUF_SIZE
+ #defineTEXT_BUF_SIZE256
+ #endif
diff -c hanterm302/main.c hanterm302+/main.c
*** hanterm302/main.cFri Nov 12 02:30:29 1993
--- hanterm302+/main.cWed May 18 17:42:58 1994
***************
*** 994,999 ****
--- 994,1005 ----
screen = &term->screen;
+ /*
+ * Need to initialize for later garbage collection
+ * Daeshik Kim (dkim@sprint.com) - DKIM
+ */
+ screen->fnt_norm = screen->fnt_bold = screen->fnt_hangul = NULL;
+
if (screen->savelines < 0) screen->savelines = 0;
term->flags = 0;
diff -c hanterm302/main.h hanterm302+/main.h
*** hanterm302/main.hWed Sep 8 01:05:09 1993
--- hanterm302+/main.hWed May 18 16:36:58 1994
***************
*** 30,32 ****
--- 30,33 ----
#defineDEFBOLDFONTNULL /* no bold font uses overstriking */
#defineDEFBORDER2
#defineDEFBORDERWIDTH2
+ #defineTEXT_BUF_SIZE256
diff -c hanterm302/misc.c hanterm302+/misc.c
*** hanterm302/misc.cWed Sep 8 02:21:45 1993
--- hanterm302+/misc.cWed May 18 17:43:34 1994
***************
*** 358,363 ****
--- 358,369 ----
0, 0,
(unsigned) FullWidth(screen),
(unsigned) FullHeight(screen));
+
+ /*
+ * This is a memory leak if it's not released
+ * Daeshik Kim (dkim@sprint.com) - DKIM
+ */
+ XtReleaseGC ((Widget)term, visualGC);
}
/* ARGSUSED */
Common subdirectories: hanterm302/tmp and hanterm302+/tmp
--
Daeshik Kim (angma at IRC) \ O: (703) 689-5878
dkim@sprint.com dskim@{Glue,eng}.umd.edu
DAESHIK.KIM@sprintintl.sprint.com
<<<<< 여기까지 <<<<<
:)
~~~~~~~~pkp~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~pkp~~~~~~~~~~~~
^_^ 키즈의 아저씨 pkp palindrome ^L^
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~