00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include <stdlib.h>
00020 #include "locbund.h"
00021
00022 #include "string.h"
00023 #include "unicode/ustring.h"
00024 #include "unicode/uloc.h"
00025
00026 ULocaleBundle*
00027 u_locbund_new(const char *loc)
00028 {
00029 ULocaleBundle *result = (ULocaleBundle*) malloc(sizeof(ULocaleBundle));
00030 int32_t len;
00031
00032 if(result == 0)
00033 return 0;
00034
00035 len = (loc == 0 ? strlen(uloc_getDefault()) : strlen(loc));
00036 result->fLocale = (char*) malloc(len + 1);
00037 if(result->fLocale == 0) {
00038 free(result);
00039 return 0;
00040 }
00041
00042 strcpy(result->fLocale, (loc == 0 ? uloc_getDefault() : loc) );
00043
00044 result->fNumberFormat = 0;
00045 result->fPercentFormat = 0;
00046 result->fCurrencyFormat = 0;
00047 result->fScientificFormat = 0;
00048 result->fSpelloutFormat = 0;
00049 result->fDateFormat = 0;
00050 result->fTimeFormat = 0;
00051
00052 return result;
00053 }
00054
00055 ULocaleBundle*
00056 u_locbund_clone(const ULocaleBundle *bundle)
00057 {
00058 ULocaleBundle *result = (ULocaleBundle*)malloc(sizeof(ULocaleBundle));
00059 UErrorCode status = U_ZERO_ERROR;
00060
00061 if(result == 0)
00062 return 0;
00063
00064 result->fLocale = (char*) malloc(strlen(bundle->fLocale) + 1);
00065 if(result->fLocale == 0) {
00066 free(result);
00067 return 0;
00068 }
00069
00070 strcpy(result->fLocale, bundle->fLocale );
00071
00072 result->fNumberFormat = (bundle->fNumberFormat == 0 ? 0 :
00073 unum_clone(bundle->fNumberFormat, &status));
00074 result->fPercentFormat = (bundle->fPercentFormat == 0 ? 0 :
00075 unum_clone(bundle->fPercentFormat,
00076 &status));
00077 result->fCurrencyFormat = (bundle->fCurrencyFormat == 0 ? 0 :
00078 unum_clone(bundle->fCurrencyFormat,
00079 &status));
00080 result->fScientificFormat = (bundle->fScientificFormat == 0 ? 0 :
00081 unum_clone(bundle->fScientificFormat,
00082 &status));
00083 result->fSpelloutFormat = (bundle->fSpelloutFormat == 0 ? 0 :
00084 unum_clone(bundle->fSpelloutFormat,
00085 &status));
00086 result->fDateFormat = (bundle->fDateFormat == 0 ? 0 :
00087 udat_clone(bundle->fDateFormat, &status));
00088 result->fTimeFormat = (bundle->fTimeFormat == 0 ? 0 :
00089 udat_clone(bundle->fTimeFormat, &status));
00090
00091 return result;
00092 }
00093
00094 void
00095 u_locbund_delete(ULocaleBundle *bundle)
00096 {
00097 free(bundle->fLocale);
00098
00099 if(bundle->fNumberFormat != 0)
00100 unum_close(bundle->fNumberFormat);
00101 if(bundle->fPercentFormat != 0)
00102 unum_close(bundle->fPercentFormat);
00103 if(bundle->fCurrencyFormat != 0)
00104 unum_close(bundle->fCurrencyFormat);
00105 if(bundle->fScientificFormat != 0)
00106 unum_close(bundle->fScientificFormat);
00107 if(bundle->fSpelloutFormat != 0)
00108 unum_close(bundle->fSpelloutFormat);
00109 if(bundle->fDateFormat != 0)
00110 udat_close(bundle->fDateFormat);
00111 if(bundle->fTimeFormat != 0)
00112 udat_close(bundle->fTimeFormat);
00113
00114 free(bundle);
00115 }
00116
00117 UNumberFormat*
00118 u_locbund_getNumberFormat(ULocaleBundle *bundle)
00119 {
00120 UErrorCode status = U_ZERO_ERROR;
00121
00122 if(bundle->fNumberFormat == 0) {
00123 bundle->fNumberFormat = unum_open(UNUM_DEFAULT, bundle->fLocale, &status);
00124 if(U_FAILURE(status))
00125 return 0;
00126 }
00127
00128 return bundle->fNumberFormat;
00129 }
00130
00131 UNumberFormat*
00132 u_locbund_getPercentFormat(ULocaleBundle *bundle)
00133 {
00134 UErrorCode status = U_ZERO_ERROR;
00135
00136 if(bundle->fPercentFormat == 0) {
00137 bundle->fPercentFormat = unum_open(UNUM_PERCENT, bundle->fLocale, &status);
00138 if(U_FAILURE(status))
00139 return 0;
00140 }
00141
00142 return bundle->fPercentFormat;
00143 }
00144
00145 UNumberFormat*
00146 u_locbund_getCurrencyFormat(ULocaleBundle *bundle)
00147 {
00148 UErrorCode status = U_ZERO_ERROR;
00149
00150 if(bundle->fCurrencyFormat == 0) {
00151 bundle->fCurrencyFormat = unum_open(UNUM_CURRENCY, bundle->fLocale,
00152 &status);
00153 if(U_FAILURE(status))
00154 return 0;
00155 }
00156
00157 return bundle->fCurrencyFormat;
00158 }
00159
00160 #define PAT_SIZE 512
00161
00162 UNumberFormat*
00163 u_locbund_getScientificFormat(ULocaleBundle *bundle)
00164 {
00165 UErrorCode status = U_ZERO_ERROR;
00166 UChar pattern [PAT_SIZE];
00167
00168 if(bundle->fScientificFormat == 0) {
00169
00170 u_uastrcpy(pattern, "0.000000E00");
00171
00172 bundle->fScientificFormat = unum_openPattern(pattern, -1,
00173 bundle->fLocale, &status);
00174
00175 if(U_FAILURE(status))
00176 return 0;
00177 }
00178
00179 return bundle->fScientificFormat;
00180 }
00181
00182 UNumberFormat*
00183 u_locbund_getSpelloutFormat(ULocaleBundle *bundle)
00184 {
00185 UErrorCode status = U_ZERO_ERROR;
00186
00187 if(bundle->fSpelloutFormat == 0) {
00188 bundle->fSpelloutFormat = unum_open(UNUM_SPELLOUT, bundle->fLocale,
00189 &status);
00190 }
00191
00192 return bundle->fSpelloutFormat;
00193 }
00194
00195 UDateFormat*
00196 u_locbund_getDateFormat(ULocaleBundle *bundle)
00197 {
00198 UErrorCode status = U_ZERO_ERROR;
00199
00200 if(bundle->fDateFormat == 0) {
00201 bundle->fDateFormat = udat_open(UDAT_NONE, UDAT_DEFAULT,
00202 bundle->fLocale, 0, 0, &status);
00203 }
00204
00205 return bundle->fDateFormat;
00206 }
00207
00208 UDateFormat*
00209 u_locbund_getTimeFormat(ULocaleBundle *bundle)
00210 {
00211 UErrorCode status = U_ZERO_ERROR;
00212
00213 if(bundle->fTimeFormat == 0) {
00214 bundle->fTimeFormat = udat_open(UDAT_DEFAULT, UDAT_NONE,
00215 bundle->fLocale, 0, 0, &status);
00216 }
00217
00218 return bundle->fTimeFormat;
00219 }