1526 lines
40 KiB
C
1526 lines
40 KiB
C
|
/*++
|
||
|
|
||
|
Copyright (c) 1991-1999, Microsoft Corporation All rights reserved.
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
alloc.c
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
This file contains functions that will allocate the necessary memory
|
||
|
blocks.
|
||
|
|
||
|
External Routines in this file:
|
||
|
AllocateMB
|
||
|
AllocateGlyph
|
||
|
AllocateTopDBCS
|
||
|
AllocateDBCS
|
||
|
AllocateWCTable
|
||
|
Allocate8
|
||
|
Insert844
|
||
|
Insert844Map
|
||
|
AllocateTemp844
|
||
|
AllocateCTMap
|
||
|
AllocateGrid
|
||
|
AllocateLangException
|
||
|
AllocateLangExceptionNodes
|
||
|
AllocateSortDefault
|
||
|
AllocateReverseDW
|
||
|
AllocateDoubleCompression
|
||
|
AllocateIdeographLcid
|
||
|
AllocateExpansion
|
||
|
AllocateCompression
|
||
|
AllocateCompression2Nodes
|
||
|
AllocateCompression3Nodes
|
||
|
AllocateException
|
||
|
AllocateExceptionNodes
|
||
|
AllocateMultipleWeights
|
||
|
AllocateIdeographExceptions
|
||
|
Free844
|
||
|
FreeCTMap
|
||
|
|
||
|
Revision History:
|
||
|
|
||
|
07-30-91 JulieB Created.
|
||
|
03-10-00 lguindon Add explicit typecast to remove build errors
|
||
|
--*/
|
||
|
|
||
|
|
||
|
|
||
|
//
|
||
|
// Include Files.
|
||
|
//
|
||
|
|
||
|
#include "nlstrans.h"
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
//
|
||
|
// Forward Declarations.
|
||
|
//
|
||
|
|
||
|
CT_MAP_VALUE
|
||
|
MapTrioToByte(
|
||
|
PCT_MAP pMap,
|
||
|
WORD Value1,
|
||
|
WORD Value2,
|
||
|
WORD Value3);
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
//-------------------------------------------------------------------------//
|
||
|
// EXTERNAL ROUTINES //
|
||
|
//-------------------------------------------------------------------------//
|
||
|
|
||
|
|
||
|
////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// AllocateMB
|
||
|
//
|
||
|
// This routine allocates all structures needed for the MB table.
|
||
|
// If an error is encountered while allocating, an error is returned.
|
||
|
//
|
||
|
// 07-30-91 JulieB Created.
|
||
|
// 12-10-91 JulieB Modified for new table format.
|
||
|
////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
int AllocateMB(
|
||
|
PCODEPAGE pCP)
|
||
|
{
|
||
|
//
|
||
|
// Allocate MB Table buffer.
|
||
|
// Set all entries in MB Table to zero.
|
||
|
//
|
||
|
if ((pCP->pMB = (PMB_TBL)malloc(MB_TABLE_SIZE * sizeof(WORD))) == NULL)
|
||
|
{
|
||
|
printf("Error: Can't allocate buffer.\n");
|
||
|
return (1);
|
||
|
}
|
||
|
memset(pCP->pMB, 0, MB_TABLE_SIZE * sizeof(WORD));
|
||
|
|
||
|
//
|
||
|
// Return success.
|
||
|
//
|
||
|
return (0);
|
||
|
}
|
||
|
|
||
|
|
||
|
////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// AllocateGlyph
|
||
|
//
|
||
|
// This routine allocates all structures needed for the Glyph table.
|
||
|
// If an error is encountered while allocating, an error is returned.
|
||
|
// All entries in the glyph table are set equal to the entries in the
|
||
|
// MB table. If the MB table has not been read in yet, then an error
|
||
|
// is returned.
|
||
|
//
|
||
|
// 06-02-92 JulieB Created.
|
||
|
////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
int AllocateGlyph(
|
||
|
PCODEPAGE pCP)
|
||
|
{
|
||
|
int ctr; // loop counter
|
||
|
|
||
|
|
||
|
//
|
||
|
// Allocate Glyph Table buffer.
|
||
|
//
|
||
|
if ((pCP->pGlyph = (PGLYPH_TBL)malloc( GLYPH_TABLE_SIZE *
|
||
|
sizeof(WORD) )) == NULL)
|
||
|
{
|
||
|
printf("Error: Can't allocate buffer.\n");
|
||
|
return (1);
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Make sure the MB table has already been read in at this point.
|
||
|
//
|
||
|
if ((!(pCP->WriteFlags & F_MB)) || (pCP->pMB == NULL))
|
||
|
{
|
||
|
printf("Parse Error: MBTABLE must be BEFORE GLYPHTABLE in file.\n");
|
||
|
return (1);
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Set all entries in the Glyph Table to the MB Table entries.
|
||
|
// All new glyph values will overwrite the appropriate MB entries
|
||
|
// in the glyph table.
|
||
|
//
|
||
|
for (ctr = 0; ((ctr < GLYPH_TABLE_SIZE) && (ctr < MB_TABLE_SIZE)); ctr++)
|
||
|
{
|
||
|
(pCP->pGlyph)[ctr] = (pCP->pMB)[ctr];
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Return success.
|
||
|
//
|
||
|
return (0);
|
||
|
}
|
||
|
|
||
|
|
||
|
////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// AllocateTopDBCS
|
||
|
//
|
||
|
// This routine allocates the initial DBCS array structure. If an error
|
||
|
// is encountered while allocating, an error is returned.
|
||
|
//
|
||
|
// 07-30-91 JulieB Created.
|
||
|
// 12-10-91 JulieB Modified for new table format.
|
||
|
////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
int AllocateTopDBCS(
|
||
|
PCODEPAGE pCP,
|
||
|
int Size)
|
||
|
{
|
||
|
//
|
||
|
// Allocate initial DBCS array structure.
|
||
|
//
|
||
|
if ((pCP->pDBCS = (PDBCS_ARRAY)malloc( Size *
|
||
|
sizeof(PDBCS_RANGE) )) == NULL)
|
||
|
{
|
||
|
printf("Error: Can't allocate buffer.\n");
|
||
|
return (1);
|
||
|
}
|
||
|
memset(pCP->pDBCS, 0, Size * sizeof(PDBCS_RANGE));
|
||
|
|
||
|
//
|
||
|
// Allocate offset area.
|
||
|
//
|
||
|
if ((pCP->pDBCSOff = (PDBCS_OFFSETS)malloc( DBCS_OFFSET_SIZE *
|
||
|
sizeof(WORD) )) == NULL)
|
||
|
{
|
||
|
printf("Error: Can't allocate buffer.\n");
|
||
|
return (1);
|
||
|
}
|
||
|
memset(pCP->pDBCSOff, 0, DBCS_OFFSET_SIZE * sizeof(WORD));
|
||
|
|
||
|
//
|
||
|
// Return success.
|
||
|
//
|
||
|
return (0);
|
||
|
}
|
||
|
|
||
|
|
||
|
////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// AllocateDBCS
|
||
|
//
|
||
|
// This routine allocates all structures needed for the DBCS tables and
|
||
|
// ranges. If an error is encountered while allocating, an error is
|
||
|
// returned.
|
||
|
//
|
||
|
// 07-30-91 JulieB Created.
|
||
|
// 12-10-91 JulieB Modified for new table format.
|
||
|
////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
int AllocateDBCS(
|
||
|
PCODEPAGE pCP,
|
||
|
int Low,
|
||
|
int High,
|
||
|
int Index)
|
||
|
{
|
||
|
PDBCS_RANGE pRange; // ptr to DBCS range
|
||
|
PDBCS_TBL_ARRAY pTblArray; // ptr to DBCS table array
|
||
|
int Ctr, Ctr2; // loop counters
|
||
|
int NumTables = High - Low + 1; // number of tables for range
|
||
|
WORD *pWordPtr; // ptr to dbcs buffer
|
||
|
|
||
|
|
||
|
//
|
||
|
// Allocate Range Structure.
|
||
|
//
|
||
|
if ((pRange = (PDBCS_RANGE)malloc(sizeof(DBCS_RANGE))) == NULL)
|
||
|
{
|
||
|
printf("Error: Can't allocate buffer.\n");
|
||
|
return (1);
|
||
|
}
|
||
|
memset(pRange, 0, sizeof(DBCS_RANGE));
|
||
|
|
||
|
//
|
||
|
// Allocate Table Array.
|
||
|
//
|
||
|
if ((pTblArray = (PDBCS_TBL_ARRAY)malloc( NumTables *
|
||
|
sizeof(PDBCS_TBL) )) == NULL)
|
||
|
{
|
||
|
printf("Error: Can't allocate buffer.\n");
|
||
|
return (1);
|
||
|
}
|
||
|
memset(pTblArray, 0, NumTables * sizeof(PDBCS_TBL));
|
||
|
|
||
|
//
|
||
|
// Allocate All Tables.
|
||
|
//
|
||
|
for (Ctr = 0; Ctr < NumTables; Ctr++)
|
||
|
{
|
||
|
//
|
||
|
// Allocate table.
|
||
|
//
|
||
|
if ((pTblArray[Ctr] = (PDBCS_TBL)malloc( DBCS_TABLE_SIZE *
|
||
|
sizeof(WORD) )) == NULL)
|
||
|
{
|
||
|
printf("Error: Can't allocate buffer.\n");
|
||
|
return (1);
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Set all entries to the Unicode default character.
|
||
|
//
|
||
|
pWordPtr = (WORD *)(pTblArray[Ctr]);
|
||
|
for (Ctr2 = 0; Ctr2 < DBCS_TABLE_SIZE; Ctr2++)
|
||
|
{
|
||
|
pWordPtr[Ctr2] = (WORD)(pCP->UniDefaultChar);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Attach the tables to each other.
|
||
|
//
|
||
|
pRange->pDBCSTbls = pTblArray;
|
||
|
(pCP->pDBCS)[Index] = pRange;
|
||
|
|
||
|
//
|
||
|
// Return success.
|
||
|
//
|
||
|
return (0);
|
||
|
}
|
||
|
|
||
|
|
||
|
////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// AllocateWCTable
|
||
|
//
|
||
|
// This routine allocates the buffer for the Unicode to ANSI translation
|
||
|
// table. The buffer is (64K // Size) bytes in length.
|
||
|
//
|
||
|
// 05-28-92 JulieB Created.
|
||
|
////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
int AllocateWCTable(
|
||
|
PCODEPAGE pCP,
|
||
|
int Size)
|
||
|
{
|
||
|
int Ctr; // loop counter
|
||
|
WORD *pWordPtr; // ptr to wide character buffer
|
||
|
|
||
|
|
||
|
//
|
||
|
// Allocate translation table buffer.
|
||
|
//
|
||
|
if ((pCP->pWC = (PWC_ARRAY)malloc(WC_TABLE_SIZE * Size)) == NULL)
|
||
|
{
|
||
|
printf("Error: Can't allocate buffer.\n");
|
||
|
return (1);
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Set all entries to the default character.
|
||
|
//
|
||
|
if (Size == sizeof(BYTE))
|
||
|
{
|
||
|
memset(pCP->pWC, (BYTE)(pCP->DefaultChar), WC_TABLE_SIZE);
|
||
|
}
|
||
|
else if (Size == sizeof(WORD))
|
||
|
{
|
||
|
pWordPtr = pCP->pWC;
|
||
|
for (Ctr = 0; Ctr < WC_TABLE_SIZE; Ctr++)
|
||
|
{
|
||
|
pWordPtr[Ctr] = pCP->DefaultChar;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
printf("Code Error: Bad 'Size' parameter for AllocateWCTable.\n");
|
||
|
return (1);
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Return success.
|
||
|
//
|
||
|
return (0);
|
||
|
}
|
||
|
|
||
|
|
||
|
////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// Allocate8
|
||
|
//
|
||
|
// This routine allocates the top buffer for the 8:4:4 table.
|
||
|
//
|
||
|
// 07-30-91 JulieB Created.
|
||
|
////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
int Allocate8(
|
||
|
P844_ARRAY *pArr)
|
||
|
{
|
||
|
//
|
||
|
// Allocate top buffer for 8:4:4 table - 256 pointers.
|
||
|
//
|
||
|
if ((*pArr = (P844_ARRAY)malloc( TABLE_SIZE_8 *
|
||
|
sizeof(P844_ARRAY) )) == NULL)
|
||
|
{
|
||
|
printf("Error: Can't allocate top 8:4:4 buffer.\n");
|
||
|
return (1);
|
||
|
}
|
||
|
memset(*pArr, 0, TABLE_SIZE_8 * sizeof(P844_ARRAY));
|
||
|
|
||
|
//
|
||
|
// Return success.
|
||
|
//
|
||
|
return (0);
|
||
|
}
|
||
|
|
||
|
|
||
|
////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// Insert844
|
||
|
//
|
||
|
// This routine inserts a WORD or DWORD value into an 8:4:4 table based on
|
||
|
// the Size parameter. It does so by allocating the appropriate buffers
|
||
|
// and filling in the third buffers with the appropriate WORD or DWORD value.
|
||
|
//
|
||
|
// 07-30-91 JulieB Created.
|
||
|
////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
int Insert844(
|
||
|
P844_ARRAY pArr,
|
||
|
WORD WChar,
|
||
|
DWORD Value,
|
||
|
int *cbBuf2,
|
||
|
int *cbBuf3,
|
||
|
int Size)
|
||
|
{
|
||
|
register int Index; // index into array
|
||
|
P844_ARRAY pTbl2; // pointer to second array
|
||
|
P844_ARRAY pTbl3; // pointer to third array
|
||
|
|
||
|
|
||
|
//
|
||
|
// Use the "8" index to get to the second table.
|
||
|
// Allocate it if necessary.
|
||
|
//
|
||
|
Index = GET8(WChar);
|
||
|
if ((pTbl2 = (P844_ARRAY)(pArr[Index])) == NULL)
|
||
|
{
|
||
|
//
|
||
|
// Allocate second table - 16 pointers.
|
||
|
//
|
||
|
if ((pTbl2 = (P844_ARRAY)malloc( TABLE_SIZE_4 *
|
||
|
sizeof(P844_ARRAY) )) == NULL)
|
||
|
{
|
||
|
printf("Error: Can't allocate second 8:4:4 buffer.\n");
|
||
|
return (1);
|
||
|
}
|
||
|
memset(pTbl2, 0, TABLE_SIZE_4 * sizeof(P844_ARRAY));
|
||
|
pArr[Index] = pTbl2;
|
||
|
|
||
|
//
|
||
|
// Keep track of how many "second buffer" allocations were made.
|
||
|
//
|
||
|
(*cbBuf2)++;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Use the "high 4" index to get to the third table.
|
||
|
// Allocate it if necessary.
|
||
|
//
|
||
|
Index = GETHI4(WChar);
|
||
|
if ((pTbl3 = pTbl2[Index]) == NULL)
|
||
|
{
|
||
|
//
|
||
|
// Allocate third table - 16 words.
|
||
|
//
|
||
|
if ((pTbl3 = (P844_ARRAY)malloc(TABLE_SIZE_4 * Size)) == NULL)
|
||
|
{
|
||
|
printf("Error: Can't allocate third 8:4:4 buffer.\n");
|
||
|
return (1);
|
||
|
}
|
||
|
memset(pTbl3, 0, TABLE_SIZE_4 * Size);
|
||
|
pTbl2[Index] = pTbl3;
|
||
|
|
||
|
//
|
||
|
// Keep track of how many "third buffer" allocations were made.
|
||
|
//
|
||
|
(*cbBuf3)++;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Use the "low 4" value to index into the third table.
|
||
|
// Save the value at this spot.
|
||
|
//
|
||
|
Index = GETLO4(WChar);
|
||
|
|
||
|
if (Size == sizeof(WORD))
|
||
|
{
|
||
|
((WORD *)pTbl3)[Index] = (WORD)Value;
|
||
|
}
|
||
|
else if (Size == sizeof(DWORD))
|
||
|
{
|
||
|
((DWORD *)pTbl3)[Index] = (DWORD)Value;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
printf("Code Error: Bad 'Size' parameter for Insert844 Table.\n");
|
||
|
return (1);
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Return success.
|
||
|
//
|
||
|
return (0);
|
||
|
}
|
||
|
|
||
|
|
||
|
////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// Insert844Map
|
||
|
//
|
||
|
// This routine inserts 3 WORD values into an 8:4:4 table. It does so by
|
||
|
// allocating the appropriate buffers and filling in the third buffers
|
||
|
// with a 1 BYTE value that is the mapping of the given 3 WORD trio.
|
||
|
//
|
||
|
// 10-29-93 JulieB Created.
|
||
|
////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
int Insert844Map(
|
||
|
P844_ARRAY pArr,
|
||
|
PCT_MAP pMap,
|
||
|
WORD WChar,
|
||
|
WORD Value1,
|
||
|
WORD Value2,
|
||
|
WORD Value3,
|
||
|
int *cbBuf2,
|
||
|
int *cbBuf3)
|
||
|
{
|
||
|
register int Index; // index into array
|
||
|
P844_ARRAY pTbl2; // pointer to second array
|
||
|
PCT_MAP_VALUE pTbl3; // pointer to third array
|
||
|
|
||
|
|
||
|
//
|
||
|
// Use the "8" index to get to the second table.
|
||
|
// Allocate it if necessary.
|
||
|
//
|
||
|
Index = GET8(WChar);
|
||
|
if ((pTbl2 = (P844_ARRAY)(pArr[Index])) == NULL)
|
||
|
{
|
||
|
//
|
||
|
// Allocate second table - 16 pointers + 1 word.
|
||
|
// The additional 1 word will be used when writing this table
|
||
|
// to avoid duplicates of the same table.
|
||
|
//
|
||
|
if ((pTbl2 = (P844_ARRAY)malloc( (TABLE_SIZE_4 + 1) *
|
||
|
sizeof(P844_ARRAY) )) == NULL)
|
||
|
{
|
||
|
printf("Error: Can't allocate second 8:4:4 buffer.\n");
|
||
|
return (1);
|
||
|
}
|
||
|
memset(pTbl2, 0, (TABLE_SIZE_4 + 1) * sizeof(P844_ARRAY));
|
||
|
pArr[Index] = pTbl2;
|
||
|
|
||
|
//
|
||
|
// Keep track of how many "second buffer" allocations were made.
|
||
|
//
|
||
|
(*cbBuf2)++;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Use the "high 4" index to get to the third table.
|
||
|
// Allocate it if necessary.
|
||
|
//
|
||
|
Index = GETHI4(WChar);
|
||
|
if ((pTbl3 = pTbl2[Index]) == NULL)
|
||
|
{
|
||
|
//
|
||
|
// Allocate third table - 16 + 2 bytes.
|
||
|
// The 2 extra bytes will be used when writing the table.
|
||
|
//
|
||
|
if ((pTbl3 = (PCT_MAP_VALUE)malloc( (TABLE_SIZE_4 + 2) *
|
||
|
(sizeof(CT_MAP_VALUE)) )) == NULL)
|
||
|
{
|
||
|
printf("Error: Can't allocate third 8:4:4 buffer.\n");
|
||
|
return (1);
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// The last field of the third table is used when writing to the
|
||
|
// data file to ensure that each table is written only ONCE
|
||
|
// (with muliple pointers to it). This field takes 1 WORD
|
||
|
// (2 bytes) and is initialized to 0.
|
||
|
//
|
||
|
memset(pTbl3, 0, (TABLE_SIZE_4 + 2) * (sizeof(CT_MAP_VALUE)));
|
||
|
pTbl2[Index] = pTbl3;
|
||
|
|
||
|
//
|
||
|
// Keep track of how many "third buffer" allocations were made.
|
||
|
//
|
||
|
(*cbBuf3)++;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Use the "low 4" value to index into the third table.
|
||
|
// Save the values at this spot.
|
||
|
//
|
||
|
Index = GETLO4(WChar);
|
||
|
|
||
|
//
|
||
|
// Map 3 WORD CType trio to 1 BYTE value.
|
||
|
//
|
||
|
pTbl3[Index] = MapTrioToByte( pMap,
|
||
|
Value1,
|
||
|
Value2,
|
||
|
Value3 );
|
||
|
|
||
|
//
|
||
|
// Make sure the number of entries in the mapping table is
|
||
|
// not greater than MAX_CT_MAP_TBL_SIZE.
|
||
|
//
|
||
|
if (pMap->Length >= MAX_CT_MAP_TBL_SIZE)
|
||
|
{
|
||
|
printf("Error: CTYPE Mapping Table Too Large.\n");
|
||
|
return (1);
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Return success.
|
||
|
//
|
||
|
return (0);
|
||
|
}
|
||
|
|
||
|
|
||
|
////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// AllocateTemp844
|
||
|
//
|
||
|
// This routine allocates the temporary storage buffer for the 8:4:4
|
||
|
// table. This temporary buffer is used when writing to the output file.
|
||
|
// The size of the buffer is (TblSize * Size) bytes in length.
|
||
|
//
|
||
|
// 07-30-91 JulieB Created.
|
||
|
////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
int AllocateTemp844(
|
||
|
PVOID *ppArr,
|
||
|
int TblSize,
|
||
|
int Size)
|
||
|
{
|
||
|
//
|
||
|
// Allocate buffer of size TblSize.
|
||
|
//
|
||
|
if ((*ppArr = (PVOID)malloc(TblSize * Size)) == NULL)
|
||
|
{
|
||
|
printf("Error: Can't allocate temp 8:4:4 buffer.\n");
|
||
|
return (1);
|
||
|
}
|
||
|
memset(*ppArr, 0, TblSize * Size);
|
||
|
|
||
|
//
|
||
|
// Return success.
|
||
|
//
|
||
|
return (0);
|
||
|
}
|
||
|
|
||
|
|
||
|
////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// AllocateCTMap
|
||
|
//
|
||
|
// This routine allocates all structures needed for the ctype mapping table.
|
||
|
// If an error is encountered while allocating, an error is returned.
|
||
|
//
|
||
|
////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
int AllocateCTMap(
|
||
|
PCT_MAP *pMap)
|
||
|
{
|
||
|
//
|
||
|
// Allocate buffer mapping table.
|
||
|
//
|
||
|
if ((*pMap = (PCT_MAP)malloc(sizeof(CT_MAP))) == NULL)
|
||
|
{
|
||
|
printf("Error: Can't allocate buffer for CType Mapping table.\n");
|
||
|
return (1);
|
||
|
}
|
||
|
memset(*pMap, 0, sizeof(CT_MAP));
|
||
|
|
||
|
//
|
||
|
// Allocate mapping table entries.
|
||
|
//
|
||
|
if (((*pMap)->pCTValues = (PCT_VALUES)malloc( MAX_CT_MAP_TBL_SIZE *
|
||
|
sizeof(CT_VALUES) )) == NULL)
|
||
|
{
|
||
|
printf("Error: Can't allocate CType mapping table with %d entries.\n",
|
||
|
MAX_CT_MAP_TBL_SIZE);
|
||
|
return (1);
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Set the first entry to 0 so that any third level table that maps
|
||
|
// to 0 will be C1 = 0, C2 = 0, and C3 = 0.
|
||
|
//
|
||
|
memset((*pMap)->pCTValues, 0, sizeof(CT_VALUES));
|
||
|
(*pMap)->Length = 1;
|
||
|
|
||
|
//
|
||
|
// Return success.
|
||
|
//
|
||
|
return (0);
|
||
|
}
|
||
|
|
||
|
|
||
|
////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// AllocateGrid
|
||
|
//
|
||
|
// This routine allocates the 2D grid for the composite table.
|
||
|
// The size passed in is the number of precomposed entries that need to
|
||
|
// go into the table. Since the exact size of the array is not known yet,
|
||
|
// the maximum possible size is allocated (size squared).
|
||
|
//
|
||
|
// 07-30-91 JulieB Created.
|
||
|
////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
int AllocateGrid(
|
||
|
PCOMP_GRID *pCompGrid,
|
||
|
int TblSize)
|
||
|
{
|
||
|
//
|
||
|
// Allocate 2D grid.
|
||
|
// The size of the grid is the TblSize squared plus one to save the
|
||
|
// size of the grid.
|
||
|
//
|
||
|
if ((*pCompGrid = (PCOMP_GRID)malloc( (TblSize * TblSize + 1) *
|
||
|
sizeof(WORD) )) == NULL)
|
||
|
{
|
||
|
printf("Error: Can't allocate buffer.\n");
|
||
|
return (1);
|
||
|
}
|
||
|
memset(*pCompGrid, 0, (TblSize * TblSize + 1) * sizeof(WORD));
|
||
|
|
||
|
//
|
||
|
// Save the size of the grid in the first spot.
|
||
|
//
|
||
|
(*pCompGrid)[0] = (WORD)TblSize;
|
||
|
|
||
|
//
|
||
|
// Return success.
|
||
|
//
|
||
|
return (0);
|
||
|
}
|
||
|
|
||
|
|
||
|
////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// AllocateLangException
|
||
|
//
|
||
|
// This routine allocates the exception header and the exception table.
|
||
|
// The size of the table is determined by the TblSize parameter. The
|
||
|
// pointer to the header and the table are stored in the language
|
||
|
// structure.
|
||
|
//
|
||
|
// 08-30-95 JulieB Created.
|
||
|
////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
int AllocateLangException(
|
||
|
PLANG_EXCEPT pLangExcept,
|
||
|
int TblSize)
|
||
|
{
|
||
|
//
|
||
|
// Set the number of Exception entries in table.
|
||
|
//
|
||
|
pLangExcept->NumException = TblSize;
|
||
|
|
||
|
//
|
||
|
// Allocate buffer of size TblSize for Exception header.
|
||
|
//
|
||
|
if ((pLangExcept->pExceptHdr =
|
||
|
(PL_EXCEPT_HDR)malloc(TblSize * sizeof(L_EXCEPT_HDR))) == NULL)
|
||
|
{
|
||
|
printf("Error: Can't allocate buffer for Exception Header.\n");
|
||
|
return (1);
|
||
|
}
|
||
|
memset(pLangExcept->pExceptHdr, 0, TblSize * sizeof(L_EXCEPT_HDR));
|
||
|
|
||
|
//
|
||
|
// Allocate buffer of size TblSize for Exception table.
|
||
|
//
|
||
|
if ((pLangExcept->pExceptTbl =
|
||
|
(PL_EXCEPT_TBL)malloc(TblSize * sizeof(PL_EXCEPT_NODE))) == NULL)
|
||
|
{
|
||
|
printf("Error: Can't allocate buffer for Exception table.\n");
|
||
|
return (1);
|
||
|
}
|
||
|
memset(pLangExcept->pExceptTbl, 0, TblSize * sizeof(PL_EXCEPT_NODE));
|
||
|
|
||
|
//
|
||
|
// Return success.
|
||
|
//
|
||
|
return (0);
|
||
|
}
|
||
|
|
||
|
|
||
|
////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// AllocateLangExceptionNodes
|
||
|
//
|
||
|
// This routine allocates the exception nodes for the exception table.
|
||
|
// The size of the table is determined by the TblSize parameter. The
|
||
|
// pointer to the nodes is stored in the exception table at the Index
|
||
|
// given.
|
||
|
//
|
||
|
// 08-30-95 JulieB Created.
|
||
|
////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
int AllocateLangExceptionNodes(
|
||
|
PLANG_EXCEPT pLangExcept,
|
||
|
int TblSize,
|
||
|
int Index)
|
||
|
{
|
||
|
PL_EXCEPT_NODE pExcNode; // ptr to exception node
|
||
|
|
||
|
|
||
|
//
|
||
|
// Allocate buffer of size TblSize for Exception nodes.
|
||
|
//
|
||
|
if ((pExcNode = (PL_EXCEPT_NODE)malloc( TblSize *
|
||
|
sizeof(L_EXCEPT_NODE) )) == NULL)
|
||
|
{
|
||
|
printf("Error: Can't allocate buffer for Exception Nodes.\n");
|
||
|
return (1);
|
||
|
}
|
||
|
memset(pExcNode, 0, TblSize * sizeof(L_EXCEPT_NODE));
|
||
|
|
||
|
//
|
||
|
// Set pointer in exception table.
|
||
|
//
|
||
|
(pLangExcept->pExceptTbl)[Index] = pExcNode;
|
||
|
|
||
|
//
|
||
|
// Return success.
|
||
|
//
|
||
|
return (0);
|
||
|
}
|
||
|
|
||
|
|
||
|
////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// AllocateSortDefault
|
||
|
//
|
||
|
// This routine allocates the sort default table - 64K DWORDS. The pointer
|
||
|
// to the new table is stored in the sortkey structure.
|
||
|
//
|
||
|
// 11-04-92 JulieB Created.
|
||
|
////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
int AllocateSortDefault(
|
||
|
PSORTKEY pSKey)
|
||
|
{
|
||
|
//
|
||
|
// Allocate buffer of size 64K DWORDS for sort default table.
|
||
|
//
|
||
|
if ((pSKey->pDefault = (PSKEY)malloc( SKEY_TBL_SIZE *
|
||
|
sizeof(SKEY) )) == NULL)
|
||
|
{
|
||
|
printf("Error: Can't allocate buffer for sortkey default table.\n");
|
||
|
return (1);
|
||
|
}
|
||
|
memset(pSKey->pDefault, 0, SKEY_TBL_SIZE * sizeof(SKEY));
|
||
|
|
||
|
//
|
||
|
// Return success.
|
||
|
//
|
||
|
return (0);
|
||
|
}
|
||
|
|
||
|
|
||
|
////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// AllocateReverseDW
|
||
|
//
|
||
|
// This routine allocates the reverse diacritic weight table. The size of
|
||
|
// the table is determined by the TblSize parameter. The pointer to the
|
||
|
// new table is stored in the sorttables structure.
|
||
|
//
|
||
|
// 11-04-92 JulieB Created.
|
||
|
////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
int AllocateReverseDW(
|
||
|
PSORT_TABLES pSTbl,
|
||
|
int TblSize)
|
||
|
{
|
||
|
//
|
||
|
// Allocate buffer of size TblSize for RevrseDW table.
|
||
|
//
|
||
|
if ((pSTbl->pReverseDW = (PREV_DW)malloc( TblSize *
|
||
|
sizeof(REV_DW) )) == NULL)
|
||
|
{
|
||
|
printf("Error: Can't allocate buffer for Reverse DW table.\n");
|
||
|
return (1);
|
||
|
}
|
||
|
memset(pSTbl->pReverseDW, 0, TblSize * sizeof(REV_DW));
|
||
|
|
||
|
//
|
||
|
// Set the number of ReverseDW entries in table.
|
||
|
//
|
||
|
pSTbl->NumReverseDW = TblSize;
|
||
|
|
||
|
//
|
||
|
// Return success.
|
||
|
//
|
||
|
return (0);
|
||
|
}
|
||
|
|
||
|
|
||
|
////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// AllocateDoubleCompression
|
||
|
//
|
||
|
// This routine allocates the double compression table. The size of
|
||
|
// the table is determined by the TblSize parameter. The pointer to the
|
||
|
// new table is stored in the sorttables structure.
|
||
|
//
|
||
|
// 11-04-92 JulieB Created.
|
||
|
////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
int AllocateDoubleCompression(
|
||
|
PSORT_TABLES pSTbl,
|
||
|
int TblSize)
|
||
|
{
|
||
|
//
|
||
|
// Allocate buffer of size TblSize for Double Compression table.
|
||
|
//
|
||
|
if ((pSTbl->pDblCompression =
|
||
|
(PDBL_COMPRESS)malloc(TblSize * sizeof(DBL_COMPRESS))) == NULL)
|
||
|
{
|
||
|
printf("Error: Can't allocate buffer for Double Compression table.\n");
|
||
|
return (1);
|
||
|
}
|
||
|
memset(pSTbl->pDblCompression, 0, TblSize * sizeof(DBL_COMPRESS));
|
||
|
|
||
|
//
|
||
|
// Set the number of Double Compression entries in table.
|
||
|
//
|
||
|
pSTbl->NumDblCompression = TblSize;
|
||
|
|
||
|
//
|
||
|
// Return success.
|
||
|
//
|
||
|
return (0);
|
||
|
}
|
||
|
|
||
|
|
||
|
////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// AllocateIdeographLcid
|
||
|
//
|
||
|
// This routine allocates the ideograph lcid table. The size of
|
||
|
// the table is determined by the TblSize parameter. The pointer to the
|
||
|
// new table is stored in the sorttables structure.
|
||
|
//
|
||
|
// 09-01-93 JulieB Created.
|
||
|
////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
int AllocateIdeographLcid(
|
||
|
PSORT_TABLES pSTbl,
|
||
|
int TblSize)
|
||
|
{
|
||
|
//
|
||
|
// Allocate buffer of size TblSize for IdeographLcid table.
|
||
|
//
|
||
|
if ((pSTbl->pIdeographLcid =
|
||
|
(PIDEOGRAPH_LCID)malloc(TblSize * sizeof(IDEOGRAPH_LCID))) == NULL)
|
||
|
{
|
||
|
printf("Error: Can't allocate buffer for Ideograph Lcid table.\n");
|
||
|
return (1);
|
||
|
}
|
||
|
memset(pSTbl->pIdeographLcid, 0, TblSize * sizeof(IDEOGRAPH_LCID));
|
||
|
|
||
|
//
|
||
|
// Set the number of Ideograph Lcid entries in table.
|
||
|
//
|
||
|
pSTbl->NumIdeographLcid = TblSize;
|
||
|
|
||
|
//
|
||
|
// Return success.
|
||
|
//
|
||
|
return (0);
|
||
|
}
|
||
|
|
||
|
|
||
|
////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// AllocateExpansion
|
||
|
//
|
||
|
// This routine allocates the expansion table. The size of
|
||
|
// the table is determined by the TblSize parameter. The pointer to the
|
||
|
// new table is stored in the sorttables structure.
|
||
|
//
|
||
|
// 11-04-92 JulieB Created.
|
||
|
////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
int AllocateExpansion(
|
||
|
PSORT_TABLES pSTbl,
|
||
|
int TblSize)
|
||
|
{
|
||
|
//
|
||
|
// Allocate buffer of size TblSize for Expansion table.
|
||
|
//
|
||
|
if ((pSTbl->pExpansion = (PEXPAND)malloc( TblSize *
|
||
|
sizeof(EXPAND) )) == NULL)
|
||
|
{
|
||
|
printf("Error: Can't allocate buffer for Expansion table.\n");
|
||
|
return (1);
|
||
|
}
|
||
|
memset(pSTbl->pExpansion, 0, TblSize * sizeof(EXPAND));
|
||
|
|
||
|
//
|
||
|
// Set the number of Expansion entries in table.
|
||
|
//
|
||
|
pSTbl->NumExpansion = TblSize;
|
||
|
|
||
|
//
|
||
|
// Return success.
|
||
|
//
|
||
|
return (0);
|
||
|
}
|
||
|
|
||
|
|
||
|
////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// AllocateCompression
|
||
|
//
|
||
|
// This routine allocates the compression header and the compression table.
|
||
|
// The size of the table is determined by the TblSize parameter. The
|
||
|
// pointer to the header and the table are stored in the sorttables
|
||
|
// structure.
|
||
|
//
|
||
|
// 11-04-92 JulieB Created.
|
||
|
////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
int AllocateCompression(
|
||
|
PSORT_TABLES pSTbl,
|
||
|
int TblSize)
|
||
|
{
|
||
|
//
|
||
|
// Set the number of Compression entries in table.
|
||
|
//
|
||
|
pSTbl->NumCompression = TblSize;
|
||
|
|
||
|
//
|
||
|
// Allocate buffer of size TblSize for Compression header.
|
||
|
//
|
||
|
if ((pSTbl->pCompressHdr =
|
||
|
(PCOMPRESS_HDR)malloc(TblSize * sizeof(COMPRESS_HDR))) == NULL)
|
||
|
{
|
||
|
printf("Error: Can't allocate buffer for Compression Header.\n");
|
||
|
return (1);
|
||
|
}
|
||
|
memset(pSTbl->pCompressHdr, 0, TblSize * sizeof(COMPRESS_HDR));
|
||
|
|
||
|
//
|
||
|
// Allocate buffer of size TblSize for Compression 2 table.
|
||
|
//
|
||
|
if ((pSTbl->pCompress2Tbl =
|
||
|
(PCOMPRESS_2_TBL)malloc( TblSize *
|
||
|
sizeof(PCOMPRESS_2_NODE) )) == NULL)
|
||
|
{
|
||
|
printf("Error: Can't allocate buffer for Compression 2 table.\n");
|
||
|
return (1);
|
||
|
}
|
||
|
memset(pSTbl->pCompress2Tbl, 0, TblSize * sizeof(PCOMPRESS_2_NODE));
|
||
|
|
||
|
//
|
||
|
// Allocate buffer of size TblSize for Compression 3 table.
|
||
|
//
|
||
|
if ((pSTbl->pCompress3Tbl =
|
||
|
(PCOMPRESS_3_TBL)malloc( TblSize *
|
||
|
sizeof(PCOMPRESS_3_NODE) )) == NULL)
|
||
|
{
|
||
|
printf("Error: Can't allocate buffer for Compression 3 table.\n");
|
||
|
return (1);
|
||
|
}
|
||
|
memset(pSTbl->pCompress3Tbl, 0, TblSize * sizeof(PCOMPRESS_3_NODE));
|
||
|
|
||
|
//
|
||
|
// Return success.
|
||
|
//
|
||
|
return (0);
|
||
|
}
|
||
|
|
||
|
|
||
|
////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// AllocateCompression2Nodes
|
||
|
//
|
||
|
// This routine allocates the compression 2 nodes for the compression table.
|
||
|
// The size of the table is determined by the TblSize parameter. The
|
||
|
// pointer to the nodes is stored in the compression table at the Index
|
||
|
// given.
|
||
|
//
|
||
|
// 11-04-92 JulieB Created.
|
||
|
////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
int AllocateCompression2Nodes(
|
||
|
PSORT_TABLES pSTbl,
|
||
|
int TblSize,
|
||
|
int Index)
|
||
|
{
|
||
|
PCOMPRESS_2_NODE pCompNode; // ptr to compression 2 node
|
||
|
|
||
|
|
||
|
//
|
||
|
// Allocate buffer of size TblSize for Compression nodes.
|
||
|
//
|
||
|
if ((pCompNode =
|
||
|
(PCOMPRESS_2_NODE)malloc( TblSize *
|
||
|
sizeof(COMPRESS_2_NODE) )) == NULL)
|
||
|
{
|
||
|
printf("Error: Can't allocate buffer for Compression 2 Nodes.\n");
|
||
|
return (1);
|
||
|
}
|
||
|
memset(pCompNode, 0, TblSize * sizeof(COMPRESS_2_NODE));
|
||
|
|
||
|
//
|
||
|
// Set pointer in compression 2 table.
|
||
|
//
|
||
|
(pSTbl->pCompress2Tbl)[Index] = pCompNode;
|
||
|
|
||
|
//
|
||
|
// Return success.
|
||
|
//
|
||
|
return (0);
|
||
|
}
|
||
|
|
||
|
|
||
|
////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// AllocateCompression3Nodes
|
||
|
//
|
||
|
// This routine allocates the compression 3 nodes for the compression table.
|
||
|
// The size of the table is determined by the TblSize parameter. The
|
||
|
// pointer to the nodes is stored in the compression table at the Index
|
||
|
// given.
|
||
|
//
|
||
|
// 11-04-92 JulieB Created.
|
||
|
////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
int AllocateCompression3Nodes(
|
||
|
PSORT_TABLES pSTbl,
|
||
|
int TblSize,
|
||
|
int Index)
|
||
|
{
|
||
|
PCOMPRESS_3_NODE pCompNode; // ptr to compression 3 node
|
||
|
|
||
|
|
||
|
//
|
||
|
// Allocate buffer of size TblSize for Compression nodes.
|
||
|
//
|
||
|
if ((pCompNode =
|
||
|
(PCOMPRESS_3_NODE)malloc( TblSize *
|
||
|
sizeof(COMPRESS_3_NODE) )) == NULL)
|
||
|
{
|
||
|
printf("Error: Can't allocate buffer for Compression 3 Nodes.\n");
|
||
|
return (1);
|
||
|
}
|
||
|
memset(pCompNode, 0, TblSize * sizeof(COMPRESS_3_NODE));
|
||
|
|
||
|
//
|
||
|
// Set pointer in compression 3 table.
|
||
|
//
|
||
|
(pSTbl->pCompress3Tbl)[Index] = pCompNode;
|
||
|
|
||
|
//
|
||
|
// Return success.
|
||
|
//
|
||
|
return (0);
|
||
|
}
|
||
|
|
||
|
|
||
|
////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// AllocateException
|
||
|
//
|
||
|
// This routine allocates the exception header and the exception table.
|
||
|
// The size of the table is determined by the TblSize parameter. The
|
||
|
// pointer to the header and the table are stored in the sorttables
|
||
|
// structure.
|
||
|
//
|
||
|
// 11-04-92 JulieB Created.
|
||
|
////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
int AllocateException(
|
||
|
PSORT_TABLES pSTbl,
|
||
|
int TblSize)
|
||
|
{
|
||
|
//
|
||
|
// Set the number of Exception entries in table.
|
||
|
//
|
||
|
pSTbl->NumException = TblSize;
|
||
|
|
||
|
//
|
||
|
// Allocate buffer of size TblSize for Exception header.
|
||
|
//
|
||
|
if ((pSTbl->pExceptHdr =
|
||
|
(PEXCEPT_HDR)malloc(TblSize * sizeof(EXCEPT_HDR))) == NULL)
|
||
|
{
|
||
|
printf("Error: Can't allocate buffer for Exception Header.\n");
|
||
|
return (1);
|
||
|
}
|
||
|
memset(pSTbl->pExceptHdr, 0, TblSize * sizeof(EXCEPT_HDR));
|
||
|
|
||
|
//
|
||
|
// Allocate buffer of size TblSize for Exception table.
|
||
|
//
|
||
|
if ((pSTbl->pExceptTbl =
|
||
|
(PEXCEPT_TBL)malloc(TblSize * sizeof(PEXCEPT_NODE))) == NULL)
|
||
|
{
|
||
|
printf("Error: Can't allocate buffer for Exception table.\n");
|
||
|
return (1);
|
||
|
}
|
||
|
memset(pSTbl->pExceptTbl, 0, TblSize * sizeof(PEXCEPT_NODE));
|
||
|
|
||
|
//
|
||
|
// Return success.
|
||
|
//
|
||
|
return (0);
|
||
|
}
|
||
|
|
||
|
////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// AllocateException
|
||
|
//
|
||
|
// This routine allocates the Jamo Table and Jamo Composition table.
|
||
|
// The size of the table is determined by the TblSize parameter. The
|
||
|
// pointer to the tables are stored in the sorttables
|
||
|
// structure.
|
||
|
//
|
||
|
// 06-26-2000 YSLin Created.
|
||
|
////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
int AllocateJamoTables(
|
||
|
PSORT_TABLES pSTbl,
|
||
|
int TblSize)
|
||
|
{
|
||
|
//
|
||
|
// Set the number of Jamo Index entries in table
|
||
|
//
|
||
|
pSTbl->NumJamoIndex = JAMO_INDEX_SIZE;
|
||
|
|
||
|
//
|
||
|
// Allocate buffer for Jamo Index table.
|
||
|
//
|
||
|
if ((pSTbl->pJamoIndexTbl =
|
||
|
(PJAMO_TABLE)malloc(JAMO_INDEX_SIZE * sizeof(JAMO_TABLE))) == NULL)
|
||
|
{
|
||
|
printf("Error: Can't allocate buffer for Jamo Index.\n");
|
||
|
return (1);
|
||
|
}
|
||
|
memset(pSTbl->pJamoIndexTbl, 0, JAMO_INDEX_SIZE * sizeof(WORD));
|
||
|
|
||
|
//
|
||
|
// Set the number of Jamo Composition entries in table.
|
||
|
// Add one for the dummy entry.
|
||
|
//
|
||
|
pSTbl->NumJamoComposition = TblSize - JAMO_INDEX_SIZE + 1;
|
||
|
|
||
|
//
|
||
|
// Allocate buffer for Jamo Composition table.
|
||
|
//
|
||
|
if ((pSTbl->pJamoComposeTbl =
|
||
|
(PJAMO_COMPOSE_STATE)malloc(pSTbl->NumJamoComposition * sizeof(JAMO_COMPOSE_STATE))) == NULL)
|
||
|
{
|
||
|
printf("Error: Can't allocate buffer for Jamo Composition.\n");
|
||
|
return (1);
|
||
|
}
|
||
|
memset(pSTbl->pJamoComposeTbl, 0, pSTbl->NumJamoComposition * sizeof(JAMO_COMPOSE_STATE));
|
||
|
|
||
|
//
|
||
|
// Return success.
|
||
|
//
|
||
|
return (0);
|
||
|
}
|
||
|
|
||
|
////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// AllocateExceptionNodes
|
||
|
//
|
||
|
// This routine allocates the exception nodes for the exception table.
|
||
|
// The size of the table is determined by the TblSize parameter. The
|
||
|
// pointer to the nodes is stored in the exception table at the Index
|
||
|
// given.
|
||
|
//
|
||
|
// 11-04-92 JulieB Created.
|
||
|
////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
int AllocateExceptionNodes(
|
||
|
PSORT_TABLES pSTbl,
|
||
|
int TblSize,
|
||
|
int Index)
|
||
|
{
|
||
|
PEXCEPT_NODE pExcNode; // ptr to exception node
|
||
|
|
||
|
|
||
|
//
|
||
|
// Allocate buffer of size TblSize for Exception nodes.
|
||
|
//
|
||
|
if ((pExcNode = (PEXCEPT_NODE)malloc( TblSize *
|
||
|
sizeof(EXCEPT_NODE) )) == NULL)
|
||
|
{
|
||
|
printf("Error: Can't allocate buffer for Exception Nodes.\n");
|
||
|
return (1);
|
||
|
}
|
||
|
memset(pExcNode, 0, TblSize * sizeof(EXCEPT_NODE));
|
||
|
|
||
|
//
|
||
|
// Set pointer in exception table.
|
||
|
//
|
||
|
(pSTbl->pExceptTbl)[Index] = pExcNode;
|
||
|
|
||
|
//
|
||
|
// Return success.
|
||
|
//
|
||
|
return (0);
|
||
|
}
|
||
|
|
||
|
|
||
|
////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// AllocateMultipleWeights
|
||
|
//
|
||
|
// This routine allocates the multiple weights table. The size of
|
||
|
// the table is determined by the TblSize parameter. The pointer to the
|
||
|
// new table is stored in the sorttables structure.
|
||
|
//
|
||
|
// 11-04-92 JulieB Created.
|
||
|
////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
int AllocateMultipleWeights(
|
||
|
PSORT_TABLES pSTbl,
|
||
|
int TblSize)
|
||
|
{
|
||
|
//
|
||
|
// Allocate buffer of size TblSize for Multiple Weights table.
|
||
|
//
|
||
|
if ((pSTbl->pMultiWeight = (PMULTI_WT)malloc( TblSize *
|
||
|
sizeof(MULTI_WT) )) == NULL)
|
||
|
{
|
||
|
printf("Error: Can't allocate buffer for Multiple Weight table.\n");
|
||
|
return (1);
|
||
|
}
|
||
|
memset(pSTbl->pMultiWeight, 0, TblSize * sizeof(MULTI_WT));
|
||
|
|
||
|
//
|
||
|
// Set the number of Multiple Weight entries in table.
|
||
|
//
|
||
|
pSTbl->NumMultiWeight = TblSize;
|
||
|
|
||
|
//
|
||
|
// Return success.
|
||
|
//
|
||
|
return (0);
|
||
|
}
|
||
|
|
||
|
|
||
|
////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// AllocateIdeographExceptions
|
||
|
//
|
||
|
// This routine allocates the ideograph exception table. The size of
|
||
|
// the table is determined by the TblSize parameter. The pointer to the
|
||
|
// new table is stored in the ideograph exception structure.
|
||
|
//
|
||
|
// 09-01-93 JulieB Created.
|
||
|
////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
int AllocateIdeographExceptions(
|
||
|
PIDEOGRAPH_EXCEPT pIdeograph,
|
||
|
int TblSize,
|
||
|
int NumColumns)
|
||
|
{
|
||
|
//
|
||
|
// Allocate buffer of size TblSize for Ideograph Exception table.
|
||
|
//
|
||
|
if (NumColumns == 2)
|
||
|
{
|
||
|
if ((pIdeograph->pExcept =
|
||
|
(PIDEOGRAPH_NODE)malloc( TblSize *
|
||
|
sizeof(IDEOGRAPH_NODE) )) == NULL)
|
||
|
{
|
||
|
printf("Error: Can't allocate buffer for Ideograph Exception table.\n");
|
||
|
return (1);
|
||
|
}
|
||
|
memset(pIdeograph->pExcept, 0, TblSize * sizeof(IDEOGRAPH_NODE));
|
||
|
|
||
|
pIdeograph->pExceptEx = NULL;
|
||
|
}
|
||
|
else if (NumColumns == 4)
|
||
|
{
|
||
|
if ((pIdeograph->pExceptEx =
|
||
|
(PIDEOGRAPH_NODE_EX)malloc( TblSize *
|
||
|
sizeof(IDEOGRAPH_NODE_EX) )) == NULL)
|
||
|
{
|
||
|
printf("Error: Can't allocate buffer for Ideograph Exception table.\n");
|
||
|
return (1);
|
||
|
}
|
||
|
memset(pIdeograph->pExceptEx, 0, TblSize * sizeof(IDEOGRAPH_NODE_EX));
|
||
|
|
||
|
pIdeograph->pExcept = NULL;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
printf("Parse Error: The Number of Columns must be either 2 or 4.\n");
|
||
|
return (1);
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Set the number of ideograph exception entries in table.
|
||
|
//
|
||
|
pIdeograph->NumEntries = TblSize;
|
||
|
pIdeograph->NumColumns = NumColumns;
|
||
|
|
||
|
//
|
||
|
// Return success.
|
||
|
//
|
||
|
return (0);
|
||
|
}
|
||
|
|
||
|
|
||
|
////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// Free844
|
||
|
//
|
||
|
// This routine frees the memory used by an 8:4:4 table pointed to by pArr.
|
||
|
//
|
||
|
// 07-30-91 JulieB Created.
|
||
|
////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
void Free844(
|
||
|
P844_ARRAY pArr)
|
||
|
{
|
||
|
int Ctr1, Ctr2; // loop counters
|
||
|
P844_ARRAY pArr2; // ptr to second arrays
|
||
|
|
||
|
|
||
|
if (pArr != NULL)
|
||
|
{
|
||
|
for (Ctr1 = 0; Ctr1 < TABLE_SIZE_8; Ctr1++)
|
||
|
{
|
||
|
if ((pArr2 = (P844_ARRAY)(pArr[Ctr1])) != NULL)
|
||
|
{
|
||
|
for (Ctr2 = 0; Ctr2 < TABLE_SIZE_4; Ctr2++)
|
||
|
{
|
||
|
if (pArr2[Ctr2] != NULL)
|
||
|
{
|
||
|
free(pArr2[Ctr2]);
|
||
|
}
|
||
|
}
|
||
|
free(pArr2);
|
||
|
}
|
||
|
}
|
||
|
free(pArr);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// FreeCTMap
|
||
|
//
|
||
|
// This routine frees the memory used by the ctype mapping table pointed
|
||
|
// to by pMap.
|
||
|
//
|
||
|
////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
void FreeCTMap(
|
||
|
PCT_MAP pMap)
|
||
|
{
|
||
|
if (pMap != NULL)
|
||
|
{
|
||
|
free(pMap->pCTValues);
|
||
|
free(pMap);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
//-------------------------------------------------------------------------//
|
||
|
// INTERNAL ROUTINES //
|
||
|
//-------------------------------------------------------------------------//
|
||
|
|
||
|
|
||
|
////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// MapTrioToByte
|
||
|
//
|
||
|
// This routine searches through the mapping table for the given CType trio.
|
||
|
// If it already exists, the entry value is returned. Otherwise, it adds
|
||
|
// the new trio to the mapping table and returns the new entry value.
|
||
|
//
|
||
|
////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
CT_MAP_VALUE MapTrioToByte(
|
||
|
PCT_MAP pMap,
|
||
|
WORD Value1,
|
||
|
WORD Value2,
|
||
|
WORD Value3)
|
||
|
{
|
||
|
PCT_VALUES pEntry; // ptr to entry
|
||
|
CT_MAP_VALUE EntryNum; // entry number
|
||
|
int Ctr; // loop counter
|
||
|
|
||
|
|
||
|
//
|
||
|
// Search through the current entries to see if the ctype trio
|
||
|
// already exists.
|
||
|
//
|
||
|
for (Ctr = 0; Ctr < pMap->Length; Ctr++)
|
||
|
{
|
||
|
//
|
||
|
// Check the entry.
|
||
|
//
|
||
|
if ( ((pMap->pCTValues[Ctr]).CType1 == Value1) &&
|
||
|
((pMap->pCTValues[Ctr]).CType2 == Value2) &&
|
||
|
((pMap->pCTValues[Ctr]).CType3 == Value3) )
|
||
|
{
|
||
|
//
|
||
|
// Entry already exists. Return the entry number.
|
||
|
//
|
||
|
if (Verbose)
|
||
|
printf("Mapping Entry %d:\tCT1 = %x\tCT2 = %x\tCT3 = %x\n",
|
||
|
Ctr, Value1, Value2, Value3);
|
||
|
|
||
|
return ((BYTE)Ctr);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// The given CType trio does not yet exist in the table.
|
||
|
// Add the new trio entry to the table and increment the
|
||
|
// total number of entries.
|
||
|
//
|
||
|
pEntry = &(pMap->pCTValues[pMap->Length]);
|
||
|
pEntry->CType1 = Value1;
|
||
|
pEntry->CType2 = Value2;
|
||
|
pEntry->CType3 = Value3;
|
||
|
|
||
|
EntryNum = (CT_MAP_VALUE)(pMap->Length);
|
||
|
|
||
|
pMap->Length++;
|
||
|
|
||
|
if (Verbose)
|
||
|
printf("Mapping New Entry %d:\tCT1 = %x\tCT2 = %x\tCT3 = %x\n",
|
||
|
EntryNum, Value1, Value2, Value3);
|
||
|
|
||
|
//
|
||
|
// Return the new entry number.
|
||
|
//
|
||
|
return (EntryNum);
|
||
|
}
|