1 // © 2016 and later: Unicode, Inc. and others.
2 // License & terms of use: http://www.unicode.org/copyright.html
3 /**************************************************************************
4 *
5 *   Copyright (C) 2000-2012, International Business Machines
6 *   Corporation and others.  All Rights Reserved.
7 *
8 ***************************************************************************
9 *   file name:  pkgdata.c
10 *   encoding:   ANSI X3.4 (1968)
11 *   tab size:   8 (not used)
12 *   indentation:4
13 *
14 *   created on: 2000may16
15 *   created by: Steven \u24C7 Loomis
16 *
17 *  common types for pkgdata
18 */
19 
20 #ifndef _PKGTYPES
21 #define _PKGTYPES
22 
23 /* headers */
24 #include "unicode/utypes.h"
25 #include "filestrm.h"
26 
27 /* linked list */
28 struct _CharList;
29 
30 typedef struct _CharList
31 {
32   const char       *str;
33   struct _CharList *next;
34 } CharList;
35 
36 
37 
38 /*
39  * write CharList 'l' into stream 's' using deliminter 'delim' (delim can be NULL). quoted: -1 remove, 0 as is, 1 add quotes
40  */
41 const char *pkg_writeCharList(FileStream *s, CharList *l, const char *delim, int32_t quoted);
42 
43 /*
44  * Same, but use line breaks. quoted: -1 remove, 0 as is, 1 add quotes
45  */
46 const char *pkg_writeCharListWrap(FileStream *s, CharList *l, const char *delim, const char *brk, int32_t quoted);
47 
48 
49 /*
50  * Count items . 0 if null
51  */
52 uint32_t pkg_countCharList(CharList *l);
53 
54 /*
55  * Prepend string to CharList. Str is adopted!
56  */
57 CharList *pkg_prependToList(CharList *l, const char *str);
58 
59 /*
60  * append string to CharList. *end or even end can be null if you don't
61  * know it.[slow]
62  * Str is adopted!
63  */
64 CharList *pkg_appendToList(CharList *l, CharList** end, const char *str);
65 
66 /*
67  * strAlias is an alias to a full or relative path to a FILE.  This function
68  * will search strAlias for the directory name (with strrchr). Then, it will
69  * determine if that directory is already in list l.  If not, it will add it
70  * with strdup(strAlias).
71  * @param l list to append to , or NULL
72  * @param end end pointer-to-pointer.  Can point to null, or be null.
73  * @param strAlias alias to full path string
74  * @return new list
75  */
76 CharList *pkg_appendUniqueDirToList(CharList *l, CharList** end, const char *strAlias);
77 
78 /*
79  * does list contain string?  Returns: t/f
80  */
81 UBool  pkg_listContains(CharList *l, const char *str);
82 
83 /*
84  * Delete list
85  */
86 void pkg_deleteList(CharList *l);
87 
88 /*
89  * Mode package function
90  */
91 struct UPKGOptions_;
92 typedef   void (UPKGMODE)(struct UPKGOptions_ *, FileStream *s, UErrorCode *status);
93 
94 /*
95  * Static mode - write the readme file
96  * @param opt UPKGOptions
97  * @param libName Name of the .lib, etc file
98  * @param status ICU error code
99  */
100 void pkg_sttc_writeReadme(struct UPKGOptions_ *opt, const char *libName, UErrorCode *status);
101 
102 /*
103  * Options to be passed throughout the program
104  */
105 
106 typedef struct UPKGOptions_
107 {
108   CharList   *fileListFiles; /* list of files containing files for inclusion in the package */
109   CharList   *filePaths;     /* All the files, with long paths */
110   CharList   *files;         /* All the files */
111   CharList   *outFiles;      /* output files [full paths] */
112 
113   const char *shortName;   /* name of what we're building */
114   const char *cShortName;   /* name of what we're building as a C identifier */
115   const char *entryName;   /* special entrypoint name */
116   const char *targetDir;  /* dir for packaged data to go */
117   const char *dataDir;    /* parent of dir for package (default: tmpdir) */
118   const char *tmpDir;
119   const char *srcDir;
120   const char *options;     /* Options arg */
121   const char *mode;        /* Mode of building */
122   const char *version;     /* Library version */
123   const char *comment;     /* comment string */
124   const char *install;     /* Where to install to (NULL = don't install) */
125   const char *icuroot;     /* where does ICU lives */
126   const char *libName;     /* name for library (default: shortName) */
127   UBool      rebuild;
128   UBool      verbose;
129   UBool      quiet;
130   UBool      withoutAssembly;
131   UBool      pdsbuild;     /* for building PDS in z/OS */
132 } UPKGOptions;
133 
134 char * convertToNativePathSeparators(char *path);
135 
136 
137 /* set up common defines for library naming */
138 
139 #if U_PLATFORM_HAS_WIN32_API
140 # ifndef UDATA_SO_SUFFIX
141 #  define UDATA_SO_SUFFIX ".dll"
142 # endif
143 # define LIB_PREFIX ""
144 # define LIB_STATIC_PREFIX ""
145 # define OBJ_SUFFIX ".obj"
146 # define UDATA_LIB_SUFFIX ".lib"
147 
148 #elif U_PLATFORM == U_PF_CYGWIN
149 # define LIB_PREFIX "cyg"
150 # define LIB_STATIC_PREFIX "lib"
151 # define OBJ_SUFFIX ".o"
152 # define UDATA_LIB_SUFFIX ".a"
153 
154 #else  /* POSIX? */
155 # define LIB_PREFIX "lib"
156 # define LIB_STATIC_PREFIX "lib"
157 # define OBJ_SUFFIX ".o"
158 # define UDATA_LIB_SUFFIX ".a"
159 #endif
160 
161 #define ASM_SUFFIX ".s"
162 
163 /* defines for common file names */
164 #define UDATA_CMN_PREFIX ""
165 #define UDATA_CMN_SUFFIX ".dat"
166 #define UDATA_CMN_INTERMEDIATE_SUFFIX "_dat"
167 
168 #define ICUDATA_RES_FILE "icudata.res"
169 
170 #define PKGDATA_DERIVED_PATH '\t'
171 
172 #endif
173