2013-09-07 2 views
0

документация для СИС утверждает, чтореверсивный порядок udata_setCommonData

Начиная с ICU 4.4, можно установить пакеты данных, несколько один за вызов этой функции. udata_open() будет искать данные в пакетах данных в том порядке, в котором они были установлены.

Однако, я хотел бы udata_open() для поиска данных в обратном порядке, так что, как только я добавить новый udata_setCommonData, я могу переписать предыдущие данные с моими новыми данными. Очевидно, что если объект, который использует данные, был создан, он будет использовать старый набор, но любые новые данные должны использовать новые данные. Я предполагаю, что ответ находится где-то в udata.cpp около doLoadFromCommonData, надеюсь, что это не слишком сложно сделать. В этой функции, я вижу

if (!isICUData) { 
    return NULL; 
} else if (pCommonData != NULL) { 
    ++commonDataIndex; /* try the next data package */ 
} else if ((!checkedExtendedICUData) && extendICUData(subErrorCode)) { 
    checkedExtendedICUData = TRUE; 
    /* try this data package slot again: it changed from NULL to non-NULL */ 
} else { 
    return NULL; 

Я подозреваю, что я хочу, чтобы начать в верхней части и использовать --commonDataIndex вместо этого.

Обновление. Я обнаружил, что я также могу поменять содержимое до тех пор, пока указатель будет таким же и повторно запустите udata_setCommonData. Возможно, это хорошее решение, которое позволяет избежать изменения кода ICU. Просто нужно выделить максимально возможный размер, с которым я мог бы столкнуться, - который, возможно, может быть сложнее.

В качестве альтернативы, способ unsetCommonData может быть хорошим.

Или, что делает хранение указатель на указатель на данные вместо указателя на данные в

for (i = 0; i < LENGTHOF(gCommonICUDataArray); ++i) { 
    if (gCommonICUDataArray[i] == NULL) { 
     gCommonICUDataArray[i] = newCommonData; 
     ucln_common_registerCleanup(UCLN_COMMON_UDATA, udata_cleanup); 
     didUpdate = TRUE; 
     break; 
    } else if (gCommonICUDataArray[i]->pHeader == pData->pHeader) { 
     /* The same data pointer is already in the array. */ 
     break; 
    } 
+1

Я не вижу вопросительный знак в вашем вопросе. В чем вопрос снова? – lpapp

+0

Я отправил обновленную информацию на заголовок вопроса .. –

ответ

0

Единственный безопасный (или вменяемым) способ сделать это, чтобы позвонить u_cleanup() и начать все сначала. В противном случае это нехорошее использование ОИТ вообще и крайне не рекомендуется. Сожалею.

Если вы хотите динамически обновлять данные, делать запрос функции или, тем не менее, вносить свой код.

Смежные вопросы