]> git.saurik.com Git - apple/icu.git/blobdiff - icuSources/tools/toolutil/toolutil.c
ICU-6.2.10.tar.gz
[apple/icu.git] / icuSources / tools / toolutil / toolutil.c
index 900a43a0d0892bbe1324461832ddcdd6e521993d..8703445cc2108e516aadb66e84ba05f8686464c7 100644 (file)
@@ -1,7 +1,7 @@
 /*
 *******************************************************************************
 *
-*   Copyright (C) 1999-2003, International Business Machines
+*   Copyright (C) 1999-2004, International Business Machines
 *   Corporation and others.  All Rights Reserved.
 *
 *******************************************************************************
 #ifdef WIN32
 #   define VC_EXTRALEAN
 #   define WIN32_LEAN_AND_MEAN
-#   define NOGDI
 #   define NOUSER
 #   define NOSERVICE
 #   define NOIME
 #   define NOMCX
 #   include <windows.h>
 #endif
+#include <stdio.h>
 #include "unicode/utypes.h"
 #include "unicode/putil.h"
 #include "cmemory.h"
@@ -58,18 +58,133 @@ getLongPathname(const char *pathname) {
 U_CAPI const char * U_EXPORT2
 findBasename(const char *filename) {
     const char *basename=uprv_strrchr(filename, U_FILE_SEP_CHAR);
-    if(basename!=NULL) {
-        return basename+1;
-    } else {
-#ifdef WIN32
+
+#if U_FILE_ALT_SEP_CHAR!=U_FILE_SEP_CHAR
+    if(basename==NULL) {
         /* Use lenient matching on Windows, which can accept either \ or /
-           This is useful for CygWin environments which has both
+           This is useful for environments like Win32+CygWin which have both.
         */
-        basename=uprv_strrchr(filename, '/');
-        if(basename!=NULL) {
-            return basename+1;
-        }
+        basename=uprv_strrchr(filename, U_FILE_ALT_SEP_CHAR);
+    }
 #endif
+
+    if(basename!=NULL) {
+        return basename+1;
+    } else {
         return filename;
     }
 }
+
+/* tool memory helper ------------------------------------------------------- */
+
+struct UToolMemory {
+    char name[64];
+    int32_t capacity, maxCapacity, size, index;
+    void *array;
+    UAlignedMemory staticArray[1];
+};
+
+U_CAPI UToolMemory * U_EXPORT2
+utm_open(const char *name, int32_t initialCapacity, int32_t maxCapacity, int32_t size) {
+    UToolMemory *mem;
+
+    if(maxCapacity<initialCapacity) {
+        maxCapacity=initialCapacity;
+    }
+
+    mem=(UToolMemory *)uprv_malloc(sizeof(UToolMemory)+initialCapacity*size);
+    if(mem==NULL) {
+        fprintf(stderr, "error: %s - out of memory\n", name);
+        exit(U_MEMORY_ALLOCATION_ERROR);
+    }
+    mem->array=mem->staticArray;
+
+    uprv_strcpy(mem->name, name);
+    mem->capacity=initialCapacity;
+    mem->maxCapacity=maxCapacity;
+    mem->size=size;
+    mem->index=0;
+    return mem;
+}
+
+U_CAPI void U_EXPORT2
+utm_close(UToolMemory *mem) {
+    if(mem!=NULL) {
+        if(mem->array!=mem->staticArray) {
+            uprv_free(mem->array);
+        }
+        uprv_free(mem);
+    }
+}
+
+
+U_CAPI void * U_EXPORT2
+utm_getStart(UToolMemory *mem) {
+    return (char *)mem->array;
+}
+
+U_CAPI int32_t U_EXPORT2
+utm_countItems(UToolMemory *mem) {
+    return mem->index;
+}
+
+
+static UBool
+utm_hasCapacity(UToolMemory *mem, int32_t capacity) {
+    if(mem->capacity<capacity) {
+        int32_t newCapacity;
+
+        if(mem->maxCapacity<capacity) {
+            fprintf(stderr, "error: %s - trying to use more than maxCapacity=%ld units\n",
+                    mem->name, (long)mem->maxCapacity);
+            exit(U_MEMORY_ALLOCATION_ERROR);
+        }
+
+        /* try to allocate a larger array */
+        if(capacity>=2*mem->capacity) {
+            newCapacity=capacity;
+        } else if(mem->capacity<=mem->maxCapacity/3) {
+            newCapacity=2*mem->capacity;
+        } else {
+            newCapacity=mem->maxCapacity;
+        }
+
+        if(mem->array==mem->staticArray) {
+            mem->array=uprv_malloc(newCapacity*mem->size);
+            if(mem->array!=NULL) {
+                uprv_memcpy(mem->array, mem->staticArray, mem->index*mem->size);
+            }
+        } else {
+            mem->array=uprv_realloc(mem->array, newCapacity*mem->size);
+        }
+
+        if(mem->array==NULL) {
+            fprintf(stderr, "error: %s - out of memory\n", mem->name);
+            exit(U_MEMORY_ALLOCATION_ERROR);
+        }
+    }
+
+    return TRUE;
+}
+
+U_CAPI void * U_EXPORT2
+utm_alloc(UToolMemory *mem) {
+    char *p=(char *)mem->array+mem->index*mem->size;
+    int32_t newIndex=mem->index+1;
+    if(utm_hasCapacity(mem, newIndex)) {
+        mem->index=newIndex;
+        uprv_memset(p, 0, mem->size);
+    }
+    return p;
+}
+
+U_CAPI void * U_EXPORT2
+utm_allocN(UToolMemory *mem, int32_t n) {
+    char *p=(char *)mem->array+mem->index*mem->size;
+    int32_t newIndex=mem->index+n;
+    if(utm_hasCapacity(mem, newIndex)) {
+        mem->index=newIndex;
+        uprv_memset(p, 0, n*mem->size);
+    }
+    return p;
+}