PageRenderTime 1ms CodeModel.GetById 179ms app.highlight 11ms RepoModel.GetById 70ms app.codeStats 0ms

/Tools/MIDLWrapper/MIDLWrapper.cpp

https://bitbucket.org/slukk/atsmp_4.2-external_webkit
C++ | 86 lines | 63 code | 20 blank | 3 comment | 10 complexity | 0105fac0b8bcee205c6b22b87b0d918d MD5 | raw file
 1// MIDLWrapper.cpp : Just calls the built-in midl.exe with the given arguments.
 2
 3#define WIN32_LEAN_AND_MEAN    // Exclude rarely-used stuff from Windows headers
 4#include <process.h>
 5#include <stdio.h>
 6#include <string>
 7#include <windows.h>
 8
 9using namespace std;
10
11int wmain(int argc, wchar_t* argv[], wchar_t* envp[])
12{
13#ifndef NDEBUG
14    fwprintf(stderr, L"######### im in ur IDE, compiling ur c0des ########\n");
15#endif
16
17    int pathIndex = -1;
18    for (int i = 0; envp[i]; ++i)
19        if (!wcsncmp(envp[i], L"PATH=", 5)) {
20            pathIndex = i;
21            break;
22        }
23
24    if (pathIndex == -1) {
25        fwprintf(stderr, L"Couldn't find PATH environment variable!\n");
26        return -1;
27    }
28
29    wchar_t* vcbin = wcsstr(envp[pathIndex], L"Tools\\vcbin");
30    if (!vcbin) {
31        fwprintf(stderr, L"Couldn't find Tools\\vcbin in PATH!\n");
32        return -1;
33    }
34
35    wchar_t saved = *vcbin;
36    *vcbin = 0;
37    
38    wchar_t* afterLeadingSemiColon = wcsrchr(envp[pathIndex], ';');
39    if (!afterLeadingSemiColon)
40        afterLeadingSemiColon = envp[pathIndex] + 5; // +5 for the length of "PATH="
41    else
42        afterLeadingSemiColon++;
43
44    *vcbin = saved;
45
46    size_t pathLength = wcslen(envp[pathIndex]);
47
48    wchar_t* trailingSemiColon = wcschr(vcbin, ';');
49    if (!trailingSemiColon)
50        trailingSemiColon = envp[pathIndex] + pathLength;
51
52    int vcbinLength = trailingSemiColon - afterLeadingSemiColon;
53
54    size_t newPathLength = pathLength - vcbinLength;
55
56    wchar_t* newPath = new wchar_t[newPathLength + 1];
57
58    // Copy everything before the vcbin path...
59    wchar_t* d = newPath;
60    wchar_t* s = envp[pathIndex];
61    while (s < afterLeadingSemiColon)
62        *d++ = *s++;
63
64    // Copy everything after the vcbin path...
65    s = trailingSemiColon;
66    while (*d++ = *s++);
67
68    envp[pathIndex] = newPath;
69
70#ifndef NDEBUG
71    fwprintf(stderr, L"New path: %s\n", envp[pathIndex]);
72#endif
73
74    wchar_t** newArgv = new wchar_t*[argc + 1];
75    for (int i = 0; i < argc; ++i) {
76        size_t length = wcslen(argv[i]);
77        newArgv[i] = new wchar_t[length + 3];
78        *newArgv[i] = '\"';
79        wcscpy_s(newArgv[i] + 1, length + 2, argv[i]);
80        *(newArgv[i] + 1 + length) = '\"';
81        *(newArgv[i] + 2 + length) = 0;
82    }
83    newArgv[argc] = 0;
84
85    return _wspawnvpe(_P_WAIT, L"midl", newArgv, envp);
86}