OLD | NEW |
(Empty) | |
| 1 /************************************************************************** |
| 2 * |
| 3 * Copyright (C) 2000-2008, International Business Machines |
| 4 * Corporation and others. All Rights Reserved. |
| 5 * |
| 6 *************************************************************************** |
| 7 * file name: pkgdata.c |
| 8 * encoding: ANSI X3.4 (1968) |
| 9 * tab size: 8 (not used) |
| 10 * indentation:4 |
| 11 * |
| 12 * created on: 2000may16 |
| 13 * created by: Steven \u24C7 Loomis |
| 14 * |
| 15 * common types for pkgdata |
| 16 */ |
| 17 |
| 18 #include <stdio.h> |
| 19 #include <stdlib.h> |
| 20 #include "unicode/utypes.h" |
| 21 #include "unicode/putil.h" |
| 22 #include "cmemory.h" |
| 23 #include "cstring.h" |
| 24 #include "pkgtypes.h" |
| 25 |
| 26 |
| 27 const char *pkg_writeCharListWrap(FileStream *s, CharList *l, const char *delim,
const char *brk, int32_t quote) |
| 28 { |
| 29 int32_t ln = 0; |
| 30 char buffer[1024]; |
| 31 while(l != NULL) |
| 32 { |
| 33 if(l->str) |
| 34 { |
| 35 uprv_strncpy(buffer, l->str, 1020); |
| 36 buffer[1019]=0; |
| 37 |
| 38 if(quote < 0) { /* remove quotes */ |
| 39 if(buffer[uprv_strlen(buffer)-1] == '"') { |
| 40 buffer[uprv_strlen(buffer)-1] = '\0'; |
| 41 } |
| 42 if(buffer[0] == '"') { |
| 43 uprv_strcpy(buffer, buffer+1); |
| 44 } |
| 45 } else if(quote > 0) { /* add quotes */ |
| 46 if(l->str[0] != '"') { |
| 47 uprv_strcpy(buffer, "\""); |
| 48 uprv_strncat(buffer, l->str,1020); |
| 49 } |
| 50 if(l->str[uprv_strlen(l->str)-1] != '"') { |
| 51 uprv_strcat(buffer, "\""); |
| 52 } |
| 53 } |
| 54 T_FileStream_write(s, buffer, (int32_t)uprv_strlen(buffer)); |
| 55 |
| 56 ln += (int32_t)uprv_strlen(l->str); |
| 57 } |
| 58 |
| 59 if(l->next && delim) |
| 60 { |
| 61 if(ln > 60 && brk) { |
| 62 ln = 0; |
| 63 T_FileStream_write(s, brk, (int32_t)uprv_strlen(brk)); |
| 64 } |
| 65 T_FileStream_write(s, delim, (int32_t)uprv_strlen(delim)); |
| 66 } |
| 67 l = l->next; |
| 68 } |
| 69 return NULL; |
| 70 } |
| 71 |
| 72 |
| 73 const char *pkg_writeCharList(FileStream *s, CharList *l, const char *delim, int
32_t quote) |
| 74 { |
| 75 char buffer[1024]; |
| 76 while(l != NULL) |
| 77 { |
| 78 if(l->str) |
| 79 { |
| 80 uprv_strncpy(buffer, l->str, 1023); |
| 81 buffer[1023]=0; |
| 82 if(uprv_strlen(l->str) >= 1023) |
| 83 { |
| 84 fprintf(stderr, "%s:%d: Internal error, line too long (greater t
han 1023 chars)\n", |
| 85 __FILE__, __LINE__); |
| 86 exit(0); |
| 87 } |
| 88 if(quote < 0) { /* remove quotes */ |
| 89 if(buffer[uprv_strlen(buffer)-1] == '"') { |
| 90 buffer[uprv_strlen(buffer)-1] = '\0'; |
| 91 } |
| 92 if(buffer[0] == '"') { |
| 93 uprv_strcpy(buffer, buffer+1); |
| 94 } |
| 95 } else if(quote > 0) { /* add quotes */ |
| 96 if(l->str[0] != '"') { |
| 97 uprv_strcpy(buffer, "\""); |
| 98 uprv_strcat(buffer, l->str); |
| 99 } |
| 100 if(l->str[uprv_strlen(l->str)-1] != '"') { |
| 101 uprv_strcat(buffer, "\""); |
| 102 } |
| 103 } |
| 104 T_FileStream_write(s, buffer, (int32_t)uprv_strlen(buffer)); |
| 105 } |
| 106 |
| 107 if(l->next && delim) |
| 108 { |
| 109 T_FileStream_write(s, delim, (int32_t)uprv_strlen(delim)); |
| 110 } |
| 111 l = l->next; |
| 112 } |
| 113 return NULL; |
| 114 } |
| 115 |
| 116 |
| 117 /* |
| 118 * Count items . 0 if null |
| 119 */ |
| 120 uint32_t pkg_countCharList(CharList *l) |
| 121 { |
| 122 uint32_t c = 0; |
| 123 while(l != NULL) |
| 124 { |
| 125 c++; |
| 126 l = l->next; |
| 127 } |
| 128 |
| 129 return c; |
| 130 } |
| 131 |
| 132 /* |
| 133 * Prepend string to CharList |
| 134 */ |
| 135 CharList *pkg_prependToList(CharList *l, const char *str) |
| 136 { |
| 137 CharList *newList; |
| 138 newList = uprv_malloc(sizeof(CharList)); |
| 139 |
| 140 /* test for NULL */ |
| 141 if(newList == NULL) { |
| 142 return NULL; |
| 143 } |
| 144 |
| 145 newList->str = str; |
| 146 newList->next = l; |
| 147 return newList; |
| 148 } |
| 149 |
| 150 /* |
| 151 * append string to CharList. *end or even end can be null if you don't |
| 152 * know it.[slow] |
| 153 * Str is adopted! |
| 154 */ |
| 155 CharList *pkg_appendToList(CharList *l, CharList** end, const char *str) |
| 156 { |
| 157 CharList *endptr = NULL, *tmp; |
| 158 |
| 159 if(end == NULL) |
| 160 { |
| 161 end = &endptr; |
| 162 } |
| 163 |
| 164 /* FIND the end */ |
| 165 if((*end == NULL) && (l != NULL)) |
| 166 { |
| 167 tmp = l; |
| 168 while(tmp->next) |
| 169 { |
| 170 tmp = tmp->next; |
| 171 } |
| 172 |
| 173 *end = tmp; |
| 174 } |
| 175 |
| 176 /* Create a new empty list and append it */ |
| 177 if(l == NULL) |
| 178 { |
| 179 l = pkg_prependToList(NULL, str); |
| 180 } |
| 181 else |
| 182 { |
| 183 (*end)->next = pkg_prependToList(NULL, str); |
| 184 } |
| 185 |
| 186 /* Move the end pointer. */ |
| 187 if(*end) |
| 188 { |
| 189 (*end) = (*end)->next; |
| 190 } |
| 191 else |
| 192 { |
| 193 *end = l; |
| 194 } |
| 195 |
| 196 return l; |
| 197 } |
| 198 |
| 199 char * convertToNativePathSeparators(char *path) { |
| 200 #if defined(U_MAKE_IS_NMAKE) |
| 201 char *itr; |
| 202 while ((itr = uprv_strchr(path, U_FILE_ALT_SEP_CHAR))) { |
| 203 *itr = U_FILE_SEP_CHAR; |
| 204 } |
| 205 #endif |
| 206 return path; |
| 207 } |
| 208 |
| 209 CharList *pkg_appendUniqueDirToList(CharList *l, CharList** end, const char *str
Alias) { |
| 210 char aBuf[1024]; |
| 211 char *rPtr; |
| 212 rPtr = uprv_strrchr(strAlias, U_FILE_SEP_CHAR); |
| 213 #if (U_FILE_SEP_CHAR != U_FILE_ALT_SEP_CHAR) |
| 214 { |
| 215 char *aPtr = uprv_strrchr(strAlias, U_FILE_ALT_SEP_CHAR); |
| 216 if(!rPtr || /* regular char wasn't found or.. */ |
| 217 (aPtr && (aPtr > rPtr))) |
| 218 { /* alt ptr exists and is to the right of r ptr */ |
| 219 rPtr = aPtr; /* may copy NULL which is OK */ |
| 220 } |
| 221 } |
| 222 #endif |
| 223 if(!rPtr) { |
| 224 return l; /* no dir path */ |
| 225 } |
| 226 if((rPtr-strAlias) >= (sizeof(aBuf)/sizeof(aBuf[0]))) { |
| 227 fprintf(stderr, "## ERR: Path too long [%d chars]: %s\n", (int)sizeof(aB
uf), strAlias); |
| 228 return l; |
| 229 } |
| 230 strncpy(aBuf, strAlias,(rPtr-strAlias)); |
| 231 aBuf[rPtr-strAlias]=0; /* no trailing slash */ |
| 232 convertToNativePathSeparators(aBuf); |
| 233 |
| 234 if(!pkg_listContains(l, aBuf)) { |
| 235 return pkg_appendToList(l, end, uprv_strdup(aBuf)); |
| 236 } else { |
| 237 return l; /* already found */ |
| 238 } |
| 239 } |
| 240 |
| 241 #if 0 |
| 242 static CharList * |
| 243 pkg_appendFromStrings(CharList *l, CharList** end, const char *s, int32_t len) |
| 244 { |
| 245 CharList *endptr = NULL; |
| 246 const char *p; |
| 247 char *t; |
| 248 const char *targ; |
| 249 if(end == NULL) { |
| 250 end = &endptr; |
| 251 } |
| 252 |
| 253 if(len==-1) { |
| 254 len = uprv_strlen(s); |
| 255 } |
| 256 targ = s+len; |
| 257 |
| 258 while(*s && s<targ) { |
| 259 while(s<targ&&isspace(*s)) s++; |
| 260 for(p=s;s<targ&&!isspace(*p);p++); |
| 261 if(p!=s) { |
| 262 t = uprv_malloc(p-s+1); |
| 263 uprv_strncpy(t,s,p-s); |
| 264 t[p-s]=0; |
| 265 l=pkg_appendToList(l,end,t); |
| 266 fprintf(stderr, " P %s\n", t); |
| 267 } |
| 268 s=p; |
| 269 } |
| 270 |
| 271 return l; |
| 272 } |
| 273 #endif |
| 274 |
| 275 |
| 276 /* |
| 277 * Delete list |
| 278 */ |
| 279 void pkg_deleteList(CharList *l) |
| 280 { |
| 281 CharList *tmp; |
| 282 while(l != NULL) |
| 283 { |
| 284 uprv_free((void*)l->str); |
| 285 tmp = l; |
| 286 l = l->next; |
| 287 uprv_free(tmp); |
| 288 } |
| 289 } |
| 290 |
| 291 UBool pkg_listContains(CharList *l, const char *str) |
| 292 { |
| 293 for(;l;l=l->next){ |
| 294 if(!uprv_strcmp(l->str, str)) { |
| 295 return TRUE; |
| 296 } |
| 297 } |
| 298 |
| 299 return FALSE; |
| 300 } |
OLD | NEW |