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