home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Usenet 1994 October
/
usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso
/
x
/
volume12
/
kterm
/
part09
< prev
next >
Wrap
Internet Message Format
|
1991-05-08
|
52KB
Path: uunet!wuarchive!cs.utexas.edu!convex!central!newstop!grapevine!male!jethro!exodus!NMSU.Edu!mleisher
From: mleisher@NMSU.Edu
Newsgroups: comp.sources.x
Subject: v12i090: kterm - kanji xterm, Part09/18
Message-ID: <12974@exodus.Eng.Sun.COM>
Date: 8 May 91 02:40:18 GMT
References: <csx-12i082:kterm@uunet.UU.NET>
Sender: news@exodus.Eng.Sun.COM
Lines: 1997
Approved: argv@sun.com
Submitted-by: mleisher@NMSU.Edu
Posting-number: Volume 12, Issue 90
Archive-name: kterm/part09
#!/bin/sh
# this is kt412.09 (part 9 of kterm-4.1.2)
# do not concatenate these parts, unpack them in order with /bin/sh
# file kterm-4.1.2/charproc.c continued
#
if test ! -r _shar_seq_.tmp; then
echo 'Please unpack part 1 first!'
exit 1
fi
(read Scheck
if test "$Scheck" != 9; then
echo Please unpack part "$Scheck" next!
exit 1
else
exit 0
fi
) < _shar_seq_.tmp || exit 1
if test ! -f _shar_wnt_.tmp; then
echo 'x - still skipping kterm-4.1.2/charproc.c'
else
echo 'x - continuing file kterm-4.1.2/charproc.c'
sed 's/^X//' << 'SHAR_EOF' >> 'kterm-4.1.2/charproc.c' &&
X screen->gsets[1] = GSET_KANA;
X screen->gsets[2] = GSET_ASCII;
# endif /* KTERM_KANJI */
X screen->gsets[3] = GSET_ASCII;
#else /* !KTERM */
X screen->gsets[0] = 'B';
X screen->gsets[1] = 'B';
X screen->gsets[2] = 'B';
X screen->gsets[3] = 'B';
#endif /* !KTERM */
X screen->curgl = 0;
#ifdef KTERM
X screen->curgr = 1;
#else /* !KTERM */
X screen->curgr = 2;
#endif /* !KTERM */
X screen->curss = 0;
X ClearScreen(screen);
#ifdef STATUSLINE
X EraseStatus();
#endif /* STATUSLINE */
X screen->cursor_state = OFF;
X if (term->flags & REVERSE_VIDEO)
X ReverseVideo(term);
X
X term->flags = term->initflags;
X if(screen->c132 && (term->flags & IN132COLUMNS)) {
X Dimension junk;
X XtMakeResizeRequest(
X (Widget) term,
X (Dimension) 80*FontWidth(screen)
X + 2 * screen->border + screen->scrollbar,
#ifdef STATUSLINE
X (Dimension) screen->statusheight +
#endif /* STATUSLINE */
X (Dimension) FontHeight(screen)
X * (screen->max_row + 1) + 2 * screen->border,
X &junk, &junk);
X XSync(screen->display, FALSE); /* synchronize */
X if(QLength(screen->display) > 0)
X xevents();
X }
X CursorSet(screen, 0, 0, term->flags);
X }
X longjmp(vtjmpbuf, 1); /* force ground state in parser */
}
X
X
#ifdef STATUSLINE
ToStatus(col)
int col;
{
X register TScreen *screen = &term->screen;
X
X if (screen->cursor_state)
X HideCursor();
X if (col > screen->max_col)
X col = screen->max_col;
X if (!screen->instatus) {
X if (!screen->statusline)
X ShowStatus();
X CursorSave(term, &screen->statussc);
X screen->instatus = TRUE;
X screen->cur_row = screen->max_row + 1;
X }
X screen->cur_col = col;
}
X
XFromStatus()
{
X register TScreen *screen = &term->screen;
X
X if (!screen->instatus)
X return;
X screen->instatus = FALSE;
X CursorRestore(term, &screen->statussc);
}
X
ShowStatus()
{
X register TScreen *screen = &term->screen;
X register int border = 2 * screen->border;
X
X if (screen->statusline)
X return;
X screen->statusline = 1;
X screen->statusheight = FontHeight(screen) + 2;
X ResizeScreen(term, border + screen->scrollbar, border);
}
X
HideStatus()
{
X register TScreen *screen = &term->screen;
X register int border = 2 * screen->border;
#ifndef KTERM
X register int i, j;
#endif /* !KTERM */
X
X if (!screen->statusline)
X return;
X if (screen->instatus)
X FromStatus();
X screen->statusline = 0;
X screen->statusheight = 0;
#ifdef KTERM
X bzero(screen->buf[screen->max_row + 1],
X sizeof(Bchr) * (screen->max_col+1));
#else /* !KTERM */
X bzero(screen->buf[i = 2 * (screen->max_row + 1)],
X j = screen->max_col + 1);
X bzero(screen->buf[i + 1], j);
#endif /* !KTERM */
X ResizeScreen(term, border + screen->scrollbar, border);
}
X
EraseStatus()
{
X register TScreen *screen = &term->screen;
X register int j, pix;
#ifdef KTERM
X int fnum = F_ISO8859_1; /* referd by normalGC and reverseGC */
#else /* !KTERM */
X register int i;
#endif /* !KTERM */
X
X if (!screen->statusline)
X return;
#ifdef KTERM
X bzero(screen->buf[screen->max_row + 1],
X j = sizeof(Bchr) * (screen->max_col+1));
#else /* !KTERM */
X bzero(screen->buf[i = 2 * (screen->max_row + 1)],
X j = screen->max_col + 1);
X bzero(screen->buf[i + 1], j) ;
#endif /* !KTERM */
X XFillRectangle(screen->display, TextWindow(screen),
X screen->reversestatus ? screen->normalGC : screen->reverseGC,
X screen->border - 1 + screen->scrollbar,
X (screen->max_row + 1) * FontHeight(screen) +
X screen->border,
X j * FontWidth(screen) + 2, screen->statusheight);
X if (!screen->reversestatus)
X StatusBox(screen);
}
X
StatusBox(screen)
register TScreen *screen;
{
#ifdef KTERM
X int fnum = F_ISO8859_1; /* referd by normalGC */
#endif /* KTERM */
X
X status_box[0].x = screen->scrollbar;
X status_box[0].y = (screen->max_row + 1) * FontHeight(screen) +
X screen->border;
X status_box[3].x = -(status_box[1].x = (screen->max_col + 1) *
X FontWidth(screen) + screen->border + 1);
X status_box[4].y = -(status_box[2].y = FontHeight(screen) + 1);
X XDrawLines(screen->display, TextWindow(screen), screen->normalGC,
X status_box, NBOX, CoordModePrevious);
}
#endif /* STATUSLINE */
X
X
/*
X * set_character_class - takes a string of the form
X *
X * low[-high]:val[,low[-high]:val[...]]
X *
X * and sets the indicated ranges to the indicated values.
X */
X
int set_character_class (s)
X register char *s;
{
X register int i; /* iterator, index into s */
X int len; /* length of s */
X int acc; /* accumulator */
X int low, high; /* bounds of range [0..127] */
X int base; /* 8, 10, 16 (octal, decimal, hex) */
X int numbers; /* count of numbers per range */
X int digits; /* count of digits in a number */
X static char *errfmt = "%s: %s in range string \"%s\" (position %d)\n";
X extern char *ProgramName;
X
X if (!s || !s[0]) return -1;
X
X base = 10; /* in case we ever add octal, hex */
X low = high = -1; /* out of range */
X
X for (i = 0, len = strlen (s), acc = 0, numbers = digits = 0;
X i < len; i++) {
X char c = s[i];
X
X if (isspace(c)) {
X continue;
X } else if (isdigit(c)) {
X acc = acc * base + (c - '0');
X digits++;
X continue;
X } else if (c == '-') {
X low = acc;
X acc = 0;
X if (digits == 0) {
X fprintf (stderr, errfmt, ProgramName, "missing number", s, i);
X return (-1);
X }
X digits = 0;
X numbers++;
X continue;
X } else if (c == ':') {
X if (numbers == 0)
X low = acc;
X else if (numbers == 1)
X high = acc;
X else {
X fprintf (stderr, errfmt, ProgramName, "too many numbers",
X s, i);
X return (-1);
X }
X digits = 0;
X numbers++;
X acc = 0;
X continue;
X } else if (c == ',') {
X /*
X * now, process it
X */
X
X if (high < 0) {
X high = low;
X numbers++;
X }
X if (numbers != 2) {
X fprintf (stderr, errfmt, ProgramName, "bad value number",
X s, i);
X } else if (SetCharacterClassRange (low, high, acc) != 0) {
X fprintf (stderr, errfmt, ProgramName, "bad range", s, i);
X }
X
X low = high = -1;
X acc = 0;
X digits = 0;
X numbers = 0;
X continue;
X } else {
X fprintf (stderr, errfmt, ProgramName, "bad character", s, i);
X return (-1);
X } /* end if else if ... else */
X
X }
X
X if (low < 0 && high < 0) return (0);
X
X /*
X * now, process it
X */
X
X if (high < 0) high = low;
X if (numbers < 1 || numbers > 2) {
X fprintf (stderr, errfmt, ProgramName, "bad value number", s, i);
X } else if (SetCharacterClassRange (low, high, acc) != 0) {
X fprintf (stderr, errfmt, ProgramName, "bad range", s, i);
X }
X
X return (0);
}
X
/* ARGSUSED */
static void HandleKeymapChange(w, event, params, param_count)
X Widget w;
X XEvent *event;
X String *params;
X Cardinal *param_count;
{
X static XtTranslations keymap, original;
X static XtResource resources[] = {
X { XtNtranslations, XtCTranslations, XtRTranslationTable,
X sizeof(XtTranslations), 0, XtRTranslationTable, (caddr_t)NULL}
X };
X char mapName[1000];
X char mapClass[1000];
X
X if (*param_count != 1) return;
X
X if (original == NULL) original = w->core.tm.translations;
X
X if (strcmp(params[0], "None") == 0) {
X XtOverrideTranslations(w, original);
X return;
X }
X (void) sprintf( mapName, "%sKeymap", params[0] );
X (void) strcpy( mapClass, mapName );
X if (islower(mapClass[0])) mapClass[0] = toupper(mapClass[0]);
X XtGetSubresources( w, &keymap, mapName, mapClass,
X resources, (Cardinal)1, NULL, (Cardinal)0 );
X if (keymap != NULL)
X XtOverrideTranslations(w, keymap);
}
X
X
/* ARGSUSED */
static void HandleBell(w, event, params, param_count)
X Widget w;
X XEvent *event; /* unused */
X String *params; /* [0] = volume */
X Cardinal *param_count; /* 0 or 1 */
{
X int percent = (*param_count) ? atoi(params[0]) : 0;
X
X XBell( XtDisplay(w), percent );
}
X
X
/* ARGSUSED */
static void HandleIgnore(w, event, params, param_count)
X Widget w;
X XEvent *event; /* unused */
X String *params; /* unused */
X Cardinal *param_count; /* unused */
{
X /* do nothing, but check for funny escape sequences */
X (void) SendMousePosition(w, event);
}
X
X
/* ARGSUSED */
void DoSetSelectedFont(w, client_data, selection, type, value, length, format)
X Widget w;
X XtPointer client_data;
X Atom *selection, *type;
X XtPointer value;
X unsigned long *length;
X int *format;
{
X char *val = (char *)value;
X int len;
X if (*type != XA_STRING || *format != 8) { Bell(); return; }
X len = strlen(value);
X if (len > 0) {
X if (val[len-1] == '\n') val[len-1] = '\0';
X if (!LoadNewFont (&term->screen, val, NULL, True,
X fontMenu_fontescape))
X Bell();
X }
}
X
void FindFontSelection (atom_name, justprobe)
X char *atom_name;
X Bool justprobe;
{
X static AtomPtr *atoms;
X static int atomCount = 0;
X AtomPtr *pAtom;
X int a;
X Atom target;
#ifdef KTERM
X int fnum = F_ISO8859_1;
#endif /* KTERM */
X
X if (!atom_name) atom_name = "PRIMARY";
X
X for (pAtom = atoms, a = atomCount; a; a--, pAtom++) {
X if (strcmp(atom_name, XmuNameOfAtom(*pAtom)) == 0) break;
X }
X if (!a) {
X atoms = (AtomPtr*) XtRealloc (atoms, sizeof(AtomPtr)*(atomCount+1));
X *(pAtom = &atoms[atomCount++]) = XmuMakeAtom(atom_name);
X }
X
X target = XmuInternAtom(XtDisplay(term), *pAtom);
X if (justprobe) {
X term->screen.menu_font_names[fontMenu_fontsel] =
X XGetSelectionOwner(XtDisplay(term), target) ? _Font_Selected_ : NULL;
X } else {
X XtGetSelectionValue(term, target, XA_STRING,
X DoSetSelectedFont, NULL,
X XtLastTimestampProcessed(XtDisplay(term)));
X }
X return;
}
X
X
/* ARGSUSED */
void HandleSetFont(w, event, params, param_count)
X Widget w;
X XEvent *event; /* unused */
X String *params; /* unused */
X Cardinal *param_count; /* unused */
{
X int fontnum;
X char *name1 = NULL, *name2 = NULL;
X
X if (*param_count == 0) {
X fontnum = fontMenu_fontdefault;
X } else {
X int maxparams = 1; /* total number of params allowed */
X
X switch (params[0][0]) {
X case 'd': case 'D': case '0':
X fontnum = fontMenu_fontdefault; break;
X case '1':
X fontnum = fontMenu_font1; break;
X case '2':
X fontnum = fontMenu_font2; break;
X case '3':
X fontnum = fontMenu_font3; break;
X case '4':
X fontnum = fontMenu_font4; break;
X case 'e': case 'E':
X fontnum = fontMenu_fontescape; maxparams = 3; break;
X case 's': case 'S':
X fontnum = fontMenu_fontsel; maxparams = 2; break;
X default:
X Bell();
X return;
X }
X if (*param_count > maxparams) { /* see if extra args given */
X Bell();
X return;
X }
X switch (*param_count) { /* assign 'em */
X case 3:
X name2 = params[2];
X /* fall through */
X case 2:
X name1 = params[1];
X break;
X }
X }
X
X SetVTFont (fontnum, True, name1, name2);
}
X
X
void SetVTFont (i, doresize, name1, name2)
X int i;
X Bool doresize;
X char *name1, *name2;
{
X TScreen *screen = &term->screen;
X
X if (i < 0 || i >= NMENUFONTS) {
X Bell();
X return;
X }
X if (i == fontMenu_fontsel) { /* go get the selection */
X FindFontSelection (name1, False); /* name1 = atom, name2 is ignored */
X return;
X }
#ifndef KTERM
X if (!name1) name1 = screen->menu_font_names[i];
#endif /* !KTERM */
X if (!LoadNewFont(screen, name1, name2, doresize, i)) {
X Bell();
X }
X return;
}
X
X
#ifdef KTERM
static char *search_font_matching(screen, fontpattern, fonttail)
TScreen *screen;
char *fontpattern;
char *fonttail;
{
X static char **fontnamelist;
X char *tmptail;
X int count, i;
X int fonttaillen;
X
X if (!fontpattern) return NULL;
X
X fonttaillen = strlen(fonttail);
X if (fontnamelist) {
X XFreeFontNames(fontnamelist);
X }
X fontnamelist = XListFonts(screen->display, fontpattern, 1000, &count);
X for (i = 0; i < count; i ++) {
X tmptail = fontnamelist[i]+strlen(fontnamelist[i])-fonttaillen;
X if (XmuCompareISOLatin1(fonttail, tmptail) == 0) {
X return fontnamelist[i];
X }
X }
X return NULL;
}
#endif /* KTERM */
X
#ifdef KTERM
int LoadNewFont (screen, nfontpat, bfontpat, doresize, fontnum)
X TScreen *screen;
X char *nfontpat, *bfontpat;
#else /* !KTERM */
int LoadNewFont (screen, nfontname, bfontname, doresize, fontnum)
X TScreen *screen;
X char *nfontname, *bfontname;
#endif /* !KTERM */
X Bool doresize;
X int fontnum;
{
X XFontStruct *nfs = NULL, *bfs = NULL;
X XGCValues xgcv;
X unsigned long mask;
X GC new_normalGC = NULL, new_normalboldGC = NULL;
X GC new_reverseGC = NULL, new_reverseboldGC = NULL;
X char *tmpname = NULL;
#ifdef KTERM
X char *tmpbname = NULL;
X XFontStruct *asciinfs = NULL;
X int fnum;
X char *nfontname, *bfontname;
X static char *fonttail[FCNT] = {
X "-iso8859-1",
X "-jisx0201.1976-0",
#ifdef KTERM_KANJI
X "-jisx0208.1983-0",
#endif /* KTERM_KANJI */
#ifdef KTERM_HANZI
X "-gb2312.1980-0",
#endif /* KTERM_HANZI */
#ifdef KTERM_HANGUL
X "-ksc5601.1987-0",
#endif /* KTERM_HANGUL */
X };
#endif /* KTERM */
X
#ifdef KTERM
X for (fnum = F_ISO8859_1; fnum < FCNT; fnum ++) {
X
X nfontname = search_font_matching(screen, nfontpat, fonttail[fnum]);
X
X if (!nfontname) {
X switch(term->misc.lang[0]) {
#ifdef KTERM_HANZI
X case 'c': case 'C':
X if ((F_ISO8859_1 < fnum && fnum < F_GB2312_0) ||
X fnum > F_GB2312_0)
X continue;
X break;
#endif /* KTERM_HANZI */
#ifdef KTERM_HANGUL
X case 'k': case 'K':
X if ((F_ISO8859_1 < fnum && fnum < F_KSC5601_0) ||
X fnum > F_KSC5601_0)
X continue;
X break;
#endif /* KTERM_HANGUL */
X default:
X if (fnum > F_JISX0208_0)
X continue;
X break;
X }
X nfontname = screen->menu_font_names[fontnum];
X }
X
X if (!(nfontname && (nfs = XLoadQueryFont (screen->display, nfontname)))) {
/**
fprintf (stderr, "n%d: failed to load \"%s\"\n", fnum, nfontname);
**/
X nfontname = search_font_matching(screen,
X screen->menu_font_list[fontnum], fonttail[fnum]);
X if (!(nfontname &&
X (nfs = XLoadQueryFont (screen->display, nfontname)))) {
/**
fprintf (stderr, "n%d: failed to load \"%s\"\n", fnum, nfontname);
**/
X if (fnum > F_ISO8859_1) {
X nfs = asciinfs;
X } else goto bad;
X }
X }
X if (fnum == F_ISO8859_1) asciinfs = nfs;
/**
fprintf (stderr, "n%d: loaded \"%s\"\n", fnum, nfontname);
**/
X
X if (nfontname && fontnum == fontMenu_fontescape &&
X nfontname != screen->menu_font_names[fontnum]) {
X tmpname = (char *) malloc (strlen(nfontname) + 1);
X if (!tmpname) return 0;
X strcpy (tmpname, nfontname);
X }
#else /* !KTERM */
X if (!nfontname) return 0;
X
X if (fontnum == fontMenu_fontescape &&
X nfontname != screen->menu_font_names[fontnum]) {
X tmpname = (char *) malloc (strlen(nfontname) + 1);
X if (!tmpname) return 0;
X strcpy (tmpname, nfontname);
X }
X
X if (!(nfs = XLoadQueryFont (screen->display, nfontname))) goto bad;
#endif /* !KTERM */
X
#ifdef KTERM
X bfontname = search_font_matching(screen, bfontpat, fonttail[fnum]);
X if (!bfontname) bfontname = screen->menu_bfont_names[fontnum];
X
X if (!(bfontname && (bfs = XLoadQueryFont (screen->display, bfontname)))) {
/**
fprintf (stderr, "b%d: failed to load \"%s\"\n", fnum, bfontname);
**/
X bfontname = search_font_matching(screen,
X screen->menu_bfont_list[fontnum], fonttail[fnum]);
X if (!(bfontname &&
X (bfs = XLoadQueryFont (screen->display, bfontname)))) {
/**
fprintf (stderr, "b%d: failed to load \"%s\"\n", fnum, bfontname);
**/
X bfs = nfs;
X }
/**
else fprintf (stderr, "b%d: loaded \"%s\"\n", fnum, bfontname);
**/
X }
/**
else fprintf (stderr, "b%d: loaded \"%s\"\n", fnum, bfontname);
**/
X
X if (bfontname && fontnum == fontMenu_fontescape &&
X bfontname != screen->menu_bfont_names[fontnum]) {
X tmpbname = (char *) malloc (strlen(bfontname) + 1);
X if (!tmpbname) return 0;
X strcpy (tmpbname, bfontname);
X }
#else /* !KTERM */
X if (!(bfontname &&
X (bfs = XLoadQueryFont (screen->display, bfontname))))
X bfs = nfs;
#endif /* !KTERM */
X
X mask = (GCFont | GCForeground | GCBackground | GCGraphicsExposures |
X GCFunction);
X
X xgcv.font = nfs->fid;
X xgcv.foreground = screen->foreground;
X xgcv.background = term->core.background_pixel;
X xgcv.graphics_exposures = TRUE; /* default */
X xgcv.function = GXcopy;
X
X new_normalGC = XtGetGC((Widget)term, mask, &xgcv);
X if (!new_normalGC) goto bad;
X
X if (nfs == bfs) { /* there is no bold font */
X new_normalboldGC = new_normalGC;
X } else {
X xgcv.font = bfs->fid;
X new_normalboldGC = XtGetGC((Widget)term, mask, &xgcv);
X if (!new_normalboldGC) goto bad;
X }
X
X xgcv.font = nfs->fid;
X xgcv.foreground = term->core.background_pixel;
X xgcv.background = screen->foreground;
X new_reverseGC = XtGetGC((Widget)term, mask, &xgcv);
X if (!new_reverseGC) goto bad;
X
X if (nfs == bfs) { /* there is no bold font */
X new_reverseboldGC = new_reverseGC;
X } else {
X xgcv.font = bfs->fid;
X new_reverseboldGC = XtGetGC((Widget)term, mask, &xgcv);
X if (!new_reverseboldGC) goto bad;
X }
X
X XtReleaseGC ((Widget) term, screen->normalGC);
X if (screen->normalGC != screen->normalboldGC)
X XtReleaseGC ((Widget) term, screen->normalboldGC);
X XtReleaseGC ((Widget) term, screen->reverseGC);
X if (screen->reverseGC != screen->reverseboldGC)
X XtReleaseGC ((Widget) term, screen->reverseboldGC);
X screen->normalGC = new_normalGC;
X screen->normalboldGC = new_normalboldGC;
X screen->reverseGC = new_reverseGC;
X screen->reverseboldGC = new_reverseboldGC;
X screen->fnt_norm = nfs;
X screen->fnt_bold = bfs;
X screen->fnt_bold = screen->fnt_norm;
X screen->enbolden = (nfs == bfs);
X set_menu_font (False);
X screen->menu_font_number = fontnum;
X set_menu_font (True);
X if (tmpname) { /* if setting escape or sel */
X if (screen->menu_font_names[fontnum])
X free (screen->menu_font_names[fontnum]);
X screen->menu_font_names[fontnum] = tmpname;
X if (fontnum == fontMenu_fontescape) {
X set_sensitivity (term->screen.fontMenu,
X fontMenuEntries[fontMenu_fontescape].widget,
X TRUE);
X }
X }
#ifdef KTERM
X set_cursor_gcs (screen, fnum);
X }
#else /* !KTERM */
X set_cursor_gcs (screen);
#endif /* !KTERM */
X update_font_info (screen, doresize);
X return 1;
X
X bad:
X if (tmpname) free (tmpname);
X if (new_normalGC)
X XtReleaseGC ((Widget) term, screen->normalGC);
X if (new_normalGC && new_normalGC != new_normalboldGC)
X XtReleaseGC ((Widget) term, new_normalboldGC);
X if (new_reverseGC)
X XtReleaseGC ((Widget) term, new_reverseGC);
X if (new_reverseGC && new_reverseGC != new_reverseboldGC)
X XtReleaseGC ((Widget) term, new_reverseboldGC);
X if (nfs) XFreeFont (screen->display, nfs);
X if (nfs && nfs != bfs) XFreeFont (screen->display, bfs);
X return 0;
}
X
X
update_font_info (screen, doresize)
X TScreen *screen;
X Bool doresize;
{
X int i, j, width, height, scrollbar_width;
#ifdef KTERM
X int fnum;
X int max_ascent = 0, max_descent = 0, max_width = 0;
X
X for (fnum = F_ISO8859_1; fnum < FCNT; fnum ++) {
X if (screen->_fnt_norm[fnum]) {
#ifdef KTERM_KANJI
X if (screen->_fnt_norm[fnum]->max_byte1 > 0) { /* MB font */
X if (max_width < screen->_fnt_norm[fnum]->max_bounds.width/2) {
X max_width = screen->_fnt_norm[fnum]->max_bounds.width/2;
X }
X } else
#endif /* KTERM_KANJI */
X if (max_width < screen->_fnt_norm[fnum]->max_bounds.width) {
X max_width = screen->_fnt_norm[fnum]->max_bounds.width;
X }
X }
X }
X screen->fullVwin.f_width = max_width;
X for (fnum = F_ISO8859_1; fnum < FCNT; fnum ++) {
X if (screen->_fnt_norm[fnum]) {
X if (max_ascent < screen->_fnt_norm[fnum]->ascent) {
X max_ascent = screen->_fnt_norm[fnum]->ascent;
X }
X if (max_descent < screen->_fnt_norm[fnum]->descent) {
X max_descent = screen->_fnt_norm[fnum]->descent;
X }
X }
X }
X screen->max_ascent = max_ascent;
X screen->max_descent = max_descent;
X screen->fullVwin.f_height = max_ascent + max_descent;
#else /* !KTERM */
X
X screen->fullVwin.f_width = screen->fnt_norm->max_bounds.width;
X screen->fullVwin.f_height = (screen->fnt_norm->ascent +
X screen->fnt_norm->descent);
#endif /* !KTERM */
X scrollbar_width = (term->misc.scrollbar ?
X screen->scrollWidget->core.width : 0);
X i = 2 * screen->border + scrollbar_width;
X j = 2 * screen->border;
#ifdef STATUSLINE
X if (screen->statusline)
#ifdef KTERM
X j += (screen->statusheight = FontHeight(screen) + 2);
#else /* !KTERM */
X j += (screen->statusheight = screen->fullVwin.f_height + 2);
#endif /* !KTERM */
#endif /* STATUSLINE */
#ifdef KTERM
X width = (screen->max_col + 1) * FontWidth(screen) + i;
X height = (screen->max_row + 1) * FontHeight(screen) + j;
#else /* !KTERM */
X width = (screen->max_col + 1) * screen->fullVwin.f_width + i;
X height = (screen->max_row + 1) * screen->fullVwin.f_height + j;
#endif /* !KTERM */
X screen->fullVwin.fullwidth = width;
X screen->fullVwin.fullheight = height;
X screen->fullVwin.width = width - i;
X screen->fullVwin.height = height - j;
X
X if (doresize) {
X if (VWindow(screen)) {
X XClearWindow (screen->display, VWindow(screen));
X }
X DoResizeScreen (term); /* set to the new natural size */
X if (screen->scrollWidget)
X ResizeScrollBar (screen->scrollWidget, -1, -1,
X Height(screen) + screen->border * 2);
X Redraw ();
X }
X set_vt_box (screen);
}
X
set_vt_box (screen)
X TScreen *screen;
{
X XPoint *vp;
X
#ifdef KTERM
X vp = &VTbox[1];
X (vp++)->x = FontWidth(screen) - 1;
X (vp++)->y = screen->fullVwin.f_height - 1;
X (vp++)->x = -(FontWidth(screen) - 1);
X vp->y = -(screen->fullVwin.f_height - 1);
X screen->_box[F_ISO8859_1] = VTbox;
X screen->_box[F_JISX0201_0] = VTbox;
# ifdef KTERM_KANJI
X vp = &VTwbox[1];
X (vp++)->x = FontWidth(screen) * 2 - 1;
X (vp++)->y = screen->fullVwin.f_height - 1;
X (vp++)->x = -(FontWidth(screen) * 2 - 1);
X vp->y = -(screen->fullVwin.f_height - 1);
X switch(term->misc.lang[0]) {
#ifdef KTERM_HANZI
X case 'c': case 'C':
X screen->_box[F_GB2312_0] = VTwbox;
X break;
#endif /* KTERM_HANZI */
#ifdef KTERM_HANGUL
X case 'k': case 'K':
X screen->_box[F_KSC5601_0] = VTwbox;
X break;
#endif /* KTERM_HANGUL */
X default:
X screen->_box[F_JISX0208_0] = VTwbox;
X break;
X }
# endif /* KTERM_KANJI */
#else /* !KTERM */
X vp = &VTbox[1];
X (vp++)->x = FontWidth(screen) - 1;
X (vp++)->y = FontHeight(screen) - 1;
X (vp++)->x = -(FontWidth(screen) - 1);
X vp->y = -(FontHeight(screen) - 1);
X screen->box = VTbox;
#endif /* !KTERM */
}
X
X
#ifdef KTERM
set_cursor_gcs (screen, fnum)
X int fnum;
#else /* !KTERM */
set_cursor_gcs (screen)
#endif /* !KTERM */
X TScreen *screen;
{
X XGCValues xgcv;
X unsigned long mask;
X unsigned long cc = screen->cursorcolor;
X unsigned long fg = screen->foreground;
X unsigned long bg = term->core.background_pixel;
X GC new_cursorGC = NULL, new_reversecursorGC = NULL;
X GC new_cursoroutlineGC = NULL;
X
X /*
X * Let's see, there are three things that have "color":
X *
X * background
X * text
X * cursorblock
X *
X * And, there are four situation when drawing a cursor, if we decide
X * that we like have a solid block of cursor color with the letter
X * that it is highlighting shown in the background color to make it
X * stand out:
X *
X * selected window, normal video - background on cursor
X * selected window, reverse video - foreground on cursor
X * unselected window, normal video - foreground on background
X * unselected window, reverse video - background on foreground
X *
X * Since the last two are really just normalGC and reverseGC, we only
X * need two new GC's. Under monochrome, we get the same effect as
X * above by setting cursor color to foreground.
X */
X
X xgcv.font = screen->fnt_norm->fid;
X mask = (GCForeground | GCBackground | GCFont);
X if (cc != fg && cc != bg) {
X /* we have a colored cursor */
X xgcv.foreground = fg;
X xgcv.background = cc;
X new_cursorGC = XtGetGC ((Widget) term, mask, &xgcv);
X
X if (screen->always_highlight) {
X new_reversecursorGC = (GC) 0;
X new_cursoroutlineGC = (GC) 0;
X } else {
X xgcv.foreground = bg;
X xgcv.background = cc;
X new_reversecursorGC = XtGetGC ((Widget) term, mask, &xgcv);
X xgcv.foreground = cc;
X xgcv.background = bg;
X new_cursoroutlineGC = XtGetGC ((Widget) term, mask, &xgcv);
X }
X } else {
X new_cursorGC = (GC) 0;
X new_reversecursorGC = (GC) 0;
X new_cursoroutlineGC = (GC) 0;
X }
X if (screen->cursorGC) XtReleaseGC (term, screen->cursorGC);
X if (screen->reversecursorGC) XtReleaseGC (term, screen->reversecursorGC);
X if (screen->cursoroutlineGC) XtReleaseGC (term, screen->cursoroutlineGC);
X screen->cursorGC = new_cursorGC;
X screen->reversecursorGC = new_reversecursorGC;
X screen->cursoroutlineGC = new_cursoroutlineGC;
}
SHAR_EOF
echo 'File kterm-4.1.2/charproc.c is complete' &&
chmod 0664 kterm-4.1.2/charproc.c ||
echo 'restore of kterm-4.1.2/charproc.c failed'
Wc_c="`wc -c < 'kterm-4.1.2/charproc.c'`"
test 139105 -eq "$Wc_c" ||
echo 'kterm-4.1.2/charproc.c: original size 139105, current size' "$Wc_c"
rm -f _shar_wnt_.tmp
fi
# ============= kterm-4.1.2/colortest ==============
if test -f 'kterm-4.1.2/colortest' -a X"$1" != X"-c"; then
echo 'x - skipping kterm-4.1.2/colortest (File already exists)'
rm -f _shar_wnt_.tmp
else
> _shar_wnt_.tmp
echo 'x - extracting kterm-4.1.2/colortest (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'kterm-4.1.2/colortest' &&
#!/bin/sh
X
for f in 0 4 1 5 2 6 3 7
do
X echo '[3'${f}'m $@%+%i!<%F%-%9%HBP1~$N(J [4'${f}'m kterm [3'${f}'m $@$G$9!#(J("^[[X'${f}'m")'
done
echo "[0m"
Xexit 0
SHAR_EOF
chmod 0775 kterm-4.1.2/colortest ||
echo 'restore of kterm-4.1.2/colortest failed'
Wc_c="`wc -c < 'kterm-4.1.2/colortest'`"
test 166 -eq "$Wc_c" ||
echo 'kterm-4.1.2/colortest: original size 166, current size' "$Wc_c"
rm -f _shar_wnt_.tmp
fi
# ============= kterm-4.1.2/convert.c ==============
if test -f 'kterm-4.1.2/convert.c' -a X"$1" != X"-c"; then
echo 'x - skipping kterm-4.1.2/convert.c (File already exists)'
rm -f _shar_wnt_.tmp
else
> _shar_wnt_.tmp
echo 'x - extracting kterm-4.1.2/convert.c (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'kterm-4.1.2/convert.c' &&
/*
X * convert.c -- code converters for kterm
X * $Kagotani: /usr/src.yoshi/X/KTerm/4.1.0/RCS/convert.c,v 1.1 90/06/27 09:38:46 kagotani Rel $
X *
X * $Header: /usr/local/src/X11/contrib/clients/kterm-4.1.2/RCS/convert.c,v 1.5 1991/03/15 09:28:40 mleisher Exp $
X */
X
/*
X * Modified for Hanzi support:
X * Mark Leisher mleisher@nmsu.edu Fri Nov 9 09:22:33 1990
X */
X
/*
X * Copyright (c) 1989 Software Research Associates, Inc.
X *
X * Permission to use, copy, modify, and distribute this software and its
X * documentation for any purpose and without fee is hereby granted, provided
X * that the above copyright notice appear in all copies and that both that
X * copyright notice and this permission notice appear in supporting
X * documentation, and that the name of Software Research Associates not be
X * used in advertising or publicity pertaining to distribution of the
X * software without specific, written prior permission. Software Research
X * Associates makes no representations about the suitability of this software
X * for any purpose. It is provided "as is" without express or implied
X * warranty.
X *
X * Author: Makoto Ishisone, Software Research Associates, Inc., Japan
X */
#include <stdio.h>
#include "kterm.h"
X
#ifdef KTERM_HANZI
#include "hzutil.h"
#endif /* KTERM HANZI */
X
#ifdef KTERM_HANGUL
#include "hgutil.h"
#endif /* KTERM_HANGUL */
X
#ifdef KTERM
X
#define NULL 0
#define SS2 0x8E
#define CSI 0x9B
X
#ifdef KTERM_HANZI
X
Ichr *
convNSHzToGB(hz, from)
Ichr *hz;
int from;
{
X Ichr *ptr;
X int i, j, len = 0;
X unsigned char c1, c2, oc1, oc2, gs1, gs2;
X
X i = 0;
X while(hz[i++].code) len++;
X ptr = (Ichr *)XtMalloc((len + 1) * sizeof(Ichr));
X
X i = j = 0;
X while(i < len) {
X gs1 = hz[i].gset;
X c1 = hz[i].code;
X if (gs1 != GSET_HANZI) {
X ptr[j].gset = gs1;
X ptr[j++].code = c1;
X } else {
X i++;
X gs2 = hz[i].gset;
X c2 = hz[i].code;
X hzconvert(from, c1, c2, &oc1, &oc2);
X ptr[j].gset = gs1;
X ptr[j++].code = oc1;
X ptr[j].gset = gs2;
X ptr[j++].code = oc2;
X }
X i++;
X }
X ptr[j].gset = 0;
X ptr[j].code = '\0';
X return(ptr);
}
X
/* CS -> GUOBIAO */
static int
CStoGB(cs_p, gs_p)
Ichr **cs_p;
unsigned char **gs_p;
{
X int c1, c2;
X Ichr *cs = *cs_p;
X unsigned char *gs = *gs_p;
X
X if (cs->gset == GSET_HANZI) {
X c1 = cs++->code;
X c2 = cs++->code;
X if (gs) {
X *gs++ = c1 | 0x80;
X *gs++ = c2 | 0x80;
X }
X *gs_p = gs;
X *cs_p = cs;
X return(2);
X }
X return(0);
}
X
/* CS -> SGB */
static int
CStoSGB(cs_p, sgs_p)
Ichr **cs_p;
unsigned char **sgs_p;
{
X int c1, c2;
X Ichr *cs = *cs_p;
X unsigned char *sgs = *sgs_p;
X unsigned char oc1, oc2;
X
X if (cs->gset == GSET_HANZI) {
X c1 = cs++->code;
X c2 = cs++->code;
X if (sgs) {
X hzconvert(GBtoSGB, c1, c2, &oc1, &oc2);
X *sgs++ = oc1 | 0x80;
X *sgs++ = oc2 | 0x80;
X }
X *sgs_p = sgs;
X *cs_p = cs;
X return(2);
X }
X return(0);
}
X
/* CS -> BIG5 */
static int
CStoBIG5(cs_p, bs_p)
Ichr **cs_p;
unsigned char **bs_p;
{
X int c1, c2;
X Ichr *cs = *cs_p;
X unsigned char *bs = *bs_p;
X unsigned char ch1, ch2, och1, och2;
X
X if (cs->gset == GSET_HANZI) {
X c1 = cs++->code;
X c2 = cs++->code;
X if (bs) {
X ch1 = c1 | 0x80;
X ch2 = c2 | 0x80;
X hzconvert(GBtoBIG, ch1, ch2, &och1, &och2);
X *bs++ = och1;
X *bs++ = och2;
X }
X *bs_p = bs;
X *cs_p = cs;
X return(2);
X }
X return(0);
}
X
/* CS -> GUOBIAO using ESC-$-A */
int
convCStoGB(cs, gs)
Ichr *cs;
unsigned char *gs;
{
X return convCStoANY(cs, gs, CStoGB);
}
X
/* CS -> SGB using ESC-$-A */
int
convCStoSGB(cs, sgs)
Ichr *cs;
unsigned char *sgs;
{
X return convCStoANY(cs, sgs, CStoSGB);
}
X
/* CS -> BIG5 using ESC-$-A */
int
convCStoBIG5(cs, bs)
Ichr *cs;
unsigned char *bs;
{
X return convCStoANY(cs, bs, CStoBIG5);
}
#endif /* KTERM_HANZI */
X
#ifdef KTERM_HANGUL
/* CS -> KS */
static int
CStoKS(cs_p, ks_p)
Ichr **cs_p;
unsigned char **ks_p;
{
X int c1, c2;
X Ichr *cs = *cs_p;
X unsigned char *ks = *ks_p;
X
X if (cs->gset == GSET_HANGUL) {
X c1 = cs++->code;
X c2 = cs++->code;
X if (ks) {
X *ks++ = c1 | 0x80;
X *ks++ = c2 | 0x80;
X }
X *ks_p = ks;
X *cs_p = cs;
X return(2);
X }
X return(0);
}
X
/* CS -> KS using ESC-$-C */
int
convCStoKS(cs, ks)
Ichr *cs;
unsigned char *ks;
{
X return convCStoANY(cs, ks, CStoKS);
}
#endif /* KTERM_HANGUL */
X
X
/* CS -> JIS using ESC-$-B */
int
convCStoJIS(cs, js)
Ichr *cs;
unsigned char *js;
{
X return convCStoANY(cs, js, NULL);
}
X
/* CS -> EUC */
static int
CStoEUC(cs_p, es_p)
Ichr **cs_p;
unsigned char **es_p;
{
X int c1, c2;
X Ichr *cs = *cs_p;
X unsigned char *es = *es_p;
X if (cs->gset == GSET_KANA) {
X c1 = cs++->code;
X if (es) {
X *es++ = SS2;
X *es++ = c1 | 0x80;
X }
X *es_p = es;
X *cs_p = cs;
X return 2;
X } else if (cs->gset == GSET_KANJI
X || cs->gset == GSET_OLDKANJI) {
X c1 = cs++->code;
X c2 = cs++->code;
X if (es) {
X *es++ = c1 | 0x80;
X *es++ = c2 | 0x80;
X }
X *es_p = es;
X *cs_p = cs;
X return 2;
X }
X return 0;
}
X
int
convCStoEUC(cs, es)
Ichr *cs;
unsigned char *es;
{
X return convCStoANY(cs, es, CStoEUC);
}
X
/* CS -> SJIS */
static int
CStoSJIS(cs_p, ss_p)
Ichr **cs_p;
unsigned char **ss_p;
{
X int c1, c2;
X Ichr *cs = *cs_p;
X unsigned char *ss = *ss_p;
X if (cs->gset == GSET_KANA) {
X c1 = cs++->code;
X if (ss) {
X *ss++ = c1 | 0x80;
X }
X *ss_p = ss;
X *cs_p = cs;
X return 1;
X } else if (cs->gset == GSET_KANJI || cs->gset == GSET_OLDKANJI) {
X c1 = cs++->code;
X c2 = cs++->code;
X if (ss) {
X *ss++ = (c1 - 0x21) / 2 + ((c1 <= 0x5e) ? 0x81 : 0xc1);
X if (c1 & 1) /* odd */
X *ss++ = c2 + ((c2 <= 0x5f) ? 0x1f : 0x20);
X else
X *ss++ = c2 + 0x7e;
X }
X *ss_p = ss;
X *cs_p = cs;
X return 2;
X }
X return 0;
}
X
int
convCStoSJIS(cs, ss)
Ichr *cs;
unsigned char *ss;
{
X return convCStoANY(cs, ss, CStoSJIS);
}
X
/* CS -> any */
int
convCStoANY(cs, as, func)
Ichr *cs;
unsigned char *as;
int (*func)();
{
X register int c1, c2;
X register int gset = GSET_ASCII;
X register int n = 0, m;
X
X while (c1 = cs->code) {
X if (func && (m = (*func)(&cs, &as))) {
X n += m;
X continue;
X }
X if (gset != cs->gset) {
X if (gset & CS96 && !(cs->gset & CS96)) {
X if (as)
X *as++ = '\025'; /* SI */
X n++;
X } else if (!(gset & CS96) && cs->gset & CS96) {
X if (as)
X *as++ = '\024'; /* SO */
X n++;
X }
X /*
X * A HACK FOR JISROMAN
X */
X if (cs->gset == GSET_ASCII
X || cs->gset == GSET_JISROMAN) {
X if (gset != GSET_ASCII
X && gset != GSET_JISROMAN) {
X if (as) {
X *as++ = '\033';
X *as++ = '(';
X *as++ = TESG(cs->gset);
X }
X n += 3;
X }
X } else if (cs->gset == GSET_KANJI
X /*
X * if (cs->gset == GSET_KANJI
X */
X || cs->gset == GSET_OLDKANJI) {
X if (as) {
X *as++ = '\033';
X *as++ = '$';
X *as++ = TESG(cs->gset);
X }
X n += 3;
X } else {
X if (as) {
X *as++ = '\033';
X if (cs->gset & MBCS) {
X *as++ = '$';
X }
X if (cs->gset & CS96) {
X *as++ = '-';
X } else {
X *as++ = '(';
X }
X *as++ = TESG(cs->gset);
X }
X n += 3;
X if (cs->gset & MBCS)
X n ++;
X }
X gset = cs->gset;
X }
X cs++;
X if (gset & MBCS) {
X c2 = cs++->code;
X if (as) {
X *as++ = c1 & ~0x80;
X *as++ = c2 & ~0x80;
X }
X n += 2;
X } else {
X if (as)
X *as++ = c1 & ~0x80;
X n++;
X }
X }
X /*
X * A HACK FOR JISROMAN
X * if (gset != GSET_ASCII) {
X */
X if (gset != GSET_ASCII && gset != GSET_JISROMAN) {
X if (as) {
X *as++ = '\033';
X *as++ = '(';
X *as++ = 'B';
X }
X n += 3;
X }
X if (as)
X *as = '\0';
X
X return n;
}
X
/* CS -> ISO Latin-1 */
int
convCStoLatin1(cs, ls)
Ichr *cs;
unsigned char *ls;
{
X register int c;
X register int n = 0;
X
X if (ls) {
X while (c = cs->code) {
X if (cs++->gset == GSET_ASCII) {
X *ls++ = c & 0x7f;
X n++;
X }
X }
X *ls = '\0';
X } else {
X while (c = cs->code) {
X if (cs++->gset == GSET_ASCII) {
X n++;
X }
X }
X }
X return n;
}
X
/******************************************************************************
COMPOUND_TEXT Summary
X (based on Comopund Text Encoding Version 1 -- MIT X Consortium Standard)
(1) Only G0 and G1 are used. G2 and G3 are not.
(2) G0 is invoked into GL and G1 into GR. These invocation are not changed.
X (In other words, Locking Shift and Single Shift are not used)
(3) In initial state, ISO Latin-1 is designated into G0/G1.
(4) To designate MBCS into G0, ESC-$-F is not used but ESC-$-(-F.
(5) In C0, only HT, NL, and ESC are used.
(6) In C1, only CSI is used.
(7) Text direction can be indecated.
X begin left-to-right string
X begin right-to-left string
X end of string
******************************************************************************/
X
/* convCStoCT -- Wide Character String -> COMPOUND_TEXT */
int
convCStoCT(cs, as)
register Ichr *cs;
register unsigned char *as;
/* Convert Wide Character String cs to COMPOUND_TEXT xstr, return
X * length of xstr in bytes (not including the terminating null character).
X * If xstr is NULL, no conversion is done, but return length of xstr.
X */
{
X register int c1, c2;
X register int g0 = GSET_ASCII;
X register int g1 = GSET_LATIN1R;
X register int n = 0;
X
X while (c1 = cs->code) {
X if (cs->gset & CS96
X || cs->gset & MBCS
X || cs->gset == GSET_KANA) {
X if (g1 != cs->gset) {
X g1 = cs->gset;
X if (as) {
X *as++ = '\033';
X if (g1 & MBCS) {
X *as++ = '$';
X }
X if (g1 & CS96) {
X *as++ = '-';
X } else {
X *as++ = ')';
X }
X *as++ = TESG(g1);
X }
X n += 3;
X if (g1 & MBCS)
X n ++;
X }
X cs++;
X if (g1 & MBCS) {
X c2 = cs++->code;
X if (as) {
X *as++ = c1 | 0x80;
X *as++ = c2 | 0x80;
X }
X n += 2;
X } else {
X if (as)
X *as++ = c1 | 0x80;
X n++;
X }
X } else {
X if (g0 != cs->gset) {
X g0 = cs->gset;
X if (as) {
X *as++ = '\033';
X *as++ = '(';
X *as++ = TESG(g0);
X }
X n += 3;
X }
X cs++;
X if (as)
X *as++ = c1 & ~0x80;
X n++;
X }
X }
X if (g0 != GSET_ASCII) {
X if (as) {
X *as++ = '\033';
X *as++ = '(';
X *as++ = 'B';
X }
X n += 3;
X }
X if (as)
X *as = '\0';
X
X return n;
}
X
static unsigned char *
getesc(str, len)
unsigned char *str;
int len;
{
X register int c;
X
X /* Find intermediate characters and final character
X * following the escape character in an escape sequence.
X */
X /* The intermediate character is 02/00 to 02/15 */
X while (len > 0) {
X c = *str;
X if (c < 0x20 || 0x2f < c)
X break;
X len--, str++;
X }
X /* The final character is 03/00 to 07/14 */
X if (--len < 0 || (c = *str++) < 0x30 || 0x7e < c)
X return (unsigned char *)NULL;
X
X return str;
}
X
static unsigned char *
getcsi(str, len)
unsigned char *str;
int len;
{
X register int c;
X
X /* Find parameter characters, intermediate characters
X * and final character following the CSI character
X * in a CSI sequence.
X */
X /* The parameter characters is 03/00 to 03/15 */
X while (len > 0) {
X c = *str;
X if (c < 0x30 || 0x3f < c)
X break;
X len--, str++;
X }
X /* The intermediate character is 02/00 to 02/15 */
X while (len > 0) {
X c = *str;
X if (c < 0x20 || 0x2f < c)
X break;
X len--, str++;
X }
X /* The final character is 04/00 to 07/14 */
X if (--len < 0 || (c = *str++) < 0x40 || 0x7e < c)
X return (unsigned char *)NULL;
X
X return str;
}
X
/* convCTtoCS -- COMPOUND_TEXT -> Wide Character String */
int
convCTtoCS(xstr, len, cs)
register unsigned char *xstr;
int len;
Ichr *cs;
/* Convert COMPOUND_TEXT xstr to Wide Character String cs, return
X * length of cs in characters (not including the terminating null character).
X * If cs is NULL, no conversion is done, but return length of cs.
X */
{
X register int c;
X int nskip;
X int n = 0;
X int g0, g1, gs;
X unsigned char *xstr1;
X
X /*
X * Compound Text can include null octet. Therefore the length
X * of xstr is able to be specified by parameter len.
X * But if len is zero or negative, get length by strlen() assuming
X * that no null octet exists.
X */
X if (len <= 0) {
X len = strlen((char *)xstr);
X }
X
X /* In initial state, ISO 8859/1 is designated into G0/G1 */
X g0 = GSET_ASCII; /* ASCII -> G0 */
X g1 = GSET_LATIN1R; /* Latin/1 right hand part -> G1 */
X
X while (len-- > 0) {
X switch (c = *xstr++) {
X case '\n': /* NEWLINE */
X case '\t': /* TAB */
X if (cs) {
X cs->code = c;
X cs->gset = g0;
X cs++;
X }
X n++;
X break;
X case 0x9b: /* CSI */
X /*
X * CSI sequence is generally in following form:
X * CSI {P} {I} F
X * P : 03/00 to 03/15
X * I : 02/00 to 02/15
X * F : 04/00 to 07/14
X */
X /*
X * Currently only directionality is definde
X * as following:
X * CSI-1-] begin left-to-right text
X * CSI-2-] begin right-to-left text
X * CSI-] end of string
X * But this implementation ignores them.
X */
X xstr1 = getcsi(xstr, len);
X if (xstr1 == NULL)
X return -1;
X len -= xstr1 - xstr;
X xstr = xstr1;
X break;
X case '\033': /* ESC */
X /*
X * ESC sequence is generally in following form:
X * ESC {I} F
X * I : 02/00 to 02/15
X * F : 03/00 to 07/14
X */
X /*
X * Currently, following functions are defined:
X * Standard character set
X * ESC-(-F
X * ESC-$-(-F
X * ESC-)-F
X * ESC---F
X * ESC-$-)-F
X * Non standard character set
X * ESC-%-/-[0123]
X * Standard character set must be accepted correctly.
X * Non standard one is ignored but must be parsed
X * for skipping data.
X */
X xstr1 = getesc(xstr, len);
X if (xstr1 == NULL)
X return -1;
X len -= xstr1 - xstr;
X switch (xstr1 - xstr) {
X case 2: /* ESC - I - F */
X switch (*xstr++) {
X case '(': /* 94chars CS -> G0 */
X g0 = GSET(*xstr);
X break;
X case ')': /* 94chars CS -> G1 */
X g1 = GSET(*xstr);
X break;
X case '-': /* 96chars CS -> G1 */
X g1 = GSET(*xstr) | CS96;
X break;
X default: /* ignore */
X break;
X }
X break;
X case 3: /* ESC - I - I - F */
X switch (*xstr++) {
X case '$':
X switch (*xstr++) {
X case '(': /* 94chars MBCS -> G0 */
X g0 = GSET(*xstr) | MBCS;
X break;
X case ')': /* 94chars MBCS -> G1 */
X g1 = GSET(*xstr) | MBCS;
X break;
X case '-': /* 96chars MBCS -> G1 */
X g1 = GSET(*xstr) | CS96 | MBCS;
X break;
X default: /* ignore */
X break;
X }
X break;
X case '%':
X if (*xstr++ != '/') {
X /* unknown sequence */
X break;
X }
X /*
X * Private encoding is ignored.
X * But following data must be skipped.
X * ESC-%-/-F-M-L
X */
X len -= 2;
X if (len < 0)
X return -1;
X nskip = (*xstr1 & 0x7f) * 128 +
X (*(xstr1 + 1) & 0x7f);
X if ((len -= nskip) < 0)
X return -1;
X xstr1 += nskip + 2;
X break;
X default:
X break;
X }
X break;
X default:
X break;
X }
X xstr = xstr1;
X break;
X default:
X if (!(c & 0x60)) {
X /*
X * Non NL/TAB/ESC/CSI character in C0 or C1
X * is an obvious error.
X */
X return -1;
X }
X gs = (c & 0x80) ? g1 : g0;
X if (cs) {
X cs->code = c & ~0x80;
X cs->gset = gs;
X cs++;
X }
X n++;
X break;
X }
X }
X if (cs) {
X cs->code = 0;
X cs->gset = 0;
X }
X return n;
}
#endif
SHAR_EOF
chmod 0664 kterm-4.1.2/convert.c ||
echo 'restore of kterm-4.1.2/convert.c failed'
Wc_c="`wc -c < 'kterm-4.1.2/convert.c'`"
test 15524 -eq "$Wc_c" ||
echo 'kterm-4.1.2/convert.c: original size 15524, current size' "$Wc_c"
rm -f _shar_wnt_.tmp
fi
# ============= kterm-4.1.2/convlib.c ==============
if test -f 'kterm-4.1.2/convlib.c' -a X"$1" != X"-c"; then
echo 'x - skipping kterm-4.1.2/convlib.c (File already exists)'
rm -f _shar_wnt_.tmp
else
> _shar_wnt_.tmp
echo 'x - extracting kterm-4.1.2/convlib.c (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'kterm-4.1.2/convlib.c' &&
/*
X * convlib.c -- conversion input library for X11 Toolkit (Xt)
X * $Header: /usr/src.yoshi/X/KTerm/4.1.0/RCS/convlib.c,v 1.1 90/06/27 09:38:48 kagotani Rel $
X *
X * ishisone@sra.co.jp
X */
X
/*
X * Modified for Hanzi support:
X * Mark Leisher mleisher@nmsu.edu Fri Nov 9 09:22:33 1990
X */
X
/*
X * Copyright (C) 1988 by Software Research Associates, Inc.
X *
X * Permission to use, copy, modify, and distribute this software and its
X * documentation for any purpose and without fee is hereby granted, provided
X * that the above copyright notice appear in all copies and that both that
X * copyright notice and this permission notice appear in supporting
X * documentation, and that the name of Software Research Associates not be
X * used in advertising or publicity pertaining to distribution of the
X * software without specific, written prior permission. Software Research
X * Associates makes no representations about the suitability of this software
X * for any purpose. It is provided "as is" without express or implied
X * warranty.
X *
X * Author: Makoto Ishisone, Software Research Associates, Inc., Japan
X * ishisone@sra.co.jp
X */
X
/*
X * This library is for languages that need complex input method
X * (such as Japanese or Chinese).
X * It communicates with the conversion server using the standard X11
X * inter-client communication mechanism (selection/property/clientmessage),
X * so that you can easily input these languages (if you have the conversion
X * server).
X */
X
X
/*
X * see protocol document for the protocol used between client and
X * conversion server.
X */
X
/*
X * How to use this library:
X *
X * 1. add the following entry to the widget's action table.
X *
X * {"begin-conversion", beginConversion},
X *
X * 2. add the following entry to the translation table.
X *
X * [trigger-event]: begin-conversion(<language>_CONVERSION)
X *
X * where:
X * [trigger-event] - an trigger event of starting conversion
X * <language> - the language you want to input
X * ex)
X * Ctrl<Key>Kanji: begin-conversion(JAPANESE_CONVERSION)
X *
X * 3. write a function beginConversion().
X * Since function beginConversion is called by the translation manager,
X * the arguments passed are Widget, XEvent*, and parameter strings.
X * This function should call _beginConversion() defined in this library.
X * _beginConversion()'s interface is:
X *
X * void _beginConversion(Widget w, Atom catom, Atom tatom,
X * void (*inputproc)(), caddr_t client_data);
X * where:
X * catom - Selection Atom (JAPANESE_CONVERSION for Japanese)
X * (CHINESE_CONVERSION for Chinese)
X * tatom - Property type of the conversion text
X * (e.g. COMPOUND_TEXT)
X * inputproc - conversion text callback function (see below)
X * client_data - client_data passed to inputproc
X *
X * this callback function interface is:
X *
X * textInput(Widget w, Atom selection,
X * Atom proptype, int propformat,
X * unsigned long propsize,
X * unsigned char *propvalue,
X * caddr_t client_data);
X *
X * the callback function should free propvalue data area by calling
X * XtFree().
X *
X * So, the simplest beginConversion() will be like this:
X *
X * /-* ARGSUSED *-/
X * void beginConversion(w, event, params, nparams)
X * Widget w;
X * XEvent *event;
X * String *params;
X * Cardinal *nparams;
X * {
X * void textInput();
X * Atom catom, tatom;
X *
X * if (*nparams != 1) {
X * /-* Error *-/
X * }
X * catom = XInternAtom(XtDisplay(w), *params, False);
X * tatom = XInternAtom(XtDisplay(w), "COMPOUND_TEXT", False);
X * _beginConversion(w, catom, tatom, textInput, NULL);
X * }
X */
X
#include "kterm.h"
X
#include <X11/StringDefs.h>
#include <X11/Intrinsic.h>
#include <X11/Xutil.h>
X
#ifndef lint
static char *rcsid = "$Id: convlib.c,v 1.1 90/06/27 09:38:48 kagotani Rel $";
#endif
X
/*
X * Atoms:
X * reqAtom ("CONVERSION_REQUEST")
X * message_type in ClientMessage event that is sent
X * when requesting conversion service to conversion server.
X * notifyAtom ("CONVERSION_NOTIFY")
X * message_type in ClientMessage event that is sent
X * from conversion server.
X * endAtom ("CONVERSION_END")
X * message_type in ClientMessage event that is sent
X * from conversion server when conversion ends.
X * endReqAtom ("CONVERSION_END_REQUEST")
X * message_type in ClientMessage event that is sent
X * from clients for stopping conversion.
X */
X
typedef struct {
X Display *display;
X Atom reqAtom; /* "CONVERSION_REQUEST" */
X Atom notifyAtom; /* "CONVERSION_NOTIFY" */
X Atom endAtom; /* "CONVERSION_END" */
X Atom endReqAtom; /* "CONVERSION_END_REQUEST" */
} ConversionAtoms;
X
typedef struct {
X Atom convatom;
X Window convowner;
X Atom property;
X void (*inputproc)();
X caddr_t closure;
} ConversionContext;
X
static XContext convertPrivContext;
X
#if __STDC__ == 1
/* function prototype */
static ConversionAtoms *getAtoms(Widget);
static ConversionContext *getConversionContext(Widget);
static void recvConvAck(Widget, caddr_t, XEvent *);
static void getConv(Widget, caddr_t, XEvent *);
#else
static ConversionAtoms *getAtoms();
static ConversionContext *getConversionContext();
static void recvConvAck();
static void getConv();
#endif
X
static ConversionAtoms *
getAtoms(w)
Widget w;
/* make atoms used for communicating with conversion server
X * and a context for holding the property name
X */
{
X int i;
X Display *disp = XtDisplay(w);
X ConversionAtoms *cap;
X static ConversionAtoms *convatomp;
X static Cardinal ndisp = 0;
#define nalloc 2
X
X /*
X * Atoms should be made for each display
X */
X
X /* check if the atoms are already made */
X cap = convatomp;
X for (i = 0; i < ndisp; i++, cap++) {
X if (cap->display == disp)
X return cap;
X }
X
X /* not made yet, so create them */
X if (ndisp == 0) {
X /* it's a first time, so a context should also be made */
X convertPrivContext = XUniqueContext();
X convatomp = (ConversionAtoms *)
X XtMalloc(sizeof(ConversionAtoms) * nalloc);
X cap = convatomp;
X } else if (ndisp % nalloc == 0) {
X /* increase size */
X convatomp = (ConversionAtoms *)
X XtRealloc(convatomp, sizeof(ConversionAtoms) * (ndisp +nalloc));
X cap = convatomp + ndisp;
X } else {
X cap = convatomp + ndisp;
SHAR_EOF
true || echo 'restore of kterm-4.1.2/convlib.c failed'
fi
echo 'End of kterm-4.1.2 part 9'
echo 'File kterm-4.1.2/convlib.c is continued in part 10'
echo 10 > _shar_seq_.tmp
exit 0
-----------------------------------------------------------------------------
mleisher@nmsu.edu "I laughed.
Mark Leisher I cried.
Computing Research Lab I fell down.
New Mexico State University It changed my life."
Las Cruces, NM - Rich [Cowboy Feng's Space Bar and Grille]
--
Dan Heller
O'Reilly && Associates Z-Code Software Comp-sources-x:
Senior Writer President comp-sources.x@uunet.uu.net
argv@ora.com argv@zipcode.com