blob: 3777b7630c7571e069874e8f1cf569f17996950f [file] [log] [blame]
/*
*******************************************************************************
* *
* COPYRIGHT: *
* (C) Copyright International Business Machines Corporation, 1998, 1999 *
* Licensed Material - Program-Property of IBM - All Rights Reserved. *
* US Government Users Restricted Rights - Use, duplication, or disclosure *
* restricted by GSA ADP Schedule Contract with IBM Corp. *
* *
*******************************************************************************
*
* File rblist.c
*
* Modification History:
*
* Date Name Description
* 06/01/99 stephen Creation.
*******************************************************************************
*/
#include "rblist.h"
#include "ustr.h"
#include "ustring.h"
#include "cmemory.h"
/* Protos */
static void rblist_grow(struct SRBItemList *list, UErrorCode *status);
struct SRBItem*
make_rbitem(const UChar *tag,
const struct SList *data,
UErrorCode *status)
{
struct SRBItem *item;
UChar *s;
if(FAILURE(*status)) return 0;
item = (struct SRBItem*) icu_malloc(sizeof(struct SRBItem));
if(item == 0) {
*status = MEMORY_ALLOCATION_ERROR;
return 0;
}
s = (UChar*) icu_malloc(sizeof(UChar) * (u_strlen(tag) + 1));
if(s == 0) {
*status = MEMORY_ALLOCATION_ERROR;
return 0;
}
u_strcpy(s, tag);
item->fTag = s;
item->fData = (struct SList*) data;
return item;
}
struct SRBItemList*
rblist_open(UErrorCode *status)
{
struct SRBItemList *list;
if(FAILURE(*status)) return 0;
list = (struct SRBItemList*) icu_malloc(sizeof(struct SRBItemList));
if(list == 0) {
*status = MEMORY_ALLOCATION_ERROR;
return 0;
}
list->fLocale = 0;
list->fData = 0;
list->fCount = 0;
list->fCapacity = 32;
rblist_grow(list, status);
return list;
}
void rblist_close(struct SRBItemList *list,
UErrorCode *status)
{
int32_t i;
if(FAILURE(*status)) return;
/* deallocate each list */
for(i = 0; i < list->fCount; ++i) {
switch(list->fData[i]->fData->fType) {
case eStringList:
strlist_close(list->fData[i]->fData, status);
break;
case eStringList2d:
strlist2d_close(list->fData[i]->fData, status);
break;
case eTaggedList:
taglist_close(list->fData[i]->fData, status);
break;
case eEmpty:
break;
}
}
icu_free(list->fData);
icu_free(list->fLocale);
icu_free(list);
}
void rblist_setlocale(struct SRBItemList *list,
const UChar *locale,
UErrorCode *status)
{
if(FAILURE(*status)) return;
/* Allocate enough space */
list->fLocale = (UChar*) icu_realloc(list->fLocale,
sizeof(UChar) * (u_strlen(locale) + 1));
if(list->fLocale == 0) {
*status = MEMORY_ALLOCATION_ERROR;
return;
}
u_strcpy(list->fLocale, locale);
}
void rblist_add(struct SRBItemList *list,
struct SRBItem *s,
UErrorCode *status)
{
int32_t index;
if(FAILURE(*status)) return;
index = list->fCount;
if(list->fCount == list->fCapacity)
rblist_grow(list, status);
list->fData[index] = s;
++(list->fCount);
}
static void
rblist_grow(struct SRBItemList *list,
UErrorCode *status)
{
int32_t i;
int32_t newCapacity;
struct SRBItem **newData;
if(FAILURE(*status)) return;
newCapacity = list->fCapacity << 1;
/* allocate space for the array of SRBItems */
newData = (struct SRBItem**)
icu_malloc(sizeof(struct SRBItem*) * newCapacity);
if(newData == 0) {
*status = MEMORY_ALLOCATION_ERROR;
return;
}
/* copy each item */
for(i = 0; i < list->fCount; ++i) {
newData[i] = list->fData[i];
}
icu_free(list->fData);
list->fData = newData;
list->fCapacity = newCapacity;
}