|
Packit Service |
2b1f13 |
/*
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
Copyright 1989, 1998 The Open Group
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
Permission to use, copy, modify, distribute, and sell this software and its
|
|
Packit Service |
2b1f13 |
documentation for any purpose is hereby granted without fee, provided that
|
|
Packit Service |
2b1f13 |
the above copyright notice appear in all copies and that both that
|
|
Packit Service |
2b1f13 |
copyright notice and this permission notice appear in supporting
|
|
Packit Service |
2b1f13 |
documentation.
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
The above copyright notice and this permission notice shall be included in
|
|
Packit Service |
2b1f13 |
all copies or substantial portions of the Software.
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
Packit Service |
2b1f13 |
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
Packit Service |
2b1f13 |
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
Packit Service |
2b1f13 |
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
|
Packit Service |
2b1f13 |
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
Packit Service |
2b1f13 |
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
Except as contained in this notice, the name of The Open Group shall not be
|
|
Packit Service |
2b1f13 |
used in advertising or otherwise to promote the sale, use or other dealings
|
|
Packit Service |
2b1f13 |
in this Software without prior written authorization from The Open Group.
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
*/
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
#ifdef HAVE_CONFIG_H
|
|
Packit Service |
2b1f13 |
#include <config.h>
|
|
Packit Service |
2b1f13 |
#endif
|
|
Packit Service |
2b1f13 |
#include <X11/Xfuncs.h>
|
|
Packit Service |
2b1f13 |
#include "Xct.h"
|
|
Packit Service |
2b1f13 |
#include <stdio.h>
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
#define UsedGraphic 0x0001
|
|
Packit Service |
2b1f13 |
#define UsedDirection 0x0002
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
typedef struct _XctPriv {
|
|
Packit Service |
2b1f13 |
XctString ptr;
|
|
Packit Service |
2b1f13 |
XctString ptrend;
|
|
Packit Service |
2b1f13 |
unsigned flags;
|
|
Packit Service |
2b1f13 |
XctHDirection *dirstack;
|
|
Packit Service |
2b1f13 |
unsigned dirsize;
|
|
Packit Service |
2b1f13 |
char **encodings;
|
|
Packit Service |
2b1f13 |
unsigned enc_count;
|
|
Packit Service |
2b1f13 |
XctString itembuf;
|
|
Packit Service |
2b1f13 |
unsigned buf_count;
|
|
Packit Service |
2b1f13 |
} *XctPriv;
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
#define IsMore(priv) ((priv)->ptr != (priv)->ptrend)
|
|
Packit Service |
2b1f13 |
#define AmountLeft(priv) ((priv)->ptrend - (priv)->ptr)
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
#include <stdlib.h>
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
#define HT 0x09
|
|
Packit Service |
2b1f13 |
#define NL 0x0a
|
|
Packit Service |
2b1f13 |
#define ESC 0x1b
|
|
Packit Service |
2b1f13 |
#define CSI 0x9b
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
#define IsLegalC0(data, c) (((c) == HT) || ((c) == NL) || \
|
|
Packit Service |
2b1f13 |
(((data)->version > XctVersion) && \
|
|
Packit Service |
2b1f13 |
((data)->flags & XctAcceptC0Extensions)))
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
#define IsLegalC1(priv, c) (((data)->version > XctVersion) && \
|
|
Packit Service |
2b1f13 |
((data)->flags & XctAcceptC1Extensions))
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
#define IsI2(c) (((c) >= 0x20) && ((c) <= 0x2f))
|
|
Packit Service |
2b1f13 |
#define IsI3(c) (((c) >= 0x30) && ((c) <= 0x3f))
|
|
Packit Service |
2b1f13 |
#define IsESCF(c) (((c) >= 0x30) && ((c) <= 0x7e))
|
|
Packit Service |
2b1f13 |
#define IsCSIF(c) (((c) >= 0x40) && ((c) <= 0x7e))
|
|
Packit Service |
2b1f13 |
#define IsC0(c) ((c) <= 0x1f)
|
|
Packit Service |
2b1f13 |
#define IsGL(c) (((c) >= 0x20) && ((c) <= 0x7f))
|
|
Packit Service |
2b1f13 |
#define IsC1(c) (((c) >= 0x80) && ((c) <= 0x9f))
|
|
Packit Service |
2b1f13 |
#define IsGR(c) ((c) >= 0xa0)
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
#define HasC 1
|
|
Packit Service |
2b1f13 |
#define HasGL 2
|
|
Packit Service |
2b1f13 |
#define HasGR 4
|
|
Packit Service |
2b1f13 |
#define ToGL 8
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
/*
|
|
Packit Service |
2b1f13 |
* Prototypes
|
|
Packit Service |
2b1f13 |
*/
|
|
Packit Service |
2b1f13 |
static void ComputeGLGR(XctData);
|
|
Packit Service |
2b1f13 |
static int Handle94GR(XctData, int);
|
|
Packit Service |
2b1f13 |
static int Handle96GR(XctData, int);
|
|
Packit Service |
2b1f13 |
static int HandleExtended(XctData data, int);
|
|
Packit Service |
2b1f13 |
static int HandleGL(XctData, int);
|
|
Packit Service |
2b1f13 |
static int HandleMultiGL(XctData, int);
|
|
Packit Service |
2b1f13 |
static int HandleMultiGR(XctData data, int);
|
|
Packit Service |
2b1f13 |
static void ShiftGRToGL(XctData, int);
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
/*
|
|
Packit Service |
2b1f13 |
* Implementation
|
|
Packit Service |
2b1f13 |
*/
|
|
Packit Service |
2b1f13 |
static void
|
|
Packit Service |
2b1f13 |
ComputeGLGR(register XctData data)
|
|
Packit Service |
2b1f13 |
{
|
|
Packit Service |
2b1f13 |
/* XXX this will need more work if more sets are registered */
|
|
Packit Service |
2b1f13 |
if ((data->GL_set_size == 94) && (data->GL_char_size == 1) &&
|
|
Packit Service |
2b1f13 |
(data->GL[0] == '\102') &&
|
|
Packit Service |
2b1f13 |
(data->GR_set_size == 96) && (data->GR_char_size == 1))
|
|
Packit Service |
2b1f13 |
data->GLGR_encoding = data->GR_encoding;
|
|
Packit Service |
2b1f13 |
else if ((data->GL_set_size == 94) && (data->GL_char_size == 1) &&
|
|
Packit Service |
2b1f13 |
(data->GL[0] == '\112') &&
|
|
Packit Service |
2b1f13 |
(data->GR_set_size == 94) && (data->GR_char_size == 1))
|
|
Packit Service |
2b1f13 |
data->GLGR_encoding = data->GR_encoding;
|
|
Packit Service |
2b1f13 |
else
|
|
Packit Service |
2b1f13 |
data->GLGR_encoding = (char *)NULL;
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
static int
|
|
Packit Service |
2b1f13 |
HandleGL(register XctData data, int c)
|
|
Packit Service |
2b1f13 |
{
|
|
Packit Service |
2b1f13 |
switch (c) {
|
|
Packit Service |
2b1f13 |
case 0x42:
|
|
Packit Service |
2b1f13 |
data->GL = "\102";
|
|
Packit Service |
2b1f13 |
data->GL_encoding = "ISO8859-1";
|
|
Packit Service |
2b1f13 |
break;
|
|
Packit Service |
2b1f13 |
case 0x4a:
|
|
Packit Service |
2b1f13 |
data->GL = "\112";
|
|
Packit Service |
2b1f13 |
data->GL_encoding = "JISX0201.1976-0";
|
|
Packit Service |
2b1f13 |
break;
|
|
Packit Service |
2b1f13 |
default:
|
|
Packit Service |
2b1f13 |
return 0;
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
data->GL_set_size = 94;
|
|
Packit Service |
2b1f13 |
data->GL_char_size = 1;
|
|
Packit Service |
2b1f13 |
ComputeGLGR(data);
|
|
Packit Service |
2b1f13 |
return 1;
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
static int
|
|
Packit Service |
2b1f13 |
HandleMultiGL(register XctData data, int c)
|
|
Packit Service |
2b1f13 |
{
|
|
Packit Service |
2b1f13 |
switch (c) {
|
|
Packit Service |
2b1f13 |
case 0x41:
|
|
Packit Service |
2b1f13 |
data->GL = "\101";
|
|
Packit Service |
2b1f13 |
data->GL_encoding = "GB2312.1980-0";
|
|
Packit Service |
2b1f13 |
break;
|
|
Packit Service |
2b1f13 |
case 0x42:
|
|
Packit Service |
2b1f13 |
data->GL = "\102";
|
|
Packit Service |
2b1f13 |
data->GL_encoding = "JISX0208.1983-0";
|
|
Packit Service |
2b1f13 |
break;
|
|
Packit Service |
2b1f13 |
case 0x43:
|
|
Packit Service |
2b1f13 |
data->GL = "\103";
|
|
Packit Service |
2b1f13 |
data->GL_encoding = "KSC5601.1987-0";
|
|
Packit Service |
2b1f13 |
break;
|
|
Packit Service |
2b1f13 |
default:
|
|
Packit Service |
2b1f13 |
return 0;
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
data->GL_set_size = 94;
|
|
Packit Service |
2b1f13 |
data->GL_char_size = 2;
|
|
Packit Service |
2b1f13 |
#ifdef notdef
|
|
Packit Service |
2b1f13 |
if (c < 0x60)
|
|
Packit Service |
2b1f13 |
data->GL_char_size = 2;
|
|
Packit Service |
2b1f13 |
else if (c < 0x70)
|
|
Packit Service |
2b1f13 |
data->GL_char_size = 3;
|
|
Packit Service |
2b1f13 |
else
|
|
Packit Service |
2b1f13 |
data->GL_char_size = 4;
|
|
Packit Service |
2b1f13 |
#endif
|
|
Packit Service |
2b1f13 |
data->GLGR_encoding = (char *)NULL;
|
|
Packit Service |
2b1f13 |
return 1;
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
static int
|
|
Packit Service |
2b1f13 |
Handle94GR(register XctData data, int c)
|
|
Packit Service |
2b1f13 |
{
|
|
Packit Service |
2b1f13 |
switch (c) {
|
|
Packit Service |
2b1f13 |
case 0x49:
|
|
Packit Service |
2b1f13 |
data->GR = "\111";
|
|
Packit Service |
2b1f13 |
data->GR_encoding = "JISX0201.1976-0";
|
|
Packit Service |
2b1f13 |
break;
|
|
Packit Service |
2b1f13 |
default:
|
|
Packit Service |
2b1f13 |
return 0;
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
data->priv->flags &= ~ToGL;
|
|
Packit Service |
2b1f13 |
data->GR_set_size = 94;
|
|
Packit Service |
2b1f13 |
data->GR_char_size = 1;
|
|
Packit Service |
2b1f13 |
data->GLGR_encoding = (char *)NULL;
|
|
Packit Service |
2b1f13 |
return 1;
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
static int
|
|
Packit Service |
2b1f13 |
Handle96GR(register XctData data, int c)
|
|
Packit Service |
2b1f13 |
{
|
|
Packit Service |
2b1f13 |
switch (c) {
|
|
Packit Service |
2b1f13 |
case 0x41:
|
|
Packit Service |
2b1f13 |
data->GR = "\101";
|
|
Packit Service |
2b1f13 |
data->GR_encoding = "ISO8859-1";
|
|
Packit Service |
2b1f13 |
break;
|
|
Packit Service |
2b1f13 |
case 0x42:
|
|
Packit Service |
2b1f13 |
data->GR = "\102";
|
|
Packit Service |
2b1f13 |
data->GR_encoding = "ISO8859-2";
|
|
Packit Service |
2b1f13 |
break;
|
|
Packit Service |
2b1f13 |
case 0x43:
|
|
Packit Service |
2b1f13 |
data->GR = "\103";
|
|
Packit Service |
2b1f13 |
data->GR_encoding = "ISO8859-3";
|
|
Packit Service |
2b1f13 |
break;
|
|
Packit Service |
2b1f13 |
case 0x44:
|
|
Packit Service |
2b1f13 |
data->GR = "\104";
|
|
Packit Service |
2b1f13 |
data->GR_encoding = "ISO8859-4";
|
|
Packit Service |
2b1f13 |
break;
|
|
Packit Service |
2b1f13 |
case 0x46:
|
|
Packit Service |
2b1f13 |
data->GR = "\106";
|
|
Packit Service |
2b1f13 |
data->GR_encoding = "ISO8859-7";
|
|
Packit Service |
2b1f13 |
break;
|
|
Packit Service |
2b1f13 |
case 0x47:
|
|
Packit Service |
2b1f13 |
data->GR = "\107";
|
|
Packit Service |
2b1f13 |
data->GR_encoding = "ISO8859-6";
|
|
Packit Service |
2b1f13 |
break;
|
|
Packit Service |
2b1f13 |
case 0x48:
|
|
Packit Service |
2b1f13 |
data->GR = "\110";
|
|
Packit Service |
2b1f13 |
data->GR_encoding = "ISO8859-8";
|
|
Packit Service |
2b1f13 |
break;
|
|
Packit Service |
2b1f13 |
case 0x4c:
|
|
Packit Service |
2b1f13 |
data->GR = "\114";
|
|
Packit Service |
2b1f13 |
data->GR_encoding = "ISO8859-5";
|
|
Packit Service |
2b1f13 |
break;
|
|
Packit Service |
2b1f13 |
case 0x4d:
|
|
Packit Service |
2b1f13 |
data->GR = "\115";
|
|
Packit Service |
2b1f13 |
data->GR_encoding = "ISO8859-9";
|
|
Packit Service |
2b1f13 |
break;
|
|
Packit Service |
2b1f13 |
default:
|
|
Packit Service |
2b1f13 |
return 0;
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
data->priv->flags &= ~ToGL;
|
|
Packit Service |
2b1f13 |
data->GR_set_size = 96;
|
|
Packit Service |
2b1f13 |
data->GR_char_size = 1;
|
|
Packit Service |
2b1f13 |
ComputeGLGR(data);
|
|
Packit Service |
2b1f13 |
return 1;
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
static int
|
|
Packit Service |
2b1f13 |
HandleMultiGR(register XctData data, int c)
|
|
Packit Service |
2b1f13 |
{
|
|
Packit Service |
2b1f13 |
switch (c) {
|
|
Packit Service |
2b1f13 |
case 0x41:
|
|
Packit Service |
2b1f13 |
data->GR = "\101";
|
|
Packit Service |
2b1f13 |
if (data->flags & XctShiftMultiGRToGL)
|
|
Packit Service |
2b1f13 |
data->GR_encoding = "GB2312.1980-0";
|
|
Packit Service |
2b1f13 |
else
|
|
Packit Service |
2b1f13 |
data->GR_encoding = "GB2312.1980-1";
|
|
Packit Service |
2b1f13 |
break;
|
|
Packit Service |
2b1f13 |
case 0x42:
|
|
Packit Service |
2b1f13 |
data->GR = "\102";
|
|
Packit Service |
2b1f13 |
if (data->flags & XctShiftMultiGRToGL)
|
|
Packit Service |
2b1f13 |
data->GR_encoding = "JISX0208.1983-0";
|
|
Packit Service |
2b1f13 |
else
|
|
Packit Service |
2b1f13 |
data->GR_encoding = "JISX0208.1983-1";
|
|
Packit Service |
2b1f13 |
break;
|
|
Packit Service |
2b1f13 |
case 0x43:
|
|
Packit Service |
2b1f13 |
data->GR = "\103";
|
|
Packit Service |
2b1f13 |
if (data->flags & XctShiftMultiGRToGL)
|
|
Packit Service |
2b1f13 |
data->GR_encoding = "KSC5601.1987-0";
|
|
Packit Service |
2b1f13 |
else
|
|
Packit Service |
2b1f13 |
data->GR_encoding = "KSC5601.1987-1";
|
|
Packit Service |
2b1f13 |
break;
|
|
Packit Service |
2b1f13 |
default:
|
|
Packit Service |
2b1f13 |
return 0;
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
if (data->flags & XctShiftMultiGRToGL)
|
|
Packit Service |
2b1f13 |
data->priv->flags |= ToGL;
|
|
Packit Service |
2b1f13 |
else
|
|
Packit Service |
2b1f13 |
data->priv->flags &= ~ToGL;
|
|
Packit Service |
2b1f13 |
data->GR_set_size = 94;
|
|
Packit Service |
2b1f13 |
data->GR_char_size = 2;
|
|
Packit Service |
2b1f13 |
#ifdef notdef
|
|
Packit Service |
2b1f13 |
if (c < 0x60)
|
|
Packit Service |
2b1f13 |
data->GR_char_size = 2;
|
|
Packit Service |
2b1f13 |
else if (c < 0x70)
|
|
Packit Service |
2b1f13 |
data->GR_char_size = 3;
|
|
Packit Service |
2b1f13 |
else
|
|
Packit Service |
2b1f13 |
data->GR_char_size = 4;
|
|
Packit Service |
2b1f13 |
#endif
|
|
Packit Service |
2b1f13 |
data->GLGR_encoding = (char *)NULL;
|
|
Packit Service |
2b1f13 |
return 1;
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
static int
|
|
Packit Service |
2b1f13 |
HandleExtended(register XctData data, int c)
|
|
Packit Service |
2b1f13 |
{
|
|
Packit Service |
2b1f13 |
register XctPriv priv = data->priv;
|
|
Packit Service |
2b1f13 |
XctString enc = data->item + 6;
|
|
Packit Service |
2b1f13 |
register XctString ptr = enc;
|
|
Packit Service |
2b1f13 |
unsigned i, len;
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
while (*ptr != 0x02) {
|
|
Packit Service |
2b1f13 |
if (!*ptr || (++ptr == priv->ptr))
|
|
Packit Service |
2b1f13 |
return 0;
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
data->item = ptr + 1;
|
|
Packit Service |
2b1f13 |
data->item_length = priv->ptr - data->item;
|
|
Packit Service |
2b1f13 |
len = ptr - enc;
|
|
Packit Service |
2b1f13 |
for (i = 0;
|
|
Packit Service |
2b1f13 |
(i < priv->enc_count) &&
|
|
Packit Service |
2b1f13 |
strncmp(priv->encodings[i], (char *)enc, len);
|
|
Packit Service |
2b1f13 |
i++)
|
|
Packit Service |
2b1f13 |
;
|
|
Packit Service |
2b1f13 |
if (i == priv->enc_count) {
|
|
Packit Service |
2b1f13 |
XctString cp;
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
for (cp = enc; cp != ptr; cp++) {
|
|
Packit Service |
2b1f13 |
if ((!IsGL(*cp) && !IsGR(*cp)) || (*cp == 0x2a) || (*cp == 0x3f))
|
|
Packit Service |
2b1f13 |
return 0;
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
ptr = (XctString)malloc((unsigned)len + 1);
|
|
Packit Service |
2b1f13 |
(void) memmove((char *)ptr, (char *)enc, len);
|
|
Packit Service |
2b1f13 |
ptr[len] = 0x00;
|
|
Packit Service |
2b1f13 |
priv->enc_count++;
|
|
Packit Service |
2b1f13 |
if (priv->encodings)
|
|
Packit Service |
2b1f13 |
priv->encodings = (char **)realloc(
|
|
Packit Service |
2b1f13 |
(char *)priv->encodings,
|
|
Packit Service |
2b1f13 |
priv->enc_count * sizeof(char *));
|
|
Packit Service |
2b1f13 |
else
|
|
Packit Service |
2b1f13 |
priv->encodings = (char **)malloc(sizeof(char *));
|
|
Packit Service |
2b1f13 |
priv->encodings[i] = (char *)ptr;
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
data->encoding = priv->encodings[i];
|
|
Packit Service |
2b1f13 |
data->char_size = c - 0x30;
|
|
Packit Service |
2b1f13 |
return 1;
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
static void
|
|
Packit Service |
2b1f13 |
ShiftGRToGL(register XctData data, int hasCdata)
|
|
Packit Service |
2b1f13 |
{
|
|
Packit Service |
2b1f13 |
register XctPriv priv = data->priv;
|
|
Packit Service |
2b1f13 |
register int i;
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
if (data->item_length > priv->buf_count) {
|
|
Packit Service |
2b1f13 |
priv->buf_count = data->item_length;
|
|
Packit Service |
2b1f13 |
if (priv->itembuf)
|
|
Packit Service |
2b1f13 |
priv->itembuf = (XctString)realloc((char *)priv->itembuf,
|
|
Packit Service |
2b1f13 |
priv->buf_count);
|
|
Packit Service |
2b1f13 |
else
|
|
Packit Service |
2b1f13 |
priv->itembuf = (XctString)malloc(priv->buf_count);
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
(void) memmove((char *)priv->itembuf, (char *)data->item,
|
|
Packit Service |
2b1f13 |
data->item_length);
|
|
Packit Service |
2b1f13 |
data->item = priv->itembuf;
|
|
Packit Service |
2b1f13 |
if (hasCdata) {
|
|
Packit Service |
2b1f13 |
for (i = data->item_length; --i >= 0; ) {
|
|
Packit Service |
2b1f13 |
if (IsGR(data->item[i]))
|
|
Packit Service |
2b1f13 |
data->item[i] &= 0x7f;
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
} else {
|
|
Packit Service |
2b1f13 |
for (i = data->item_length; --i >= 0; )
|
|
Packit Service |
2b1f13 |
data->item[i] &= 0x7f;
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
/* Create an XctData structure for parsing a Compound Text string. */
|
|
Packit Service |
2b1f13 |
XctData
|
|
Packit Service |
2b1f13 |
XctCreate(_Xconst unsigned char *string, int length, XctFlags flags)
|
|
Packit Service |
2b1f13 |
{
|
|
Packit Service |
2b1f13 |
register XctData data;
|
|
Packit Service |
2b1f13 |
register XctPriv priv;
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
data = (XctData)malloc(sizeof(struct _XctRec) + sizeof(struct _XctPriv));
|
|
Packit Service |
2b1f13 |
if (!data)
|
|
Packit Service |
2b1f13 |
return data;
|
|
Packit Service |
2b1f13 |
data->priv = priv = (XctPriv)(data + 1);
|
|
Packit Service |
2b1f13 |
data->total_string = (XctString)string;
|
|
Packit Service |
2b1f13 |
data->total_length = length;
|
|
Packit Service |
2b1f13 |
data->flags = flags;
|
|
Packit Service |
2b1f13 |
priv->dirstack = (XctHDirection *)NULL;
|
|
Packit Service |
2b1f13 |
priv->dirsize = 0;
|
|
Packit Service |
2b1f13 |
priv->encodings = (char **)NULL;
|
|
Packit Service |
2b1f13 |
priv->enc_count = 0;
|
|
Packit Service |
2b1f13 |
priv->itembuf = (XctString)NULL;
|
|
Packit Service |
2b1f13 |
priv->buf_count = 0;
|
|
Packit Service |
2b1f13 |
XctReset(data);
|
|
Packit Service |
2b1f13 |
return data;
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
/* Reset the XctData structure to re-parse the string from the beginning. */
|
|
Packit Service |
2b1f13 |
void
|
|
Packit Service |
2b1f13 |
XctReset(register XctData data)
|
|
Packit Service |
2b1f13 |
{
|
|
Packit Service |
2b1f13 |
register XctPriv priv = data->priv;
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
priv->ptr = data->total_string;
|
|
Packit Service |
2b1f13 |
priv->ptrend = data->total_string + data->total_length;
|
|
Packit Service |
2b1f13 |
data->item = (XctString)NULL;
|
|
Packit Service |
2b1f13 |
data->item_length = 0;
|
|
Packit Service |
2b1f13 |
data->encoding = (char *)NULL;
|
|
Packit Service |
2b1f13 |
data->char_size = 1;
|
|
Packit Service |
2b1f13 |
data->horizontal = XctUnspecified;
|
|
Packit Service |
2b1f13 |
data->horz_depth = 0;
|
|
Packit Service |
2b1f13 |
priv->flags = 0;
|
|
Packit Service |
2b1f13 |
data->GL_set_size = data->GR_set_size = 0; /* XXX */
|
|
Packit Service |
2b1f13 |
(void)HandleGL(data, (unsigned char)0x42);
|
|
Packit Service |
2b1f13 |
(void)Handle96GR(data, (unsigned char)0x41);
|
|
Packit Service |
2b1f13 |
data->version = 1;
|
|
Packit Service |
2b1f13 |
data->can_ignore_exts = 0;
|
|
Packit Service |
2b1f13 |
/* parse version, if present */
|
|
Packit Service |
2b1f13 |
if ((data->total_length >= 4) &&
|
|
Packit Service |
2b1f13 |
(priv->ptr[0] == ESC) && (priv->ptr[1] == 0x23) &&
|
|
Packit Service |
2b1f13 |
IsI2(priv->ptr[2]) &&
|
|
Packit Service |
2b1f13 |
((priv->ptr[3] == 0x30) || (priv->ptr[3] == 0x31))) {
|
|
Packit Service |
2b1f13 |
data->version = priv->ptr[2] - 0x1f;
|
|
Packit Service |
2b1f13 |
if (priv->ptr[3] == 0x30)
|
|
Packit Service |
2b1f13 |
data->can_ignore_exts = 1;
|
|
Packit Service |
2b1f13 |
priv->ptr += 4;
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
/* Parse the next "item" from the Compound Text string. The return value
|
|
Packit Service |
2b1f13 |
* indicates what kind of item is returned. The item itself, and the current
|
|
Packit Service |
2b1f13 |
* contextual state, are reported as components of the XctData structure.
|
|
Packit Service |
2b1f13 |
*/
|
|
Packit Service |
2b1f13 |
XctResult
|
|
Packit Service |
2b1f13 |
XctNextItem(register XctData data)
|
|
Packit Service |
2b1f13 |
{
|
|
Packit Service |
2b1f13 |
register XctPriv priv = data->priv;
|
|
Packit Service |
2b1f13 |
unsigned char c;
|
|
Packit Service |
2b1f13 |
int len, bits;
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
#define NEXT data->item_length++; priv->ptr++
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
while (IsMore(priv)) {
|
|
Packit Service |
2b1f13 |
data->item = priv->ptr;
|
|
Packit Service |
2b1f13 |
data->item_length = 0;
|
|
Packit Service |
2b1f13 |
c = *priv->ptr;
|
|
Packit Service |
2b1f13 |
if (c == ESC) {
|
|
Packit Service |
2b1f13 |
NEXT;
|
|
Packit Service |
2b1f13 |
while (IsMore(priv) && IsI2(*priv->ptr)) {
|
|
Packit Service |
2b1f13 |
NEXT;
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
if (!IsMore(priv))
|
|
Packit Service |
2b1f13 |
return XctError;
|
|
Packit Service |
2b1f13 |
c = *priv->ptr;
|
|
Packit Service |
2b1f13 |
NEXT;
|
|
Packit Service |
2b1f13 |
if (!IsESCF(c))
|
|
Packit Service |
2b1f13 |
return XctError;
|
|
Packit Service |
2b1f13 |
switch (data->item[1]) {
|
|
Packit Service |
2b1f13 |
case 0x24:
|
|
Packit Service |
2b1f13 |
if (data->item_length > 3) {
|
|
Packit Service |
2b1f13 |
if (data->item[2] == 0x28) {
|
|
Packit Service |
2b1f13 |
if (HandleMultiGL(data, c))
|
|
Packit Service |
2b1f13 |
continue;
|
|
Packit Service |
2b1f13 |
} else if (data->item[2] == 0x29) {
|
|
Packit Service |
2b1f13 |
if (HandleMultiGR(data, c))
|
|
Packit Service |
2b1f13 |
continue;
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
break;
|
|
Packit Service |
2b1f13 |
case 0x25:
|
|
Packit Service |
2b1f13 |
if ((data->item_length == 4) && (data->item[2] == 0x2f) &&
|
|
Packit Service |
2b1f13 |
(c <= 0x3f)) {
|
|
Packit Service |
2b1f13 |
if ((AmountLeft(priv) < 2) ||
|
|
Packit Service |
2b1f13 |
(priv->ptr[0] < 0x80) || (priv->ptr[1] < 0x80))
|
|
Packit Service |
2b1f13 |
return XctError;
|
|
Packit Service |
2b1f13 |
len = *priv->ptr - 0x80;
|
|
Packit Service |
2b1f13 |
NEXT;
|
|
Packit Service |
2b1f13 |
len = (len << 7) + (*priv->ptr - 0x80);
|
|
Packit Service |
2b1f13 |
NEXT;
|
|
Packit Service |
2b1f13 |
if (AmountLeft(priv) < len)
|
|
Packit Service |
2b1f13 |
return XctError;
|
|
Packit Service |
2b1f13 |
data->item_length += len;
|
|
Packit Service |
2b1f13 |
priv->ptr += len;
|
|
Packit Service |
2b1f13 |
if (c <= 0x34) {
|
|
Packit Service |
2b1f13 |
if (!HandleExtended(data, c) ||
|
|
Packit Service |
2b1f13 |
((data->horz_depth == 0) &&
|
|
Packit Service |
2b1f13 |
(priv->flags & UsedDirection)))
|
|
Packit Service |
2b1f13 |
return XctError;
|
|
Packit Service |
2b1f13 |
priv->flags |= UsedGraphic;
|
|
Packit Service |
2b1f13 |
return XctExtendedSegment;
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
break;
|
|
Packit Service |
2b1f13 |
case 0x28:
|
|
Packit Service |
2b1f13 |
if (HandleGL(data, c))
|
|
Packit Service |
2b1f13 |
continue;
|
|
Packit Service |
2b1f13 |
break;
|
|
Packit Service |
2b1f13 |
case 0x29:
|
|
Packit Service |
2b1f13 |
if (Handle94GR(data, c))
|
|
Packit Service |
2b1f13 |
continue;
|
|
Packit Service |
2b1f13 |
break;
|
|
Packit Service |
2b1f13 |
case 0x2d:
|
|
Packit Service |
2b1f13 |
if (Handle96GR(data, c))
|
|
Packit Service |
2b1f13 |
continue;
|
|
Packit Service |
2b1f13 |
break;
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
} else if (c == CSI) {
|
|
Packit Service |
2b1f13 |
NEXT;
|
|
Packit Service |
2b1f13 |
while (IsMore(priv) && IsI3(*priv->ptr)) {
|
|
Packit Service |
2b1f13 |
NEXT;
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
while (IsMore(priv) && IsI2(*priv->ptr)) {
|
|
Packit Service |
2b1f13 |
NEXT;
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
if (!IsMore(priv))
|
|
Packit Service |
2b1f13 |
return XctError;
|
|
Packit Service |
2b1f13 |
c = *priv->ptr;
|
|
Packit Service |
2b1f13 |
NEXT;
|
|
Packit Service |
2b1f13 |
if (!IsCSIF(c))
|
|
Packit Service |
2b1f13 |
return XctError;
|
|
Packit Service |
2b1f13 |
if (c == 0x5d) {
|
|
Packit Service |
2b1f13 |
if ((data->item_length == 3) &&
|
|
Packit Service |
2b1f13 |
((data->item[1] == 0x31) || (data->item[1] == 0x32))) {
|
|
Packit Service |
2b1f13 |
data->horz_depth++;
|
|
Packit Service |
2b1f13 |
if (priv->dirsize < data->horz_depth) {
|
|
Packit Service |
2b1f13 |
priv->dirsize += 10;
|
|
Packit Service |
2b1f13 |
if (priv->dirstack)
|
|
Packit Service |
2b1f13 |
priv->dirstack = (XctHDirection *)
|
|
Packit Service |
2b1f13 |
realloc((char *)priv->dirstack,
|
|
Packit Service |
2b1f13 |
priv->dirsize *
|
|
Packit Service |
2b1f13 |
sizeof(XctHDirection));
|
|
Packit Service |
2b1f13 |
else
|
|
Packit Service |
2b1f13 |
priv->dirstack = (XctHDirection *)
|
|
Packit Service |
2b1f13 |
malloc(priv->dirsize *
|
|
Packit Service |
2b1f13 |
sizeof(XctHDirection));
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
priv->dirstack[data->horz_depth - 1] = data->horizontal;
|
|
Packit Service |
2b1f13 |
if (data->item[1] == 0x31)
|
|
Packit Service |
2b1f13 |
data->horizontal = XctLeftToRight;
|
|
Packit Service |
2b1f13 |
else
|
|
Packit Service |
2b1f13 |
data->horizontal = XctRightToLeft;
|
|
Packit Service |
2b1f13 |
if ((priv->flags & UsedGraphic) &&
|
|
Packit Service |
2b1f13 |
!(priv->flags & UsedDirection))
|
|
Packit Service |
2b1f13 |
return XctError;
|
|
Packit Service |
2b1f13 |
priv->flags |= UsedDirection;
|
|
Packit Service |
2b1f13 |
if (data->flags & XctHideDirection)
|
|
Packit Service |
2b1f13 |
continue;
|
|
Packit Service |
2b1f13 |
return XctHorizontal;
|
|
Packit Service |
2b1f13 |
} else if (data->item_length == 2) {
|
|
Packit Service |
2b1f13 |
if (!data->horz_depth)
|
|
Packit Service |
2b1f13 |
return XctError;
|
|
Packit Service |
2b1f13 |
data->horz_depth--;
|
|
Packit Service |
2b1f13 |
data->horizontal = priv->dirstack[data->horz_depth];
|
|
Packit Service |
2b1f13 |
if (data->flags & XctHideDirection)
|
|
Packit Service |
2b1f13 |
continue;
|
|
Packit Service |
2b1f13 |
return XctHorizontal;
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
} else if (data->flags & XctSingleSetSegments) {
|
|
Packit Service |
2b1f13 |
NEXT;
|
|
Packit Service |
2b1f13 |
if IsC0(c) {
|
|
Packit Service |
2b1f13 |
data->encoding = (char *)NULL;
|
|
Packit Service |
2b1f13 |
data->char_size = 1;
|
|
Packit Service |
2b1f13 |
if (IsLegalC0(data, c))
|
|
Packit Service |
2b1f13 |
return XctC0Segment;
|
|
Packit Service |
2b1f13 |
} else if (IsGL(c)) {
|
|
Packit Service |
2b1f13 |
data->encoding = data->GL_encoding;
|
|
Packit Service |
2b1f13 |
data->char_size = data->GL_char_size;
|
|
Packit Service |
2b1f13 |
while (IsMore(priv) && IsGL(*priv->ptr)) {
|
|
Packit Service |
2b1f13 |
NEXT;
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
if (((data->char_size > 1) &&
|
|
Packit Service |
2b1f13 |
(data->item_length % data->char_size)) ||
|
|
Packit Service |
2b1f13 |
((data->horz_depth == 0) &&
|
|
Packit Service |
2b1f13 |
(priv->flags & UsedDirection)))
|
|
Packit Service |
2b1f13 |
return XctError;
|
|
Packit Service |
2b1f13 |
priv->flags |= UsedGraphic;
|
|
Packit Service |
2b1f13 |
return XctGLSegment;
|
|
Packit Service |
2b1f13 |
} else if (IsC1(c)) {
|
|
Packit Service |
2b1f13 |
data->encoding = (char *)NULL;
|
|
Packit Service |
2b1f13 |
data->char_size = 1;
|
|
Packit Service |
2b1f13 |
if (IsLegalC1(data, c))
|
|
Packit Service |
2b1f13 |
return XctC1Segment;
|
|
Packit Service |
2b1f13 |
} else {
|
|
Packit Service |
2b1f13 |
data->encoding = data->GR_encoding;
|
|
Packit Service |
2b1f13 |
data->char_size = data->GR_char_size;
|
|
Packit Service |
2b1f13 |
while (IsMore(priv) && IsGR(*priv->ptr)) {
|
|
Packit Service |
2b1f13 |
NEXT;
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
if (((data->char_size > 1) &&
|
|
Packit Service |
2b1f13 |
(data->item_length % data->char_size)) ||
|
|
Packit Service |
2b1f13 |
((data->horz_depth == 0) &&
|
|
Packit Service |
2b1f13 |
(priv->flags & UsedDirection)))
|
|
Packit Service |
2b1f13 |
return XctError;
|
|
Packit Service |
2b1f13 |
priv->flags |= UsedGraphic;
|
|
Packit Service |
2b1f13 |
if (!(priv->flags & ToGL))
|
|
Packit Service |
2b1f13 |
return XctGRSegment;
|
|
Packit Service |
2b1f13 |
ShiftGRToGL(data, 0);
|
|
Packit Service |
2b1f13 |
return XctGLSegment;
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
} else {
|
|
Packit Service |
2b1f13 |
bits = 0;
|
|
Packit Service |
2b1f13 |
while (1) {
|
|
Packit Service |
2b1f13 |
if (IsC0(c) || IsC1(c)) {
|
|
Packit Service |
2b1f13 |
if ((c == ESC) || (c == CSI))
|
|
Packit Service |
2b1f13 |
break;
|
|
Packit Service |
2b1f13 |
if (IsC0(c) ? !IsLegalC0(data, c) : !IsLegalC1(data, c))
|
|
Packit Service |
2b1f13 |
break;
|
|
Packit Service |
2b1f13 |
bits |= HasC;
|
|
Packit Service |
2b1f13 |
NEXT;
|
|
Packit Service |
2b1f13 |
} else {
|
|
Packit Service |
2b1f13 |
len = data->item_length;
|
|
Packit Service |
2b1f13 |
if (IsGL(c)) {
|
|
Packit Service |
2b1f13 |
if ((data->flags & XctShiftMultiGRToGL) &&
|
|
Packit Service |
2b1f13 |
(bits & HasGR))
|
|
Packit Service |
2b1f13 |
break;
|
|
Packit Service |
2b1f13 |
NEXT;
|
|
Packit Service |
2b1f13 |
bits |= HasGL;
|
|
Packit Service |
2b1f13 |
while (IsMore(priv) && IsGL(*priv->ptr)) {
|
|
Packit Service |
2b1f13 |
NEXT;
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
if ((data->GL_char_size > 1) &&
|
|
Packit Service |
2b1f13 |
((data->item_length - len) % data->GL_char_size))
|
|
Packit Service |
2b1f13 |
return XctError;
|
|
Packit Service |
2b1f13 |
} else {
|
|
Packit Service |
2b1f13 |
if ((data->flags & XctShiftMultiGRToGL) &&
|
|
Packit Service |
2b1f13 |
(bits & HasGL))
|
|
Packit Service |
2b1f13 |
break;
|
|
Packit Service |
2b1f13 |
NEXT;
|
|
Packit Service |
2b1f13 |
bits |= HasGR;
|
|
Packit Service |
2b1f13 |
while (IsMore(priv) && IsGR(*priv->ptr)) {
|
|
Packit Service |
2b1f13 |
NEXT;
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
if ((data->GR_char_size > 1) &&
|
|
Packit Service |
2b1f13 |
((data->item_length - len) % data->GR_char_size))
|
|
Packit Service |
2b1f13 |
return XctError;
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
if (!IsMore(priv))
|
|
Packit Service |
2b1f13 |
break;
|
|
Packit Service |
2b1f13 |
c = *priv->ptr;
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
if (data->item_length) {
|
|
Packit Service |
2b1f13 |
if (bits & (HasGL|HasGR)) {
|
|
Packit Service |
2b1f13 |
priv->flags |= UsedGraphic;
|
|
Packit Service |
2b1f13 |
if ((data->horz_depth == 0) &&
|
|
Packit Service |
2b1f13 |
(priv->flags & UsedDirection))
|
|
Packit Service |
2b1f13 |
return XctError;
|
|
Packit Service |
2b1f13 |
if ((data->flags & XctShiftMultiGRToGL) && (bits & HasGR))
|
|
Packit Service |
2b1f13 |
ShiftGRToGL(data, bits & HasC);
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
if ((bits == (HasGL|HasGR)) ||
|
|
Packit Service |
2b1f13 |
(data->GLGR_encoding && !(bits & HasC))) {
|
|
Packit Service |
2b1f13 |
data->encoding = data->GLGR_encoding;
|
|
Packit Service |
2b1f13 |
if (data->GL_char_size == data->GR_char_size)
|
|
Packit Service |
2b1f13 |
data->char_size = data->GL_char_size;
|
|
Packit Service |
2b1f13 |
else
|
|
Packit Service |
2b1f13 |
data->char_size = 0;
|
|
Packit Service |
2b1f13 |
} else if (bits == HasGL) {
|
|
Packit Service |
2b1f13 |
data->encoding = data->GL_encoding;
|
|
Packit Service |
2b1f13 |
data->char_size = data->GL_char_size;
|
|
Packit Service |
2b1f13 |
} else if (bits == HasGR) {
|
|
Packit Service |
2b1f13 |
data->encoding = data->GR_encoding;
|
|
Packit Service |
2b1f13 |
data->char_size = data->GR_char_size;
|
|
Packit Service |
2b1f13 |
} else {
|
|
Packit Service |
2b1f13 |
data->encoding = (char *)NULL;
|
|
Packit Service |
2b1f13 |
data->char_size = 1;
|
|
Packit Service |
2b1f13 |
if ((bits & HasGL) &&
|
|
Packit Service |
2b1f13 |
(data->GL_char_size != data->char_size))
|
|
Packit Service |
2b1f13 |
data->char_size = 0;
|
|
Packit Service |
2b1f13 |
if ((bits & HasGR) &&
|
|
Packit Service |
2b1f13 |
(data->GR_char_size != data->char_size))
|
|
Packit Service |
2b1f13 |
data->char_size = 0;
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
return XctSegment;
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
NEXT;
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
if (data->version <= XctVersion)
|
|
Packit Service |
2b1f13 |
return XctError;
|
|
Packit Service |
2b1f13 |
if (data->flags & XctProvideExtensions)
|
|
Packit Service |
2b1f13 |
return XctExtension;
|
|
Packit Service |
2b1f13 |
if (!data->can_ignore_exts)
|
|
Packit Service |
2b1f13 |
return XctError;
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
return XctEndOfText;
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
/* Free all data associated with an XctDataStructure. */
|
|
Packit Service |
2b1f13 |
void
|
|
Packit Service |
2b1f13 |
XctFree(register XctData data)
|
|
Packit Service |
2b1f13 |
{
|
|
Packit Service |
2b1f13 |
unsigned i;
|
|
Packit Service |
2b1f13 |
register XctPriv priv = data->priv;
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
if (priv->dirstack)
|
|
Packit Service |
2b1f13 |
free((char *)priv->dirstack);
|
|
Packit Service |
2b1f13 |
if (data->flags & XctFreeString)
|
|
Packit Service |
2b1f13 |
free((char *)data->total_string);
|
|
Packit Service |
2b1f13 |
for (i = 0; i < priv->enc_count; i++)
|
|
Packit Service |
2b1f13 |
free(priv->encodings[i]);
|
|
Packit Service |
2b1f13 |
if (priv->encodings)
|
|
Packit Service |
2b1f13 |
free((char *)priv->encodings);
|
|
Packit Service |
2b1f13 |
if (priv->itembuf)
|
|
Packit Service |
2b1f13 |
free((char *)priv->itembuf);
|
|
Packit Service |
2b1f13 |
free((char *)data);
|
|
Packit Service |
2b1f13 |
}
|