1ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* 2ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru******************************************************************************* 3ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* 48393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius* Copyright (C) 2005-2013, International Business Machines 5ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* Corporation and others. All Rights Reserved. 6ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* 7ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru******************************************************************************* 8ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* file name: package.h 9ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* encoding: US-ASCII 10ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* tab size: 8 (not used) 11ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* indentation:4 12ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* 13ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* created on: 2005aug25 14ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* created by: Markus W. Scherer 15ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* 16ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru* Read, modify, and write ICU .dat data package files. 17ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*/ 18ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 19ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#ifndef __PACKAGE_H__ 20ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define __PACKAGE_H__ 21ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 22ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/utypes.h" 23ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 24ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include <stdio.h> 25ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 26ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru// .dat package file representation ---------------------------------------- *** 27ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 28ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define STRING_STORE_SIZE 100000 29ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define MAX_PKG_NAME_LENGTH 32 30ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 31ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querutypedef void CheckDependency(void *context, const char *itemName, const char *targetName); 32ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 33ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_NAMESPACE_BEGIN 34ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 35ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustruct Item { 36ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru char *name; 37ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru uint8_t *data; 38ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t length; 39ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UBool isDataOwned; 40ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru char type; 41ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}; 42ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 43ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruclass U_TOOLUTIL_API Package { 44ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querupublic: 45ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* 46ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Constructor. 47ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Prepare this object for a new, empty package. 48ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 49ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru Package(); 50ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 51ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* Destructor. */ 52ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ~Package(); 53ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 548393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius /** 558393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius * Uses the prefix of the first entry of the package in readPackage(), 568393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius * rather than the package basename. 578393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius */ 588393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius void setAutoPrefix() { doAutoPrefix=TRUE; } 598393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius /** 608393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius * Same as setAutoPrefix(), plus the prefix must end with the platform type letter. 618393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius */ 628393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius void setAutoPrefixWithType() { 638393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius doAutoPrefix=TRUE; 648393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius prefixEndsWithType=TRUE; 658393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius } 668393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius void setPrefix(const char *p); 678393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius 68ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* 69ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Read an existing .dat package file. 70ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * The header and item name strings are swapped into this object, 71ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * but the items are left unswapped. 72ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 73ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru void readPackage(const char *filename); 74ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* 75ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Write a .dat package file with the items in this object. 76ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Swap all pieces to the desired output platform properties. 77ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * The package becomes unusable: 78ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * The item names are swapped and sorted in the outCharset rather than the local one. 79ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Also, the items themselves are swapped in-place 80ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 81ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru void writePackage(const char *filename, char outType, const char *comment); 82ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 83ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* 84ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Return the input data type letter (l, b, or e). 85ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 86ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru char getInType(); 87ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 88ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru // find the item in items[], return the non-negative index if found, else the binary-not of the insertion point 89ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t findItem(const char *name, int32_t length=-1) const; 90ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 91ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* 92ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Set internal state for following calls to findNextItem() which will return 93ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * indexes for items whose names match the pattern. 94ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 95ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru void findItems(const char *pattern); 96ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t findNextItem(); 97ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* 98ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Set the match mode for findItems() & findNextItem(). 99ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param mode 0=default 100ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * MATCH_NOSLASH * does not match a '/' 101ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 102ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru void setMatchMode(uint32_t mode); 103ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 104ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru enum { 105ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru MATCH_NOSLASH=1 106ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru }; 107ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 108ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru void addItem(const char *name); 109ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru void addItem(const char *name, uint8_t *data, int32_t length, UBool isDataOwned, char type); 110ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru void addFile(const char *filesPath, const char *name); 111ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru void addItems(const Package &listPkg); 112ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 11385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho void removeItem(int32_t itemIndex); 114ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru void removeItems(const char *pattern); 115ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru void removeItems(const Package &listPkg); 116ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 117ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* The extractItem() functions accept outputType=0 to mean "don't swap the item". */ 11885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho void extractItem(const char *filesPath, int32_t itemIndex, char outType); 119ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru void extractItems(const char *filesPath, const char *pattern, char outType); 120ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru void extractItems(const char *filesPath, const Package &listPkg, char outType); 121ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 122ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* This variant extracts an item to a specific filename. */ 12385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho void extractItem(const char *filesPath, const char *outName, int32_t itemIndex, char outType); 124ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 125ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t getItemCount() const; 126ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru const Item *getItem(int32_t idx) const; 127ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 128ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* 129ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Check dependencies and return TRUE if all dependencies are fulfilled. 130ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 131ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UBool checkDependencies(); 132ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 133ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* 13427f654740f2a26ad62a5c155af9199af9e69b889claireho * Enumerate all the dependencies and give the results to context and call CheckDependency callback 13527f654740f2a26ad62a5c155af9199af9e69b889claireho * @param context user context (will be passed to check function) 13627f654740f2a26ad62a5c155af9199af9e69b889claireho * @param check will be called with context and any missing items 137ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 138ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru void enumDependencies(void *context, CheckDependency check); 139ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 140ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruprivate: 141ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru void enumDependencies(Item *pItem, void *context, CheckDependency check); 142ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 14327f654740f2a26ad62a5c155af9199af9e69b889claireho /** 14427f654740f2a26ad62a5c155af9199af9e69b889claireho * Default CheckDependency function used by checkDependencies() 14527f654740f2a26ad62a5c155af9199af9e69b889claireho */ 146ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru static void checkDependency(void *context, const char *itemName, const char *targetName); 147ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 148ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru /* 149ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Allocate a string in inStrings or outStrings. 150ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * The length does not include the terminating NUL. 151ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 152ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru char *allocString(UBool in, int32_t length); 153ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 154ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru void sortItems(); 155ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 156ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru // data fields 157ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru char inPkgName[MAX_PKG_NAME_LENGTH]; 1588393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius char pkgPrefix[MAX_PKG_NAME_LENGTH]; 159ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 160ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru uint8_t *inData; 161ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru uint8_t header[1024]; 162ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t inLength, headerLength; 163ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru uint8_t inCharset; 164ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UBool inIsBigEndian; 1658393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius UBool doAutoPrefix; 1668393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius UBool prefixEndsWithType; 167ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 168ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t itemCount; 16927f654740f2a26ad62a5c155af9199af9e69b889claireho int32_t itemMax; 17027f654740f2a26ad62a5c155af9199af9e69b889claireho Item *items; 171ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 172ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t inStringTop, outStringTop; 173ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru char inStrings[STRING_STORE_SIZE], outStrings[STRING_STORE_SIZE]; 174ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 175ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru // match mode for findItems(pattern) and findNextItem() 176ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru uint32_t matchMode; 177ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 178ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru // state for findItems(pattern) and findNextItem() 179ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru const char *findPrefix, *findSuffix; 180ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t findPrefixLength, findSuffixLength; 181ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t findNextIndex; 182ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 183ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru // state for checkDependencies() 184ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UBool isMissingItems; 18527f654740f2a26ad62a5c155af9199af9e69b889claireho 18627f654740f2a26ad62a5c155af9199af9e69b889claireho /** 18727f654740f2a26ad62a5c155af9199af9e69b889claireho * Grow itemMax to new value 18827f654740f2a26ad62a5c155af9199af9e69b889claireho */ 18927f654740f2a26ad62a5c155af9199af9e69b889claireho void setItemCapacity(int32_t max); 19027f654740f2a26ad62a5c155af9199af9e69b889claireho 19127f654740f2a26ad62a5c155af9199af9e69b889claireho /** 19227f654740f2a26ad62a5c155af9199af9e69b889claireho * Grow itemMax to at least itemCount+1 19327f654740f2a26ad62a5c155af9199af9e69b889claireho */ 19427f654740f2a26ad62a5c155af9199af9e69b889claireho void ensureItemCapacity(); 195ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}; 196ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 197ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_NAMESPACE_END 198ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 199ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif 20027f654740f2a26ad62a5c155af9199af9e69b889claireho 20127f654740f2a26ad62a5c155af9199af9e69b889claireho 202