static unsigned int wincodepage_from_langid (unsigned short langid) { char cp_string [max_cp_string_len]; int c; memset (cp_string, 0, max_cp_string_len); /* LOCALE_RETURN_NUMBER flag would avoid strtoul conversion, but is unavailable on Win95. */ c = GetLocaleInfoA (MAKELCID (langid, SORT_DEFAULT), LOCALE_IDEFAULTCODEPAGE, cp_string, max_cp_string_len); /* If codepage data for an LCID is not installed on users's system, GetLocaleInfo returns an empty string. Fall back to system ANSI default. */ if (c == 0) return CP_OEM; return strtoul (cp_string, 0, 10); }
static TW_UINT16 get_default_paper_size(const supported_size_t *s, int n) { DWORD paper; int rc; int defsize = -1; double width, height; int i; rc = GetLocaleInfoA(LOCALE_USER_DEFAULT, LOCALE_IPAPERSIZE | LOCALE_RETURN_NUMBER, (void *) &paper, sizeof(paper)); if (rc > 0) switch (paper) { case 1: defsize = TWSS_USLETTER; break; case 5: defsize = TWSS_USLEGAL; break; case 8: defsize = TWSS_A3; break; case 9: defsize = TWSS_A4; break; } if (defsize == -1) return TWSS_NONE; if (get_width_height(&width, &height, TRUE) != TWCC_SUCCESS) return TWSS_NONE; for (i = 0; i < n; i++) if (s[i].size == defsize) { /* Sane's use of integers to store floats is a hair lossy; deal with it */ if (s[i].x > (width + .01) || s[i].y > (height + 0.01)) return TWSS_NONE; else return s[i].size; } return TWSS_NONE; }
/*------------------------------------------------ get locale information by Unicode --------------------------------------------------*/ int MyGetLocaleInfoW(int ilang, int codepage, LCTYPE lctype, wchar_t* dst, int n) { int r; LCID locale; *dst = 0; locale = MAKELCID((WORD)ilang, SORT_DEFAULT); if(GetVersion() & 0x80000000) // 95/98/Me { char buf[80]; r = GetLocaleInfoA(locale, lctype, buf, 80); if(r) MultiByteToWideChar(codepage, 0, buf, -1, dst, n); } else // NT4/2000/XP r = GetLocaleInfoW(locale, lctype, dst, n); return r; }
static void test_wm_set_get_text(void) { static const CHAR a_str[] = "a"; CHAR buff[16], time[16], caltype[3]; HWND hWnd; LRESULT ret; hWnd = create_datetime_control(0); ret = SendMessageA(hWnd, WM_SETTEXT, 0, (LPARAM)a_str); ok(CB_ERR == ret || broken(0 == ret) || /* comctl32 <= 4.72 */ broken(1 == ret), /* comctl32 <= 4.70 */ "Expected CB_ERR, got %ld\n", ret); buff[0] = 0; ret = SendMessageA(hWnd, WM_GETTEXT, sizeof(buff), (LPARAM)buff); ok(strcmp(buff, a_str) != 0, "Expected text to change, got %s\n", buff); ok(ret != 0, "Expected non-zero return value\n"); SetLastError(0xdeadbeef); ret = GetLocaleInfoA(LOCALE_USER_DEFAULT, LOCALE_ICALENDARTYPE, caltype, 3); if (ret == 0) skip("Must know local calendar type (%x)\n", GetLastError()); else if (atoi(caltype) != CAL_GREGORIAN) skip("DateTimePicker Control only supports Gregorian calendar (type: %s)\n", caltype); else { SetLastError(0xdeadbeef); ret = GetDateFormatA(LOCALE_USER_DEFAULT, 0, NULL, NULL, time, sizeof(time)); if (ret == 0) skip("GetDateFormat failed, returned %ld, error %d\n", ret, GetLastError()); else ok(!strcmp(buff, time), "Expected %s, got %s\n", time, buff); } DestroyWindow(hWnd); }
/*------------------------------------------------ get codepage from locale --------------------------------------------------*/ int GetCodePage(int ilang) { char buf[10]; WCHAR bufw[10]; int r; int codepage = CP_ACP; LCID locale; locale = MAKELCID((WORD)ilang, SORT_DEFAULT); if(GetVersion() & 0x80000000) // 95/98/Me { r = GetLocaleInfoA(locale, LOCALE_IDEFAULTANSICODEPAGE, buf, 10); if(r) codepage = atoi(buf); } else // NT4/2000/XP { r = GetLocaleInfoW(locale, LOCALE_IDEFAULTANSICODEPAGE, bufw, 10); if(r) codepage = _wtoi(bufw); } if(!IsValidCodePage(codepage)) codepage = CP_ACP; return codepage; }
void LanguageInfo::Set(int lang_) { language = lang_; dword q = sGetLanguageDetails(language, &english_name, &native_name); if(!q) return; getindexletter = DefaultGetIndexLetter; compare = DefaultLanguageCompare; if(language == LNG_('C','S','C','Z')) { getindexletter = CSCZGetIndexLetter; compare = CSCZLanguageCompare; } #ifdef PLATFORM_WIN32 LCID lcid = q; thousand_separator = GetLocaleInfoA(lcid, LOCALE_STHOUSAND); decimal_point = GetLocaleInfoA(lcid, LOCALE_SDECIMAL); static const LCTYPE months[] = { LOCALE_SMONTHNAME1, LOCALE_SMONTHNAME2, LOCALE_SMONTHNAME3, LOCALE_SMONTHNAME4, LOCALE_SMONTHNAME5, LOCALE_SMONTHNAME6, LOCALE_SMONTHNAME7, LOCALE_SMONTHNAME8, LOCALE_SMONTHNAME9, LOCALE_SMONTHNAME10, LOCALE_SMONTHNAME11, LOCALE_SMONTHNAME12, }; static const LCTYPE smonths[] = { LOCALE_SABBREVMONTHNAME1, LOCALE_SABBREVMONTHNAME2, LOCALE_SABBREVMONTHNAME3, LOCALE_SABBREVMONTHNAME4, LOCALE_SABBREVMONTHNAME5, LOCALE_SABBREVMONTHNAME6, LOCALE_SABBREVMONTHNAME7, LOCALE_SABBREVMONTHNAME8, LOCALE_SABBREVMONTHNAME9, LOCALE_SABBREVMONTHNAME10, LOCALE_SABBREVMONTHNAME11, LOCALE_SABBREVMONTHNAME12, }; ASSERT(__countof(months) == __countof(month_names)); int i; for(i = 0; i < __countof(months); i++) { month_names[i] = GetLocaleInfoW(lcid, months[i]); short_month_names[i] = GetLocaleInfoW(lcid, smonths[i]); } static const LCTYPE days[] = { LOCALE_SDAYNAME1, LOCALE_SDAYNAME2, LOCALE_SDAYNAME3, LOCALE_SDAYNAME4, LOCALE_SDAYNAME5, LOCALE_SDAYNAME6, LOCALE_SDAYNAME7, }; static const LCTYPE sdays[] = { LOCALE_SABBREVDAYNAME1, LOCALE_SABBREVDAYNAME2, LOCALE_SABBREVDAYNAME3, LOCALE_SABBREVDAYNAME4, LOCALE_SABBREVDAYNAME5, LOCALE_SABBREVDAYNAME6, LOCALE_SABBREVDAYNAME7, }; ASSERT(__countof(days) == __countof(day_names)); for(i = 0; i < __countof(days); i++) { day_names[i] = GetLocaleInfoW(lcid, days[i]); short_day_names[i] = GetLocaleInfoW(lcid, sdays[i]); } #endif #ifdef PLATFORM_POSIX String langtext = LNGAsText(language); char ltext[6]; ltext[0] = ToLower(langtext[0]); ltext[1] = ToLower(langtext[1]); ltext[2] = '_'; ltext[3] = ToUpper(langtext[3]); ltext[4] = ToUpper(langtext[4]); ltext[5] = 0; String oldloc = setlocale(LC_ALL, NULL); if(setlocale(LC_ALL, ltext)) { const struct lconv *lc = localeconv(); decimal_point = lc->decimal_point; thousand_separator = lc->thousands_sep; static const int months[] = { MON_1, MON_2, MON_3, MON_4, MON_5, MON_6, MON_7, MON_8, MON_9, MON_10, MON_11, MON_12, }; static const int smonths[] = { ABMON_1, ABMON_2, ABMON_3, ABMON_4, ABMON_5, ABMON_6, ABMON_7, ABMON_8, ABMON_9, ABMON_10, ABMON_11, ABMON_12, }; ASSERT(__countof(months) == __countof(month_names) && __countof(smonths) == __countof(month_names)); int i; for(i = 0; i < __countof(months); i++) { month_names[i] = nl_langinfo(months[i]); short_month_names[i] = nl_langinfo(smonths[i]); } static const int days[] = { // Linux locale starts with Sunday DAY_2, DAY_3, DAY_4, DAY_5, DAY_6, DAY_7, DAY_1, }; static const int sdays[] = { ABDAY_2, ABDAY_3, ABDAY_4, ABDAY_5, ABDAY_6, ABDAY_7, ABDAY_1, }; ASSERT(__countof(days) == __countof(day_names) && __countof(sdays) == __countof(day_names)); for(i = 0; i < __countof(days); i++) { day_names[i] = nl_langinfo(days[i]); short_day_names[i] = nl_langinfo(sdays[i]); } setlocale(LC_ALL, oldloc); } #endif for(int i = 0; i < 12; i++) { month[i] = month_names[i].ToString(); smonth[i] = short_month_names[i].ToString(); } for(int i = 0; i < 7; i++) { day[i] = day_names[i].ToString(); sday[i] = short_day_names[i].ToString(); } }
LRESULT CALLBACK MCWindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { static Boolean isactive = True; KeySym keysym; MCStack *target; _Drawable _dw; Drawable dw = &_dw; dw->type = DC_WINDOW; dw->handle.window = (MCSysWindowHandle)hwnd; MCScreenDC *pms = (MCScreenDC *)MCscreen; MCStack *omousestack = MCmousestackptr; uint2 button; Boolean down; char buffer[XLOOKUPSTRING_SIZE]; MCPoint t_mouseloc; t_mouseloc = MCPointMake(LOWORD(lParam), HIWORD(lParam)); // IM-2014-01-28: [[ HiDPI ]] Convert screen to logical coords t_mouseloc = ((MCScreenDC*)MCscreen)->screentologicalpoint(t_mouseloc); // MW-2005-02-20: Seed the SSL random number generator #ifdef MCSSL SeedSSL(msg, wParam, lParam); #endif if (curinfo == NULL) curinfo = &dummycurinfo; switch (msg) { #ifdef FEATURE_RELAUNCH_SUPPORT case WM_COPYDATA: { LRESULT t_result; COPYDATASTRUCT *t_data; t_data = (COPYDATASTRUCT *)lParam; t_result = 0; if (t_data -> dwData == CWM_RELAUNCH) { MCresult -> clear(); MCParameter *t_first_parameter = NULL; MCParameter *t_current_parameter = NULL; extern char *strndup(const char *, unsigned int); char *t_command_line = strndup((char *)t_data -> lpData, t_data -> cbData); char *sptr = t_command_line; while(*sptr) { if (*sptr == '\\') *sptr = '/'; sptr++; } sptr = t_command_line; while(*sptr) { char *t_argument; int t_argument_length; while (isspace(*sptr)) sptr++; t_argument_length = 0; if (*sptr == '"') { t_argument = ++sptr; while (*sptr && *sptr != '"') { sptr++; t_argument_length += 1; } } else { t_argument = sptr; while(*sptr && !isspace(*sptr)) { sptr++; t_argument_length += 1; } } if (t_argument_length != 0) { MCParameter *t_parameter; MCString t_param; t_param . set(t_argument, t_argument_length); t_parameter = new MCParameter(t_param); if (t_first_parameter == NULL) t_first_parameter = t_parameter; else t_current_parameter -> setnext(t_parameter); t_current_parameter = t_parameter; } if (*sptr) sptr++; } if (MCdispatcher -> gethome() -> message(MCM_relaunch, t_first_parameter, False, True) != ES_NORMAL) t_result = 0; else { MCExecPoint t_ep; MCresult -> fetch(t_ep); if (t_ep . getsvalue() == "background") t_result = (LRESULT)HWND_BOTTOM; else t_result = MCdefaultstackptr -> getwindow() == NULL ? (LRESULT)HWND_BOTTOM : (LRESULT)(MCdefaultstackptr -> getwindow() -> handle . window); } while(t_first_parameter != NULL) { MCParameter *t_next; t_next = t_first_parameter -> getnext(); delete t_first_parameter; t_first_parameter = t_next; } free(t_command_line); MCresult -> clear(); } return t_result; } #endif case CWM_TASKBAR_NOTIFICATION: ((MCScreenDC *)MCscreen) -> processtaskbarnotify(hwnd, wParam, lParam); break; case WM_DISPLAYCHANGE: case WM_SETTINGCHANGE: { if (hwnd != ((MCScreenDC *)MCscreen) -> getinvisiblewindow()) break; ((MCScreenDC *)MCscreen) -> processdesktopchanged(true); } break; case WM_PALETTECHANGED: dw->handle.window = (MCSysWindowHandle)wParam; if (MCdispatcher->findstackd(dw) == NULL) { dw->handle.window = (MCSysWindowHandle)hwnd; MCStack *sptr = MCdispatcher->findstackd(dw); if (sptr != NULL) sptr->dirtyall(); } break; case WM_PAINT: { MCStack *t_stack; t_stack = MCdispatcher -> findstackd(dw); if (t_stack != nil) t_stack -> onpaint(); } break; case WM_SETFOCUS: //FocusIn if (curinfo->dispatch) { if (MCtracewindow == DNULL || hwnd != (HWND)MCtracewindow->handle.window) { dw->handle.window = (MCSysWindowHandle)GetFocus(); MCdispatcher->wkfocus(dw); } curinfo->handled = True; } else { MCEventnode *tptr = new MCEventnode(hwnd, msg, wParam, lParam, 0, MCmodifierstate, MCeventtime); pms->appendevent(tptr); } break; case WM_KILLFOCUS: //FocusOut: if (curinfo->dispatch) { if (MCtracewindow == DNULL || hwnd != (HWND)MCtracewindow->handle.window) MCdispatcher->wkunfocus(dw); curinfo->handled = True; } else { MCEventnode *tptr = new MCEventnode(hwnd, msg, wParam, lParam, 0, MCmodifierstate, MCeventtime); pms->appendevent(tptr); } break; case WM_SYSKEYDOWN: case WM_SYSCHAR: case WM_CHAR: case WM_KEYDOWN: { if (wParam == VK_CONTROL) break; char t_input_char; t_input_char = (char)wParam; if (IsWindowUnicode(hwnd)) { if (wParam >= 128) { bool t_is_unicode; WCHAR t_wide[1]; // MW-2012-07-25: [[ Bug 9200 ]] Make sure we roundtrip the input character // through 1252 *not* the active code page (which could be anything). t_wide[0] = (WCHAR)wParam; t_is_unicode = (WideCharToMultiByte(1252, 0, t_wide, 1, &t_input_char, 1, NULL, NULL) == 0); if (!t_is_unicode) { WCHAR t_reverse_wide[1]; t_is_unicode = MultiByteToWideChar(1252, 0, &t_input_char, 1, t_reverse_wide, 1) == 0; if (!t_is_unicode) t_is_unicode = t_reverse_wide[0] != t_wide[0]; } if (t_is_unicode && (msg == WM_CHAR || msg == WM_SYSCHAR)) { if (MCactivefield) { MCString t_unicode_string; t_unicode_string . set((char *)t_wide, 2); // MW-2012-02-03: [[ Unicode Block ]] Use the new finsert method to insert // text in unicode mode. MCactivefield -> finsertnew(FT_IMEINSERT, t_unicode_string, LCH_UNICODE, true); } break; } } } else if (wParam >= 128 && (((MCScreenDC *)MCscreen) -> system_codepage) != (((MCScreenDC *)MCscreen) -> input_codepage)) { WCHAR t_unicode_char; MultiByteToWideChar((((MCScreenDC *)MCscreen) -> input_codepage), 0, &t_input_char, 1, &t_unicode_char, 1); bool t_is_unicode; t_is_unicode = (WideCharToMultiByte((((MCScreenDC *)MCscreen) -> system_codepage), 0, &t_unicode_char, 1, &t_input_char, 1, NULL, NULL) == 0); if (!t_is_unicode) { WCHAR t_reverse_unicode_char; t_is_unicode = MultiByteToWideChar((((MCScreenDC *)MCscreen) -> system_codepage), 0, &t_input_char, 1, &t_reverse_unicode_char, 1) == 0; if (!t_is_unicode) t_is_unicode = t_reverse_unicode_char != t_unicode_char; } if (t_is_unicode) { if (MCactivefield) { MCString t_unicode_string; t_unicode_string . set((char *)&t_unicode_char, 2); // MW-2012-02-03: [[ Unicode Block ]] Use the new finsert method to insert // text in unicode mode. MCactivefield -> finsertnew(FT_IMEINSERT, t_unicode_string, LCH_UNICODE, true); } break; } } if (msg == WM_CHAR || msg == WM_SYSCHAR) wParam = t_input_char; buffer[0] = buffer[1] = 0; if (msg == WM_CHAR || msg == WM_SYSCHAR) buffer[0] = lastchar = wParam; // MW-2010-11-17: [[ Bug 3892 ]] Ctrl+Alt can be the same as AltGr. // If we are a CHAR message *and* have a non-control character *and* have Ctrl+Alt set, we discard the modifiers if ((msg == WM_CHAR || msg == WM_SYSCHAR) && wParam >= 32 && (MCmodifierstate & (MS_CONTROL | MS_ALT)) == (MS_CONTROL | MS_ALT)) MCmodifierstate = 0; if (curinfo->keysym == 0) // event came from some other dispatch keysym = pms->getkeysym(wParam, lParam); else keysym = curinfo->keysym; lastkeysym = keysym; if (MCmodifierstate & MS_CONTROL) if (wParam == VK_CANCEL || keysym == '.') { if (MCallowinterrupts && !MCdefaultstackptr->cantabort()) curinfo->abort = True; else MCinterrupt = True; } else if (msg == WM_KEYDOWN) buffer[0] = lastchar = wParam; if (curinfo->dispatch) { if (MCtracewindow == DNULL || hwnd != (HWND)MCtracewindow->handle.window) { uint2 count = LOWORD(lParam); while (count--) { if (!MCdispatcher->wkdown(dw, buffer, keysym) && (msg == WM_SYSKEYDOWN || msg == WM_SYSCHAR)) return IsWindowUnicode(hwnd) ? DefWindowProcW(hwnd, msg, wParam, lParam) : DefWindowProcA(hwnd, msg, wParam, lParam); if (count || lParam & 0x40000000) MCdispatcher->wkup(dw, buffer, keysym); } curinfo->handled = curinfo->reset = True; } } else { MCEventnode *tptr = new MCEventnode(hwnd, msg, wParam, lParam, keysym, MCmodifierstate, MCeventtime); pms->appendevent(tptr); } } break; case WM_KEYUP: case WM_SYSKEYUP: { if (curinfo->keysym == 0) // event came from some other dispatch keysym = pms->getkeysym(wParam, lParam); else keysym = curinfo->keysym; if (keysym == lastkeysym) buffer[0] = lastchar; else buffer[0] = 0; buffer[1] = 0; if (curinfo->dispatch) { if (MCtracewindow == DNULL || hwnd != (HWND)MCtracewindow->handle.window) { MCeventtime = GetMessageTime(); //krevent->time; MCdispatcher->wkup(dw, buffer, keysym); curinfo->handled = curinfo->reset = True; } } else { MCEventnode *tptr = new MCEventnode(hwnd, msg, wParam, lParam, 0, MCmodifierstate, MCeventtime); pms->appendevent(tptr); } } break; case WM_IME_STARTCOMPOSITION: if (!MCinlineinput) return IsWindowUnicode(hwnd) ? DefWindowProcW(hwnd, msg, wParam, lParam) : DefWindowProcA(hwnd, msg, wParam, lParam); break; case WM_IME_ENDCOMPOSITION: if (!MCinlineinput) return IsWindowUnicode(hwnd) ? DefWindowProcW(hwnd, msg, wParam, lParam) : DefWindowProcA(hwnd, msg, wParam, lParam); break; case WM_IME_CHAR: { if (!MCactivefield) break; uint2 unicodekey = MAXUINT2; uint4 destlen; if (IsWindowUnicode(hwnd)) { unicodekey = wParam; destlen = 2; } else { char multibytechar[3]; multibytechar[0] = HIBYTE((WORD)wParam) ; multibytechar[1] = LOBYTE((WORD)wParam) ; multibytechar[2] = '\0'; MCU_multibytetounicode(multibytechar, 2, (char *)&unicodekey, 2, destlen, MCS_langidtocharset(LOWORD(GetKeyboardLayout(0)))); } MCString unicodestr; unicodestr.set((char *)&unicodekey, destlen); // MW-2012-02-03: [[ Unicode Block ]] Use the new finsert method to insert // text in unicode mode. MCactivefield->finsertnew(FT_IMEINSERT, unicodestr, 0, true); } break; case WM_IME_COMPOSITION: { if (!MCinlineinput) return IsWindowUnicode(hwnd) ? DefWindowProcW(hwnd, msg, wParam, lParam) : DefWindowProcA(hwnd, msg, wParam, lParam); if (!MCactivefield) break; DWORD dwindex = 0; if (lParam & GCS_RESULTSTR) { MCactivefield->stopcomposition(True,False); dwindex = GCS_RESULTSTR; } else if (lParam & GCS_COMPSTR) { MCactivefield->startcomposition(); dwindex = GCS_COMPSTR; } HIMC hIMC = ImmGetContext(hwnd); if (!hIMC || !dwindex) break; int2 cursorpos = LOWORD(ImmGetCompositionStringA(hIMC, GCS_CURSORPOS, NULL, 0)); MCactivefield->setcompositioncursoroffset(cursorpos << 1); uint2 compstrsize = 0; char *compstring = NULL; compstrsize = (uint2)ImmGetCompositionStringW(hIMC, dwindex, NULL, 0); compstring = new char[compstrsize+sizeof(WCHAR)]; ImmGetCompositionStringW(hIMC, dwindex, compstring, compstrsize); MCString unicodestr(compstring, compstrsize); // MW-2012-02-03: [[ Unicode Block ]] Use the new finsert method to insert // text in unicode mode. MCactivefield->finsertnew(FT_IMEINSERT, unicodestr, 0, true); delete compstring; ImmReleaseContext(hwnd, hIMC); } break; case WM_IME_NOTIFY: //sent when IME opens windows switch (wParam) { case IMN_OPENCANDIDATE: { HIMC hIMC = ImmGetContext(hwnd); DWORD imeprop = ImmGetProperty(GetKeyboardLayout(0), IGP_PROPERTY); if (imeprop & IME_PROP_AT_CARET) { if (MCactivefield) { uint1 i; for (i = 0; i < 4; i++) { MCRectangle r; CANDIDATEFORM cdf; cdf.dwIndex = i; cdf.dwStyle = CFS_CANDIDATEPOS; MCactivefield->getcompositionrect(r, -1); cdf.ptCurrentPos.x = r.x; cdf.ptCurrentPos.y = r.y + r.height + 32; cdf.rcArea.right = 1; cdf.rcArea.left = r.x; cdf.rcArea.top = r.y + r.height + 32; cdf.rcArea.bottom = 1; ImmSetCandidateWindow(hIMC, &cdf); } } } } break; case IMN_SETOPENSTATUS: { COMPOSITIONFORM cpf; HIMC hIMC = ImmGetContext(hwnd); cpf.dwStyle = CFS_DEFAULT; cpf.ptCurrentPos.x = 0; cpf.ptCurrentPos.y = 0; ImmSetCompositionWindow(hIMC, &cpf); ImmReleaseContext(hwnd, hIMC); } break; } return IsWindowUnicode(hwnd) ? DefWindowProcW(hwnd, msg, wParam, lParam) : DefWindowProcA(hwnd, msg, wParam, lParam); break; case WM_SETCURSOR: if (curinfo->live && !pms->isgrabbed() && LOWORD(lParam) != HTCLIENT) return IsWindowUnicode(hwnd) ? DefWindowProcW(hwnd, msg, wParam, lParam) : DefWindowProcA(hwnd, msg, wParam, lParam); MCmousestackptr = MCdispatcher->findstackd(dw); if (MCmousestackptr != NULL) { MCmousestackptr->resetcursor(True); if (pms->getmousetimer() == 0) pms->setmousetimer(timeSetEvent(LEAVE_CHECK_INTERVAL, 100, mouseproc, 0, TIME_ONESHOT)); } if (omousestack != MCmousestackptr) { if (omousestack != NULL && omousestack != MCtracestackptr) omousestack->munfocus(); if (MCmousestackptr != NULL && MCmousestackptr != MCtracestackptr) MCmousestackptr->enter(); } break; case WM_CAPTURECHANGED: if (curinfo->live) { if (pms->isgrabbed()) { MCStack *sptr = MCdispatcher->findstackd(dw); if (sptr != NULL) { if (lastdown != 0) sptr->mup(lastdown); buffer[0] = 0x1B; // escape buffer[1] = '\0'; Boolean oldlock = MClockmessages; MClockmessages = True; sptr->kdown(buffer, XK_Escape); sptr->kup(buffer, XK_Escape); MClockmessages = oldlock; sptr->munfocus(); pms->setgrabbed(False); curinfo->handled = True; } capturehwnd = NULL; } } break; case WM_MOUSEMOVE: //MotionNotify: case WM_NCMOUSEMOVE: // IM-2013-09-23: [[ FullscreenMode ]] Update mouseloc with MCscreen getters & setters MCStack *t_old_mousestack; MCPoint t_old_mouseloc; MCscreen->getmouseloc(t_old_mousestack, t_old_mouseloc); if (t_old_mouseloc.x != t_mouseloc.x || t_old_mouseloc.y != t_mouseloc.y) { MCscreen->setmouseloc(t_old_mousestack, t_mouseloc); if (curinfo->dispatch) { if (msg != WM_NCMOUSEMOVE) MCscreen->setmouseloc(MCdispatcher->findstackd(dw), t_mouseloc); if (MCtracewindow == DNULL || hwnd != (HWND)MCtracewindow->handle.window) { if (t_old_mousestack != NULL && MCmousestackptr != t_old_mousestack) t_old_mousestack->munfocus(); if (msg == WM_MOUSEMOVE) { MCPoint t_clickloc; MCStack *t_stackptr; MCscreen->getclickloc(t_stackptr, t_clickloc); MCdispatcher->wmfocus(dw, t_mouseloc.x, t_mouseloc.y); if (capturehwnd != NULL && MCbuttonstate != 0 && !dragclick && (MCU_abs(t_mouseloc.x - t_clickloc.x) >= MCdragdelta || MCU_abs(t_mouseloc.y - t_clickloc.y) >= MCdragdelta)) { dragclick = True; MCdispatcher -> wmdrag(dw); } } else if (MCmousestackptr != NULL) MCmousestackptr->munfocus(); curinfo->handled = True; } } else { MCEventnode *tptr = new MCEventnode(hwnd, msg, wParam, lParam, 0, MCmodifierstate, MCeventtime); pms->appendevent(tptr); } } if (msg == WM_NCMOUSEMOVE) return IsWindowUnicode(hwnd) ? DefWindowProcW(hwnd, msg, wParam, lParam) : DefWindowProcA(hwnd, msg, wParam, lParam); break; case WM_APP: if (MCmousestackptr != NULL && MCdispatcher->getmenu() == NULL) { POINT p; if (!GetCursorPos(&p) || !MCU_point_in_rect(MCmousestackptr->getrect(), (int2)p.x, (int2)p.y)) { if (MCmousestackptr != MCtracestackptr) MCmousestackptr->munfocus(); } else pms->setmousetimer(timeSetEvent(LEAVE_CHECK_INTERVAL, 100, mouseproc, 0, TIME_ONESHOT)); } curinfo->handled = True; break; case WM_LBUTTONDOWN: case WM_MBUTTONDOWN: case WM_RBUTTONDOWN: case WM_LBUTTONUP: case WM_MBUTTONUP: case WM_RBUTTONUP: case WM_LBUTTONDBLCLK: case WM_MBUTTONDBLCLK: case WM_RBUTTONDBLCLK: if (msg == WM_LBUTTONDOWN || msg == WM_LBUTTONUP || msg == WM_LBUTTONDBLCLK) button = 1; else if (msg == WM_MBUTTONDOWN || msg == WM_MBUTTONUP || msg == WM_MBUTTONDBLCLK) button = 2; else button = 3; if (msg == WM_LBUTTONUP || msg == WM_MBUTTONUP || msg == WM_RBUTTONUP) { if (curinfo->live && !pms->isgrabbed()) { ReleaseCapture(); capturehwnd = NULL; } MCbuttonstate &= ~(1L << (button - 1)); down = False; lastdown = 0; } else { if (curinfo->live && !pms->isgrabbed()) { SetCapture(hwnd); capturehwnd = hwnd; lastdown = button; } MCbuttonstate |= 1L << (button - 1); down = True; if (msg == WM_LBUTTONDBLCLK || msg == WM_MBUTTONDBLCLK || msg == WM_RBUTTONDBLCLK) doubledown = True; } if (curinfo->dispatch) { if (MCtracewindow == DNULL || hwnd != (HWND)MCtracewindow->handle.window) if (down) if (doubledown) MCdispatcher->wdoubledown(dw, button); else { if (doubleclick && MCeventtime - clicktime < MCdoubletime && MCU_abs(MCclicklocx - t_mouseloc.x) < MCdoubledelta && MCU_abs(MCclicklocy - t_mouseloc.y) < MCdoubledelta) tripleclick = True; else tripleclick = False; doubleclick = False; // IM-2013-09-23: [[ FullscreenMode ]] Update clickloc with MCscreen getters & setters MCscreen->setclickloc(MCmousestackptr, t_mouseloc); dragclick = False; MCdispatcher->wmfocus(dw, t_mouseloc.x, t_mouseloc.y); MCdispatcher->wmdown(dw, button); } else { if (doubledown) { doubledown = False; doubleclick = True; clicktime = MCeventtime; MCdispatcher->wdoubleup(dw, button); } else MCdispatcher->wmup(dw, button); } curinfo->handled = curinfo->reset = True; } else { MCEventnode *tptr = new MCEventnode(hwnd, msg, wParam, lParam, 0, MCmodifierstate, MCeventtime); pms->appendevent(tptr); } break; case WM_SIZE: { MCStack *target = MCdispatcher->findstackd(dw); if (target != NULL) { if (wParam == SIZE_MINIMIZED) target->iconify(); else if (target->isiconic()) { MCstacks->restack(target); target->view_configure(true); target->uniconify(); SetWindowPos((HWND)target -> getwindow() -> handle . window, NULL, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER); } else target->view_configure(true); curinfo->handled = True; } } break; case WM_MOVE: MCdispatcher->configure(dw); curinfo->handled = True; break; case WM_CLOSE: MCdispatcher->wclose(dw); curinfo->handled = True; break; case WM_GETMINMAXINFO: target = MCdispatcher->findstackd(dw); if (target != NULL) target->constrain(lParam); break; case WM_ERASEBKGND: break; case WM_TIMER: curinfo->handled = True; if (MCmousestackptr != NULL && MCdispatcher->getmenu() == NULL) { int2 x, y; pms->querymouse(x, y); MCRectangle rect; if (pms->getwindowgeometry(MCmousestackptr->getw(), rect) && capturehwnd == NULL && !pms->getgrabbed() && !MCU_point_in_rect(rect, x, y)) { MCmousestackptr->munfocus(); MCmousestackptr = NULL; } } break; case WM_CANCELMODE: if (pms->isgrabbed()) { buffer[0] = 0x1B; buffer[1] = '\0'; Boolean oldlock = MClockmessages; MClockmessages = True; MCdispatcher->wkdown(dw, buffer, XK_Escape); MCdispatcher->wkup(dw, buffer, XK_Escape); MClockmessages = oldlock; curinfo->handled = True; pms->setgrabbed(False); MCmousex = MCmousey = -1; // prevent button msg from reopening menu MCdispatcher->wmfocus(dw, MCmousex, MCmousey); } break; case MM_MCINOTIFY: if (wParam == MCI_NOTIFY_SUCCESSFUL) { MCPlayer *tptr = MCplayers; while (tptr != NULL) { if (lParam == (LPARAM)tptr->getDeviceID()) { if (tptr->isdisposable()) tptr->playstop(); else tptr->message_with_args(MCM_play_stopped, tptr->getname()); break; } tptr = tptr->getnextplayer(); } curinfo->handled = True; } break; case WM_USER: { uint2 i; for (i = 0 ; i < MCnsockets ; i++) { if (MCsockets[i]->fd == 0) MCsockets[i]->readsome(); if (wParam == MCsockets[i]->fd && !MCsockets[i]->shared) break; } if (i < MCnsockets) { if (WSAGETSELECTERROR(lParam)) { MCsockets[i]->error = new char[16 + I4L]; sprintf(MCsockets[i]->error, "Error %d on socket", WSAGETSELECTERROR(lParam)); MCsockets[i]->doclose(); } else { /* I.M * TODO - look in to this further: * we sometimes get FD_READ, but there's no data ready to read * so trying to read when using SSL results in us getting stuck * in SSTATE_RETRYREAD, which won't be cleared until data is * available to read. As a quick fix, we can check the socket with select() */ int t_events = 0; TIMEVAL t_time = {0,0}; fd_set rmaskfd, wmaskfd, emaskfd; FD_ZERO(&rmaskfd); FD_ZERO(&wmaskfd); FD_ZERO(&emaskfd); FD_SET(wParam, &rmaskfd); FD_SET(wParam, &emaskfd); select(0, &rmaskfd, &wmaskfd, &emaskfd, &t_time); if (FD_ISSET(wParam, &emaskfd)) t_events = t_events; if (FD_ISSET(wParam, &rmaskfd)) t_events |= FD_READ; if (FD_ISSET(wParam, &wmaskfd)) t_events |= FD_WRITE; switch (WSAGETSELECTEVENT(lParam)) { case FD_OOB: // bogus, from MCS_read_socket case FD_READ: if (t_events & FD_READ) MCsockets[i]->readsome(); break; case FD_WRITE: MCsockets[i]->writesome(); MCsockets[i]->setselect(); break; case FD_CONNECT: MCsockets[i]->writesome(); MCsockets[i]->readsome(); MCsockets[i]->setselect(); break; case FD_ACCEPT: MCsockets[i]->acceptone(); break; case FD_CLOSE: MCsockets[i]->readsome(); #ifdef MCSSL if (MCsockets[i]->fd != 0 && !MCsockets[i]->secure) #else if (MCsockets[i]->fd != 0) #endif MCsockets[i]->doclose(); break; } } } curinfo->handled = True; break; } case WM_WINDOWPOSCHANGING: { ((MCScreenDC *)MCscreen) -> restackwindows(hwnd, msg, wParam, lParam); // return IsWindowUnicode(hwnd) ? DefWindowProcW(hwnd, msg, wParam, lParam) : DefWindowProcA(hwnd, msg, wParam, lParam); } break; case WM_POWERBROADCAST: MCS_reset_time(); return TRUE; case WM_THEMECHANGED: case WM_SYSCOLORCHANGE: if (hwnd == pms->getinvisiblewindow() && MCcurtheme && MCcurtheme->getthemeid() == LF_NATIVEWIN) { MCcurtheme->unload(); MCcurtheme->load(); // MW-2011-08-17: [[ Redraw ]] The theme has changed so redraw everything. MCRedrawDirtyScreen(); } break; case WM_ACTIVATEAPP: if (wParam != isactive) { MCstacks->hidepalettes(!wParam); ((MCScreenDC *)MCscreen) -> hidebackdrop(!wParam); if (MCdefaultstackptr != NULL) MCdefaultstackptr->getcard()->message(wParam ? MCM_resume : MCM_suspend); isactive = wParam; if (!wParam) { if (pms->taskbarhidden) { //we are suspended, show menu bar for other process pms->showtaskbar(); pms->taskbarhidden = True; } } else { if (pms->taskbarhidden) { pms->taskbarhidden = False; pms->hidetaskbar(); } } } break; case WM_INPUTLANGCHANGE: { LCID t_locale_id; t_locale_id = MAKELCID(lParam, SORT_DEFAULT); char t_info[8]; GetLocaleInfoA(t_locale_id, LOCALE_IDEFAULTANSICODEPAGE, t_info, 8); ((MCScreenDC *)MCscreen) -> input_codepage = atoi(t_info); ((MCScreenDC *)MCscreen) -> system_codepage = GetACP(); } break; case WM_NCACTIVATE: if (MCactivatepalettes && wParam == FALSE && MCstacks->getactive()) { MCStack *sptr = MCdispatcher->findstackd(dw); if (sptr != NULL && sptr->getmode() == WM_PALETTE) wParam = TRUE; } return IsWindowUnicode(hwnd) ? DefWindowProcW(hwnd, msg, wParam, lParam) : DefWindowProcA(hwnd, msg, wParam, lParam); case WM_MOUSEWHEEL: case WM_MOUSEHWHEEL: if (MCmousestackptr != NULL) { MCObject *mfocused = MCmousestackptr->getcard()->getmfocused(); if (mfocused == NULL) mfocused = MCmousestackptr -> getcard(); if (mfocused != NULL) { int4 val = (short)HIWORD(wParam); if (msg == WM_MOUSEWHEEL) { if (val < 0) mfocused->kdown("", XK_WheelUp); else mfocused->kdown("", XK_WheelDown); } else if (msg == WM_MOUSEHWHEEL) { if (val < 0) mfocused->kdown("", XK_WheelLeft); else mfocused->kdown("", XK_WheelRight); } } } break; default: return IsWindowUnicode(hwnd) ? DefWindowProcW(hwnd, msg, wParam, lParam) : DefWindowProcA(hwnd, msg, wParam, lParam); } return 0; }
/****************************************************************************** * GetLocaleInfoA [OLE2NLS.5] * Is the last parameter really WORD for Win16? */ INT16 WINAPI GetLocaleInfo16(LCID lcid,LCTYPE LCType,LPSTR buf,INT16 len) { return GetLocaleInfoA(lcid,LCType,buf,len); }
LPSTR _setLocale32A(SHORT Category, LPCSTR localeName) { char codepage[7]; BOOL restoreC = FALSE; char* LocaleName = NULL; LCID Handle = 0; char* p; CPINFO cpinfo; if (localeName) LocaleName = strdup(localeName); _lock_locale(); if (__locale == NULL || __locale == &CLOCALE) { if (__locale == &CLOCALE) restoreC = TRUE; if ((__locale = (LPWIN32LOCALE) calloc(1, sizeof(WIN32LOCALE))) == NULL) { SetLastError(ERROR_OUTOFMEMORY); free(LocaleName); _unlock_locale(); return NULL; } } if (__locale->setLocaleReturn != NULL) { free(__locale->setLocaleReturn); __locale->setLocaleReturn = NULL; } if (LocaleName == NULL || LocaleName[0] == 0x0) { if (LocaleName == NULL) { if (restoreC) { _cleanCategories(__locale); free(__locale); __locale = &CLOCALE; } else { if ((Category & LC_MONETARY) == LC_MONETARY) _addCategoryName(__locale, "LC_MONETARY"); if ((Category & LC_NUMERIC) == LC_NUMERIC) _addCategoryName(__locale, "LC_NUMERIC"); if ((Category & LC_TIME) == LC_TIME) _addCategoryName(__locale, "LC_TIME"); if ((Category & LC_COLLATE) == LC_COLLATE) _addCategoryName(__locale, "LC_COLLATE"); if ((Category & LC_CTYPE) == LC_CTYPE) _addCategoryName(__locale, "LC_CTYPE"); free(LocaleName); _llocaleconv(); _unlock_locale(); return __locale->setLocaleReturn; } } else { Handle = GetUserDefaultLCID(); GetLocaleInfoA(Handle, LOCALE_IDEFAULTCODEPAGE, codepage, 7); __locale->codepage = atol(codepage); __locale->isCLocale = FALSE; } } else { if (strstr(localeName, "en_US")) { strcpy(LocaleName, "ENU"); if ((p = strchr(localeName, '.')) != NULL) strcpy(&LocaleName[3], p); } else if (strstr(localeName, "en_GB")) { strcpy(LocaleName, "ENG"); if ((p = strchr(localeName, '.')) != NULL) strcpy(&LocaleName[3], p); } else if (strstr(localeName, "fr_FR")) { strcpy(LocaleName, "FRA"); if ((p = strchr(localeName, '.')) != NULL) strcpy(&LocaleName[3], p); } else if (strstr(localeName, "de_DE")) { strcpy(LocaleName, "DEU"); if ((p = strchr(localeName, '.')) != NULL) strcpy(&LocaleName[3], p); } if (strcmp(localeName, "C") == 0) { _cleanCategories(__locale); free(__locale); __locale = &CLOCALE; } else if (LocaleName[0] == 'L' && LocaleName[1] == 'C' && LocaleName[2] == '_') { free(LocaleName); _unlock_locale(); return _setLocaleFromString(__locale, localeName); } else { __locale->isCLocale = FALSE; if ((Handle = _getLocale(__locale, (LPSTR)LocaleName)) == 0) { if (restoreC) { free(__locale); __locale = &CLOCALE; } _unlock_locale(); free(LocaleName); return NULL; } } } __locale->handle = Handle; free(LocaleName); if (!IsValidLocale(__locale->handle, LCID_INSTALLED) && !__locale->isCLocale) { SetLastError(ERROR_LOCALE_NOTINSTALLED); if (restoreC) { _cleanCategories(__locale); free(__locale); __locale = &CLOCALE; } _unlock_locale(); return NULL; } /* SetThreadLocale will only work under NT but it's best to do it in case the application uses OLE2 or some other functionnality requiring a Locale. */ SetThreadLocale(__locale->handle); if (!__locale->isCLocale) { _cleanCategories(__locale); if (_setNewCategories(__locale, Category) == 0) { SetLastError(ERROR_CATEGORY_INVALID); if (restoreC) { _cleanCategories(__locale); free(__locale); __locale = &CLOCALE; } _unlock_locale(); return NULL; } if (_setmbcp(__locale->codepage) != 0 || !GetCPInfo(__locale->codepage, &cpinfo)) { _unlock_locale(); SetLastError(ERROR_MBCS_CODEPAGE_INVALID); return NULL; } __mb_cur_max = cpinfo.MaxCharSize; _llocaleconv(); _unlock_locale(); return __locale->setLocaleReturn; } else { __mb_cur_max = 1; _llocaleconv(); _unlock_locale(); return __locale->setLocaleReturn; } }
WORD DosGetCountryInfo(IN OUT PWORD CountryId, OUT PDOS_COUNTRY_INFO CountryInfo) { INT Return; DWORD NumVal; Return = GetLocaleInfoA(LOCALE_USER_DEFAULT, LOCALE_IDATE | LOCALE_RETURN_NUMBER, // LOCALE_ILDATE | LOCALE_RETURN_NUMBER (LPSTR)&NumVal, sizeof(NumVal)); if (Return == 0) return LOWORD(GetLastError()); CountryInfo->DateTimeFormat = (WORD)NumVal; Return = GetLocaleInfoA(LOCALE_USER_DEFAULT, LOCALE_SCURRENCY, (LPSTR)&CountryInfo->CurrencySymbol, sizeof(CountryInfo->CurrencySymbol)); if (Return == 0) return LOWORD(GetLastError()); Return = GetLocaleInfoA(LOCALE_USER_DEFAULT, LOCALE_STHOUSAND, (LPSTR)&CountryInfo->ThousandSep, sizeof(CountryInfo->ThousandSep)); if (Return == 0) return LOWORD(GetLastError()); Return = GetLocaleInfoA(LOCALE_USER_DEFAULT, LOCALE_SDECIMAL, (LPSTR)&CountryInfo->DecimalSep, sizeof(CountryInfo->DecimalSep)); if (Return == 0) return LOWORD(GetLastError()); Return = GetLocaleInfoA(LOCALE_USER_DEFAULT, LOCALE_SDATE, (LPSTR)&CountryInfo->DateSep, sizeof(CountryInfo->DateSep)); if (Return == 0) return LOWORD(GetLastError()); Return = GetLocaleInfoA(LOCALE_USER_DEFAULT, LOCALE_STIME, (LPSTR)&CountryInfo->TimeSep, sizeof(CountryInfo->TimeSep)); if (Return == 0) return LOWORD(GetLastError()); // NOTE: '4: Symbol replace decimal separator' is unsupported. Return = GetLocaleInfoA(LOCALE_USER_DEFAULT, LOCALE_ICURRENCY | LOCALE_RETURN_NUMBER, (LPSTR)&NumVal, sizeof(NumVal)); if (Return == 0) return LOWORD(GetLastError()); CountryInfo->CurrencyFormat = (BYTE)NumVal; Return = GetLocaleInfoA(LOCALE_USER_DEFAULT, LOCALE_ICURRDIGITS | LOCALE_RETURN_NUMBER, // LOCALE_IDIGITS | LOCALE_RETURN_NUMBER (LPSTR)&NumVal, sizeof(NumVal)); if (Return == 0) return LOWORD(GetLastError()); CountryInfo->CurrencyDigitsNum = (BYTE)NumVal; Return = GetLocaleInfoA(LOCALE_USER_DEFAULT, LOCALE_ITIME | LOCALE_RETURN_NUMBER, (LPSTR)&NumVal, sizeof(NumVal)); if (Return == 0) return LOWORD(GetLastError()); CountryInfo->TimeFormat = (BYTE)NumVal; CountryInfo->CaseMapPtr = MAKELONG(FIELD_OFFSET(COUNTRY_DATA, CaseMapRoutine), CountryDataSegment); // CountryInfo->DataListSep; return ERROR_SUCCESS; }
/* Internal: Find the LCID for a locale specification */ static LCID MSVCRT_locale_to_LCID(locale_search_t* locale) { LCID lcid; EnumResourceLanguagesA(GetModuleHandleA("KERNEL32"), (LPSTR)RT_STRING, (LPCSTR)LOCALE_ILANGUAGE,find_best_locale_proc, (LONG_PTR)locale); if (!locale->match_flags) return 0; /* If we were given something that didn't match, fail */ if (locale->search_country[0] && !(locale->match_flags & FOUND_COUNTRY)) return 0; lcid = MAKELCID(locale->found_lang_id, SORT_DEFAULT); /* Populate partial locale, translating LCID to locale string elements */ if (!locale->found_codepage[0]) { /* Even if a codepage is not enumerated for a locale * it can be set if valid */ if (locale->search_codepage[0]) { if (IsValidCodePage(atoi(locale->search_codepage))) memcpy(locale->found_codepage,locale->search_codepage,MAX_ELEM_LEN); else { /* Special codepage values: OEM & ANSI */ if (strcasecmp(locale->search_codepage,"OCP")) { GetLocaleInfoA(lcid, LOCALE_IDEFAULTCODEPAGE, locale->found_codepage, MAX_ELEM_LEN); } if (strcasecmp(locale->search_codepage,"ACP")) { GetLocaleInfoA(lcid, LOCALE_IDEFAULTANSICODEPAGE, locale->found_codepage, MAX_ELEM_LEN); } else return 0; if (!atoi(locale->found_codepage)) return 0; } } else { /* Prefer ANSI codepages if present */ GetLocaleInfoA(lcid, LOCALE_IDEFAULTANSICODEPAGE, locale->found_codepage, MAX_ELEM_LEN); if (!locale->found_codepage[0] || !atoi(locale->found_codepage)) GetLocaleInfoA(lcid, LOCALE_IDEFAULTCODEPAGE, locale->found_codepage, MAX_ELEM_LEN); } } GetLocaleInfoA(lcid, LOCALE_SENGLANGUAGE|LOCALE_NOUSEROVERRIDE, locale->found_language, MAX_ELEM_LEN); GetLocaleInfoA(lcid, LOCALE_SENGCOUNTRY|LOCALE_NOUSEROVERRIDE, locale->found_country, MAX_ELEM_LEN); return lcid; }
int fontforge_main( int argc, char **argv ) { extern const char *source_modtime_str; extern const char *source_version_str; const char *load_prefs = getenv("FONTFORGE_LOADPREFS"); int i; int recover=2; int any; int next_recent=0; GRect pos; GWindowAttrs wattrs; char *display = NULL; FontRequest rq; int ds, ld; int openflags=0; int doopen=0, quit_request=0; #if defined(__Mac) int local_x; #endif fprintf( stderr, "Copyright (c) 2000-2012 by George Williams.\n Executable based on sources from %s" "-ML" #ifdef FREETYPE_HAS_DEBUGGER "-TtfDb" #endif #ifdef _NO_PYTHON "-NoPython" #endif #ifdef FONTFORGE_CONFIG_USE_DOUBLE "-D" #endif ".\n", source_modtime_str ); fprintf( stderr, " Library based on sources from %s.\n", library_version_configuration.library_source_modtime_string ); /* Must be done before we cache the current directory */ /* Change to HOME dir if specified on the commandline */ for ( i=1; i<argc; ++i ) { char *pt = argv[i]; if ( pt[0]=='-' && pt[1]=='-' ) ++pt; #ifndef __Mac if (strcmp(pt,"-home")==0) { #else if (strcmp(pt,"-home")==0 || strncmp(pt,"-psn_",5)==0) { /* OK, I don't know what _-psn_ means, but to GW it means */ /* we've been started on the mac from the FontForge.app */ /* structure, and the current directory is (shudder) "/" */ #endif if (getenv("HOME")!=NULL) chdir(getenv("HOME")); break; /* Done - Unnecessary to check more arguments */ } } #if defined(__Mac) /* Start X if they haven't already done so. Well... try anyway */ /* Must be before we change DYLD_LIBRARY_PATH or X won't start */ /* (osascript depends on a libjpeg which isn't found if we look in /sw/lib first */ local_x = uses_local_x(argc,argv); if ( local_x==1 && getenv("DISPLAY")==NULL ) { /* Don't start X if we're just going to quit. */ /* if X exists, it isn't needed. If X doesn't exist it's wrong */ if ( !hasquit(argc,argv)) { #if 1 /* This sequence is supposed to bring up an app without a window */ /* but X still opens an xterm */ system( "osascript -e 'tell application \"X11\" to launch'" ); system( "osascript -e 'tell application \"X11\" to activate'" ); #else system( "open /Applications/Utilities/X11.app/" ); #endif } setenv("DISPLAY",":0.0",0); } else if ( local_x==1 && *getenv("DISPLAY")!='/' && strcmp(getenv("DISPLAY"),":0.0")!=0 && strcmp(getenv("DISPLAY"),":0")!=0 ) /* 10.5.7 uses a named socket or something "/tmp/launch-01ftWX:0" */ local_x = 0; #endif #if defined(__MINGW32__) if( getenv("DISPLAY")==NULL ) { putenv("DISPLAY=127.0.0.1:0.0"); } if( getenv("LC_ALL")==NULL ){ char lang[8]; char env[32]; if( GetLocaleInfoA(LOCALE_USER_DEFAULT, LOCALE_SISO639LANGNAME, lang, 8) > 0 ){ strcpy(env, "LC_ALL="); strcat(env, lang); putenv(env); } } #endif FF_SetUiInterface(&gdraw_ui_interface); FF_SetPrefsInterface(&gdraw_prefs_interface); FF_SetSCInterface(&gdraw_sc_interface); FF_SetCVInterface(&gdraw_cv_interface); FF_SetBCInterface(&gdraw_bc_interface); FF_SetFVInterface(&gdraw_fv_interface); FF_SetFIInterface(&gdraw_fi_interface); FF_SetMVInterface(&gdraw_mv_interface); FF_SetClipInterface(&gdraw_clip_interface); #ifndef _NO_PYTHON PythonUI_Init(); #endif InitSimpleStuff(); FindProgDir(argv[0]); #if defined(__MINGW32__) { char path[MAX_PATH+4]; char *c = path; unsigned int len = GetModuleFileNameA(NULL, path, MAX_PATH); path[len] = '\0'; for(; *c; *c++) /* backslash to slash */ if(*c == '\\') *c = '/'; GResourceSetProg(path); } #else GResourceSetProg(argv[0]); #endif #if defined(__Mac) /* The mac seems to default to the "C" locale, LANG and LC_MESSAGES are not*/ /* defined. This means that gettext will not bother to look up any message*/ /* files -- even if we have a "C" or "POSIX" entry in the locale diretory */ /* Now if X11 gives us the command key, I want to force a rebinding to use */ /* Cmd rather than Control key -- more mac-like. But I can't do that if */ /* there is no locale. So I force a locale if there is none specified */ /* I force the US English locale, because that's the what the messages are */ /* by default so I'm changing as little as I can. I think. */ /* Now the locale command will treat a LANG which is "" as undefined, but */ /* gettext will not. So I don't bother to check for null strings or "C" */ /* or "POSIX". If they've mucked with the locale perhaps they know what */ /* they are doing */ { int did_keybindings = 0; if ( local_x && !get_mac_x11_prop("enable_key_equivalents") ) { /* Ok, we get the command key */ if ( getenv("LANG")==NULL && getenv("LC_MESSAGES")==NULL ) { setenv("LC_MESSAGES","en_US.UTF-8",0); } /* Can we find a set of keybindings designed for the mac with cmd key? */ bind_textdomain_codeset("Mac-FontForge-MenuShortCuts","UTF-8"); bindtextdomain("Mac-FontForge-MenuShortCuts", getLocaleDir()); if ( *dgettext("Mac-FontForge-MenuShortCuts","Flag0x10+")!='F' ) { GMenuSetShortcutDomain("Mac-FontForge-MenuShortCuts"); did_keybindings = 1; } } if ( !did_keybindings ) { /* Nope. we can't. Fall back to the normal stuff */ #endif GMenuSetShortcutDomain("FontForge-MenuShortCuts"); bind_textdomain_codeset("FontForge-MenuShortCuts","UTF-8"); bindtextdomain("FontForge-MenuShortCuts", getLocaleDir()); #if defined(__Mac) }} #endif bind_textdomain_codeset("FontForge","UTF-8"); bindtextdomain("FontForge", getLocaleDir()); textdomain("FontForge"); GResourceUseGetText(); #if defined(__MINGW32__) { size_t len = strlen(GResourceProgramDir); char* path = galloc(len + 64); strcpy(path, GResourceProgramDir); strcpy(path+len, "/share/fontforge/pixmaps"); /* PixmapDir */ GGadgetSetImageDir(path); strcpy(path+len, "/share/fontforge/resources/fontforge.resource"); /* Resource File */ GResourceAddResourceFile(path, GResourceProgramName, false); gfree(path); } #elif defined(SHAREDIR) GGadgetSetImageDir(SHAREDIR "/pixmaps"); GResourceAddResourceFile(SHAREDIR "/resources/fontforge.resource",GResourceProgramName,false); #endif hotkeysLoad(); if ( load_prefs!=NULL && strcasecmp(load_prefs,"Always")==0 ) LoadPrefs(); if ( default_encoding==NULL ) default_encoding=FindOrMakeEncoding("ISO8859-1"); if ( default_encoding==NULL ) default_encoding=&custom; /* In case iconv is broken */ CheckIsScript(argc,argv); /* Will run the script and exit if it is a script */ /* If there is no UI, there is always a script */ /* and we will never return from the above */ if ( load_prefs==NULL || (strcasecmp(load_prefs,"Always")!=0 && /* Already loaded */ strcasecmp(load_prefs,"Never")!=0 )) LoadPrefs(); GrokNavigationMask(); for ( i=1; i<argc; ++i ) { char *pt = argv[i]; if ( pt[0]=='-' && pt[1]=='-' ) ++pt; if ( strcmp(pt,"-sync")==0 ) GResourceAddResourceString("Gdraw.Synchronize: true",argv[0]); else if ( strcmp(pt,"-depth")==0 && i<argc-1 ) AddR(argv[0],"Gdraw.Depth", argv[++i]); else if ( strcmp(pt,"-vc")==0 && i<argc-1 ) AddR(argv[0],"Gdraw.VisualClass", argv[++i]); else if ( (strcmp(pt,"-cmap")==0 || strcmp(pt,"-colormap")==0) && i<argc-1 ) AddR(argv[0],"Gdraw.Colormap", argv[++i]); else if ( (strcmp(pt,"-dontopenxdevices")==0) ) AddR(argv[0],"Gdraw.DontOpenXDevices", "true"); else if ( strcmp(pt,"-keyboard")==0 && i<argc-1 ) AddR(argv[0],"Gdraw.Keyboard", argv[++i]); else if ( strcmp(pt,"-display")==0 && i<argc-1 ) display = argv[++i]; # if MyMemory else if ( strcmp(pt,"-memory")==0 ) __malloc_debug(5); # endif else if ( strncmp(pt,"-usecairo",strlen("-usecairo"))==0 ) { if ( strcmp(pt,"-usecairo=no")==0 ) GDrawEnableCairo(false); else GDrawEnableCairo(true); } else if ( strcmp(pt,"-nosplash")==0 ) splash = 0; else if ( strcmp(pt,"-unique")==0 ) unique = 1; else if ( strcmp(pt,"-recover")==0 && i<argc-1 ) { ++i; if ( strcmp(argv[i],"none")==0 ) recover=0; else if ( strcmp(argv[i],"clean")==0 ) recover= -1; else if ( strcmp(argv[i],"auto")==0 ) recover= 1; else if ( strcmp(argv[i],"inquire")==0 ) recover= 2; else { fprintf( stderr, "Invalid argument to -recover, must be none, auto, inquire or clean\n" ); dousage(); } } else if ( strcmp(pt,"-recover=none")==0 ) { recover = 0; } else if ( strcmp(pt,"-recover=clean")==0 ) { recover = -1; } else if ( strcmp(pt,"-recover=auto")==0 ) { recover = 1; } else if ( strcmp(pt,"-recover=inquire")==0 ) { recover = 2; } else if ( strcmp(pt,"-docs")==0 ) dohelp(); else if ( strcmp(pt,"-help")==0 ) dousage(); else if ( strcmp(pt,"-version")==0 ) doversion(source_version_str); else if ( strcmp(pt,"-quit")==0 ) quit_request = true; else if ( strcmp(pt,"-home")==0 ) /* already did a chdir earlier, don't need to do it again */; #if defined(__Mac) else if ( strncmp(pt,"-psn_",5)==0 ) { /* OK, I don't know what _-psn_ means, but to GW it means */ /* we've been started on the mac from the FontForge.app */ /* structure, and the current directory was (shudder) "/" */ /* (however, we changed to HOME earlier in main routine). */ unique = 1; listen_to_apple_events = true; } #endif } ensureDotFontForgeIsSetup(); GDrawCreateDisplays(display,argv[0]); default_background = GDrawGetDefaultBackground(screen_display); InitToolIconClut(default_background); InitToolIcons(); InitCursors(); #ifndef _NO_PYTHON PyFF_ProcessInitFiles(); #endif /* Wait until the UI has started, otherwise people who don't have consoles*/ /* open won't get our error messages, and it's an important one */ /* Scripting doesn't care about a mismatch, because scripting interpretation */ /* all lives in the library */ check_library_version(&exe_library_version_configuration,true,false); /* the splash screen used not to have a title bar (wam_nodecor) */ /* but I found I needed to know how much the window manager moved */ /* the window around, which I can determine if I have a positioned */ /* decorated window created at the begining */ /* Actually I don't care any more */ wattrs.mask = wam_events|wam_cursor|wam_bordwidth|wam_backcol|wam_positioned|wam_utf8_wtitle|wam_isdlg; wattrs.event_masks = ~(1<<et_charup); wattrs.positioned = 1; wattrs.cursor = ct_pointer; wattrs.utf8_window_title = "FontForge"; wattrs.border_width = 2; wattrs.background_color = 0xffffff; wattrs.is_dlg = !listen_to_apple_events; pos.x = pos.y = 200; pos.width = splashimage.u.image->width; pos.height = splashimage.u.image->height-56; /* 54 */ GDrawBindSelection(NULL,sn_user1,"FontForge"); if ( unique && GDrawSelectionOwned(NULL,sn_user1)) { /* Different event handler, not a dialog */ wattrs.is_dlg = false; splashw = GDrawCreateTopWindow(NULL,&pos,request_e_h,NULL,&wattrs); PingOtherFontForge(argc,argv); } else { if ( quit_request ) exit( 0 ); splashw = GDrawCreateTopWindow(NULL,&pos,splash_e_h,NULL,&wattrs); } memset(&rq,0,sizeof(rq)); rq.utf8_family_name = SERIF_UI_FAMILIES; rq.point_size = 12; rq.weight = 400; splash_font = GDrawInstanciateFont(NULL,&rq); splash_font = GResourceFindFont("Splash.Font",splash_font); GDrawDecomposeFont(splash_font, &rq); rq.style = fs_italic; splash_italic = GDrawInstanciateFont(NULL,&rq); splash_italic = GResourceFindFont("Splash.ItalicFont",splash_italic); GDrawSetFont(splashw,splash_font); GDrawWindowFontMetrics(splashw,splash_font,&as,&ds,&ld); fh = as+ds+ld; SplashLayout(); localsplash = splash; if ( localsplash && !listen_to_apple_events ) start_splash_screen(); if ( AutoSaveFrequency>0 ) autosave_timer=GDrawRequestTimer(splashw,2*AutoSaveFrequency*1000,AutoSaveFrequency*1000,NULL); GDrawProcessPendingEvents(NULL); GDrawSetBuildCharHooks(BuildCharHook,InsCharHook); any = 0; if ( recover==-1 ) CleanAutoRecovery(); else if ( recover ) any = DoAutoRecovery(recover-1); openflags = 0; for ( i=1; i<argc; ++i ) { char buffer[1025]; char *pt = argv[i]; GDrawProcessPendingEvents(NULL); if ( pt[0]=='-' && pt[1]=='-' ) ++pt; if ( strcmp(pt,"-new")==0 ) { FontNew(); any = 1; # if HANYANG } else if ( strcmp(pt,"-newkorean")==0 ) { MenuNewComposition(NULL,NULL,NULL); any = 1; # endif } else if ( strcmp(pt,"-last")==0 ) { if ( next_recent<RECENT_MAX && RecentFiles[next_recent]!=NULL ) if ( ViewPostScriptFont(RecentFiles[next_recent++],openflags)) any = 1; } else if ( strcmp(pt,"-sync")==0 || strcmp(pt,"-memory")==0 || strcmp(pt,"-nosplash")==0 || strcmp(pt,"-recover=none")==0 || strcmp(pt,"-recover=clean")==0 || strcmp(pt,"-recover=auto")==0 || strcmp(pt,"-dontopenxdevices")==0 || strcmp(pt,"-unique")==0 || strncmp(pt,"-usecairo",strlen("-usecairo"))==0 || strcmp(pt,"-home")==0 ) /* Already done, needed to be before display opened */; else if ( strncmp(pt,"-psn_",5)==0 ) /* Already done */; else if ( (strcmp(pt,"-depth")==0 || strcmp(pt,"-vc")==0 || strcmp(pt,"-cmap")==0 || strcmp(pt,"-colormap")==0 || strcmp(pt,"-keyboard")==0 || strcmp(pt,"-display")==0 || strcmp(pt,"-recover")==0 ) && i<argc-1 ) ++i; /* Already done, needed to be before display opened */ else if ( strcmp(pt,"-allglyphs")==0 ) openflags |= of_all_glyphs_in_ttc; else if ( strcmp(pt,"-open")==0 ) doopen = true; else { if ( strstr(argv[i],"://")!=NULL ) { /* Assume an absolute URL */ strncpy(buffer,argv[i],sizeof(buffer)); buffer[sizeof(buffer)-1]= '\0'; } else GFileGetAbsoluteName(argv[i],buffer,sizeof(buffer)); if ( GFileIsDir(buffer) || (strstr(buffer,"://")!=NULL && buffer[strlen(buffer)-1]=='/')) { char *fname; fname = galloc(strlen(buffer)+strlen("/glyphs/contents.plist")+1); strcpy(fname,buffer); strcat(fname,"/glyphs/contents.plist"); if ( GFileExists(fname)) { /* It's probably a Unified Font Object directory */ free(fname); if ( ViewPostScriptFont(buffer,openflags) ) any = 1; } else { strcpy(fname,buffer); strcat(fname,"/font.props"); if ( GFileExists(fname)) { /* It's probably a sf dir collection */ free(fname); if ( ViewPostScriptFont(buffer,openflags) ) any = 1; } else { free(fname); if ( buffer[strlen(buffer)-1]!='/' ) { /* If dirname doesn't end in "/" we'll be looking in parent dir */ buffer[strlen(buffer)+1]='\0'; buffer[strlen(buffer)] = '/'; } fname = GetPostScriptFontName(buffer,false); if ( fname!=NULL ) ViewPostScriptFont(fname,openflags); any = 1; /* Even if we didn't get a font, don't bring up dlg again */ free(fname); } } } else if ( ViewPostScriptFont(buffer,openflags)!=0 ) any = 1; } } if ( !any && !doopen ) any = ReopenLastFonts(); #if defined(__Mac) if ( listen_to_apple_events ) { install_apple_event_handlers(); install_mac_timer(); RunApplicationEventLoop(); } else #endif if ( doopen || !any ) MenuOpen(NULL,NULL,NULL); GDrawEventLoop(NULL); hotkeysSave(); uninm_names_db_close(names_db); lt_dlexit(); return( 0 ); }
int __cdecl __crtGetLocaleInfoA( LCID Locale, LCTYPE LCType, LPSTR lpLCData, int cchData, int code_page ) { static int f_use = 0; /* * Look for unstubbed 'preferred' flavor. Otherwise use available flavor. * Must actually call the function to ensure it's not a stub. */ if (0 == f_use) { if (0 != GetLocaleInfoW(0, LOCALE_ILANGUAGE, NULL, 0)) f_use = USE_W; else if (0 != GetLocaleInfoA(0, LOCALE_ILANGUAGE, NULL, 0)) f_use = USE_A; else return 0; } /* Use "A" version */ if (USE_A == f_use) { return GetLocaleInfoA(Locale, LCType, lpLCData, cchData); } /* Use "W" version */ if (USE_W == f_use) { int retval; int buff_size; wchar_t *wbuffer; /* * Use __lc_codepage for conversion if code_page not specified */ if (0 == code_page) code_page = __lc_codepage; /* find out how big buffer needs to be */ if (0 == (buff_size = GetLocaleInfoW(Locale, LCType, NULL, 0))) return 0; /* allocate buffer */ __try { wbuffer = (wchar_t *)_alloca( buff_size * sizeof(wchar_t) ); } __except( EXCEPTION_EXECUTE_HANDLER ) { wbuffer = NULL; } if ( wbuffer == NULL ) return 0; /* get the info in wide format */ if (0 == GetLocaleInfoW(Locale, LCType, wbuffer, buff_size)) return 0; /* convert from Wide Char to ANSI */ if (0 == cchData) { /* convert into local buffer */ retval = WideCharToMultiByte( code_page, WC_COMPOSITECHECK | WC_SEPCHARS, wbuffer, -1, NULL, 0, NULL, NULL ); } else { /* convert into user buffer */ retval = WideCharToMultiByte( code_page, WC_COMPOSITECHECK | WC_SEPCHARS, wbuffer, -1, lpLCData, cchData, NULL, NULL ); } return retval; }
void XAP_Win32EncodingManager::initialize() { char szLocaleInfo[64]; static char szCodepage[64]; static char szSystemCodepage[64]; static char szLanguage[64]; static char szTerritory[64]; NativeNonUnicodeEncodingName = Native8BitEncodingName = NativeSystemEncodingName = NativeEncodingName = "CP1252"; LanguageISOName = "en"; LanguageISOTerritory = NULL; XAP_EncodingManager::initialize(); // Unicode Encoding Name // TODO Does NT use UCS-2BE internally on non-Intel CPUs? // TODO Windows 2000 and XP use UTF-16 but on 2000 it may involve a // TODO registry setting NativeUnicodeEncodingName = getUCS2LEName(); // Encodings // User Encoding (Set via Region/Locale; does not require reboot) if (GetLocaleInfoA(LOCALE_USER_DEFAULT,LOCALE_IDEFAULTANSICODEPAGE,szLocaleInfo,sizeof(szLocaleInfo)/sizeof(szLocaleInfo[0]))) { // Windows Unicode locale? if (!strcmp(szLocaleInfo,"0")) { NativeEncodingName = NativeUnicodeEncodingName; m_bIsUnicodeLocale = true; } else { szCodepage[0] = 'C'; szCodepage[1] = 'P'; strcpy(szCodepage+2,szLocaleInfo); NativeNonUnicodeEncodingName = Native8BitEncodingName = NativeEncodingName = szCodepage; m_bIsUnicodeLocale = false; } } // System Encoding (Used by GUI,DOS; Set via Region/Default Language; requires reboot) if (GetLocaleInfoA(LOCALE_SYSTEM_DEFAULT,LOCALE_IDEFAULTANSICODEPAGE,szLocaleInfo,sizeof(szLocaleInfo)/sizeof(szLocaleInfo[0]))) { // Windows Unicode locale? if (!strcmp(szLocaleInfo,"0")) { NativeSystemEncodingName = NativeUnicodeEncodingName; //m_bIsUnicodeLocale = true; } else { szSystemCodepage[0] = 'C'; szSystemCodepage[1] = 'P'; strcpy(szSystemCodepage+2,szLocaleInfo); NativeSystemEncodingName = szSystemCodepage; //m_bIsUnicodeLocale = false; } } m_bIsUnicodeLocale = true; NativeEncodingName = "UCS-2LE"; NativeSystemEncodingName = "UCS-2LE"; if (UT_getISO639Language(szLanguage)) { LanguageISOName = szLanguage; } else { UT_ASSERT_HARMLESS(UT_SHOULD_NOT_HAPPEN); } if (UT_getISO3166Country(szTerritory)) { LanguageISOTerritory = szTerritory; } describe(); }
/*********************************************************************** * lineGetTranslateCaps (TAPI32.@) * * get address translate capabilities. Returns a LINETRANSLATECAPS * structure: * * +-----------------------+ * |TotalSize | * |NeededSize | * |UsedSize | * +-----------------------+ * |NumLocations | * |LocationsListSize | * |LocationsListOffset | -+ * |CurrentLocationID | | * +-----------------------+ | * |NumCards | | * |CardListSize | | * |CardListOffset | -|--+ * |CurrentPreferredCardID | | | * +-----------------------+ | | * | | <+ | * |LINELOCATIONENTRY #1 | | * | | | * +-----------------------+ | * ~ ~ | * +-----------------------+ | * | | | * |LINELOCATIONENTRY | | * | #NumLocations| | * +-----------------------+ | * | | <---+ * |LINECARDENTRY #1 | * | | * +-----------------------+ * ~ ~ * +-----------------------+ * | | * |LINECARDENTRY #NumCards| * | | * +-----------------------+ * | room for strings named| * | in the structures | * | above. | * +-----------------------+ */ DWORD WINAPI lineGetTranslateCapsA(HLINEAPP hLineApp, DWORD dwAPIVersion, LPLINETRANSLATECAPS lpTranslateCaps) { HKEY hkLocations, hkCards, hkCardLocations, hsubkey; int numlocations, numcards; DWORD maxlockeylen, maxcardkeylen; char *loc_key_name = NULL; char *card_key_name = NULL; LPBYTE strptr; int length; int i; DWORD lendword; DWORD currentid; LPLINELOCATIONENTRY pLocEntry; LPLINECARDENTRY pCardEntry; TRACE("(%p, %08x, %p (tot. size %d)\n", hLineApp, dwAPIVersion, lpTranslateCaps, lpTranslateCaps->dwTotalSize ); if( lpTranslateCaps->dwTotalSize < sizeof(LINETRANSLATECAPS)) return LINEERR_STRUCTURETOOSMALL; if( RegCreateKeyA(HKEY_LOCAL_MACHINE, szLocationsKey, &hkLocations) != ERROR_SUCCESS ) { ERR("unexpected registry error 1.\n"); return LINEERR_INIFILECORRUPT; } lendword = sizeof( DWORD); if( RegQueryValueExA( hkLocations, "CurrentID", NULL, NULL, (LPBYTE) ¤tid, &lendword) != ERROR_SUCCESS ) currentid = -1; /* change this later */ if(RegQueryInfoKeyA(hkLocations, NULL, NULL, NULL, NULL, &maxlockeylen, NULL, NULL, NULL, NULL, NULL, NULL) != ERROR_SUCCESS) { RegCloseKey(hkLocations); ERR("unexpected registry error 2.\n"); return LINEERR_INIFILECORRUPT; } maxlockeylen++; if( maxlockeylen < 10) maxlockeylen = 10; /* need this also if there is no key */ loc_key_name = HeapAlloc( GetProcessHeap(), 0, maxlockeylen); /* first time through: calculate needed space */ length=0; i=0; numlocations=0; while( RegEnumKeyA(hkLocations, i, loc_key_name, maxlockeylen) == ERROR_SUCCESS){ DWORD size_val; i++; if( strncasecmp(loc_key_name, "location", 8) || (RegOpenKeyA(hkLocations, loc_key_name, &hsubkey) != ERROR_SUCCESS)) continue; numlocations++; length += sizeof(LINELOCATIONENTRY); RegQueryValueExA(hsubkey, "Name",NULL,NULL,NULL,&size_val); length += size_val; RegQueryValueExA(hsubkey, "AreaCode",NULL,NULL,NULL,&size_val); length += size_val; RegQueryValueExA(hsubkey, "OutsideAccess",NULL,NULL,NULL,&size_val); length += size_val; RegQueryValueExA(hsubkey, "LongDistanceAccess",NULL,NULL,NULL,&size_val); length += size_val; RegQueryValueExA(hsubkey, "DisableCallWaiting",NULL,NULL,NULL,&size_val); length += size_val; /* fixme: what about TollPrefixList???? */ RegCloseKey(hsubkey); } if(numlocations == 0) { /* add one location */ if( RegCreateKeyA( hkLocations, "Location1", &hsubkey) == ERROR_SUCCESS) { DWORD dwval; char buf[10]; numlocations = 1; length += sizeof(LINELOCATIONENTRY) + 20 ; RegSetValueExA( hsubkey, "AreaCode", 0, REG_SZ, (const BYTE *)"010", 4); GetLocaleInfoA( LOCALE_SYSTEM_DEFAULT, LOCALE_ICOUNTRY, buf, 8); dwval = atoi(buf); RegSetValueExA( hsubkey, "Country", 0, REG_DWORD, (LPBYTE)&dwval, sizeof(DWORD)); RegSetValueExA( hsubkey, "DisableCallWaiting", 0, REG_SZ, (const BYTE *)"", 1); dwval = 1; RegSetValueExA( hsubkey, "Flags", 0, REG_DWORD, (LPBYTE)&dwval, sizeof(DWORD)); RegSetValueExA( hsubkey, "LongDistanceAccess", 0, REG_SZ, (const BYTE *)"", 1); RegSetValueExA( hsubkey, "Name", 0, REG_SZ, (const BYTE *)"New Location", 13); RegSetValueExA( hsubkey, "OutsideAccess", 0, REG_SZ, (const BYTE *)"", 1); RegCloseKey(hsubkey); dwval = 1; RegSetValueExA( hkLocations, "CurrentID", 0, REG_DWORD, (LPBYTE)&dwval, sizeof(DWORD)); dwval = 2; RegSetValueExA( hkLocations, "NextID", 0, REG_DWORD, (LPBYTE)&dwval, sizeof(DWORD)); } } /* do the card list */ numcards=0; if( RegCreateKeyA(HKEY_CURRENT_USER, szCardsKey, &hkCards) == ERROR_SUCCESS ) { if(RegQueryInfoKeyA(hkCards, NULL, NULL, NULL, NULL, &maxcardkeylen, NULL, NULL, NULL, NULL, NULL, NULL) == ERROR_SUCCESS) { maxcardkeylen++; if( maxcardkeylen < 6) maxcardkeylen = 6; card_key_name = HeapAlloc(GetProcessHeap(), 0, maxcardkeylen); i=0; while( RegEnumKeyA(hkCards, i, card_key_name, maxcardkeylen) == ERROR_SUCCESS){ DWORD size_val; i++; if( strncasecmp(card_key_name, "card", 4) || ERROR_SUCCESS != (RegOpenKeyA(hkCards, card_key_name, &hsubkey) )) continue; numcards++; length += sizeof(LINECARDENTRY); RegQueryValueExA(hsubkey, "Name",NULL,NULL,NULL,&size_val); length += size_val; RegQueryValueExA(hsubkey, "LocalRule",NULL,NULL,NULL,&size_val); length += size_val; RegQueryValueExA(hsubkey, "LDRule",NULL,NULL,NULL,&size_val); length += size_val; RegQueryValueExA(hsubkey, "InternationalRule",NULL,NULL,NULL, &size_val); length += size_val; RegCloseKey(hsubkey); } } /* add one card (direct call) */ if (numcards == 0 && ERROR_SUCCESS == RegCreateKeyA( hkCards, "Card1", &hsubkey)) { DWORD dwval; numcards = 1; length += sizeof(LINECARDENTRY) + 22 ; RegSetValueExA( hsubkey, "Name", 0, REG_SZ, (const BYTE *)"None (Direct Call)", 19); dwval = 1; RegSetValueExA( hsubkey, "Flags", 0, REG_DWORD, (LPBYTE)&dwval, sizeof(DWORD)); RegSetValueExA( hsubkey, "InternationalRule", 0, REG_SZ, (const BYTE *)"", 1); RegSetValueExA( hsubkey, "LDRule", 0, REG_SZ, (const BYTE *)"", 1); RegSetValueExA( hsubkey, "LocalRule", 0, REG_SZ, (const BYTE *)"", 1); RegCloseKey(hsubkey); dwval = 2; RegSetValueExA( hkCards, "NextID", 0, REG_DWORD, (LPBYTE)&dwval, sizeof(DWORD)); } } else hkCards = 0; /* should really fail */ /* check if sufficient room is available */ lpTranslateCaps->dwNeededSize = sizeof(LINETRANSLATECAPS) + length; if ( lpTranslateCaps->dwNeededSize > lpTranslateCaps->dwTotalSize ) { RegCloseKey( hkLocations); if( hkCards) RegCloseKey( hkCards); HeapFree(GetProcessHeap(), 0, loc_key_name); HeapFree(GetProcessHeap(), 0, card_key_name); lpTranslateCaps->dwUsedSize = sizeof(LINETRANSLATECAPS); TRACE("Insufficient space: total %d needed %d used %d\n", lpTranslateCaps->dwTotalSize, lpTranslateCaps->dwNeededSize, lpTranslateCaps->dwUsedSize); return 0; } /* fill in the LINETRANSLATECAPS structure */ lpTranslateCaps->dwUsedSize = lpTranslateCaps->dwNeededSize; lpTranslateCaps->dwNumLocations = numlocations; lpTranslateCaps->dwLocationListSize = sizeof(LINELOCATIONENTRY) * lpTranslateCaps->dwNumLocations; lpTranslateCaps->dwLocationListOffset = sizeof(LINETRANSLATECAPS); lpTranslateCaps->dwCurrentLocationID = currentid; lpTranslateCaps->dwNumCards = numcards; lpTranslateCaps->dwCardListSize = sizeof(LINECARDENTRY) * lpTranslateCaps->dwNumCards; lpTranslateCaps->dwCardListOffset = lpTranslateCaps->dwLocationListOffset + lpTranslateCaps->dwLocationListSize; lpTranslateCaps->dwCurrentPreferredCardID = 0; /* this is where the strings will be stored */ strptr = ((LPBYTE) lpTranslateCaps) + lpTranslateCaps->dwCardListOffset + lpTranslateCaps->dwCardListSize; pLocEntry = (LPLINELOCATIONENTRY) (lpTranslateCaps + 1); /* key with Preferred CardID's */ if( RegOpenKeyA(HKEY_CURRENT_USER, szLocationsKey, &hkCardLocations) != ERROR_SUCCESS ) hkCardLocations = 0; /* second time through all locations */ i=0; while(RegEnumKeyA(hkLocations, i, loc_key_name, maxlockeylen) == ERROR_SUCCESS){ DWORD size_val; i++; if( strncasecmp(loc_key_name, "location", 8) || (RegOpenKeyA(hkLocations, loc_key_name, &hsubkey) != ERROR_SUCCESS)) continue; size_val=sizeof(DWORD); if( RegQueryValueExA(hsubkey, "ID",NULL, NULL, (LPBYTE) &(pLocEntry->dwPermanentLocationID), &size_val) != ERROR_SUCCESS) pLocEntry->dwPermanentLocationID = atoi( loc_key_name + 8); size_val=2048; RegQueryValueExA(hsubkey, "Name",NULL,NULL, strptr, &size_val); pLocEntry->dwLocationNameSize = size_val; pLocEntry->dwLocationNameOffset = strptr - (LPBYTE) lpTranslateCaps; strptr += size_val; size_val=2048; RegQueryValueExA(hsubkey, "AreaCode",NULL,NULL, strptr, &size_val); pLocEntry->dwCityCodeSize = size_val; pLocEntry->dwCityCodeOffset = strptr - (LPBYTE) lpTranslateCaps; strptr += size_val; size_val=2048; RegQueryValueExA(hsubkey, "OutsideAccess",NULL,NULL, strptr, &size_val); pLocEntry->dwLocalAccessCodeSize = size_val; pLocEntry->dwLocalAccessCodeOffset = strptr - (LPBYTE) lpTranslateCaps; strptr += size_val; size_val=2048; RegQueryValueExA(hsubkey, "LongDistanceAccess",NULL,NULL, strptr, &size_val); pLocEntry->dwLongDistanceAccessCodeSize= size_val; pLocEntry->dwLongDistanceAccessCodeOffset= strptr - (LPBYTE) lpTranslateCaps; strptr += size_val; size_val=2048; RegQueryValueExA(hsubkey, "DisableCallWaiting",NULL,NULL, strptr, &size_val); pLocEntry->dwCancelCallWaitingSize= size_val; pLocEntry->dwCancelCallWaitingOffset= strptr - (LPBYTE) lpTranslateCaps; strptr += size_val; pLocEntry->dwTollPrefixListSize = 0; /* FIXME */ pLocEntry->dwTollPrefixListOffset = 0; /* FIXME */ size_val=sizeof(DWORD); RegQueryValueExA(hsubkey, "Country",NULL,NULL, (LPBYTE) &(pLocEntry->dwCountryCode), &size_val); pLocEntry->dwCountryID = pLocEntry->dwCountryCode; /* FIXME */ RegQueryValueExA(hsubkey, "Flags",NULL,NULL, (LPBYTE) &(pLocEntry->dwOptions), &size_val); RegCloseKey(hsubkey); /* get preferred cardid */ pLocEntry->dwPreferredCardID = 0; if ( hkCardLocations) { size_val=sizeof(DWORD); if(RegOpenKeyA(hkCardLocations, loc_key_name, &hsubkey) == ERROR_SUCCESS) { RegQueryValueExA(hsubkey, "CallingCard",NULL,NULL, (LPBYTE) &(pLocEntry->dwPreferredCardID), &size_val); RegCloseKey(hsubkey); } } /* make sure there is a currentID */ if(currentid == -1){ currentid = pLocEntry->dwPermanentLocationID; lpTranslateCaps->dwCurrentLocationID = currentid; } if(pLocEntry->dwPermanentLocationID == currentid ) lpTranslateCaps->dwCurrentPreferredCardID = pLocEntry->dwPreferredCardID; TRACE("added: ID %d %s CountryCode %d CityCode %s CardID %d " "LocalAccess: %s LongDistanceAccess: %s CountryID %d " "Options %d CancelCallWait %s\n", pLocEntry->dwPermanentLocationID, debugstr_a( (char*)lpTranslateCaps + pLocEntry->dwLocationNameOffset), pLocEntry->dwCountryCode, debugstr_a( (char*)lpTranslateCaps + pLocEntry->dwCityCodeOffset), pLocEntry->dwPreferredCardID, debugstr_a( (char*)lpTranslateCaps + pLocEntry->dwLocalAccessCodeOffset), debugstr_a( (char*)lpTranslateCaps + pLocEntry->dwLongDistanceAccessCodeOffset), pLocEntry->dwCountryID, pLocEntry->dwOptions, debugstr_a( (char*)lpTranslateCaps + pLocEntry->dwCancelCallWaitingOffset)); pLocEntry++; } pCardEntry= (LPLINECARDENTRY) pLocEntry; /* do the card list */ if( hkCards) { i=0; while( RegEnumKeyA(hkCards, i, card_key_name, maxcardkeylen) == ERROR_SUCCESS){ DWORD size_val; i++; if( strncasecmp(card_key_name, "card", 4) || (RegOpenKeyA(hkCards, card_key_name, &hsubkey) != ERROR_SUCCESS)) continue; size_val=sizeof(DWORD); if( RegQueryValueExA(hsubkey, "ID",NULL, NULL, (LPBYTE) &(pCardEntry->dwPermanentCardID), &size_val) != ERROR_SUCCESS) pCardEntry->dwPermanentCardID= atoi( card_key_name + 4); size_val=2048; RegQueryValueExA(hsubkey, "Name",NULL,NULL, strptr, &size_val); pCardEntry->dwCardNameSize = size_val; pCardEntry->dwCardNameOffset = strptr - (LPBYTE) lpTranslateCaps; strptr += size_val; pCardEntry->dwCardNumberDigits = 1; /* FIXME */ size_val=2048; RegQueryValueExA(hsubkey, "LocalRule",NULL,NULL, strptr, &size_val); pCardEntry->dwSameAreaRuleSize= size_val; pCardEntry->dwSameAreaRuleOffset= strptr - (LPBYTE) lpTranslateCaps; strptr += size_val; size_val=2048; RegQueryValueExA(hsubkey, "LDRule",NULL,NULL, strptr, &size_val); pCardEntry->dwLongDistanceRuleSize = size_val; pCardEntry->dwLongDistanceRuleOffset = strptr - (LPBYTE) lpTranslateCaps; strptr += size_val; size_val=2048; RegQueryValueExA(hsubkey, "InternationalRule",NULL,NULL, strptr, &size_val); pCardEntry->dwInternationalRuleSize = size_val; pCardEntry->dwInternationalRuleOffset = strptr - (LPBYTE) lpTranslateCaps; strptr += size_val; size_val=sizeof(DWORD); RegQueryValueExA(hsubkey, "Flags",NULL, NULL, (LPBYTE) &(pCardEntry->dwOptions), &size_val); TRACE( "added card: ID %d name %s SameArea %s LongDistance %s International %s Options 0x%x\n", pCardEntry->dwPermanentCardID, debugstr_a( (char*)lpTranslateCaps + pCardEntry->dwCardNameOffset), debugstr_a( (char*)lpTranslateCaps + pCardEntry->dwSameAreaRuleOffset), debugstr_a( (char*)lpTranslateCaps + pCardEntry->dwLongDistanceRuleOffset), debugstr_a( (char*)lpTranslateCaps + pCardEntry->dwInternationalRuleOffset), pCardEntry->dwOptions); pCardEntry++; } } if(hkLocations) RegCloseKey(hkLocations); if(hkCards) RegCloseKey(hkCards); if(hkCardLocations) RegCloseKey(hkCardLocations); HeapFree(GetProcessHeap(), 0, loc_key_name); HeapFree(GetProcessHeap(), 0, card_key_name); TRACE(" returning success tot %d needed %d used %d\n", lpTranslateCaps->dwTotalSize, lpTranslateCaps->dwNeededSize, lpTranslateCaps->dwUsedSize ); return 0; /* success */ }
const char* _Locale_pm_str(struct _Locale_time* ltime) { static char buffer[9]; GetLocaleInfoA(ltime->lcid, LOCALE_S2359, buffer, 9); __ConvertFromACP(buffer, 9, ltime->cp); return buffer; }
/* Return 1 if OEM code page not used */ int __intGetOCP(LCID lcid) { char cp[6]; GetLocaleInfoA(lcid, LOCALE_IDEFAULTCODEPAGE, cp, 6); return atoi(cp); }
int TkSelGetSelection( Tcl_Interp *interp, /* Interpreter to use for reporting errors. */ Tk_Window tkwin, /* Window on whose behalf to retrieve the * selection (determines display from which to * retrieve). */ Atom selection, /* Selection to retrieve. */ Atom target, /* Desired form in which selection is to be * returned. */ Tk_GetSelProc *proc, /* Procedure to call to process the selection, * once it has been retrieved. */ ClientData clientData) /* Arbitrary value to pass to proc. */ { char *data, *destPtr; Tcl_DString ds; HGLOBAL handle; Tcl_Encoding encoding; int result, locale; if ((selection != Tk_InternAtom(tkwin, "CLIPBOARD")) || (target != XA_STRING) || !OpenClipboard(NULL)) { goto error; } /* * Attempt to get the data in Unicode form if available as this is less * work that CF_TEXT. */ result = TCL_ERROR; if (IsClipboardFormatAvailable(CF_UNICODETEXT)) { handle = GetClipboardData(CF_UNICODETEXT); if (!handle) { CloseClipboard(); goto error; } data = GlobalLock(handle); Tcl_DStringInit(&ds); Tcl_UniCharToUtfDString((Tcl_UniChar *)data, Tcl_UniCharLen((Tcl_UniChar *)data), &ds); GlobalUnlock(handle); } else if (IsClipboardFormatAvailable(CF_TEXT)) { /* * Determine the encoding to use to convert this text. */ if (IsClipboardFormatAvailable(CF_LOCALE)) { handle = GetClipboardData(CF_LOCALE); if (!handle) { CloseClipboard(); goto error; } /* * Get the locale identifier, determine the proper code page to * use, and find the corresponding encoding. */ Tcl_DStringInit(&ds); Tcl_DStringAppend(&ds, "cp######", -1); data = GlobalLock(handle); /* * Even though the documentation claims that GetLocaleInfo expects * an LCID, on Windows 9x it really seems to expect a LanguageID. */ locale = LANGIDFROMLCID(*((int*)data)); GetLocaleInfoA(locale, LOCALE_IDEFAULTANSICODEPAGE, Tcl_DStringValue(&ds)+2, Tcl_DStringLength(&ds)-2); GlobalUnlock(handle); encoding = Tcl_GetEncoding(NULL, Tcl_DStringValue(&ds)); Tcl_DStringFree(&ds); } else { encoding = NULL; } /* * Fetch the text and convert it to UTF. */ handle = GetClipboardData(CF_TEXT); if (!handle) { if (encoding) { Tcl_FreeEncoding(encoding); } CloseClipboard(); goto error; } data = GlobalLock(handle); Tcl_ExternalToUtfDString(encoding, data, -1, &ds); GlobalUnlock(handle); if (encoding) { Tcl_FreeEncoding(encoding); } } else { CloseClipboard(); goto error; } /* * Translate CR/LF to LF. */ data = destPtr = Tcl_DStringValue(&ds); while (*data) { if (data[0] == '\r' && data[1] == '\n') { data++; } else { *destPtr++ = *data++; } } *destPtr = '\0'; /* * Pass the data off to the selection procedure. */ result = proc(clientData, interp, Tcl_DStringValue(&ds)); Tcl_DStringFree(&ds); CloseClipboard(); return result; error: Tcl_SetObjResult(interp, Tcl_ObjPrintf( "%s selection doesn't exist or form \"%s\" not defined", Tk_GetAtomName(tkwin, selection), Tk_GetAtomName(tkwin, target))); Tcl_SetErrorCode(interp, "TK", "SELECTION", "EXISTS", NULL); return TCL_ERROR; }
static int __cdecl __crtGetLocaleInfoW_stat( _locale_t plocinfo, LCID Locale, LCTYPE LCType, LPWSTR lpLCData, int cchData, int code_page ) { static int f_use = 0; /* * Look for unstubbed 'preferred' flavor. Otherwise use available flavor. * Must actually call the function to ensure it's not a stub. */ if (0 == f_use) { if (0 != GetLocaleInfoW(0, LOCALE_ILANGUAGE, NULL, 0)) { f_use = USE_W; } else if (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) { f_use = USE_A; } } /* Use "W" version */ if (USE_W == f_use) { return GetLocaleInfoW(Locale, LCType, lpLCData, cchData); } /* Use "A" version */ if (USE_A == f_use || f_use == 0) { int retval = 0; int buff_size; unsigned char* buffer; /* * Use __lc_codepage for conversion if code_page not specified */ if (0 == code_page) { code_page = plocinfo->locinfo->lc_codepage; } /* find out how big buffer needs to be */ if (0 == (buff_size = GetLocaleInfoA(Locale, LCType, NULL, 0))) { return 0; } /* allocate buffer */ buffer = (unsigned char*)_calloca(buff_size, sizeof(char)); if (buffer == NULL) { return 0; } /* get the info in ANSI format */ if (0 == GetLocaleInfoA(Locale, LCType, (char*)buffer, buff_size)) { goto error_cleanup; } if (0 == cchData) { /* find out how much space needed */ retval = MultiByteToWideChar(code_page, MB_PRECOMPOSED, (const char*)buffer, -1, NULL, 0); } else { /* convert into user buffer */ retval = MultiByteToWideChar(code_page, MB_PRECOMPOSED, (const char*)buffer, -1, lpLCData, cchData); } error_cleanup: _freea(buffer); return retval; } else { /* f_use is neither USE_A nor USE_W */ return 0; } }
static void test_setlocale(void) { static const char lc_all[] = "LC_COLLATE=C;LC_CTYPE=C;" "LC_MONETARY=Greek_Greece.1253;LC_NUMERIC=Polish_Poland.1250;LC_TIME=C"; char *ret, buf[100]; ret = setlocale(20, "C"); ok(ret == NULL, "ret = %s\n", ret); ret = setlocale(LC_ALL, "C"); ok(!strcmp(ret, "C"), "ret = %s\n", ret); ret = setlocale(LC_ALL, NULL); ok(!strcmp(ret, "C"), "ret = %s\n", ret); if(!setlocale(LC_NUMERIC, "Polish") || !setlocale(LC_NUMERIC, "Greek") || !setlocale(LC_NUMERIC, "German") || !setlocale(LC_NUMERIC, "English")) { win_skip("System with limited locales\n"); return; } ret = setlocale(LC_NUMERIC, "Polish"); ok(!strcmp(ret, "Polish_Poland.1250"), "ret = %s\n", ret); ret = setlocale(LC_MONETARY, "Greek"); ok(!strcmp(ret, "Greek_Greece.1253"), "ret = %s\n", ret); ret = setlocale(LC_ALL, NULL); ok(!strcmp(ret, lc_all), "ret = %s\n", ret); strcpy(buf, ret); ret = setlocale(LC_ALL, buf); ok(!strcmp(ret, lc_all), "ret = %s\n", ret); ret = setlocale(LC_ALL, "German"); ok(!strcmp(ret, "German_Germany.1252"), "ret = %s\n", ret); ret = setlocale(LC_ALL, "american"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp(ret, "English_United States.1252"), "ret = %s\n", ret); ret = setlocale(LC_ALL, "american english"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp(ret, "English_United States.1252"), "ret = %s\n", ret); ret = setlocale(LC_ALL, "american-english"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp(ret, "English_United States.1252"), "ret = %s\n", ret); ret = setlocale(LC_ALL, "australian"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp(ret, "English_Australia.1252"), "ret = %s\n", ret); ret = setlocale(LC_ALL, "belgian"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp(ret, "Dutch_Belgium.1252"), "ret = %s\n", ret); ret = setlocale(LC_ALL, "canadian"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp(ret, "English_Canada.1252"), "ret = %s\n", ret); ret = setlocale(LC_ALL, "chinese"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp(ret, "Chinese (Simplified)_People's Republic of China.936") || !strcmp(ret, "Chinese (Simplified)_China.936") || broken(!strcmp(ret, "Chinese_Taiwan.950")), "ret = %s\n", ret); ret = setlocale(LC_ALL, "chinese-simplified"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp(ret, "Chinese (Simplified)_People's Republic of China.936") || !strcmp(ret, "Chinese (Simplified)_China.936") || broken(!strcmp(ret, "Chinese_People's Republic of China.936")) || broken(!strcmp(ret, "Chinese_Taiwan.950")), "ret = %s\n", ret); ret = setlocale(LC_ALL, "chinese-traditional"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp(ret, "Chinese (Traditional)_Taiwan.950") || broken(!strcmp(ret, "Chinese_Taiwan.950")), "ret = %s\n", ret); ret = setlocale(LC_ALL, "chs"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp(ret, "Chinese (Simplified)_People's Republic of China.936") || !strcmp(ret, "Chinese (Simplified)_China.936") || broken(!strcmp(ret, "Chinese_People's Republic of China.936")), "ret = %s\n", ret); ret = setlocale(LC_ALL, "cht"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp(ret, "Chinese (Traditional)_Taiwan.950") || broken(!strcmp(ret, "Chinese_Taiwan.950")), "ret = %s\n", ret); ret = setlocale(LC_ALL, "Chinese_China.936"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) { trace("Chinese_China.936=%s\n", ret); ok(!strcmp(ret, "Chinese (Simplified)_People's Republic of China.936") /* Vista - Win7 */ || !strcmp(ret, "Chinese (Simplified)_China.936") /* Win8 - Win10 */ || broken(!strcmp(ret, "Chinese_People's Republic of China.936")), "ret = %s\n", ret); } ret = setlocale(LC_ALL, "csy"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp(ret, "Czech_Czech Republic.1250") || !strcmp(ret, "Czech_Czechia.1250"), "ret = %s\n", ret); ret = setlocale(LC_ALL, "czech"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp(ret, "Czech_Czech Republic.1250") || !strcmp(ret, "Czech_Czechia.1250"), "ret = %s\n", ret); ret = setlocale(LC_ALL, "dan"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp(ret, "Danish_Denmark.1252"), "ret = %s\n", ret); ret = setlocale(LC_ALL, "danish"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp(ret, "Danish_Denmark.1252"), "ret = %s\n", ret); ret = setlocale(LC_ALL, "dea"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp(ret, "German_Austria.1252"), "ret = %s\n", ret); ret = setlocale(LC_ALL, "des"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp(ret, "German_Switzerland.1252"), "ret = %s\n", ret); ret = setlocale(LC_ALL, "deu"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp(ret, "German_Germany.1252"), "ret = %s\n", ret); ret = setlocale(LC_ALL, "dutch"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp(ret, "Dutch_Netherlands.1252"), "ret = %s\n", ret); ret = setlocale(LC_ALL, "dutch-belgian"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp(ret, "Dutch_Belgium.1252") || broken(!strcmp(ret, "Dutch_Netherlands.1252")), "ret = %s\n", ret); ret = setlocale(LC_ALL, "ena"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp(ret, "English_Australia.1252") || broken(!strcmp(ret, "English_United States.1252")), "ret = %s\n", ret); ret = setlocale(LC_ALL, "ell"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp(ret, "Greek_Greece.1253"), "ret = %s\n", ret); ret = setlocale(LC_ALL, "enc"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp(ret, "English_Canada.1252") || broken(!strcmp(ret, "English_United States.1252")), "ret = %s\n", ret); ret = setlocale(LC_ALL, "eng"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp(ret, "English_United Kingdom.1252") || broken(!strcmp(ret, "English_United States.1252")), "ret = %s\n", ret); ret = setlocale(LC_ALL, "enu"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp(ret, "English_United States.1252"), "ret = %s\n", ret); ret = setlocale(LC_ALL, "enz"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp(ret, "English_New Zealand.1252") || broken(!strcmp(ret, "English_United States.1252")), "ret = %s\n", ret); ret = setlocale(LC_ALL, "english"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp(ret, "English_United States.1252"), "ret = %s\n", ret); ret = setlocale(LC_ALL, "english-american"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp(ret, "English_United States.1252"), "ret = %s\n", ret); ret = setlocale(LC_ALL, "english-aus"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp(ret, "English_Australia.1252") || broken(!strcmp(ret, "English_United States.1252")), "ret = %s\n", ret); ret = setlocale(LC_ALL, "english-can"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp(ret, "English_Canada.1252") || broken(!strcmp(ret, "English_United States.1252")), "ret = %s\n", ret); ret = setlocale(LC_ALL, "english-nz"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp(ret, "English_New Zealand.1252") || broken(!strcmp(ret, "English_United States.1252")), "ret = %s\n", ret); ret = setlocale(LC_ALL, "english-uk"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp(ret, "English_United Kingdom.1252") || broken(!strcmp(ret, "English_United States.1252")), "ret = %s\n", ret); ret = setlocale(LC_ALL, "english-us"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp(ret, "English_United States.1252"), "ret = %s\n", ret); ret = setlocale(LC_ALL, "english-usa"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp(ret, "English_United States.1252"), "ret = %s\n", ret); ret = setlocale(LC_ALL, "esm"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp(ret, "Spanish_Mexico.1252"), "ret = %s\n", ret); ret = setlocale(LC_ALL, "esn"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp(ret, "Spanish_Spain.1252") || broken(!strcmp(ret, "Spanish - Modern Sort_Spain.1252")), "ret = %s\n", ret); ret = setlocale(LC_ALL, "esp"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp(ret, "Spanish_Spain.1252") || broken(!strcmp(ret, "Spanish - Traditional Sort_Spain.1252")), "ret = %s\n", ret); ret = setlocale(LC_ALL, "fin"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp(ret, "Finnish_Finland.1252"), "ret = %s\n", ret); ret = setlocale(LC_ALL, "finnish"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp(ret, "Finnish_Finland.1252"), "ret = %s\n", ret); ret = setlocale(LC_ALL, "fra"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp(ret, "French_France.1252"), "ret = %s\n", ret); ret = setlocale(LC_ALL, "frb"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp(ret, "French_Belgium.1252") || broken(!strcmp(ret, "French_France.1252")), "ret = %s\n", ret); ret = setlocale(LC_ALL, "frc"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp(ret, "French_Canada.1252") || broken(!strcmp(ret, "French_France.1252")), "ret = %s\n", ret); ret = setlocale(LC_ALL, "french"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp(ret, "French_France.1252"), "ret = %s\n", ret); ret = setlocale(LC_ALL, "french-belgian"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp(ret, "French_Belgium.1252") || broken(!strcmp(ret, "French_France.1252")), "ret = %s\n", ret); ret = setlocale(LC_ALL, "french-canadian"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp(ret, "French_Canada.1252") || broken(!strcmp(ret, "French_France.1252")), "ret = %s\n", ret); ret = setlocale(LC_ALL, "french-swiss"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp(ret, "French_Switzerland.1252") || broken(!strcmp(ret, "French_France.1252")), "ret = %s\n", ret); ret = setlocale(LC_ALL, "frs"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp(ret, "French_Switzerland.1252") || broken(!strcmp(ret, "French_France.1252")), "ret = %s\n", ret); ret = setlocale(LC_ALL, "german"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp(ret, "German_Germany.1252"), "ret = %s\n", ret); ret = setlocale(LC_ALL, "german-austrian"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp(ret, "German_Austria.1252") || broken(!strcmp(ret, "German_Germany.1252")), "ret = %s\n", ret); ret = setlocale(LC_ALL, "german-swiss"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp(ret, "German_Switzerland.1252") || broken(!strcmp(ret, "German_Germany.1252")), "ret = %s\n", ret); ret = setlocale(LC_ALL, "greek"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp(ret, "Greek_Greece.1253"), "ret = %s\n", ret); ret = setlocale(LC_ALL, "hun"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp(ret, "Hungarian_Hungary.1250"), "ret = %s\n", ret); ret = setlocale(LC_ALL, "hungarian"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp(ret, "Hungarian_Hungary.1250"), "ret = %s\n", ret); ret = setlocale(LC_ALL, "icelandic"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp(ret, "Icelandic_Iceland.1252"), "ret = %s\n", ret); ret = setlocale(LC_ALL, "isl"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp(ret, "Icelandic_Iceland.1252"), "ret = %s\n", ret); ret = setlocale(LC_ALL, "ita"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp(ret, "Italian_Italy.1252"), "ret = %s\n", ret); ret = setlocale(LC_ALL, "italian"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp(ret, "Italian_Italy.1252"), "ret = %s\n", ret); ret = setlocale(LC_ALL, "italian-swiss"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp(ret, "Italian_Switzerland.1252") || broken(!strcmp(ret, "Italian_Italy.1252")), "ret = %s\n", ret); ret = setlocale(LC_ALL, "its"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp(ret, "Italian_Switzerland.1252") || broken(!strcmp(ret, "Italian_Italy.1252")), "ret = %s\n", ret); ret = setlocale(LC_ALL, "japanese"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp(ret, "Japanese_Japan.932"), "ret = %s\n", ret); ret = setlocale(LC_ALL, "jpn"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp(ret, "Japanese_Japan.932"), "ret = %s\n", ret); ret = setlocale(LC_ALL, "korean"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp(ret, "Korean_Korea.949"), "ret = %s\n", ret); ret = setlocale(LC_ALL, "korean"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp(ret, "Korean_Korea.949"), "ret = %s\n", ret); ret = setlocale(LC_ALL, "nlb"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp(ret, "Dutch_Belgium.1252") || broken(!strcmp(ret, "Dutch_Netherlands.1252")), "ret = %s\n", ret); ret = setlocale(LC_ALL, "nld"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp(ret, "Dutch_Netherlands.1252"), "ret = %s\n", ret); ret = setlocale(LC_ALL, "non"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp( ret, "Norwegian-Nynorsk_Norway.1252") /* XP - Win10 */ || !strcmp(ret, "Norwegian (Nynorsk)_Norway.1252") || broken(!strcmp(ret, "Norwegian (Bokm\xe5l)_Norway.1252")) || broken(!strcmp(ret, "Norwegian_Norway.1252")), /* WinME */ "ret = %s\n", ret); ret = setlocale(LC_ALL, "nor"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp(ret, "Norwegian (Bokm\xe5l)_Norway.1252") /* XP - Win8 */ || !strcmp(ret, "Norwegian Bokm\xe5l_Norway.1252") /* Win10 */ || !strcmp(ret, "Norwegian (Bokmal)_Norway.1252") || broken(!strcmp(ret, "Norwegian_Norway.1252")), /* WinME */ "ret = %s\n", ret); ret = setlocale(LC_ALL, "norwegian-bokmal"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp(ret, "Norwegian (Bokm\xe5l)_Norway.1252") /* XP - Win8 */ || !strcmp(ret, "Norwegian Bokm\xe5l_Norway.1252") /* Win10 */ || !strcmp(ret, "Norwegian (Bokmal)_Norway.1252") || broken(!strcmp(ret, "Norwegian_Norway.1252")), /* WinME */ "ret = %s\n", ret); ret = setlocale(LC_ALL, "norwegian-nynorsk"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp(ret, "Norwegian-Nynorsk_Norway.1252") /* Vista - Win10 */ || !strcmp(ret, "Norwegian (Nynorsk)_Norway.1252") || broken(!strcmp(ret, "Norwegian_Norway.1252")) /* WinME */ || broken(!strcmp(ret, "Norwegian (Bokmal)_Norway.1252")) || broken(!strcmp(ret, "Norwegian (Bokm\xe5l)_Norway.1252")) /* XP & 2003 */, "ret = %s\n", ret); ret = setlocale(LC_ALL, "plk"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp(ret, "Polish_Poland.1250"), "ret = %s\n", ret); ret = setlocale(LC_ALL, "polish"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp(ret, "Polish_Poland.1250"), "ret = %s\n", ret); ret = setlocale(LC_ALL, "portuguese"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp(ret, "Portuguese_Brazil.1252") || broken(!strcmp(ret, "Portuguese_Portugal.1252")) /* NT4 */, "ret = %s\n", ret); ret = setlocale(LC_ALL, "portuguese-brazil"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp(ret, "Portuguese_Brazil.1252"), "ret = %s\n", ret); ret = setlocale(LC_ALL, "ptb"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp(ret, "Portuguese_Brazil.1252"), "ret = %s\n", ret); ret = setlocale(LC_ALL, "ptg"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp(ret, "Portuguese_Portugal.1252"), "ret = %s\n", ret); ret = setlocale(LC_ALL, "rus"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp(ret, "Russian_Russia.1251"), "ret = %s\n", ret); ret = setlocale(LC_ALL, "russian"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp(ret, "Russian_Russia.1251"), "ret = %s\n", ret); ret = setlocale(LC_ALL, "sky"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp(ret, "Slovak_Slovakia.1250"), "ret = %s\n", ret); ret = setlocale(LC_ALL, "slovak"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp(ret, "Slovak_Slovakia.1250"), "ret = %s\n", ret); ret = setlocale(LC_ALL, "spanish"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp(ret, "Spanish_Spain.1252") || broken(!strcmp(ret, "Spanish - Traditional Sort_Spain.1252")), "ret = %s\n", ret); ret = setlocale(LC_ALL, "spanish-mexican"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp(ret, "Spanish_Mexico.1252") || broken(!strcmp(ret, "Spanish_Spain.1252")), "ret = %s\n", ret); ret = setlocale(LC_ALL, "spanish-modern"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp(ret, "Spanish - Modern Sort_Spain.1252") || !strcmp(ret, "Spanish_Spain.1252"), "ret = %s\n", ret); ret = setlocale(LC_ALL, "sve"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp(ret, "Swedish_Sweden.1252"), "ret = %s\n", ret); ret = setlocale(LC_ALL, "swedish"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp(ret, "Swedish_Sweden.1252"), "ret = %s\n", ret); ret = setlocale(LC_ALL, "swiss"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp(ret, "German_Switzerland.1252"), "ret = %s\n", ret); ret = setlocale(LC_ALL, "trk"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp(ret, "Turkish_Turkey.1254"), "ret = %s\n", ret); ret = setlocale(LC_ALL, "turkish"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp(ret, "Turkish_Turkey.1254"), "ret = %s\n", ret); ret = setlocale(LC_ALL, "uk"); ok(ret != NULL, "ret == NULL\n"); if(ret) ok(!strcmp(ret, "English_United Kingdom.1252") || broken(!strcmp(ret, "Ukrainian_Ukraine.1251")), "ret = %s\n", ret); ret = setlocale(LC_ALL, "us"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp(ret, "English_United States.1252"), "ret = %s\n", ret); ret = setlocale(LC_ALL, "usa"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) ok(!strcmp(ret, "English_United States.1252"), "ret = %s\n", ret); ret = setlocale(LC_ALL, "English_United States.ACP"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) { strcpy(buf, "English_United States."); GetLocaleInfoA(MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT), LOCALE_IDEFAULTANSICODEPAGE, buf+strlen(buf), 80); ok(!strcmp(ret, buf), "ret = %s, expected %s\n", ret, buf); } ret = setlocale(LC_ALL, "English_United States.OCP"); ok(ret != NULL || broken (ret == NULL), "ret == NULL\n"); if(ret) { strcpy(buf, "English_United States."); GetLocaleInfoA(MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT), LOCALE_IDEFAULTCODEPAGE, buf+strlen(buf), 80); ok(!strcmp(ret, buf), "ret = %s, expected %s\n", ret, buf); } ret = setlocale(LC_ALL, "English_United States.UTF8"); ok(ret == NULL, "ret != NULL\n"); ret = setlocale(LC_ALL, "en-US"); ok(ret == NULL || broken (ret != NULL), "ret != NULL\n"); /* XP & 2003 */ }
static int LoadLangPack(const TCHAR *szLangPack) { FILE *fp; char line[4096] = ""; char *pszColon; char *pszLine; int entriesAlloced; int startOfLine=0; unsigned int linePos=1; LCID langID; UINT fileCp = CP_ACP; lstrcpy(langPack.filename,szLangPack); fp = _tfopen(szLangPack,_T("rt")); if(fp==NULL) return 1; fgets(line,SIZEOF(line),fp); size_t lineLen = strlen(line); if (lineLen >= 3 && line[0]=='\xef' && line[1]=='\xbb' && line[2]=='\xbf') { fileCp = CP_UTF8; memmove(line, line + 3, lineLen - 2); } lrtrim(line); if(lstrcmpA(line,"Miranda Language Pack Version 1")) {fclose(fp); return 2;} //headers while(!feof(fp)) { startOfLine=ftell(fp); if(fgets(line,SIZEOF(line),fp)==NULL) break; lrtrim(line); if(IsEmpty(line) || line[0]==';' || line[0]==0) continue; if(line[0]=='[') break; pszColon=strchr(line,':'); if(pszColon==NULL) {fclose(fp); return 3;} *pszColon++ = 0; if(!lstrcmpA(line,"Language")) {mir_snprintf(langPack.language,sizeof(langPack.language),"%s",pszColon); lrtrim(langPack.language);} else if(!lstrcmpA(line,"Last-Modified-Using")) {mir_snprintf(langPack.lastModifiedUsing,sizeof(langPack.lastModifiedUsing),"%s",pszColon); lrtrim(langPack.lastModifiedUsing);} else if(!lstrcmpA(line,"Authors")) {mir_snprintf(langPack.authors,sizeof(langPack.authors),"%s",pszColon); lrtrim(langPack.authors);} else if(!lstrcmpA(line,"Author-email")) {mir_snprintf(langPack.authorEmail,sizeof(langPack.authorEmail),"%s",pszColon); lrtrim(langPack.authorEmail);} else if(!lstrcmpA(line, "Locale")) { char szBuf[20], *stopped; lrtrim(pszColon + 1); langID = (USHORT)strtol(pszColon, &stopped, 16); langPack.localeID = MAKELCID(langID, 0); GetLocaleInfoA(langPack.localeID, LOCALE_IDEFAULTANSICODEPAGE, szBuf, 10); szBuf[5] = 0; // codepages have max. 5 digits langPack.defaultANSICp = atoi(szBuf); if (fileCp == CP_ACP) fileCp = langPack.defaultANSICp; } } //body fseek(fp,startOfLine,SEEK_SET); entriesAlloced=0; while(!feof(fp)) { if(fgets(line,SIZEOF(line),fp)==NULL) break; if(IsEmpty(line) || line[0]==';' || line[0]==0) continue; rtrim(line); ConvertBackslashes(line, fileCp); if(line[0]=='[' && line[lstrlenA(line)-1]==']') { if(langPack.entryCount && langPack.entry[langPack.entryCount-1].local==NULL) { if(langPack.entry[langPack.entryCount-1].english!=NULL) mir_free(langPack.entry[langPack.entryCount-1].english); langPack.entryCount--; } pszLine = line+1; line[lstrlenA(line)-1]='\0'; if(++langPack.entryCount>entriesAlloced) { entriesAlloced+=128; langPack.entry=(struct LangPackEntry*)mir_realloc(langPack.entry,sizeof(struct LangPackEntry)*entriesAlloced); } langPack.entry[langPack.entryCount-1].english=NULL; langPack.entry[langPack.entryCount-1].englishHash=hashstr(pszLine); langPack.entry[langPack.entryCount-1].local=NULL; langPack.entry[langPack.entryCount-1].wlocal = NULL; langPack.entry[langPack.entryCount-1].linePos=linePos++; } else if(langPack.entryCount) { struct LangPackEntry* E = &langPack.entry[langPack.entryCount-1]; if(E->local==NULL) { E->local=mir_strdup(line); if (fileCp == CP_UTF8) Utf8DecodeCP(E->local, langPack.defaultANSICp, NULL); { int iNeeded = MultiByteToWideChar(fileCp, 0, line, -1, 0, 0); E->wlocal = (wchar_t *)mir_alloc((iNeeded+1) * sizeof(wchar_t)); MultiByteToWideChar(fileCp, 0, line, -1, E->wlocal, iNeeded); } } else { size_t iOldLenA = strlen(E->local); E->local = (char*)mir_realloc(E->local, iOldLenA + strlen(line) + 2); strcat(E->local, "\n"); strcat(E->local, line); if (fileCp == CP_UTF8) Utf8DecodeCP(E->local + iOldLenA + 1, langPack.defaultANSICp, NULL); { int iNeeded = MultiByteToWideChar(fileCp, 0, line, -1, 0, 0); size_t iOldLen = wcslen(E->wlocal); E->wlocal = (wchar_t*)mir_realloc(E->wlocal, ( sizeof(wchar_t) * ( iOldLen + iNeeded + 2))); wcscat(E->wlocal, L"\n"); MultiByteToWideChar(fileCp, 0, line, -1, E->wlocal + iOldLen+1, iNeeded); } } } } fclose(fp); qsort(langPack.entry,langPack.entryCount,sizeof(LangPackEntry),(int(*)(const void*,const void*))SortLangPackHashesProc); return 0; }
static void test__Gettnames(void) { static const DWORD time_data[] = { LOCALE_SABBREVDAYNAME7, LOCALE_SABBREVDAYNAME1, LOCALE_SABBREVDAYNAME2, LOCALE_SABBREVDAYNAME3, LOCALE_SABBREVDAYNAME4, LOCALE_SABBREVDAYNAME5, LOCALE_SABBREVDAYNAME6, LOCALE_SDAYNAME7, LOCALE_SDAYNAME1, LOCALE_SDAYNAME2, LOCALE_SDAYNAME3, LOCALE_SDAYNAME4, LOCALE_SDAYNAME5, LOCALE_SDAYNAME6, LOCALE_SABBREVMONTHNAME1, LOCALE_SABBREVMONTHNAME2, LOCALE_SABBREVMONTHNAME3, LOCALE_SABBREVMONTHNAME4, LOCALE_SABBREVMONTHNAME5, LOCALE_SABBREVMONTHNAME6, LOCALE_SABBREVMONTHNAME7, LOCALE_SABBREVMONTHNAME8, LOCALE_SABBREVMONTHNAME9, LOCALE_SABBREVMONTHNAME10, LOCALE_SABBREVMONTHNAME11, LOCALE_SABBREVMONTHNAME12, LOCALE_SMONTHNAME1, LOCALE_SMONTHNAME2, LOCALE_SMONTHNAME3, LOCALE_SMONTHNAME4, LOCALE_SMONTHNAME5, LOCALE_SMONTHNAME6, LOCALE_SMONTHNAME7, LOCALE_SMONTHNAME8, LOCALE_SMONTHNAME9, LOCALE_SMONTHNAME10, LOCALE_SMONTHNAME11, LOCALE_SMONTHNAME12, LOCALE_S1159, LOCALE_S2359, LOCALE_SSHORTDATE, LOCALE_SLONGDATE, LOCALE_STIMEFORMAT }; struct { char *str[43]; LCID lcid; int unk[2]; wchar_t *wstr[43]; char data[1]; } *ret; int size; char buf[64]; int i; if(!setlocale(LC_ALL, "english")) return; ret = _Gettnames(); size = ret->str[0]-(char*)ret; /* Newer version of the structure stores both ascii and unicode strings. * Unicode strings are only initialized on Windows 7 */ if(sizeof(void*) == 8) ok(size==0x2c0 || broken(size==0x168), "structure size: %x\n", size); else ok(size==0x164 || broken(size==0xb8), "structure size: %x\n", size); for (i = 0; i < ARRAY_SIZE(time_data); i++) { size = GetLocaleInfoA(MAKELCID(LANG_ENGLISH, SORT_DEFAULT), time_data[i], buf, sizeof(buf)); ok(size, "GetLocaleInfo failed: %x\n", GetLastError()); ok(!strcmp(ret->str[i], buf), "ret->str[%i] = %s, expected %s\n", i, ret->str[i], buf); } free(ret); if(!setlocale(LC_TIME, "german")) return; ret = _Gettnames(); for (i = 0; i < ARRAY_SIZE(time_data); i++) { size = GetLocaleInfoA(MAKELCID(LANG_GERMAN, SORT_DEFAULT), time_data[i], buf, sizeof(buf)); ok(size, "GetLocaleInfo failed: %x\n", GetLastError()); ok(!strcmp(ret->str[i], buf), "ret->str[%i] = %s, expected %s\n", i, ret->str[i], buf); } free(ret); setlocale(LC_ALL, "C"); }
LCID _getLocale(LPWIN32LOCALE _locale, LPSTR LocaleName) { BOOL found = FALSE; LCID locale; int res; int langID = 1; int subID = 1; int lcid = 0; char Language[64] = "none"; char ISO3166[4] = "000"; char *token; char *savetoken; char codepage[7]; strlwr(LocaleName); while (!found && langID <= MAX_LANGID) { locale = MAKELCID(MAKELANGID(langID, SUBLANG_DEFAULT), SORT_DEFAULT); GetLocaleInfoA(locale, LOCALE_SENGLANGUAGE, Language, 64); GetLocaleInfoA(locale, LOCALE_SABBREVLANGNAME, ISO3166, 4); strlwr(Language); strlwr(ISO3166); if (strstr(LocaleName, Language) != NULL) found = TRUE; else if (strstr(LocaleName, ISO3166) == LocaleName) { found = TRUE; } else langID++; } // No language specified and no codepage if (!found && strchr(LocaleName, '_') == NULL && strchr(LocaleName, '.') == NULL) { SetLastError(ERROR_LOCALE_INVALID); return 0; } if (!found) { if (_locale->handle == 0) langID = GetSystemDefaultLangID(); else langID = _locale->handle & 0x3FF; } // if not just a codepage lcid is now the selected language // get the sublanguage if any specified if ((token = strchr(LocaleName, '_')) != NULL) { token++; if ((savetoken = strchr(token, '.')) != NULL) *savetoken = 0x0; found = FALSE; res = 1; while (!found && res != 0) { res = GetLocaleInfoA(MAKELCID(MAKELANGID(langID, subID), SORT_DEFAULT), LOCALE_SENGCOUNTRY, Language, 64); strlwr(Language); if (strcmp(Language, token) == 0) { lcid = MAKELCID(MAKELANGID(langID, subID), SORT_DEFAULT); found = TRUE; } else subID++; } if (!found) { SetLastError(ERROR_LOCALE_INVALID); return 0; } if (savetoken) *savetoken = '.'; } else { lcid = MAKELCID(MAKELANGID(langID, SUBLANG_DEFAULT), SORT_DEFAULT); } // get the codepage if any specified if ((token = strchr(LocaleName, '.')) == NULL) { GetLocaleInfoA(lcid, LOCALE_IDEFAULTCODEPAGE, codepage, 7); _locale->codepage = atol(codepage); } else { token++; _locale->codepage = atol(token); } //isValidLocale() return lcid; }
static void SetValue(HWND hwndDlg, int idCtrl, HANDLE hContact, char *szModule, char *szSetting, int special) { char str[80], *pstr = NULL; TCHAR* ptstr = NULL; char* szProto = GetContactProto(hContact); bool proto_service = szProto && (CallProtoService(szProto, PS_GETCAPS, PFLAGNUM_4, 0) & PF4_INFOSETTINGSVC); DBVARIANT dbv = { DBVT_DELETED }; int unspecified; if (szModule == NULL) unspecified = 1; else if (proto_service) unspecified = Proto_GetContactInfoSetting(hContact, szProto, szModule, szSetting, &dbv, 0); else unspecified = db_get_s(hContact, szModule, szSetting, &dbv, 0); if ( !unspecified) { switch(dbv.type) { case DBVT_BYTE: if (special == SVS_GENDER) { if (dbv.cVal == 'M') ptstr = TranslateT("Male"); else if (dbv.cVal == 'F') ptstr = TranslateT("Female"); else unspecified = 1; } else if (special == SVS_MONTH) { if (dbv.bVal>0 && dbv.bVal <= 12) { pstr = str; GetLocaleInfoA(LOCALE_USER_DEFAULT, LOCALE_SABBREVMONTHNAME1-1+dbv.bVal, str, SIZEOF(str)); } else unspecified = 1; } else if (special == SVS_TIMEZONE) { if (dbv.cVal == -100) unspecified = 1; else { pstr = str; mir_snprintf(str, SIZEOF(str), dbv.cVal?"UTC%+d:%02d":"UTC", -dbv.cVal/2, (dbv.cVal&1)*30); } } else { unspecified = (special == SVS_ZEROISUNSPEC && dbv.bVal == 0); pstr = _itoa(special == SVS_SIGNED?dbv.cVal:dbv.bVal, str, 10); } break; case DBVT_WORD: if (special == SVS_COUNTRY) { WORD wSave = dbv.wVal; if (wSave == (WORD)-1) { char szSettingName[100]; mir_snprintf(szSettingName, SIZEOF(szSettingName), "%sName", szSetting); if ( !db_get_ts(hContact, szModule, szSettingName, &dbv)) { ptstr = dbv.ptszVal; unspecified = false; break; } } pstr = Translate((char*)CallService(MS_UTILS_GETCOUNTRYBYNUMBER, wSave, 0)); unspecified = pstr == NULL; } else { unspecified = (special == SVS_ZEROISUNSPEC && dbv.wVal == 0); pstr = _itoa(special == SVS_SIGNED?dbv.sVal:dbv.wVal, str, 10); } break; case DBVT_DWORD: unspecified = (special == SVS_ZEROISUNSPEC && dbv.dVal == 0); if (special == SVS_IP) { struct in_addr ia; ia.S_un.S_addr = htonl(dbv.dVal); pstr = inet_ntoa(ia); if (dbv.dVal == 0) unspecified = 1; } else pstr = _itoa(special == SVS_SIGNED?dbv.lVal:dbv.dVal, str, 10); break; case DBVT_ASCIIZ: unspecified = (special == SVS_ZEROISUNSPEC && dbv.pszVal[0] == '\0'); pstr = dbv.pszVal; break; case DBVT_UTF8: unspecified = (special == SVS_ZEROISUNSPEC && dbv.pszVal[0] == '\0'); if ( !unspecified) { WCHAR* wszStr; Utf8Decode(dbv.pszVal, &wszStr); SetDlgItemTextW(hwndDlg, idCtrl, TranslateTS(wszStr)); mir_free(wszStr); goto LBL_Exit; } pstr = dbv.pszVal; Utf8Decode(dbv.pszVal, NULL); break; default: pstr = str; lstrcpyA(str, "???"); break; } } if (unspecified) SetDlgItemText(hwndDlg, idCtrl, TranslateT("<not specified>")); else if (ptstr != NULL) SetDlgItemText(hwndDlg, idCtrl, ptstr); else SetDlgItemTextA(hwndDlg, idCtrl, pstr); LBL_Exit: EnableWindow(GetDlgItem(hwndDlg, idCtrl), !unspecified); if (proto_service) Proto_FreeInfoVariant(&dbv); else db_free(&dbv); }
static void test_VarFormat(void) { static const WCHAR szTesting[] = { 't','e','s','t','i','n','g','\0' }; static const WCHAR szNum[] = { '3','9','6','9','7','.','1','1','\0' }; size_t i; WCHAR buffW[256]; char buff[256]; VARIANT in; VARIANT_BOOL bTrue = VARIANT_TRUE, bFalse = VARIANT_FALSE; int fd = 0, fw = 0; ULONG flags = 0; BSTR bstrin, out = NULL; HRESULT hres; CHECKPTR(VarFormat); if (PRIMARYLANGID(LANGIDFROMLCID(GetUserDefaultLCID())) != LANG_ENGLISH) { skip("Skipping VarFormat tests for non English language\n"); return; } GetLocaleInfoA(LOCALE_USER_DEFAULT, LOCALE_SDECIMAL, buff, sizeof(buff)/sizeof(char)); if (buff[0] != '.' || buff[1]) { skip("Skipping VarFormat tests as decimal separator is '%s'\n", buff); return; } GetLocaleInfoA(LOCALE_USER_DEFAULT, LOCALE_IDIGITS, buff, sizeof(buff)/sizeof(char)); if (buff[0] != '2' || buff[1]) { skip("Skipping VarFormat tests as decimal places is '%s'\n", buff); return; } VARFMT(VT_BOOL,V_BOOL,VARIANT_TRUE,"True/False",S_OK,"True"); VARFMT(VT_BOOL,V_BOOL,VARIANT_FALSE,"True/False",S_OK,"False"); VNUMFMT(VT_I1,V_I1); VNUMFMT(VT_I2,V_I2); VNUMFMT(VT_I4,V_I4); if (has_i8) { VNUMFMT(VT_I8,V_I8); } VNUMFMT(VT_INT,V_INT); VNUMFMT(VT_UI1,V_UI1); VNUMFMT(VT_UI2,V_UI2); VNUMFMT(VT_UI4,V_UI4); if (has_i8) { VNUMFMT(VT_UI8,V_UI8); } VNUMFMT(VT_UINT,V_UINT); VNUMFMT(VT_R4,V_R4); VNUMFMT(VT_R8,V_R8); /* Reference types are dereferenced */ VARFMT(VT_BOOL|VT_BYREF,V_BOOLREF,&bTrue,"True/False",S_OK,"True"); VARFMT(VT_BOOL|VT_BYREF,V_BOOLREF,&bFalse,"True/False",S_OK,"False"); /* Dates */ for (i = 0; i < sizeof(VarFormat_date_results)/sizeof(FMTDATERES); i++) { if (i < 7) fd = i + 1; /* Test first day */ else fd = 0; VARFMT(VT_DATE,V_DATE,VarFormat_date_results[i].val, VarFormat_date_results[i].fmt,S_OK, VarFormat_date_results[i].res); } /* Named time formats */ GetLocaleInfoA(LOCALE_USER_DEFAULT, LOCALE_STIMEFORMAT, buff, sizeof(buff)/sizeof(char)); if (strcmp(buff, "h:mm:ss tt")) { skip("Skipping named time tests as time format is '%s'\n", buff); } else { for (i = 0; i < sizeof(VarFormat_namedtime_results)/sizeof(FMTDATERES); i++) { fd = 0; VARFMT(VT_DATE,V_DATE,VarFormat_namedtime_results[i].val, VarFormat_namedtime_results[i].fmt,S_OK, VarFormat_namedtime_results[i].res); } } /* Strings */ bstrin = SysAllocString(szTesting); VARFMT(VT_BSTR,V_BSTR,bstrin,"",S_OK,"testing"); VARFMT(VT_BSTR,V_BSTR,bstrin,"@",S_OK,"testing"); VARFMT(VT_BSTR,V_BSTR,bstrin,"&",S_OK,"testing"); VARFMT(VT_BSTR,V_BSTR,bstrin,"\\x@\\x@",S_OK,"xtxesting"); VARFMT(VT_BSTR,V_BSTR,bstrin,"\\x&\\x&",S_OK,"xtxesting"); VARFMT(VT_BSTR,V_BSTR,bstrin,"@\\x",S_OK,"txesting"); VARFMT(VT_BSTR,V_BSTR,bstrin,"@@@@@@@@",S_OK," testing"); VARFMT(VT_BSTR,V_BSTR,bstrin,"@\\x@@@@@@@",S_OK," xtesting"); VARFMT(VT_BSTR,V_BSTR,bstrin,"&&&&&&&&",S_OK,"testing"); VARFMT(VT_BSTR,V_BSTR,bstrin,"!&&&&&&&",S_OK,"testing"); VARFMT(VT_BSTR,V_BSTR,bstrin,"&&&&&&&!",S_OK,"testing"); VARFMT(VT_BSTR,V_BSTR,bstrin,">&&",S_OK,"TESTING"); VARFMT(VT_BSTR,V_BSTR,bstrin,"<&&",S_OK,"testing"); VARFMT(VT_BSTR,V_BSTR,bstrin,"<&>&",S_OK,"testing"); SysFreeString(bstrin); bstrin = SysAllocString(szNum); todo_wine VARFMT(VT_BSTR,V_BSTR,bstrin,"hh:mm",S_OK,"02:38"); todo_wine VARFMT(VT_BSTR,V_BSTR,bstrin,"mm-dd-yy",S_OK,"09-06-08"); SysFreeString(bstrin); /* Numeric values are converted to strings then output */ VARFMT(VT_I1,V_I1,1,"<&>&",S_OK,"1"); /* Number formats */ VARFMT(VT_I4,V_I4,1,"#00000000",S_OK,"00000001"); VARFMT(VT_I4,V_I4,1,"000###",S_OK,"000001"); VARFMT(VT_I4,V_I4,1,"#00##00#0",S_OK,"00000001"); VARFMT(VT_I4,V_I4,1,"1#####0000",S_OK,"10001"); VARFMT(VT_I4,V_I4,1,"##abcdefghijklmnopqrstuvwxyz",S_OK,"1abcdefghijklmnopqrstuvwxyz"); VARFMT(VT_I4,V_I4,100000,"#,###,###,###",S_OK,"100,000"); VARFMT(VT_I4,V_I4,1,"0,000,000,000",S_OK,"0,000,000,001"); VARFMT(VT_I4,V_I4,123456789,"#,#.#",S_OK,"123,456,789."); VARFMT(VT_I4,V_I4,123456789,"###, ###, ###",S_OK,"123, 456, 789"); VARFMT(VT_I4,V_I4,1,"#;-#",S_OK,"1"); VARFMT(VT_I4,V_I4,-1,"#;-#",S_OK,"-1"); VARFMT(VT_R8,V_R8,1.23456789,"0#.0#0#0#0#0",S_OK,"01.234567890"); VARFMT(VT_R8,V_R8,1.2,"0#.0#0#0#0#0",S_OK,"01.200000000"); VARFMT(VT_R8,V_R8,9.87654321,"#0.#0#0#0#0#",S_OK,"9.87654321"); VARFMT(VT_R8,V_R8,9.8,"#0.#0#0#0#0#",S_OK,"9.80000000"); VARFMT(VT_R8,V_R8,0.00000008,"#0.#0#0#0#0#0",S_OK,"0.0000000800"); VARFMT(VT_R8,V_R8,0.00010705,"#0.##########",S_OK,"0.00010705"); VARFMT(VT_I4,V_I4,17,"#0",S_OK,"17"); VARFMT(VT_I4,V_I4,4711,"#0",S_OK,"4711"); VARFMT(VT_I4,V_I4,17,"#00",S_OK,"17"); VARFMT(VT_I4,V_I4,100,"0##",S_OK,"100"); VARFMT(VT_I4,V_I4,17,"#000",S_OK,"017"); VARFMT(VT_I4,V_I4,17,"#0.00",S_OK,"17.00"); VARFMT(VT_I4,V_I4,17,"#0000.00",S_OK,"0017.00"); VARFMT(VT_I4,V_I4,17,"#.00",S_OK,"17.00"); VARFMT(VT_R8,V_R8,1.7,"#.00",S_OK,"1.70"); VARFMT(VT_R8,V_R8,.17,"#.00",S_OK,".17"); VARFMT(VT_I4,V_I4,17,"#3",S_OK,"173"); VARFMT(VT_I4,V_I4,17,"#33",S_OK,"1733"); VARFMT(VT_I4,V_I4,17,"#3.33",S_OK,"173.33"); VARFMT(VT_I4,V_I4,17,"#3333.33",S_OK,"173333.33"); VARFMT(VT_I4,V_I4,17,"#.33",S_OK,"17.33"); VARFMT(VT_R8,V_R8,.17,"#.33",S_OK,".33"); VARFMT(VT_R8,V_R8,1.7,"0.0000E-000",S_OK,"1.7000E000"); VARFMT(VT_R8,V_R8,1.7,"0.0000e-1",S_OK,"1.7000e01"); VARFMT(VT_R8,V_R8,86.936849,"#0.000000000000e-000",S_OK,"86.936849000000e000"); VARFMT(VT_R8,V_R8,1.7,"#0",S_OK,"2"); VARFMT(VT_R8,V_R8,1.7,"#.33",S_OK,"2.33"); VARFMT(VT_R8,V_R8,1.7,"#3",S_OK,"23"); VARFMT(VT_R8,V_R8,1.73245,"0.0000E+000",S_OK,"1.7325E+000"); VARFMT(VT_R8,V_R8,9.9999999,"#0.000000",S_OK,"10.000000"); VARFMT(VT_R8,V_R8,1.7,"0.0000e+0#",S_OK,"1.7000e+0"); VARFMT(VT_R8,V_R8,100.0001e+0,"0.0000E+0",S_OK,"1.0000E+2"); VARFMT(VT_R8,V_R8,1000001,"0.0000e+1",S_OK,"1.0000e+61"); VARFMT(VT_R8,V_R8,100.0001e+25,"0.0000e+0",S_OK,"1.0000e+27"); VARFMT(VT_R8,V_R8,450.0001e+43,"#000.0000e+0",S_OK,"4500.0010e+42"); VARFMT(VT_R8,V_R8,0.0001e-11,"##00.0000e-0",S_OK,"1000.0000e-18"); VARFMT(VT_R8,V_R8,0.0317e-11,"0000.0000e-0",S_OK,"3170.0000e-16"); VARFMT(VT_R8,V_R8,0.0021e-11,"00##.0000e-0",S_OK,"2100.0000e-17"); VARFMT(VT_R8,V_R8,1.0001e-27,"##00.0000e-0",S_OK,"1000.1000e-30"); VARFMT(VT_R8,V_R8,47.11,".0000E+0",S_OK,".4711E+2"); VARFMT(VT_R8,V_R8,3.0401e-13,"#####.####e-0%",S_OK,"30401.e-15%"); VARFMT(VT_R8,V_R8,1.57,"0.00",S_OK,"1.57"); VARFMT(VT_R8,V_R8,-1.57,"0.00",S_OK,"-1.57"); VARFMT(VT_R8,V_R8,-1.57,"#.##",S_OK,"-1.57"); VARFMT(VT_R8,V_R8,-0.1,".#",S_OK,"-.1"); VARFMT(VT_R8,V_R8,0.099,"#.#",S_OK,".1"); VARFMT(VT_R8,V_R8,0.0999,"#.##",S_OK,".1"); VARFMT(VT_R8,V_R8,0.099,"#.##",S_OK,".1"); VARFMT(VT_R8,V_R8,0.0099,"#.##",S_OK,".01"); VARFMT(VT_R8,V_R8,0.0049,"#.##",S_OK,"."); VARFMT(VT_R8,V_R8,0.0094,"#.##",S_OK,".01"); VARFMT(VT_R8,V_R8,0.00099,"#.##",S_OK,"."); VARFMT(VT_R8,V_R8,0.0995,"#.##",S_OK,".1"); VARFMT(VT_R8,V_R8,8.0995,"#.##",S_OK,"8.1"); VARFMT(VT_R8,V_R8,0.0994,"#.##",S_OK,".1"); VARFMT(VT_R8,V_R8,1.00,"#,##0.00",S_OK,"1.00"); VARFMT(VT_R8,V_R8,0.0995,"#.###",S_OK,".1"); /* 'out' is not cleared */ out = (BSTR)0x1; hres = pVarFormat(&in,NULL,fd,fw,flags,&out); /* Would crash if out is cleared */ ok(hres == S_OK, "got %08x\n", hres); SysFreeString(out); out = NULL; /* VT_NULL */ V_VT(&in) = VT_NULL; hres = pVarFormat(&in,NULL,fd,fw,0,&out); ok(hres == S_OK, "VarFormat failed with 0x%08x\n", hres); ok(out == NULL, "expected NULL formatted string\n"); /* Invalid args */ hres = pVarFormat(&in,NULL,fd,fw,flags,NULL); ok(hres == E_INVALIDARG, "Null out: expected E_INVALIDARG, got 0x%08x\n", hres); hres = pVarFormat(NULL,NULL,fd,fw,flags,&out); ok(hres == E_INVALIDARG, "Null in: expected E_INVALIDARG, got 0x%08x\n", hres); fd = -1; VARFMT(VT_BOOL,V_BOOL,VARIANT_TRUE,"",E_INVALIDARG,""); fd = 8; VARFMT(VT_BOOL,V_BOOL,VARIANT_TRUE,"",E_INVALIDARG,""); fd = 0; fw = -1; VARFMT(VT_BOOL,V_BOOL,VARIANT_TRUE,"",E_INVALIDARG,""); fw = 4; VARFMT(VT_BOOL,V_BOOL,VARIANT_TRUE,"",E_INVALIDARG,""); }
static void test_threadcp(void) { static const LCID ENGLISH = MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT); static const LCID HINDI = MAKELCID(MAKELANGID(LANG_HINDI, SUBLANG_HINDI_INDIA), SORT_DEFAULT); static const LCID GEORGIAN = MAKELCID(MAKELANGID(LANG_GEORGIAN, SUBLANG_GEORGIAN_GEORGIA), SORT_DEFAULT); static const LCID RUSSIAN = MAKELCID(MAKELANGID(LANG_RUSSIAN, SUBLANG_RUSSIAN_RUSSIA), SORT_DEFAULT); static const LCID JAPANESE = MAKELCID(MAKELANGID(LANG_JAPANESE, SUBLANG_JAPANESE_JAPAN), SORT_DEFAULT); static const LCID CHINESE = MAKELCID(MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED), SORT_DEFAULT); BOOL islead, islead_acp; CPINFOEXA cpi; UINT cp, acp; int i, num; LCID last; BOOL ret; struct test { LCID lcid; UINT threadcp; } lcids[] = { { HINDI, 0 }, { GEORGIAN, 0 }, { ENGLISH, 1252 }, { RUSSIAN, 1251 }, { JAPANESE, 932 }, { CHINESE, 936 } }; struct test_islead_nocp { LCID lcid; BYTE testchar; } isleads_nocp[] = { { HINDI, 0x00 }, { HINDI, 0x81 }, { HINDI, 0xa0 }, { HINDI, 0xe0 }, { GEORGIAN, 0x00 }, { GEORGIAN, 0x81 }, { GEORGIAN, 0xa0 }, { GEORGIAN, 0xe0 }, }; struct test_islead { LCID lcid; BYTE testchar; BOOL islead; } isleads[] = { { ENGLISH, 0x00, FALSE }, { ENGLISH, 0x81, FALSE }, { ENGLISH, 0xa0, FALSE }, { ENGLISH, 0xe0, FALSE }, { RUSSIAN, 0x00, FALSE }, { RUSSIAN, 0x81, FALSE }, { RUSSIAN, 0xa0, FALSE }, { RUSSIAN, 0xe0, FALSE }, { JAPANESE, 0x00, FALSE }, { JAPANESE, 0x81, TRUE }, { JAPANESE, 0xa0, FALSE }, { JAPANESE, 0xe0, TRUE }, { CHINESE, 0x00, FALSE }, { CHINESE, 0x81, TRUE }, { CHINESE, 0xa0, TRUE }, { CHINESE, 0xe0, TRUE }, }; last = GetThreadLocale(); acp = GetACP(); for (i = 0; i < sizeof(lcids)/sizeof(lcids[0]); i++) { SetThreadLocale(lcids[i].lcid); cp = 0xdeadbeef; GetLocaleInfoA(lcids[i].lcid, LOCALE_IDEFAULTANSICODEPAGE|LOCALE_RETURN_NUMBER, (LPSTR)&cp, sizeof(cp)); ok(cp == lcids[i].threadcp, "wrong codepage %u for lcid %04x, should be %u\n", cp, lcids[i].threadcp, cp); /* GetCPInfoEx/GetCPInfo - CP_ACP */ SetLastError(0xdeadbeef); memset(&cpi, 0, sizeof(cpi)); ret = GetCPInfoExA(CP_ACP, 0, &cpi); ok(ret, "GetCPInfoExA failed for lcid %04x, error %d\n", lcids[i].lcid, GetLastError()); ok(cpi.CodePage == acp, "wrong codepage %u for lcid %04x, should be %u\n", cpi.CodePage, lcids[i].lcid, acp); /* WideCharToMultiByte - CP_ACP */ num = WideCharToMultiByte(CP_ACP, 0, foobarW, -1, NULL, 0, NULL, NULL); ok(num == 7, "ret is %d (%04x)\n", num, lcids[i].lcid); /* MultiByteToWideChar - CP_ACP */ num = MultiByteToWideChar(CP_ACP, 0, "foobar", -1, NULL, 0); ok(num == 7, "ret is %d (%04x)\n", num, lcids[i].lcid); /* GetCPInfoEx/GetCPInfo - CP_THREAD_ACP */ SetLastError(0xdeadbeef); memset(&cpi, 0, sizeof(cpi)); ret = GetCPInfoExA(CP_THREAD_ACP, 0, &cpi); ok(ret, "GetCPInfoExA failed for lcid %04x, error %d\n", lcids[i].lcid, GetLastError()); if (lcids[i].threadcp) ok(cpi.CodePage == lcids[i].threadcp, "wrong codepage %u for lcid %04x, should be %u\n", cpi.CodePage, lcids[i].lcid, lcids[i].threadcp); else ok(cpi.CodePage == acp, "wrong codepage %u for lcid %04x, should be %u\n", cpi.CodePage, lcids[i].lcid, acp); /* WideCharToMultiByte - CP_THREAD_ACP */ num = WideCharToMultiByte(CP_THREAD_ACP, 0, foobarW, -1, NULL, 0, NULL, NULL); ok(num == 7, "ret is %d (%04x)\n", num, lcids[i].lcid); /* MultiByteToWideChar - CP_THREAD_ACP */ num = MultiByteToWideChar(CP_THREAD_ACP, 0, "foobar", -1, NULL, 0); ok(num == 7, "ret is %d (%04x)\n", num, lcids[i].lcid); } /* IsDBCSLeadByteEx - locales without codepage */ for (i = 0; i < sizeof(isleads_nocp)/sizeof(isleads_nocp[0]); i++) { SetThreadLocale(isleads_nocp[i].lcid); islead_acp = IsDBCSLeadByteEx(CP_ACP, isleads_nocp[i].testchar); islead = IsDBCSLeadByteEx(CP_THREAD_ACP, isleads_nocp[i].testchar); ok(islead == islead_acp, "wrong islead %i for test char %x in lcid %04x. should be %i\n", islead, isleads_nocp[i].testchar, isleads_nocp[i].lcid, islead_acp); } /* IsDBCSLeadByteEx - locales with codepage */ for (i = 0; i < sizeof(isleads)/sizeof(isleads[0]); i++) { SetThreadLocale(isleads[i].lcid); islead = IsDBCSLeadByteEx(CP_THREAD_ACP, isleads[i].testchar); ok(islead == isleads[i].islead, "wrong islead %i for test char %x in lcid %04x. should be %i\n", islead, isleads[i].testchar, isleads[i].lcid, isleads[i].islead); } SetThreadLocale(last); }
static void LoaderThread(void *arg) { LoaderThreadStartParams *dtsp = (LoaderThreadStartParams *)arg; FILE *fp; char line[4096]; char *pszLine, *pszColon, *pszBuf; int startOfLine = 0; WIN32_FIND_DATA wfd; HANDLE hFind; TCHAR szDir[MAX_PATH]; TCHAR szSearch[MAX_PATH]; TCHAR *p; int success = 0; struct DialogData dialog; struct DlgControlData *control; void *buf; ZeroMemory(&dialog, sizeof(dialog)); if (GetModuleFileName(NULL, szDir, _countof(szDir))) { p = _tcsrchr(szDir, _T('\\')); if (p) *p = _T('\0'); mir_sntprintf(szSearch, _T("%s\\helppack_*.txt"), szDir); hFind = FindFirstFile(szSearch, &wfd); if (hFind != INVALID_HANDLE_VALUE) { do { if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) continue; if (lstrlen(wfd.cFileName) < 4 || wfd.cFileName[lstrlen(wfd.cFileName) - 4] != _T('.')) continue; mir_sntprintf(szSearch, _T("%s\\%s"), szDir, wfd.cFileName); success = 1; break; } while (FindNextFile(hFind, &wfd)); FindClose(hFind); } } if (!success) { if (!Miranda_Terminated() && IsWindow(hwndHelpDlg)) PostMessage(hwndHelpDlg, M_HELPLOADFAILED, 0, (LPARAM)dtsp->hwndCtl); return; } fp = _tfopen(szSearch, _T("rt")); if (fp == NULL) { if (!Miranda_Terminated() && IsWindow(hwndHelpDlg)) PostMessage(hwndHelpDlg, M_HELPLOADFAILED, 0, (LPARAM)dtsp->hwndCtl); return; } fgets(line, _countof(line), fp); TrimString(line); if (lstrcmpA(line, "Miranda Help Pack Version 1")) { fclose(fp); if (!Miranda_Terminated() && IsWindow(hwndHelpDlg)) PostMessage(hwndHelpDlg, M_HELPLOADFAILED, 0, (LPARAM)dtsp->hwndCtl); return; } // headers dialog.locale = LOCALE_USER_DEFAULT; dialog.defaultCodePage = CP_ACP; while (!feof(fp)) { startOfLine = ftell(fp); if (fgets(line, _countof(line), fp) == NULL) break; TrimString(line); if (IsEmpty(line) || line[0] == ';' || line[0] == '\0') continue; if (line[0] == '[') break; pszColon = strchr(line, ':'); if (pszColon == NULL) { fclose(fp); if (!Miranda_Terminated() && IsWindow(hwndHelpDlg)) PostMessage(hwndHelpDlg, M_HELPLOADFAILED, 0, (LPARAM)dtsp->hwndCtl); return; } *pszColon = '\0'; // locale if (!lstrcmpA(line, "Locale")) { char szCP[6]; TrimString(pszColon + 1); dialog.locale = MAKELCID((USHORT)strtol(pszColon + 1, NULL, 16), SORT_DEFAULT); // codepage if (GetLocaleInfoA(dialog.locale, LOCALE_IDEFAULTANSICODEPAGE, szCP, sizeof(szCP))) { szCP[5] = '\0'; // codepages have 5 digits at max dialog.defaultCodePage = atoi(szCP); } } } // RTL flag // see also: http://blogs.msdn.com/michkap/archive/2006/03/03/542963.aspx { LOCALESIGNATURE sig; dialog.isLocaleRTL = 0; if (GetLocaleInfo(dialog.locale, LOCALE_FONTSIGNATURE, (LPTSTR)&sig, sizeof(sig) / sizeof(TCHAR))) dialog.isLocaleRTL = (sig.lsUsb[3] & 0x8000000); // Win2000+: testing for 'Layout progress: horizontal from right to left' bit switch (PRIMARYLANGID(LANGIDFROMLCID(dialog.locale))) { // prior to Win2000 case LANG_ARABIC: case LANG_HEBREW: case LANG_FARSI: dialog.isLocaleRTL = 1; } } // body fseek(fp, startOfLine, SEEK_SET); success = 1; control = NULL; while (!feof(fp)) { if (fgets(line, _countof(line), fp) == NULL) break; if (IsEmpty(line) || line[0] == ';' || line[0] == '\0') continue; TrimStringSimple(line); if (line[0] == '[' && line[lstrlenA(line) - 1] == ']') { pszLine = line + 1; line[lstrlenA(line) - 1] = '\0'; // module pszColon = strrchr(pszLine, ':'); if (pszColon == NULL) continue; *pszColon = '\0'; pszColon++; TrimString(pszLine); if (lstrcmpiA(dtsp->szModule, pszLine)) continue; pszBuf = pszLine; // dlgid pszLine = pszColon; pszColon = strrchr(pszLine, '@'); if (pszColon == NULL) continue; *pszColon = '\0'; pszColon++; TrimString(pszColon); if (lstrcmpA(dtsp->szDlgId, pszColon)) continue; if (dialog.szModule == NULL && dialog.szId == NULL) { dialog.szModule = mir_strdup(pszBuf); dialog.szId = mir_strdup(pszColon); if (dialog.szId == NULL || dialog.szModule == NULL) { success = 0; break; } } buf = (struct DlgControlData*)mir_realloc(dialog.control, sizeof(struct DlgControlData)*(dialog.controlCount + 1)); if (buf == NULL) { success = 0; break; } dialog.controlCount++; dialog.control = (struct DlgControlData*)buf; control = &dialog.control[dialog.controlCount - 1]; ZeroMemory(control, sizeof(*control)); // ctlid TrimString(pszLine); control->id = atoi(pszLine); } else if (control != NULL) { pszLine = line; // ctltext pszColon = strchr(pszLine, '='); if (pszColon == NULL) continue; *pszColon = '\0'; pszColon++; TrimString(pszColon); TrimString(pszLine); if (*pszColon == '\0' || *pszLine == '\0') continue; int size = lstrlenA(pszLine) + 1; control->szTitle = (WCHAR*)mir_alloc(size*sizeof(WCHAR)); if (control->szTitle != NULL) { *control->szTitle = _T('\0'); MultiByteToWideChar(dialog.defaultCodePage, 0, pszLine, -1, control->szTitle, size); } // text control->szText = mir_utf8encodecp(pszColon, dialog.defaultCodePage); control = NULL; // control done } } fclose(fp); if (success) { int i, dialogInserted = 0; dialog.timeLoaded = dialog.timeLastUsed = GetTickCount(); EnterCriticalSection(&csDialogCache); for (i = 0; i < dialogCacheCount; i++) { if (dialogCache[i].timeLastUsed && dialogCache[i].timeLastUsed<(dialog.timeLoaded - DIALOGCACHEEXPIRY)) { FreeDialogCacheEntry(&dialogCache[i]); if (dialogInserted || !dialog.controlCount) { MoveMemory(dialogCache + i, dialogCache + i + 1, sizeof(struct DialogData)*(dialogCacheCount - i - 1)); dialogCacheCount--; buf = (struct DialogData*)mir_realloc(dialogCache, sizeof(struct DialogData)*dialogCacheCount); if (buf != NULL) dialogCache = (struct DialogData*)buf; else if (!dialogCacheCount) dialogCache = NULL; } else { dialogInserted = 1; dialogCache[i] = dialog; } } } if (dialog.controlCount && !dialogInserted) { buf = (struct DialogData*)mir_realloc(dialogCache, sizeof(struct DialogData)*(dialogCacheCount + 1)); if (buf != NULL) { dialogCacheCount++; dialogCache = (struct DialogData*)buf; dialogCache[dialogCacheCount - 1] = dialog; dialogInserted = 1; } } LeaveCriticalSection(&csDialogCache); if (!dialogInserted) { mir_free(dialog.szId); // does NULL check mir_free(dialog.szModule); // does NULL check mir_free(dialog.control); // does NULL check } if (!Miranda_Terminated() && IsWindow(hwndHelpDlg)) PostMessage(hwndHelpDlg, M_HELPLOADED, 0, (LPARAM)dtsp->hwndCtl); } if (!success) { mir_free(dialog.szId); // does NULL check mir_free(dialog.szModule); // does NULL check mir_free(dialog.control); // does NULL check if (!Miranda_Terminated() && IsWindow(hwndHelpDlg)) PostMessage(hwndHelpDlg, M_HELPLOADFAILED, 0, (LPARAM)dtsp->hwndCtl); } mir_free(dtsp->szDlgId); mir_free(dtsp->szModule); mir_free(dtsp); }
int fontforge_main( int argc, char **argv ) { extern const char *source_modtime_str; extern const char *source_version_str; const char *load_prefs = getenv("FONTFORGE_LOADPREFS"); int i; int recover=2; int any; int next_recent=0; GRect pos; GWindowAttrs wattrs; char *display = NULL; FontRequest rq; int ds, ld; int openflags=0; int doopen=0, quit_request=0; bool use_cairo = true; #if !(GLIB_CHECK_VERSION(2, 35, 0)) g_type_init(); #endif /* Must be done before we cache the current directory */ /* Change to HOME dir if specified on the commandline */ for ( i=1; i<argc; ++i ) { char *pt = argv[i]; if ( pt[0]=='-' && pt[1]=='-' ) ++pt; if (strcmp(pt,"-home")==0 || strncmp(pt,"-psn_",5)==0) { /* OK, I don't know what _-psn_ means, but to GW it means */ /* we've been started on the mac from the FontForge.app */ /* structure, and the current directory is (shudder) "/" */ if (getenv("HOME")!=NULL) chdir(getenv("HOME")); break; /* Done - Unnecessary to check more arguments */ } if (strcmp(pt,"-quiet")==0) quiet = 1; } if (!quiet) { fprintf( stderr, "Copyright (c) 2000-2014 by George Williams. See AUTHORS for Contributors.\n" ); fprintf( stderr, " License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>\n" ); fprintf( stderr, " with many parts BSD <http://fontforge.org/license.html>. Please read LICENSE.\n" ); fprintf( stderr, " Based on sources from %s" "-ML" #ifdef FREETYPE_HAS_DEBUGGER "-TtfDb" #endif #ifdef _NO_PYTHON "-NoPython" #endif #ifdef FONTFORGE_CONFIG_USE_DOUBLE "-D" #endif ".\n", FONTFORGE_MODTIME_STR ); fprintf( stderr, " Based on source from git with hash: %s\n", FONTFORGE_GIT_VERSION ); } #if defined(__Mac) /* Start X if they haven't already done so. Well... try anyway */ /* Must be before we change DYLD_LIBRARY_PATH or X won't start */ /* (osascript depends on a libjpeg which isn't found if we look in /sw/lib first */ int local_x = uses_local_x(argc,argv); if ( local_x==1 && getenv("DISPLAY")==NULL ) { /* Don't start X if we're just going to quit. */ /* if X exists, it isn't needed. If X doesn't exist it's wrong */ if ( !hasquit(argc,argv)) { /* This sequence is supposed to bring up an app without a window */ /* but X still opens an xterm */ system( "osascript -e 'tell application \"X11\" to launch'" ); system( "osascript -e 'tell application \"X11\" to activate'" ); } setenv("DISPLAY",":0.0",0); } else if ( local_x==1 && *getenv("DISPLAY")!='/' && strcmp(getenv("DISPLAY"),":0.0")!=0 && strcmp(getenv("DISPLAY"),":0")!=0 ) /* 10.5.7 uses a named socket or something "/tmp/launch-01ftWX:0" */ local_x = 0; #endif #if defined(__MINGW32__) if( getenv("DISPLAY")==NULL ) { putenv("DISPLAY=127.0.0.1:0.0"); } if( getenv("LC_ALL")==NULL ){ char lang[8]; char env[32]; if( GetLocaleInfoA(LOCALE_USER_DEFAULT, LOCALE_SISO639LANGNAME, lang, 8) > 0 ){ strcpy(env, "LC_ALL="); strcat(env, lang); putenv(env); } } #endif FF_SetUiInterface(&gdraw_ui_interface); FF_SetPrefsInterface(&gdraw_prefs_interface); FF_SetSCInterface(&gdraw_sc_interface); FF_SetCVInterface(&gdraw_cv_interface); FF_SetBCInterface(&gdraw_bc_interface); FF_SetFVInterface(&gdraw_fv_interface); FF_SetFIInterface(&gdraw_fi_interface); FF_SetMVInterface(&gdraw_mv_interface); FF_SetClipInterface(&gdraw_clip_interface); #ifndef _NO_PYTHON PythonUI_Init(); #endif FindProgDir(argv[0]); InitSimpleStuff(); #if defined(__MINGW32__) { char path[MAX_PATH]; unsigned int len = GetModuleFileNameA(NULL, path, MAX_PATH); path[len] = '\0'; //The '.exe' must be removed as resources presumes it's not there. GResourceSetProg(GFileRemoveExtension(GFileNormalizePath(path))); } #else GResourceSetProg(argv[0]); #endif #if defined(__Mac) /* The mac seems to default to the "C" locale, LANG and LC_MESSAGES are not*/ /* defined. This means that gettext will not bother to look up any message*/ /* files -- even if we have a "C" or "POSIX" entry in the locale diretory */ /* Now if X11 gives us the command key, I want to force a rebinding to use */ /* Cmd rather than Control key -- more mac-like. But I can't do that if */ /* there is no locale. So I force a locale if there is none specified */ /* I force the US English locale, because that's the what the messages are */ /* by default so I'm changing as little as I can. I think. */ /* Now the locale command will treat a LANG which is "" as undefined, but */ /* gettext will not. So I don't bother to check for null strings or "C" */ /* or "POSIX". If they've mucked with the locale perhaps they know what */ /* they are doing */ { int did_keybindings = 0; int useCommandKey = get_mac_x11_prop("enable_key_equivalents") <= 0; if ( local_x && useCommandKey ) { hotkeySystemSetCanUseMacCommand( 1 ); /* Ok, we get the command key */ if ( getenv("LANG")==NULL && getenv("LC_MESSAGES")==NULL ) { setenv("LC_MESSAGES","en_US.UTF-8",0); } /* Can we find a set of keybindings designed for the mac with cmd key? */ bind_textdomain_codeset("Mac-FontForge-MenuShortCuts","UTF-8"); bindtextdomain("Mac-FontForge-MenuShortCuts", getLocaleDir()); if ( *dgettext("Mac-FontForge-MenuShortCuts","Flag0x10+")!='F' ) { GMenuSetShortcutDomain("Mac-FontForge-MenuShortCuts"); did_keybindings = 1; } } if ( !did_keybindings ) { /* Nope. we can't. Fall back to the normal stuff */ #endif GMenuSetShortcutDomain("FontForge-MenuShortCuts"); bind_textdomain_codeset("FontForge-MenuShortCuts","UTF-8"); bindtextdomain("FontForge-MenuShortCuts", getLocaleDir()); #if defined(__Mac) } } #endif bind_textdomain_codeset("FontForge","UTF-8"); bindtextdomain("FontForge", getLocaleDir()); textdomain("FontForge"); GResourceUseGetText(); { char shareDir[PATH_MAX]; char* sd = getShareDir(); strncpy( shareDir, sd, PATH_MAX ); shareDir[PATH_MAX-1] = '\0'; if(!sd) { strcpy( shareDir, SHAREDIR ); } char path[PATH_MAX]; snprintf(path, PATH_MAX, "%s%s", shareDir, "/pixmaps" ); GGadgetSetImageDir( path ); snprintf(path, PATH_MAX, "%s%s", shareDir, "/resources/fontforge.resource" ); GResourceAddResourceFile(path, GResourceProgramName,false); } hotkeysLoad(); // loadPrefsFiles(); Prefs_LoadDefaultPreferences(); if ( load_prefs!=NULL && strcasecmp(load_prefs,"Always")==0 ) LoadPrefs(); if ( default_encoding==NULL ) default_encoding=FindOrMakeEncoding("ISO8859-1"); if ( default_encoding==NULL ) default_encoding=&custom; /* In case iconv is broken */ // This no longer starts embedded Python unless control passes to the Python executors, // which exit independently rather than returning here. CheckIsScript(argc,argv); /* Will run the script and exit if it is a script */ /* If there is no UI, there is always a script */ /* and we will never return from the above */ if ( load_prefs==NULL || (strcasecmp(load_prefs,"Always")!=0 && /* Already loaded */ strcasecmp(load_prefs,"Never")!=0 )) LoadPrefs(); GrokNavigationMask(); for ( i=1; i<argc; ++i ) { char *pt = argv[i]; if ( pt[0]=='-' && pt[1]=='-' ) ++pt; if ( strcmp(pt,"-sync")==0 ) GResourceAddResourceString("Gdraw.Synchronize: true",argv[0]); else if ( strcmp(pt,"-depth")==0 && i<argc-1 ) AddR(argv[0],"Gdraw.Depth", argv[++i]); else if ( strcmp(pt,"-vc")==0 && i<argc-1 ) AddR(argv[0],"Gdraw.VisualClass", argv[++i]); else if ( (strcmp(pt,"-cmap")==0 || strcmp(pt,"-colormap")==0) && i<argc-1 ) AddR(argv[0],"Gdraw.Colormap", argv[++i]); else if ( (strcmp(pt,"-dontopenxdevices")==0) ) AddR(argv[0],"Gdraw.DontOpenXDevices", "true"); else if ( strcmp(pt,"-keyboard")==0 && i<argc-1 ) AddR(argv[0],"Gdraw.Keyboard", argv[++i]); else if ( strcmp(pt,"-display")==0 && i<argc-1 ) display = argv[++i]; # if MyMemory else if ( strcmp(pt,"-memory")==0 ) __malloc_debug(5); # endif else if ( strncmp(pt,"-usecairo",strlen("-usecairo"))==0 ) { if ( strcmp(pt,"-usecairo=no")==0 ) use_cairo = false; else use_cairo = true; GDrawEnableCairo(use_cairo); } else if ( strcmp(pt,"-nosplash")==0 ) splash = 0; else if ( strcmp(pt,"-quiet")==0 ) /* already checked for this earlier, no need to do it again */; else if ( strcmp(pt,"-unique")==0 ) unique = 1; else if ( strcmp(pt,"-forceuihidden")==0 ) cmdlinearg_forceUIHidden = 0; else if ( strcmp(pt,"-recover")==0 && i<argc-1 ) { ++i; if ( strcmp(argv[i],"none")==0 ) recover=0; else if ( strcmp(argv[i],"clean")==0 ) recover= -1; else if ( strcmp(argv[i],"auto")==0 ) recover= 1; else if ( strcmp(argv[i],"inquire")==0 ) recover= 2; else { fprintf( stderr, "Invalid argument to -recover, must be none, auto, inquire or clean\n" ); dousage(); } } else if ( strcmp(pt,"-recover=none")==0 ) { recover = 0; } else if ( strcmp(pt,"-recover=clean")==0 ) { recover = -1; } else if ( strcmp(pt,"-recover=auto")==0 ) { recover = 1; } else if ( strcmp(pt,"-recover=inquire")==0 ) { recover = 2; } else if ( strcmp(pt,"-docs")==0 ) dohelp(); else if ( strcmp(pt,"-help")==0 ) dousage(); else if ( strcmp(pt,"-version")==0 || strcmp(pt,"-v")==0 || strcmp(pt,"-V")==0 ) doversion(FONTFORGE_MODTIME_STR); else if ( strcmp(pt,"-quit")==0 ) quit_request = true; else if ( strcmp(pt,"-home")==0 ) /* already did a chdir earlier, don't need to do it again */; #if defined(__Mac) else if ( strncmp(pt,"-psn_",5)==0 ) { /* OK, I don't know what _-psn_ means, but to GW it means */ /* we've been started on the mac from the FontForge.app */ /* structure, and the current directory was (shudder) "/" */ /* (however, we changed to HOME earlier in main routine). */ unique = 1; listen_to_apple_events = true; // This has been problematic on Mavericks and later. } #endif } ensureDotFontForgeIsSetup(); #if defined(__MINGW32__) && !defined(_NO_LIBCAIRO) //Load any custom fonts for the user interface if (use_cairo) { char *system_load = getGResourceProgramDir(); char *user_load = getFontForgeUserDir(Data); char lbuf[MAX_PATH]; int lret; if (system_load != NULL) { //Follow the FontConfig APPSHAREFONTDIR location lret = snprintf(lbuf, MAX_PATH, "%s/../share/fonts", system_load); if (lret > 0 && lret < MAX_PATH) { WinLoadUserFonts(lbuf); } } if (user_load != NULL) { lret = snprintf(lbuf, MAX_PATH, "%s/%s", user_load, "ui-fonts"); if (lret > 0 && lret < MAX_PATH) { WinLoadUserFonts(lbuf); } free(user_load); } } #endif InitImageCache(); // This is in gtextinfo.c. It zeroes imagecache for us. atexit(&ClearImageCache); // We register the destructor, which is also in gtextinfo.c. GDrawCreateDisplays(display,argv[0]); atexit(&GDrawDestroyDisplays); // We register the destructor so that it runs even if we call exit without finishing this function. default_background = GDrawGetDefaultBackground(screen_display); InitToolIconClut(default_background); InitToolIcons(); InitCursors(); /** * we have to do a quick sniff of argv[] here to see if the user * wanted to skip loading these python init files. */ for ( i=1; i<argc; ++i ) { char *pt = argv[i]; if ( !strcmp(pt,"-SkipPythonInitFiles")) { ProcessPythonInitFiles = 0; } } #ifndef _NO_PYTHON /*# ifndef GWW_TEST*/ FontForge_InitializeEmbeddedPython(); /* !!!!!! debug (valgrind doesn't like python) */ /*# endif*/ #endif #ifndef _NO_PYTHON if( ProcessPythonInitFiles ) PyFF_ProcessInitFiles(); #endif /* the splash screen used not to have a title bar (wam_nodecor) */ /* but I found I needed to know how much the window manager moved */ /* the window around, which I can determine if I have a positioned */ /* decorated window created at the begining */ /* Actually I don't care any more */ wattrs.mask = wam_events|wam_cursor|wam_bordwidth|wam_backcol|wam_positioned|wam_utf8_wtitle|wam_isdlg; wattrs.event_masks = ~(1<<et_charup); wattrs.positioned = 1; wattrs.cursor = ct_pointer; wattrs.utf8_window_title = "FontForge"; wattrs.border_width = 2; wattrs.background_color = 0xffffff; wattrs.is_dlg = !listen_to_apple_events; pos.x = pos.y = 200; pos.width = splashimage.u.image->width; pos.height = splashimage.u.image->height-56; /* 54 */ GDrawBindSelection(NULL,sn_user1,"FontForge"); if ( unique && GDrawSelectionOwned(NULL,sn_user1)) { /* Different event handler, not a dialog */ wattrs.is_dlg = false; splashw = GDrawCreateTopWindow(NULL,&pos,request_e_h,NULL,&wattrs); PingOtherFontForge(argc,argv); } else { if ( quit_request ) exit( 0 ); splashw = GDrawCreateTopWindow(NULL,&pos,splash_e_h,NULL,&wattrs); } memset(&rq,0,sizeof(rq)); rq.utf8_family_name = SERIF_UI_FAMILIES; rq.point_size = 12; rq.weight = 400; splash_font = GDrawInstanciateFont(NULL,&rq); splash_font = GResourceFindFont("Splash.Font",splash_font); GDrawDecomposeFont(splash_font, &rq); rq.style = fs_italic; splash_italic = GDrawInstanciateFont(NULL,&rq); splash_italic = GResourceFindFont("Splash.ItalicFont",splash_italic); GDrawSetFont(splashw,splash_font); SplashLayout(); localsplash = splash; if ( localsplash && !listen_to_apple_events ) start_splash_screen(); // // The below call will initialize the fontconfig cache if required. // That can take a while the first time it happens. // GDrawWindowFontMetrics(splashw,splash_font,&as,&ds,&ld); fh = as+ds+ld; if ( AutoSaveFrequency>0 ) autosave_timer=GDrawRequestTimer(splashw,2*AutoSaveFrequency*1000,AutoSaveFrequency*1000,NULL); GDrawProcessPendingEvents(NULL); GDrawSetBuildCharHooks(BuildCharHook,InsCharHook); any = 0; if ( recover==-1 ) CleanAutoRecovery(); else if ( recover ) any = DoAutoRecoveryExtended( recover-1 ); openflags = 0; for ( i=1; i<argc; ++i ) { char buffer[1025]; char *pt = argv[i]; GDrawProcessPendingEvents(NULL); if ( pt[0]=='-' && pt[1]=='-' && pt[2]!='\0') ++pt; if ( strcmp(pt,"-new")==0 ) { FontNew(); any = 1; # if HANYANG } else if ( strcmp(pt,"-newkorean")==0 ) { MenuNewComposition(NULL,NULL,NULL); any = 1; # endif } else if ( !strcmp(pt,"-SkipPythonInitFiles")) { // already handled above. } else if ( strcmp(pt,"-last")==0 ) { if ( next_recent<RECENT_MAX && RecentFiles[next_recent]!=NULL ) if ( ViewPostScriptFont(RecentFiles[next_recent++],openflags)) any = 1; } else if ( strcmp(pt,"-sync")==0 || strcmp(pt,"-memory")==0 || strcmp(pt,"-nosplash")==0 || strcmp(pt,"-recover=none")==0 || strcmp(pt,"-recover=clean")==0 || strcmp(pt,"-recover=auto")==0 || strcmp(pt,"-dontopenxdevices")==0 || strcmp(pt,"-unique")==0 || strncmp(pt,"-usecairo",strlen("-usecairo"))==0 || strcmp(pt,"-home")==0 || strcmp(pt,"-quiet")==0 || strcmp(pt,"-forceuihidden")==0 ) /* Already done, needed to be before display opened */; else if ( strncmp(pt,"-psn_",5)==0 ) /* Already done */; else if ( (strcmp(pt,"-depth")==0 || strcmp(pt,"-vc")==0 || strcmp(pt,"-cmap")==0 || strcmp(pt,"-colormap")==0 || strcmp(pt,"-keyboard")==0 || strcmp(pt,"-display")==0 || strcmp(pt,"-recover")==0 ) && i<argc-1 ) ++i; /* Already done, needed to be before display opened */ else if ( strcmp(pt,"-allglyphs")==0 ) openflags |= of_all_glyphs_in_ttc; else if ( strcmp(pt,"-open")==0 ) doopen = true; else { printf("else argv[i]:%s\n", argv[i] ); if ( strstr(argv[i],"://")!=NULL ) { /* Assume an absolute URL */ strncpy(buffer,argv[i],sizeof(buffer)); buffer[sizeof(buffer)-1]= '\0'; } else GFileGetAbsoluteName(argv[i],buffer,sizeof(buffer)); if ( GFileIsDir(buffer) || (strstr(buffer,"://")!=NULL && buffer[strlen(buffer)-1]=='/')) { char *fname; fname = malloc(strlen(buffer)+strlen("/glyphs/contents.plist")+1); strcpy(fname,buffer); strcat(fname,"/glyphs/contents.plist"); if ( GFileExists(fname)) { /* It's probably a Unified Font Object directory */ free(fname); if ( ViewPostScriptFont(buffer,openflags) ) any = 1; } else { strcpy(fname,buffer); strcat(fname,"/font.props"); if ( GFileExists(fname)) { /* It's probably a sf dir collection */ free(fname); if ( ViewPostScriptFont(buffer,openflags) ) any = 1; } else { free(fname); if ( buffer[strlen(buffer)-1]!='/' ) { /* If dirname doesn't end in "/" we'll be looking in parent dir */ buffer[strlen(buffer)+1]='\0'; buffer[strlen(buffer)] = '/'; } fname = GetPostScriptFontName(buffer,false); if ( fname!=NULL ) ViewPostScriptFont(fname,openflags); any = 1; /* Even if we didn't get a font, don't bring up dlg again */ free(fname); } } } else if ( ViewPostScriptFont(buffer,openflags)!=0 ) any = 1; } } if ( !any && !doopen ) any = ReopenLastFonts(); collabclient_ensureClientBeacon(); collabclient_sniffForLocalServer(); #ifndef _NO_PYTHON PythonUI_namedpipe_Init(); #endif #if defined(__Mac) if ( listen_to_apple_events ) { install_apple_event_handlers(); install_mac_timer(); setup_cocoa_app(); // WARNING: See declaration of RunApplicationEventLoop() above as to // why you might not want to call that function anymore. // RunApplicationEventLoop(); } else #endif if ( doopen || !any ) _FVMenuOpen(NULL); GDrawEventLoop(NULL); GDrawDestroyDisplays(); #ifndef _NO_PYTHON /*# ifndef GWW_TEST*/ FontForge_FinalizeEmbeddedPython(); /* !!!!!! debug (valgrind doesn't like python) */ /*# endif*/ #endif // These free menu translations, mostly. BitmapViewFinishNonStatic(); MetricsViewFinishNonStatic(); CharViewFinishNonStatic(); FontViewFinishNonStatic(); ClearImageCache(); // This frees the contents of imagecache. hotkeysSave(); LastFonts_Save(); #ifndef _NO_LIBUNICODENAMES uninm_names_db_close(names_db); /* close this database before exiting */ uninm_blocks_db_close(blocks_db); #endif lt_dlexit(); return( 0 ); }
/* * Convert a Windows setlocale() argument to a Unix-style one. * * Regardless of platform, we install message catalogs under a Unix-style * LL[_CC][.ENCODING][@VARIANT] naming convention. Only LC_MESSAGES settings * following that style will elicit localized interface strings. * * Before Visual Studio 2012 (msvcr110.dll), Windows setlocale() accepted "C" * (but not "c") and strings of the form <Language>[_<Country>][.<CodePage>], * case-insensitive. setlocale() returns the fully-qualified form; for * example, setlocale("thaI") returns "Thai_Thailand.874". Internally, * setlocale() and _create_locale() select a "locale identifier"[1] and store * it in an undocumented _locale_t field. From that LCID, we can retrieve the * ISO 639 language and the ISO 3166 country. Character encoding does not * matter, because the server and client encodings govern that. * * Windows Vista introduced the "locale name" concept[2], closely following * RFC 4646. Locale identifiers are now deprecated. Starting with Visual * Studio 2012, setlocale() accepts locale names in addition to the strings it * accepted historically. It does not standardize them; setlocale("Th-tH") * returns "Th-tH". setlocale(category, "") still returns a traditional * string. Furthermore, msvcr110.dll changed the undocumented _locale_t * content to carry locale names instead of locale identifiers. * * MinGW headers declare _create_locale(), but msvcrt.dll lacks that symbol. * IsoLocaleName() always fails in a MinGW-built postgres.exe, so only * Unix-style values of the lc_messages GUC can elicit localized messages. In * particular, every lc_messages setting that initdb can select automatically * will yield only C-locale messages. XXX This could be fixed by running the * fully-qualified locale name through a lookup table. * * This function returns a pointer to a static buffer bearing the converted * name or NULL if conversion fails. * * [1] http://msdn.microsoft.com/en-us/library/windows/desktop/dd373763.aspx * [2] http://msdn.microsoft.com/en-us/library/windows/desktop/dd373814.aspx */ static char * IsoLocaleName(const char *winlocname) { #if (_MSC_VER >= 1400) /* VC8.0 or later */ static char iso_lc_messages[32]; _locale_t loct = NULL; if (pg_strcasecmp("c", winlocname) == 0 || pg_strcasecmp("posix", winlocname) == 0) { strcpy(iso_lc_messages, "C"); return iso_lc_messages; } loct = _create_locale(LC_CTYPE, winlocname); if (loct != NULL) { #if (_MSC_VER >= 1700) /* Visual Studio 2012 or later */ size_t rc; char *hyphen; /* Locale names use only ASCII, any conversion locale suffices. */ rc = wchar2char(iso_lc_messages, loct->locinfo->locale_name[LC_CTYPE], sizeof(iso_lc_messages), NULL); _free_locale(loct); if (rc == -1 || rc == sizeof(iso_lc_messages)) return NULL; /* * Since the message catalogs sit on a case-insensitive filesystem, we * need not standardize letter case here. So long as we do not ship * message catalogs for which it would matter, we also need not * translate the script/variant portion, e.g. uz-Cyrl-UZ to * uz_UZ@cyrillic. Simply replace the hyphen with an underscore. * * Note that the locale name can be less-specific than the value we * would derive under earlier Visual Studio releases. For example, * French_France.1252 yields just "fr". This does not affect any of * the country-specific message catalogs available as of this writing * (pt_BR, zh_CN, zh_TW). */ hyphen = strchr(iso_lc_messages, '-'); if (hyphen) *hyphen = '_'; #else char isolang[32], isocrty[32]; LCID lcid; lcid = loct->locinfo->lc_handle[LC_CTYPE]; if (lcid == 0) lcid = MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT); _free_locale(loct); if (!GetLocaleInfoA(lcid, LOCALE_SISO639LANGNAME, isolang, sizeof(isolang))) return NULL; if (!GetLocaleInfoA(lcid, LOCALE_SISO3166CTRYNAME, isocrty, sizeof(isocrty))) return NULL; snprintf(iso_lc_messages, sizeof(iso_lc_messages) - 1, "%s_%s", isolang, isocrty); #endif return iso_lc_messages; } return NULL; #else return NULL; /* Not supported on this version of msvc/mingw */ #endif /* _MSC_VER >= 1400 */ }
int _Locale_n_sign_posn(struct _Locale_monetary * lmon) { char loc_data[2]; GetLocaleInfoA(lmon->lcid, LOCALE_INEGSIGNPOSN, loc_data, 2); return atoi(loc_data); }