-
Notifications
You must be signed in to change notification settings - Fork 4.6k
/
resourcestring.cpp
87 lines (72 loc) · 2.84 KB
/
resourcestring.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
#include <stdio.h>
#include <utilcode.h>
#include "resourcestring.h"
static int CompareNativeStringResources(const void *a, const void *b)
{
unsigned int resourceIdA = ((NativeStringResource*)a)->resourceId;
unsigned int resourceIdB = ((NativeStringResource*)b)->resourceId;
if (resourceIdA < resourceIdB)
return -1;
if (resourceIdA == resourceIdB)
return 0;
return 1;
}
int LoadNativeStringResource(const NativeStringResourceTable &nativeStringResourceTable, unsigned int iResourceID, WCHAR* szBuffer, int iMax, int *pcwchUsed)
{
int len = 0;
if (szBuffer && iMax)
{
// Search the sorted set of resources for the ID we're interested in.
NativeStringResource searchEntry = {iResourceID, NULL};
NativeStringResource *resourceEntry = (NativeStringResource*)bsearch(
&searchEntry,
nativeStringResourceTable.table,
nativeStringResourceTable.size,
sizeof(NativeStringResource),
CompareNativeStringResources);
if (resourceEntry != NULL)
{
len = MultiByteToWideChar(CP_UTF8, 0, resourceEntry->resourceString, -1, szBuffer, iMax);
if (len == 0)
{
int hr = HRESULT_FROM_GetLastError();
// Tell the caller if the buffer isn't big enough
if (hr == HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER) && pcwchUsed)
*pcwchUsed = iMax;
return hr;
}
}
else
{
// The resource ID wasn't found in our array. Fall back on returning the ID as a string.
const WCHAR undefMsg[] = W("Undefined resource string ID:0x");
wcscpy_s(szBuffer, iMax, undefMsg);
// Compute if there is enough space for the message and ID.
WCHAR* nxt = NULL;
int extraSpace = iMax - (ARRAY_SIZE(undefMsg) - 1);
if (0 < extraSpace)
{
nxt = FormatInteger(szBuffer + (ARRAY_SIZE(undefMsg) - 1), extraSpace, "%X", iResourceID);
}
if (nxt != NULL)
{
len = (int)(nxt - szBuffer);
}
else
{
// The only possible failure is that the string didn't fit the buffer. So the buffer contains
// partial string terminated by '\0'.
// We could return ERROR_INSUFFICIENT_BUFFER, but we'll error on the side of caution here and
// actually show something (given that this is likely a scenario involving a bug/deployment issue).
len = iMax - 1;
}
}
}
if (pcwchUsed)
{
*pcwchUsed = len;
}
return S_OK;
}