summaryrefslogtreecommitdiff
path: root/Build/source/libs/icu/icu-4.6/tools/pkgdata/pkgtypes.c
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/libs/icu/icu-4.6/tools/pkgdata/pkgtypes.c')
-rw-r--r--Build/source/libs/icu/icu-4.6/tools/pkgdata/pkgtypes.c300
1 files changed, 300 insertions, 0 deletions
diff --git a/Build/source/libs/icu/icu-4.6/tools/pkgdata/pkgtypes.c b/Build/source/libs/icu/icu-4.6/tools/pkgdata/pkgtypes.c
new file mode 100644
index 00000000000..7b71054c572
--- /dev/null
+++ b/Build/source/libs/icu/icu-4.6/tools/pkgdata/pkgtypes.c
@@ -0,0 +1,300 @@
+/**************************************************************************
+*
+* Copyright (C) 2000-2008, International Business Machines
+* Corporation and others. All Rights Reserved.
+*
+***************************************************************************
+* file name: pkgdata.c
+* encoding: ANSI X3.4 (1968)
+* tab size: 8 (not used)
+* indentation:4
+*
+* created on: 2000may16
+* created by: Steven \u24C7 Loomis
+*
+* common types for pkgdata
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include "unicode/utypes.h"
+#include "unicode/putil.h"
+#include "cmemory.h"
+#include "cstring.h"
+#include "pkgtypes.h"
+
+
+const char *pkg_writeCharListWrap(FileStream *s, CharList *l, const char *delim, const char *brk, int32_t quote)
+{
+ int32_t ln = 0;
+ char buffer[1024];
+ while(l != NULL)
+ {
+ if(l->str)
+ {
+ uprv_strncpy(buffer, l->str, 1020);
+ buffer[1019]=0;
+
+ if(quote < 0) { /* remove quotes */
+ if(buffer[uprv_strlen(buffer)-1] == '"') {
+ buffer[uprv_strlen(buffer)-1] = '\0';
+ }
+ if(buffer[0] == '"') {
+ uprv_strcpy(buffer, buffer+1);
+ }
+ } else if(quote > 0) { /* add quotes */
+ if(l->str[0] != '"') {
+ uprv_strcpy(buffer, "\"");
+ uprv_strncat(buffer, l->str,1020);
+ }
+ if(l->str[uprv_strlen(l->str)-1] != '"') {
+ uprv_strcat(buffer, "\"");
+ }
+ }
+ T_FileStream_write(s, buffer, (int32_t)uprv_strlen(buffer));
+
+ ln += (int32_t)uprv_strlen(l->str);
+ }
+
+ if(l->next && delim)
+ {
+ if(ln > 60 && brk) {
+ ln = 0;
+ T_FileStream_write(s, brk, (int32_t)uprv_strlen(brk));
+ }
+ T_FileStream_write(s, delim, (int32_t)uprv_strlen(delim));
+ }
+ l = l->next;
+ }
+ return NULL;
+}
+
+
+const char *pkg_writeCharList(FileStream *s, CharList *l, const char *delim, int32_t quote)
+{
+ char buffer[1024];
+ while(l != NULL)
+ {
+ if(l->str)
+ {
+ uprv_strncpy(buffer, l->str, 1023);
+ buffer[1023]=0;
+ if(uprv_strlen(l->str) >= 1023)
+ {
+ fprintf(stderr, "%s:%d: Internal error, line too long (greater than 1023 chars)\n",
+ __FILE__, __LINE__);
+ exit(0);
+ }
+ if(quote < 0) { /* remove quotes */
+ if(buffer[uprv_strlen(buffer)-1] == '"') {
+ buffer[uprv_strlen(buffer)-1] = '\0';
+ }
+ if(buffer[0] == '"') {
+ uprv_strcpy(buffer, buffer+1);
+ }
+ } else if(quote > 0) { /* add quotes */
+ if(l->str[0] != '"') {
+ uprv_strcpy(buffer, "\"");
+ uprv_strcat(buffer, l->str);
+ }
+ if(l->str[uprv_strlen(l->str)-1] != '"') {
+ uprv_strcat(buffer, "\"");
+ }
+ }
+ T_FileStream_write(s, buffer, (int32_t)uprv_strlen(buffer));
+ }
+
+ if(l->next && delim)
+ {
+ T_FileStream_write(s, delim, (int32_t)uprv_strlen(delim));
+ }
+ l = l->next;
+ }
+ return NULL;
+}
+
+
+/*
+ * Count items . 0 if null
+ */
+uint32_t pkg_countCharList(CharList *l)
+{
+ uint32_t c = 0;
+ while(l != NULL)
+ {
+ c++;
+ l = l->next;
+ }
+
+ return c;
+}
+
+/*
+ * Prepend string to CharList
+ */
+CharList *pkg_prependToList(CharList *l, const char *str)
+{
+ CharList *newList;
+ newList = uprv_malloc(sizeof(CharList));
+
+ /* test for NULL */
+ if(newList == NULL) {
+ return NULL;
+ }
+
+ newList->str = str;
+ newList->next = l;
+ return newList;
+}
+
+/*
+ * append string to CharList. *end or even end can be null if you don't
+ * know it.[slow]
+ * Str is adopted!
+ */
+CharList *pkg_appendToList(CharList *l, CharList** end, const char *str)
+{
+ CharList *endptr = NULL, *tmp;
+
+ if(end == NULL)
+ {
+ end = &endptr;
+ }
+
+ /* FIND the end */
+ if((*end == NULL) && (l != NULL))
+ {
+ tmp = l;
+ while(tmp->next)
+ {
+ tmp = tmp->next;
+ }
+
+ *end = tmp;
+ }
+
+ /* Create a new empty list and append it */
+ if(l == NULL)
+ {
+ l = pkg_prependToList(NULL, str);
+ }
+ else
+ {
+ (*end)->next = pkg_prependToList(NULL, str);
+ }
+
+ /* Move the end pointer. */
+ if(*end)
+ {
+ (*end) = (*end)->next;
+ }
+ else
+ {
+ *end = l;
+ }
+
+ return l;
+}
+
+char * convertToNativePathSeparators(char *path) {
+#if defined(U_MAKE_IS_NMAKE)
+ char *itr;
+ while ((itr = uprv_strchr(path, U_FILE_ALT_SEP_CHAR))) {
+ *itr = U_FILE_SEP_CHAR;
+ }
+#endif
+ return path;
+}
+
+CharList *pkg_appendUniqueDirToList(CharList *l, CharList** end, const char *strAlias) {
+ char aBuf[1024];
+ char *rPtr;
+ rPtr = uprv_strrchr(strAlias, U_FILE_SEP_CHAR);
+#if (U_FILE_SEP_CHAR != U_FILE_ALT_SEP_CHAR)
+ {
+ char *aPtr = uprv_strrchr(strAlias, U_FILE_ALT_SEP_CHAR);
+ if(!rPtr || /* regular char wasn't found or.. */
+ (aPtr && (aPtr > rPtr)))
+ { /* alt ptr exists and is to the right of r ptr */
+ rPtr = aPtr; /* may copy NULL which is OK */
+ }
+ }
+#endif
+ if(!rPtr) {
+ return l; /* no dir path */
+ }
+ if((rPtr-strAlias) >= (sizeof(aBuf)/sizeof(aBuf[0]))) {
+ fprintf(stderr, "## ERR: Path too long [%d chars]: %s\n", (int)sizeof(aBuf), strAlias);
+ return l;
+ }
+ strncpy(aBuf, strAlias,(rPtr-strAlias));
+ aBuf[rPtr-strAlias]=0; /* no trailing slash */
+ convertToNativePathSeparators(aBuf);
+
+ if(!pkg_listContains(l, aBuf)) {
+ return pkg_appendToList(l, end, uprv_strdup(aBuf));
+ } else {
+ return l; /* already found */
+ }
+}
+
+#if 0
+static CharList *
+pkg_appendFromStrings(CharList *l, CharList** end, const char *s, int32_t len)
+{
+ CharList *endptr = NULL;
+ const char *p;
+ char *t;
+ const char *targ;
+ if(end == NULL) {
+ end = &endptr;
+ }
+
+ if(len==-1) {
+ len = uprv_strlen(s);
+ }
+ targ = s+len;
+
+ while(*s && s<targ) {
+ while(s<targ&&isspace(*s)) s++;
+ for(p=s;s<targ&&!isspace(*p);p++);
+ if(p!=s) {
+ t = uprv_malloc(p-s+1);
+ uprv_strncpy(t,s,p-s);
+ t[p-s]=0;
+ l=pkg_appendToList(l,end,t);
+ fprintf(stderr, " P %s\n", t);
+ }
+ s=p;
+ }
+
+ return l;
+}
+#endif
+
+
+/*
+ * Delete list
+ */
+void pkg_deleteList(CharList *l)
+{
+ CharList *tmp;
+ while(l != NULL)
+ {
+ uprv_free((void*)l->str);
+ tmp = l;
+ l = l->next;
+ uprv_free(tmp);
+ }
+}
+
+UBool pkg_listContains(CharList *l, const char *str)
+{
+ for(;l;l=l->next){
+ if(!uprv_strcmp(l->str, str)) {
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}