16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/************************************************************************** 26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Copyright (C) 2000-2012, International Business Machines 46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Corporation and others. All Rights Reserved. 56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*************************************************************************** 76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* file name: pkgdata.c 86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* encoding: ANSI X3.4 (1968) 96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* tab size: 8 (not used) 106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* indentation:4 116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* created on: 2000may16 136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* created by: Steven \u24C7 Loomis 146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* common types for pkgdata 166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/ 176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifndef _PKGTYPES 196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define _PKGTYPES 206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* headers */ 226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/utypes.h" 236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "filestrm.h" 246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* linked list */ 266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstruct _CharList; 276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtypedef struct _CharList 296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char *str; 316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org struct _CharList *next; 326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} CharList; 336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* 376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * write CharList 'l' into stream 's' using deliminter 'delim' (delim can be NULL). quoted: -1 remove, 0 as is, 1 add quotes 386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgconst char *pkg_writeCharList(FileStream *s, CharList *l, const char *delim, int32_t quoted); 406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* 426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Same, but use line breaks. quoted: -1 remove, 0 as is, 1 add quotes 436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgconst char *pkg_writeCharListWrap(FileStream *s, CharList *l, const char *delim, const char *brk, int32_t quoted); 456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* 486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Count items . 0 if null 496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orguint32_t pkg_countCharList(CharList *l); 516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* 536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Prepend string to CharList. Str is adopted! 546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCharList *pkg_prependToList(CharList *l, const char *str); 566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* 586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * append string to CharList. *end or even end can be null if you don't 596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * know it.[slow] 606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Str is adopted! 616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCharList *pkg_appendToList(CharList *l, CharList** end, const char *str); 636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* 656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * strAlias is an alias to a full or relative path to a FILE. This function 666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * will search strAlias for the directory name (with strrchr). Then, it will 676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * determine if that directory is already in list l. If not, it will add it 686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * with strdup(strAlias). 696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param l list to append to , or NULL 706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param end end pointer-to-pointer. Can point to null, or be null. 716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param strAlias alias to full path string 726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return new list 736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgCharList *pkg_appendUniqueDirToList(CharList *l, CharList** end, const char *strAlias); 756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* 776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * does list contain string? Returns: t/f 786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUBool pkg_listContains(CharList *l, const char *str); 806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* 826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Delete list 836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid pkg_deleteList(CharList *l); 856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* 876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Mode package function 886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstruct UPKGOptions_; 906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtypedef void (UPKGMODE)(struct UPKGOptions_ *, FileStream *s, UErrorCode *status); 916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* 936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Static mode - write the readme file 946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param opt UPKGOptions 956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param libName Name of the .lib, etc file 966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param status ICU error code 976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid pkg_sttc_writeReadme(struct UPKGOptions_ *opt, const char *libName, UErrorCode *status); 996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* 1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Options to be passed throughout the program 1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtypedef struct UPKGOptions_ 1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org CharList *fileListFiles; /* list of files containing files for inclusion in the package */ 1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org CharList *filePaths; /* All the files, with long paths */ 1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org CharList *files; /* All the files */ 1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org CharList *outFiles; /* output files [full paths] */ 1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char *shortName; /* name of what we're building */ 1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char *cShortName; /* name of what we're building as a C identifier */ 1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char *entryName; /* special entrypoint name */ 1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char *targetDir; /* dir for packaged data to go */ 1156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char *dataDir; /* parent of dir for package (default: tmpdir) */ 1166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char *tmpDir; 1176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char *srcDir; 1186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char *options; /* Options arg */ 1196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char *mode; /* Mode of building */ 1206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char *version; /* Library version */ 1216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char *comment; /* comment string */ 1226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char *install; /* Where to install to (NULL = don't install) */ 1236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char *icuroot; /* where does ICU lives */ 1246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char *libName; /* name for library (default: shortName) */ 1256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool rebuild; 1266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool verbose; 1276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool quiet; 1286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool withoutAssembly; 1296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool pdsbuild; /* for building PDS in z/OS */ 1306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} UPKGOptions; 1316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgchar * convertToNativePathSeparators(char *path); 1336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* set up common defines for library naming */ 1366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if U_PLATFORM_HAS_WIN32_API 1386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org# ifndef UDATA_SO_SUFFIX 1396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org# define UDATA_SO_SUFFIX ".dll" 1406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org# endif 1416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org# define LIB_PREFIX "" 1426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org# define LIB_STATIC_PREFIX "" 1436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org# define OBJ_SUFFIX ".obj" 1446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org# define UDATA_LIB_SUFFIX ".lib" 1456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#elif U_PLATFORM == U_PF_CYGWIN 1476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org# define LIB_PREFIX "cyg" 1486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org# define LIB_STATIC_PREFIX "lib" 1496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org# define OBJ_SUFFIX ".o" 1506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org# define UDATA_LIB_SUFFIX ".a" 1516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#else /* POSIX? */ 1536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org# define LIB_PREFIX "lib" 1546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org# define LIB_STATIC_PREFIX "lib" 1556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org# define OBJ_SUFFIX ".o" 1566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org# define UDATA_LIB_SUFFIX ".a" 1576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif 1586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define ASM_SUFFIX ".s" 1606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* defines for common file names */ 1626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define UDATA_CMN_PREFIX "" 1636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define UDATA_CMN_SUFFIX ".dat" 1646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define UDATA_CMN_INTERMEDIATE_SUFFIX "_dat" 1656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define ICUDATA_RES_FILE "icudata.res" 1676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define PKGDATA_DERIVED_PATH '\t' 1696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif 171