| Index: icu46/source/tools/pkgdata/pkgtypes.c
|
| ===================================================================
|
| --- icu46/source/tools/pkgdata/pkgtypes.c (revision 0)
|
| +++ icu46/source/tools/pkgdata/pkgtypes.c (revision 0)
|
| @@ -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;
|
| +}
|
|
|
| Property changes on: icu46/source/tools/pkgdata/pkgtypes.c
|
| ___________________________________________________________________
|
| Added: svn:eol-style
|
| + LF
|
|
|
|
|