Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

156 lines
3.2 KiB

  1. /***********************************************************************
  2. * Microsoft (R) Windows (R) Resource Compiler
  3. *
  4. * Copyright (c) Microsoft Corporation. All rights reserved.
  5. *
  6. * File Comments:
  7. *
  8. *
  9. ***********************************************************************/
  10. #include "rc.h"
  11. #include <setjmp.h>
  12. /* Module handle */
  13. extern "C" const BYTE __ImageBase[];
  14. HINSTANCE hInstance = (HINSTANCE) __ImageBase;
  15. RC_MESSAGE_CALLBACK lpfnMessageCallbackA;
  16. RC_MESSAGE_CALLBACKW lpfnMessageCallbackW;
  17. RC_PARSE_CALLBACK lpfnParseCallbackA;
  18. RC_PARSE_CALLBACKW lpfnParseCallbackW;
  19. BOOL fWindowUnicode;
  20. HWND hWndCaller;
  21. /* Function prototypes */
  22. int __cdecl rc_main(int, wchar_t *[], char *[]);
  23. void DoMessageCallback(BOOL f, const wchar_t *wsz)
  24. {
  25. static CPINFO cpinfo;
  26. size_t cwch;
  27. size_t cchMax;
  28. char *sz;
  29. if (lpfnMessageCallbackW != 0) {
  30. (*lpfnMessageCallbackW)(0, 0, wsz);
  31. }
  32. if ((hWndCaller != NULL) && fWindowUnicode) {
  33. if (SendMessageW(hWndCaller, WM_RC_ERROR, f, (LPARAM) wsz) != 0) {
  34. quit(NULL);
  35. }
  36. }
  37. if ((lpfnMessageCallbackA == 0) && ((hWndCaller == NULL) || fWindowUnicode)) {
  38. return;
  39. }
  40. if (cpinfo.MaxCharSize == 0) {
  41. if (!GetCPInfo(CP_ACP, &cpinfo)) {
  42. return;
  43. }
  44. }
  45. cwch = wcslen(wsz) + 1;
  46. cchMax = (cwch - 1) * cpinfo.MaxCharSize + 1;
  47. sz = (char *) MyAlloc(cchMax);
  48. if (WideCharToMultiByte(CP_ACP, 0, wsz, (int) cwch, sz, (int) cchMax, NULL, NULL) == 0) {
  49. // Conversion failed
  50. return;
  51. }
  52. if (lpfnMessageCallbackA != 0) {
  53. (*lpfnMessageCallbackA)(0, 0, sz);
  54. }
  55. if ((hWndCaller != NULL) && !fWindowUnicode) {
  56. if (SendMessageA(hWndCaller, WM_RC_ERROR, f, (LPARAM) sz) != 0) {
  57. quit(NULL);
  58. }
  59. }
  60. MyFree(sz);
  61. }
  62. extern "C"
  63. int CALLBACK
  64. RC(
  65. HWND hWnd,
  66. int fStatus,
  67. RC_MESSAGE_CALLBACK lpfnMsg,
  68. RC_PARSE_CALLBACK lpfnParse,
  69. int argc,
  70. char *argv[]
  71. )
  72. {
  73. fWindowUnicode = FALSE;
  74. hWndCaller = hWnd;
  75. lpfnMessageCallbackA = lpfnMsg;
  76. lpfnParseCallbackA = lpfnParse;
  77. return(rc_main(argc, NULL, argv));
  78. }
  79. extern "C"
  80. int CALLBACK
  81. RCW(
  82. HWND hWnd,
  83. int fStatus,
  84. RC_MESSAGE_CALLBACKW lpfnMsg,
  85. RC_PARSE_CALLBACKW lpfnParse,
  86. int argc,
  87. wchar_t *argv[]
  88. )
  89. {
  90. fWindowUnicode = TRUE;
  91. hWndCaller = hWnd;
  92. lpfnMessageCallbackW = lpfnMsg;
  93. lpfnParseCallbackW = lpfnParse;
  94. return(rc_main(argc, argv, NULL));
  95. }
  96. void SendWarning(const wchar_t *wsz)
  97. {
  98. DoMessageCallback(FALSE, wsz);
  99. }
  100. void SendError(const wchar_t *wsz)
  101. {
  102. static int cErrThisLine = 0;
  103. static int LastRow = 0;
  104. DoMessageCallback(FALSE, wsz);
  105. if (token.row == LastRow) {
  106. if ((++cErrThisLine > 4) && wcscmp(wsz, L"\n")) {
  107. quit(NULL);
  108. }
  109. } else {
  110. LastRow = token.row;
  111. cErrThisLine = 0;
  112. }
  113. }
  114. void UpdateStatus(unsigned nCode, unsigned long dwStatus)
  115. {
  116. if (hWndCaller) {
  117. if (SendMessageA(hWndCaller, WM_RC_STATUS, nCode, dwStatus) != 0) {
  118. quit(NULL);
  119. }
  120. }
  121. }