2 * Copyright 1992, 1993 by TOSHIBA Corp.
4 * Permission to use, copy, modify, and distribute this software and its
5 * documentation for any purpose and without fee is hereby granted, provided
6 * that the above copyright notice appear in all copies and that both that
7 * copyright notice and this permission notice appear in supporting
8 * documentation, and that the name of TOSHIBA not be used in advertising
9 * or publicity pertaining to distribution of the software without specific,
10 * written prior permission. TOSHIBA make no representations about the
11 * suitability of this software for any purpose. It is provided "as is"
12 * without express or implied warranty.
14 * TOSHIBA DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
15 * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
16 * TOSHIBA BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
17 * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
18 * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
19 * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
22 * Author: Katsuhisa Yano TOSHIBA Corp.
23 * mopi@osa.ilab.toshiba.co.jp
26 * (c) Copyright 1995 FUJITSU LIMITED
27 * This is source code modified by FUJITSU LIMITED under the Joint
28 * Development Agreement for the CDE/Motif PST.
36 #include "XlcGeneric.h"
38 static XLCd create (const char *name, XLCdMethods methods);
39 static Bool initialize (XLCd lcd);
40 static void destroy (XLCd lcd);
42 static XLCdPublicMethodsRec genericMethods = {
43 { NULL }, /* use default methods */
53 XLCdMethods _XlcGenericMethods = (XLCdMethods) &genericMethods;
61 XLCdPublicMethods new;
63 lcd = Xcalloc(1, sizeof(XLCdRec));
67 lcd->core = Xcalloc(1, sizeof(XLCdGenericRec));
68 if (lcd->core == NULL)
71 new = (XLCdPublicMethods) Xmalloc(sizeof(XLCdPublicMethodsRec));
74 memcpy(new,methods,sizeof(XLCdPublicMethodsRec));
75 lcd->methods = (XLCdMethods) new;
104 value = strtol(str + 2, &next, base);
105 if (str + 2 != next) {
106 *((unsigned char *) encoding++) = (unsigned char) value;
111 *encoding++ = *str++;
122 unsigned long *value)
124 const char *tmp1 = str;
127 if (*tmp1++ != '\\') {
145 *value = (unsigned long) strtol(tmp1, NULL, base);
155 XlcCharSet *new_list;
158 if ((num = codeset->num_charsets))
159 new_list = (XlcCharSet *) Xrealloc(codeset->charset_list,
160 (num + 1) * sizeof(XlcCharSet));
162 new_list = (XlcCharSet *) Xmalloc(sizeof(XlcCharSet));
164 if (new_list == NULL)
167 new_list[num] = charset;
168 codeset->charset_list = new_list;
169 codeset->num_charsets = num + 1;
176 XLCdGenericPart *gen)
178 CodeSet new, *new_list;
181 new = Xcalloc(1, sizeof(CodeSetRec));
185 if ((num = gen->codeset_num))
186 new_list = (CodeSet *) Xrealloc(gen->codeset_list,
187 (num + 1) * sizeof(CodeSet));
189 new_list = (CodeSet *) Xmalloc(sizeof(CodeSet));
191 if (new_list == NULL)
195 gen->codeset_list = new_list;
196 gen->codeset_num = num + 1;
208 XLCdGenericPart *gen,
210 const char *encoding,
213 ParseInfo new, *new_list;
218 str = strdup(encoding);
222 new = Xcalloc(1, sizeof(ParseInfoRec));
226 if (gen->mb_parse_table == NULL) {
227 gen->mb_parse_table = Xcalloc(1, 256); /* 2^8 */
228 if (gen->mb_parse_table == NULL)
232 if ((num = gen->mb_parse_list_num))
233 new_list = (ParseInfo *) Xrealloc(gen->mb_parse_list,
234 (num + 2) * sizeof(ParseInfo));
236 new_list = (ParseInfo *) Xmalloc(2 * sizeof(ParseInfo));
239 if (new_list == NULL)
243 new_list[num + 1] = NULL;
244 gen->mb_parse_list = new_list;
245 gen->mb_parse_list_num = num + 1;
247 ch = (unsigned char) *str;
248 if (gen->mb_parse_table[ch] == 0)
249 gen->mb_parse_table[ch] = num + 1;
253 new->codeset = codeset;
255 if (codeset->parse_info == NULL)
256 codeset->parse_info = new;
272 XLCdGenericPart *gen = XLC_GENERIC_PART(lcd);
273 ParseInfo *parse_info;
276 if (gen->mb_parse_table)
277 Xfree(gen->mb_parse_table);
278 if ((num = gen->mb_parse_list_num) > 0) {
279 for (parse_info = gen->mb_parse_list; num-- > 0; parse_info++) {
280 if ((*parse_info)->encoding)
281 Xfree((*parse_info)->encoding);
284 Xfree(gen->mb_parse_list);
287 if ((num = gen->codeset_num) > 0)
288 Xfree(gen->codeset_list);
293 #define FORWARD (unsigned long)'+'
294 #define BACKWARD (unsigned long)'-'
301 unsigned long start = 0;
302 unsigned long end = 0;
303 unsigned long dest = 0;
304 unsigned long shift = 0;
305 unsigned long direction = 0;
306 sscanf(str,"[\\x%lx,\\x%lx]->\\x%lx", &start, &end, &dest);
309 shift = dest - start;
310 direction = FORWARD ;
312 shift = start - dest;
313 direction = BACKWARD;
323 if (*str == ',' && *(str+1) == '[')
336 for (ptr=str; *ptr; ptr++) {
350 FontScope scope,sc_ptr;
353 num = count_scopemap(str);
354 scope = (FontScope) Xmalloc(num * sizeof(FontScopeRec));
358 for (i=0, str_sc=str, sc_ptr=scope; i < num; i++, sc_ptr++) {
359 str_sc = getscope(str_sc, sc_ptr);
373 for (i = 0; i < num; i++)
374 fprintf(stderr, "%s value[%d] = %s\n", str, i, value[i]);
386 fprintf(stderr, "dmpscope %s\n", name);
387 for (i=0; i<num; i++)
388 fprintf(stderr,"%x %x %x %x \n",
392 sc[i].shift_direction);
393 fprintf(stderr, "dmpscope end\n");
405 charset = _XlcGetCharSet(name);
406 if (charset == NULL &&
407 (charset = _XlcCreateDefaultCharSet(name, ""))) {
408 _XlcAddCharSet(charset);
410 charset->source = CSsrcXLC;
418 XLCdGenericPart *gen)
421 char csd[16], cset_name[256];
426 XlcSide side = XlcUnknown;
429 for (i=0; ; i++) { /* loop start */
431 sprintf(csd, "csd%d", i);
434 sprintf(name, "%s.%s", csd, "charset_name");
435 _XlcGetResource(lcd, "XLC_CHARSET_DEFINE", name, &value, &num);
436 _XlcDbg_printValue(name,value,num);
438 /* hackers will get truncated -- C'est la vie */
439 strncpy(cset_name,value[0], sizeof cset_name - 1);
440 cset_name[(sizeof cset_name) - 1] = '\0';
441 sprintf(name, "%s.%s", csd , "side");
442 _XlcGetResource(lcd, "XLC_CHARSET_DEFINE", name, &value, &num);
444 _XlcDbg_printValue(name,value,num);
445 if (!_XlcNCompareISOLatin1(value[0], "none", 4)) {
447 } else if (!_XlcNCompareISOLatin1(value[0], "GL", 2)) {
449 strcat(cset_name,":GL");
452 strcat(cset_name,":GR");
454 if (charsetd == NULL &&
455 (charsetd = srch_charset_define(cset_name,&new)) == NULL)
465 tmp = strdup(cset_name);
468 charsetd->name = tmp;
471 charsetd->side = side ;
473 sprintf(name, "%s.%s", csd, "length");
474 _XlcGetResource(lcd, "XLC_CHARSET_DEFINE", name, &value, &num);
476 _XlcDbg_printValue(name,value,num);
477 charsetd->char_size = atoi(value[0]);
480 sprintf(name, "%s.%s", csd, "gc_number");
481 _XlcGetResource(lcd, "XLC_CHARSET_DEFINE", name, &value, &num);
483 _XlcDbg_printValue(name,value,num);
484 charsetd->set_size = atoi(value[0]);
486 /* string_encoding */
487 sprintf(name, "%s.%s", csd, "string_encoding");
488 _XlcGetResource(lcd, "XLC_CHARSET_DEFINE", name, &value, &num);
490 _XlcDbg_printValue(name,value,num);
491 if (!strcmp("False",value[0])) {
492 charsetd->string_encoding = False;
494 charsetd->string_encoding = True;
498 sprintf(name, "%s.%s", csd, "sequence");
499 _XlcGetResource(lcd, "XLC_CHARSET_DEFINE", name, &value, &num);
501 _XlcDbg_printValue(name,value,num);
503 if (charsetd->ct_sequence) {
504 Xfree(charsetd->ct_sequence);
507 tmp = (char *)Xmalloc(strlen(value[0])+1);
510 charsetd->ct_sequence = tmp;
511 string_to_encoding(value[0],tmp);
514 sprintf(name, "%s.%s", csd, "encoding_name");
515 _XlcGetResource(lcd, "XLC_CHARSET_DEFINE", name, &value, &num);
517 _XlcDbg_printValue(name,value,num);
519 if (charsetd->encoding_name) {
520 Xfree(charsetd->encoding_name);
523 tmp = strdup(value[0]);
524 charsetd->encoding_name = tmp;
525 charsetd->xrm_encoding_name = XrmStringToQuark(tmp);
527 _XlcAddCT(charsetd->name, charsetd->ct_sequence);
533 XLCdGenericPart *gen)
538 if ((num = gen->segment_conv_num) > 0) {
539 new_list = (SegConv) Xrealloc(gen->segment_conv,
540 (num + 1) * sizeof(SegConvRec));
542 new_list = (SegConv) Xmalloc(sizeof(SegConvRec));
545 if (new_list == NULL)
548 gen->segment_conv = new_list;
549 gen->segment_conv_num = num + 1;
551 return &new_list[num];
556 read_segmentconversion(
558 XLCdGenericPart *gen)
566 for (i=0 ; ; i++) { /* loop start */
568 sprintf(conv, "conv%d", i);
571 sprintf(name, "%s.%s", conv, "length");
572 _XlcGetResource(lcd, "XLC_SEGMENTCONVERSION", name, &value, &num);
574 if (conversion == NULL &&
575 (conversion = add_conversion(gen)) == NULL) {
578 _XlcDbg_printValue(name,value,num);
585 conversion->length = atoi(value[0]);
587 /* source_encoding */
588 sprintf(name, "%s.%s", conv, "source_encoding");
589 _XlcGetResource(lcd, "XLC_SEGMENTCONVERSION", name, &value, &num);
592 _XlcDbg_printValue(name,value,num);
593 tmp = strdup(value[0]);
596 conversion->source_encoding = tmp;
597 conversion->source = srch_charset_define(tmp,&new);
599 /* destination_encoding */
600 sprintf(name, "%s.%s", conv, "destination_encoding");
601 _XlcGetResource(lcd, "XLC_SEGMENTCONVERSION", name, &value, &num);
604 _XlcDbg_printValue(name,value,num);
605 tmp = strdup(value[0]);
608 conversion->destination_encoding = tmp;
609 conversion->dest = srch_charset_define(tmp,&new);
612 sprintf(name, "%s.%s", conv, "range");
613 _XlcGetResource(lcd, "XLC_SEGMENTCONVERSION", name, &value, &num);
615 _XlcDbg_printValue(name,value,num);
616 sscanf(value[0],"\\x%lx,\\x%lx",
617 &(conversion->range.start), &(conversion->range.end));
620 sprintf(name, "%s.%s", conv, "conversion");
621 _XlcGetResource(lcd, "XLC_SEGMENTCONVERSION", name, &value, &num);
623 _XlcDbg_printValue(name,value,num);
625 _XlcParse_scopemaps(value[0],&conversion->conv_num);
637 char* cset_name = NULL;
640 ret = (ExtdSegment)Xmalloc(sizeof(ExtdSegmentRec));
643 ret->name = strdup(value[0]);
644 if (ret->name == NULL) {
648 cset_name = (char*) Xmalloc (strlen(ret->name) + 1);
649 if (cset_name == NULL) {
654 if (strchr(value[0],':')) {
655 ptr = strchr(ret->name,':');
658 if (!_XlcNCompareISOLatin1(ptr, "GL", 2)) {
660 sprintf(cset_name,"%s:%s",ret->name,"GL");
663 sprintf(cset_name,"%s:%s",ret->name,"GR");
667 strcpy(cset_name,ret->name);
669 ret->area = (FontScope)Xmalloc((num - 1)*sizeof(FontScopeRec));
670 if (ret->area == NULL) {
676 ret->area_num = num - 1;
678 for (i = 1; i < num; i++) {
679 sscanf(value[i],"\\x%lx,\\x%lx",
680 &scope[i-1].start, &scope[i-1].end);
682 ret->charset = srch_charset_define(cset_name,&new);
693 XLCdGenericPart *gen = XLC_GENERIC_PART(lcd);
701 gen->codeset_num = 0;
703 /***** wc_encoding_mask *****/
704 _XlcGetResource(lcd, "XLC_XLOCALE", "wc_encoding_mask", &value, &num);
706 if (string_to_ulong(value[0], &l) == False)
708 gen->wc_encode_mask = l;
710 /***** wc_shift_bits *****/
711 _XlcGetResource(lcd, "XLC_XLOCALE", "wc_shift_bits", &value, &num);
713 gen->wc_shift_bits = atoi(value[0]);
714 if (gen->wc_shift_bits < 1)
715 gen->wc_shift_bits = 8;
716 /***** use_stdc_env *****/
717 _XlcGetResource(lcd, "XLC_XLOCALE", "use_stdc_env", &value, &num);
718 if (num > 0 && !_XlcCompareISOLatin1(value[0], "True"))
719 gen->use_stdc_env = True;
721 gen->use_stdc_env = False;
722 /***** force_convert_to_mb *****/
723 _XlcGetResource(lcd, "XLC_XLOCALE", "force_convert_to_mb", &value, &num);
724 if (num > 0 && !_XlcCompareISOLatin1(value[0], "True"))
725 gen->force_convert_to_mb = True;
727 gen->force_convert_to_mb = False;
730 CodeSetRec *codeset = NULL;
734 sprintf(cs, "cs%d", i);
736 /***** codeset.side *****/
737 sprintf(name, "%s.%s", cs , "side");
738 _XlcGetResource(lcd, "XLC_XLOCALE", name, &value, &num);
742 if (codeset == NULL && (codeset = add_codeset(gen)) == NULL)
746 if (!_XlcNCompareISOLatin1(value[0], "none", 4)) {
747 codeset->side = XlcNONE;
748 } else if (!_XlcNCompareISOLatin1(value[0], "GL", 2)) {
749 codeset->side = XlcGL;
751 codeset->side = XlcGR;
754 tmp = strrchr(value[0], ':');
755 if (tmp != NULL && !_XlcCompareISOLatin1(tmp + 1, "Default")) {
756 if (codeset->side == XlcGR)
757 gen->initial_state_GR = codeset;
759 gen->initial_state_GL = codeset;
763 /***** codeset.length *****/
764 sprintf(name, "%s.%s", cs , "length");
765 _XlcGetResource(lcd, "XLC_XLOCALE", name, &value, &num);
767 if (codeset == NULL && (codeset = add_codeset(gen)) == NULL)
769 codeset->length = atoi(value[0]);
770 if (codeset->length < 1)
774 /***** codeset.mb_encoding *****/
775 sprintf(name, "%s.%s", cs, "mb_encoding");
776 _XlcGetResource(lcd, "XLC_XLOCALE", name, &value, &num);
789 if (codeset == NULL && (codeset = add_codeset(gen)) == NULL)
791 for ( ; num-- > 0; value++) {
794 EncodingType type = E_SS; /* for BC */
795 for (j = 0; shifts[j].str; j++) {
796 if (!_XlcNCompareISOLatin1(tmp, shifts[j].str,
797 strlen(shifts[j].str))) {
798 type = shifts[j].type;
799 tmp += strlen(shifts[j].str);
803 if (strlen (tmp) > sizeof encoding ||
804 string_to_encoding(tmp, encoding) == False)
806 add_parse_list(gen, type, encoding, codeset);
810 /***** codeset.wc_encoding *****/
811 sprintf(name, "%s.%s", cs, "wc_encoding");
812 _XlcGetResource(lcd, "XLC_XLOCALE", name, &value, &num);
814 if (codeset == NULL && (codeset = add_codeset(gen)) == NULL)
816 if (string_to_ulong(value[0], &l) == False)
818 codeset->wc_encoding = l;
821 /***** codeset.ct_encoding *****/
822 sprintf(name, "%s.%s", cs, "ct_encoding");
823 _XlcGetResource(lcd, "XLC_XLOCALE", name, &value, &num);
827 if (codeset == NULL && (codeset = add_codeset(gen)) == NULL)
829 for ( ; num-- > 0; value++) {
830 if (strlen (*value) > sizeof name)
832 string_to_encoding(*value, name);
834 if ((encoding = strchr(name, ':')) &&
835 (encoding = strchr(encoding + 1, ':'))) {
837 charset = _XlcAddCT(name, encoding);
839 if (charset == NULL) {
840 charset = _XlcGetCharSet(name);
841 if (charset == NULL &&
842 (charset = _XlcCreateDefaultCharSet(name, ""))) {
843 charset->side = codeset->side;
844 charset->char_size = codeset->length;
845 _XlcAddCharSet(charset);
849 if (add_charset(codeset, charset) == False)
859 /***** 3.4.2 byteM (1 <= M <= length)*****/
860 for (M=1; M-1 < codeset->length; M++) {
861 unsigned long start,end;
864 sprintf(name,"%s.%s%d",cs,"byte",M);
865 _XlcGetResource(lcd, "XLC_XLOCALE", name, &value, &num);
869 codeset->byteM = NULL;
873 (ByteInfoListRec *)Xmalloc(
874 (codeset->length)*sizeof(ByteInfoListRec));
875 if (codeset->byteM == NULL) {
881 _XlcDbg_printValue(name,value,num);
882 (codeset->byteM)[M-1].M = M;
883 (codeset->byteM)[M-1].byteinfo_num = num;
884 (codeset->byteM)[M-1].byteinfo =
885 (ByteInfo)Xmalloc( num * sizeof(ByteInfoRec));
886 for (ii = 0 ; ii < num ; ii++) {
887 tmpb = (codeset->byteM)[M-1].byteinfo ;
888 /* default 0x00 - 0xff */
889 sscanf(value[ii],"\\x%lx,\\x%lx",&start,&end);
890 tmpb[ii].start = (unsigned char)start;
891 tmpb[ii].end = (unsigned char)end;
898 /***** codeset.mb_conversion *****/
899 sprintf(name, "%s.%s", cs, "mb_conversion");
900 _XlcGetResource(lcd, "XLC_XLOCALE", name, &value, &num);
902 _XlcDbg_printValue(name,value,num);
903 codeset->mbconv = Xmalloc(sizeof(ConversionRec));
904 codeset->mbconv->convlist =
905 _XlcParse_scopemaps(value[0],&(codeset->mbconv->conv_num));
906 dmpscope("mb_conv",codeset->mbconv->convlist,
907 codeset->mbconv->conv_num);
908 /* [\x%x,\x%x]->\x%x,... */
910 /***** codeset.ct_conversion *****/
911 sprintf(name, "%s.%s", cs, "ct_conversion");
912 _XlcGetResource(lcd, "XLC_XLOCALE", name, &value, &num);
914 _XlcDbg_printValue(name,value,num);
915 codeset->ctconv = Xmalloc(sizeof(ConversionRec));
916 codeset->ctconv->convlist =
917 _XlcParse_scopemaps(value[0],&(codeset->ctconv->conv_num));
918 dmpscope("ctconv",codeset->ctconv->convlist,
919 codeset->ctconv->conv_num);
920 /* [\x%x,\x%x]->\x%x,... */
922 /***** codeset.ct_conversion_file *****/
923 sprintf(name, "%s.%s", cs, "ct_conversion_file");
924 _XlcGetResource(lcd, "XLC_XLOCALE", name, &value, &num);
926 _XlcDbg_printValue(name,value,num);
927 /* [\x%x,\x%x]->\x%x,... */
929 /***** codeset.ct_extended_segment *****/
930 sprintf(name, "%s.%s", cs, "ct_extended_segment");
931 _XlcGetResource(lcd, "XLC_XLOCALE", name, &value, &num);
933 _XlcDbg_printValue(name,value,num);
934 codeset->ctextseg = create_ctextseg(value,num);
935 /* [\x%x,\x%x]->\x%x,... */
941 read_charset_define(lcd,gen); /* For VW/UDC */
942 read_segmentconversion(lcd,gen); /* For VW/UDC */
944 if (gen->initial_state_GL == NULL) {
946 for (i = 0; i < gen->codeset_num; i++) {
947 codeset = gen->codeset_list[i];
948 if (codeset->side == XlcGL)
949 gen->initial_state_GL = codeset;
953 if (gen->initial_state_GR == NULL) {
955 for (i = 0; i < gen->codeset_num; i++) {
956 codeset = gen->codeset_list[i];
957 if (codeset->side == XlcGR)
958 gen->initial_state_GR = codeset;
962 for (i = 0; i < gen->codeset_num; i++) {
963 CodeSetRec *codeset = gen->codeset_list[i];
964 for (ii = 0; ii < codeset->num_charsets; ii++) {
965 charset = codeset->charset_list[ii];
966 if (! strcmp(charset->encoding_name, "ISO8859-1"))
967 charset->string_encoding = True;
968 if ( charset->string_encoding )
969 codeset->string_encoding = True;
980 #ifdef USE_DYNAMIC_LC
981 /* override the open_om and open_im methods which were set by
982 super_class's initialize method() */
988 _XInitDynamicOM(lcd);
990 _XInitDynamicIM(lcd);
999 XLCdPublicMethods superclass = (XLCdPublicMethods) _XlcPublicMethods;
1001 XLC_PUBLIC_METHODS(lcd)->superclass = superclass;
1003 #ifdef _FIX_MEM_LEAK_
1004 //BUGFIX: Memory leak
1005 lcd->methods->close = destroy;
1008 if (superclass->pub.initialize) {
1009 if ((*superclass->pub.initialize)(lcd) == False)
1013 #ifdef USE_DYNAMIC_LC
1014 if (initialize_core(lcd) == False)
1018 if (load_generic(lcd) == False)
1024 /* VW/UDC start 95.01.08 */
1031 if (codeset->byteM == NULL) {
1034 blst = codeset->byteM;
1035 for (i = 0; i < codeset->length; i++) {
1036 if (blst[i].byteinfo) {
1037 Xfree(blst[i].byteinfo);
1038 blst[i].byteinfo = NULL;
1041 Xfree(codeset->byteM);
1042 codeset->byteM = NULL;
1049 Conversion mbconv,ctconv;
1050 if (codeset->mbconv) {
1051 mbconv = codeset->mbconv;
1053 if (mbconv->convlist) {
1054 Xfree(mbconv->convlist);
1055 mbconv->convlist = NULL;
1058 codeset->mbconv = NULL;
1060 if (codeset->ctconv) {
1061 ctconv = codeset->ctconv;
1063 if (ctconv->convlist) {
1064 Xfree(ctconv->convlist);
1065 ctconv->convlist = NULL;
1068 codeset->ctconv = NULL;
1076 ExtdSegment ctextseg;
1077 if (codeset->ctextseg == NULL) {
1080 ctextseg = codeset->ctextseg;
1081 if (ctextseg->name) {
1082 Xfree(ctextseg->name);
1083 ctextseg->name = NULL;
1085 if (ctextseg->area) {
1086 Xfree(ctextseg->area);
1087 ctextseg->area = NULL;
1089 Xfree(codeset->ctextseg);
1090 codeset->ctextseg = NULL;
1097 ParseInfo parse_info;
1098 if (codeset->parse_info == NULL) {
1101 parse_info = codeset->parse_info;
1102 if (parse_info->encoding) {
1103 Xfree(parse_info->encoding);
1104 parse_info->encoding = NULL;
1106 Xfree(codeset->parse_info);
1107 codeset->parse_info = NULL;
1111 destroy_CodeSetList(
1112 XLCdGenericPart *gen)
1114 CodeSet *codeset = gen->codeset_list;
1116 if (gen->codeset_num == 0) {
1119 for (i=0;i<gen->codeset_num;i++) {
1120 freeByteM(codeset[i]);
1121 freeConversion(codeset[i]);
1122 freeExtdSegment(codeset[i]);
1123 freeParseInfo(codeset[i]);
1124 if (codeset[i]->charset_list) {
1125 Xfree(codeset[i]->charset_list);
1126 codeset[i]->charset_list = NULL;
1128 Xfree(codeset[i]); codeset[i]=NULL;
1130 Xfree(codeset); gen->codeset_list = NULL;
1135 XLCdGenericPart *gen)
1137 SegConv seg = gen->segment_conv;
1139 if (gen->segment_conv_num == 0) {
1142 for (i=0;i<gen->segment_conv_num;i++) {
1143 if (seg[i].source_encoding) {
1144 Xfree(seg[i].source_encoding);
1145 seg[i].source_encoding = NULL;
1147 if (seg[i].destination_encoding) {
1148 Xfree(seg[i].destination_encoding);
1149 seg[i].destination_encoding = NULL;
1152 Xfree(seg[i].conv); seg[i].conv = NULL;
1155 Xfree(seg); gen->segment_conv = NULL;
1162 XLCdGenericPart *gen = XLC_GENERIC_PART(lcd);
1163 destroy_SegConv(gen);
1164 destroy_CodeSetList(gen);
1165 if (gen->mb_parse_table) {
1166 Xfree(gen->mb_parse_table);
1167 gen->mb_parse_table = NULL;
1169 if (gen->mb_parse_list) {
1170 Xfree(gen->mb_parse_list);
1171 gen->mb_parse_list = NULL;
1174 /* VW/UDC end 95.01.08 */
1180 XLCdPublicMethods superclass = XLC_PUBLIC_METHODS(lcd)->superclass;
1182 destroy_gen(lcd); /* ADD 1996.01.08 */
1183 if (superclass && superclass->pub.destroy)
1184 (*superclass->pub.destroy)(lcd);