/** * ticonv_ti89tpusb_to_utf16: * @ti: null terminated string (input) * @utf16: null terminated string (output) * * Titanium/USB charset to UTF-16 conversion. * * Return value: returns the destination pointer or NULL if error. **/ TIEXPORT4 unsigned short* TICALL ticonv_ti89tusb_to_utf16(const char *ti, unsigned short *utf16) { unsigned short *tmp; tmp = ticonv_utf8_to_utf16(ti); memcpy(utf16, tmp, 2 * ticonv_utf16_strlen(tmp)); g_free(tmp); return utf16; }
static unsigned short * ticonv_usb_to_utf16(const char *ti, unsigned short *utf16) { unsigned short *tmp; if (ti == NULL || utf16 == NULL) { return NULL; } tmp = ticonv_utf8_to_utf16(ti); if (tmp == NULL) { return NULL; } if (utf16 != NULL) { memcpy(utf16, tmp, 2 * ticonv_utf16_strlen(tmp)); } ticonv_utf16_free(tmp); return utf16; }
/** * ticonv_utf16_to_gfe: * @model: a calculator model taken in #CalcModel. * @src: the name of variable to convert from UTF-16 * * This function converts a varname into a valid filename (depends on locale). * Example: 'foobar' => foobar, 'alpha' => _alpha_. * * Greeks characters need conversion if the locale is not UTF-8 (Windows for sure, Linux * if locale is different of UTF-8) because greek characters are often missed or mis-converted * when converting to locale. * * Return value: %dst as a newly allocated string. **/ TIEXPORT4 char* TICALL ticonv_utf16_to_gfe(CalcModel model, const unsigned short *src) { #ifdef __WIN32__ int is_utf8 = G_WIN32_HAVE_WIDECHAR_API(); #else int is_utf8 = g_get_charset(NULL); #endif const char *str; unsigned short *utf16_src, *p; unsigned short *utf16_dst, *q; char *dst; // detokenization to UTF-16 p = utf16_src = (unsigned short *)src; q = utf16_dst = g_malloc0(18*ticonv_utf16_strlen(utf16_src)+2); // conversion from UTF-16 to UTF-16 if(tifiles_calc_is_ti9x(model) && !is_utf8) { while(*p) { unsigned long msb = *p & 0xff00; if(!msb) { *q++ = *p++ & 0xff; } else { gunichar2 *str2; glong ir, iw; switch(*p) { case 0x03bc: str = "_mu_"; break; case 0x03b1: str = "_alpha_"; break; case 0x03b2: str = "_beta_"; break; case 0x0393: str = "_GAMMA_"; break; case 0x03b3: str = "_gamma_"; break; case 0x0394: str = "_DELTA_"; break; case 0x03b4: str = "_delta_"; break; case 0x03b5: str = "_epsilon_";break; case 0x03b6: str = "_zeta_"; break; case 0x03b8: str = "_theta_"; break; case 0x03bb: str = "_lambda_"; break; case 0x03be: str = "_ksi_"; break; case 0x03a0: str = "_PI_"; break; case 0x03c0: str = "_pi_"; break; case 0x03c1: str = "_rho_"; break; case 0x03a3: str = "_SIGMA_"; break; case 0x03c3: str = "_sigma_"; break; case 0x03c4: str = "_tau_"; break; case 0x03d5: str = "_PHI_"; break; case 0x03a8: str = "_PSI_"; break; case 0x03a9: str = "_OMEGA_"; break; case 0x03c9: str = "_omega_"; break; default: str = ""; break; } str2 = g_utf8_to_utf16(str, -1, &ir, &iw, NULL); memcpy(q, str2, (iw+1) * sizeof(unsigned short)); g_free(str2); q += iw; p++; } } *q = '\0'; } else if(tifiles_calc_is_ti8x(model) && !is_utf8) { while(*p) { unsigned long msb = *p & 0xff00; if(!msb) { *q++ = *p++ & 0xff; } else { if(*p >= 0x2080 && *p <= 0x2089) { *q++ = (*p++ - 0x2080) + '0'; } else { gunichar2 *str2; glong ir, iw; switch(*p) { case 0x03bc: str = "_mu_"; break; case 0x03b1: str = "_alpha_"; break; case 0x03b2: str = "_beta_"; break; case 0x0393: str = "_GAMMA_"; break; case 0x03b3: str = "_gamma_"; break; case 0x0394: str = "_DELTA_"; break; case 0x03b4: str = "_delta_"; break; case 0x03b5: str = "_epsilon_";break; case 0x03b6: str = "_zeta_"; break; case 0x03b8: str = "_theta_"; break; case 0x03bb: str = "_lambda_"; break; case 0x03be: str = "_ksi_"; break; case 0x03a0: str = "_PI_"; break; case 0x03c0: str = "_pi_"; break; case 0x03c1: str = "_rho_"; break; case 0x03a3: str = "_SIGMA_"; break; case 0x03c3: str = "_sigma_"; break; case 0x03c4: str = "_tau_"; break; case 0x03d5: str = "_PHI_"; break; case 0x03a8: str = "_PSI_"; break; case 0x03a9: str = "_OMEGA_"; break; case 0x03c9: str = "_omega_"; break; default: str = ""; break; } str2 = g_utf8_to_utf16(str, -1, &ir, &iw, NULL); memcpy(q, str2, (iw+1) * sizeof(gunichar2)); g_free(str2); q += iw; p++; } } } *q = '\0'; } else { while(*p) { #ifdef __WIN32__ if(*p >= 0x2080 && *p <= 0x2089) { *q++ = (*p++ - 0x2080) + '0'; } else #endif *q++ = *p++; } *q = '\0'; } // '/' is not allowed in filenames for(q = utf16_dst; *q; q++) { if(*q == '/') *q = '_'; } // UTF-16 to UTF-8 to GFE encoding { gchar *utf8; utf8 = g_utf16_to_utf8(utf16_dst, -1, NULL, NULL, NULL); g_free(utf16_dst); dst = g_filename_from_utf8(utf8, -1, NULL, NULL, NULL); g_free(utf8); } return dst; }