/*++ 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); }