Home | History | Annotate | Download | only in common
      1 /*
      2 ******************************************************************************
      3 *
      4 *   Copyright (C) 1999-2011, International Business Machines
      5 *   Corporation and others.  All Rights Reserved.
      6 *
      7 ******************************************************************************/
      8 
      9 
     10 /*----------------------------------------------------------------------------------
     11  *
     12  *   UCommonData   An abstract interface for dealing with ICU Common Data Files.
     13  *                 ICU Common Data Files are a grouping of a number of individual
     14  *                 data items (resources, converters, tables, anything) into a
     15  *                 single file or dll.  The combined format includes a table of
     16  *                 contents for locating the individual items by name.
     17  *
     18  *                 Two formats for the table of contents are supported, which is
     19  *                 why there is an abstract inteface involved.
     20  *
     21  *                 These functions are part of the ICU internal implementation, and
     22  *                 are not inteded to be used directly by applications.
     23  */
     24 
     25 #ifndef __UCMNDATA_H__
     26 #define __UCMNDATA_H__
     27 
     28 #include "unicode/udata.h"
     29 #include "umapfile.h"
     30 
     31 
     32 #define COMMON_DATA_NAME U_ICUDATA_NAME
     33 
     34 typedef struct  {
     35     uint16_t    headerSize;
     36     uint8_t     magic1;
     37     uint8_t     magic2;
     38 } MappedData;
     39 
     40 
     41 typedef struct  {
     42     MappedData  dataHeader;
     43     UDataInfo   info;
     44 } DataHeader;
     45 
     46 typedef struct {
     47     DataHeader hdr;
     48     char padding[8];
     49     uint32_t count, reserved;
     50     /*
     51     const struct {
     52     const char *const name;
     53     const void *const data;
     54     } toc[1];
     55     */
     56    int   fakeNameAndData[4];       /* TODO:  Change this header type from */
     57                                    /*        pointerTOC to OffsetTOC.     */
     58 } ICU_Data_Header;
     59 
     60 typedef struct {
     61     uint32_t nameOffset;
     62     uint32_t dataOffset;
     63 } UDataOffsetTOCEntry;
     64 
     65 typedef struct {
     66     uint32_t count;
     67     UDataOffsetTOCEntry entry[2];    /* Actual size of array is from count. */
     68 } UDataOffsetTOC;
     69 
     70 /**
     71  * Get the header size from a const DataHeader *udh.
     72  * Handles opposite-endian data.
     73  *
     74  * @internal
     75  */
     76 U_CFUNC uint16_t
     77 udata_getHeaderSize(const DataHeader *udh);
     78 
     79 /**
     80  * Get the UDataInfo.size from a const UDataInfo *info.
     81  * Handles opposite-endian data.
     82  *
     83  * @internal
     84  */
     85 U_CFUNC uint16_t
     86 udata_getInfoSize(const UDataInfo *info);
     87 
     88 U_CDECL_BEGIN
     89 /*
     90  *  "Virtual" functions for data lookup.
     91  *  To call one, given a UDataMemory *p, the code looks like this:
     92  *     p->vFuncs.Lookup(p, tocEntryName, pErrorCode);
     93  *          (I sure do wish this was written in C++, not C)
     94  */
     95 
     96 typedef const DataHeader *
     97 (U_CALLCONV * LookupFn)(const UDataMemory *pData,
     98                         const char *tocEntryName,
     99                         int32_t *pLength,
    100                         UErrorCode *pErrorCode);
    101 
    102 typedef uint32_t
    103 (U_CALLCONV * NumEntriesFn)(const UDataMemory *pData);
    104 
    105 U_CDECL_END
    106 
    107 typedef struct {
    108     LookupFn      Lookup;
    109     NumEntriesFn  NumEntries;
    110 } commonDataFuncs;
    111 
    112 
    113 /*
    114  *  Functions to check whether a UDataMemory refers to memory containing
    115  *     a recognizable header and table of contents a Common Data Format
    116  *
    117  *     If a valid header and TOC are found,
    118  *         set the CommonDataFuncs function dispatch vector in the UDataMemory
    119  *             to point to the right functions for the TOC type.
    120  *     otherwise
    121  *         set an errorcode.
    122  */
    123 U_CFUNC void udata_checkCommonData(UDataMemory *pData, UErrorCode *pErrorCode);
    124 
    125 #endif
    126