ReactOS 0.4.15-dev-7842-g558ab78
main.cpp
Go to the documentation of this file.
1/*
2 * PROJECT: xml2sdb
3 * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
4 * PURPOSE: Implement platform agnostic read / write / allocation functions, parse commandline
5 * COPYRIGHT: Copyright 2016,2017 Mark Jansen (mark.jansen@reactos.org)
6 */
7
8#include "xml2sdb.h"
9#include "sdbpapi.h"
10#include "sdbstringtable.h"
11#include <time.h>
12#include <stdio.h>
13#include <stdarg.h>
14
15extern "C"
16{
18
20{
21 return ::calloc(1, size);
22}
23
25{
26 LPVOID newMem = ::realloc(mem, size);
27 if (newMem && size > oldSize)
28 {
29 memset((BYTE*)newMem + oldSize, 0, size - oldSize);
30 }
31 return newMem;
32}
33
35{
36 return ::free(mem);
37}
38
40{
41 size_t len = 0;
42 while (string[len])
43 len++;
44 return len;
45}
46
48{
49 return (SdbpStrlen(string) + 1) * sizeof(WCHAR);
50}
51
53{
54 PDB pdb;
55 FILE* f;
56 std::string pathA(path, path + SdbpStrlen(path));
57
58 f = fopen(pathA.c_str(), write ? "wb" : "rb");
59 if (!f)
60 return NULL;
61
62 pdb = (PDB)SdbAlloc(sizeof(DB));
63 pdb->file = f;
64 pdb->for_write = write;
65
66 return pdb;
67}
68
70{
71 ASSERT(pdb->for_write);
72
73 fwrite(pdb->data, pdb->write_iter, 1, (FILE*)pdb->file);
74}
75
77{
78 if (!pdb)
79 return;
80
81 if (pdb->file)
82 fclose((FILE*)pdb->file);
83 if (pdb->string_buffer)
84 SdbCloseDatabase(pdb->string_buffer);
85 if (pdb->string_lookup)
86 SdbpTableDestroy(&pdb->string_lookup);
87 SdbFree(pdb->data);
88 SdbFree(pdb);
89}
90
92{
93 if ((tag & TAG_TYPE_MASK) != type)
94 return FALSE;
95 return TRUE;
96}
97
99{
100 DWORD size = offset + num;
101
102 /* Either overflow or no data to read */
103 if (size <= offset)
104 return FALSE;
105
106 /* Overflow */
107 if (pdb->size < size)
108 return FALSE;
109
110 memcpy(dest, pdb->data + offset, num);
111 return TRUE;
112}
113
115{
116 TAG data;
117 if (!SdbpReadData(pdb, &data, tagid, sizeof(data)))
118 return TAG_NULL;
119 return data;
120}
121
123{
124 TAG tag = SdbGetTagFromTagID(pdb, tagid);
125 if (tag == TAG_NULL)
126 return FALSE;
127 return SdbpCheckTagType(tag, type);
128}
129
131{
132 va_list ArgList;
133 const char* LevelStr;
134
136 return FALSE;
137
138 switch (Level)
139 {
140 case SHIM_ERR:
141 LevelStr = "Err ";
142 break;
143 case SHIM_WARN:
144 LevelStr = "Warn";
145 break;
146 case SHIM_INFO:
147 LevelStr = "Info";
148 break;
149 default:
150 LevelStr = "User";
151 break;
152 }
153 printf("[%s][%-20s] ", LevelStr, FunctionName);
154 va_start(ArgList, Format);
155 vprintf(Format, ArgList);
156 va_end(ArgList);
157 return TRUE;
158}
159
160
161#define TICKSPERSEC 10000000
162#if defined(__GNUC__)
163#define TICKSTO1970 0x019db1ded53e8000LL
164#else
165#define TICKSTO1970 0x019db1ded53e8000i64
166#endif
169{
170 Time->QuadPart = ((LONGLONG)SecondsSince1970 * TICKSPERSEC) + TICKSTO1970;
171}
172
173
174}
175
176
177bool xml_2_db(const char* xml, const WCHAR* sdb);
178
179static bool run_one(std::string& input, std::string& output)
180{
181 sdbstring outputW(output.begin(), output.end());
182 if (!xml_2_db(input.c_str(), outputW.c_str()))
183 return false;
184 input = output = "";
185 return true;
186}
187
188static std::string get_strarg(int argc, char* argv[], int& i)
189{
190 if (argv[i][2] != 0)
191 return std::string(argv[i] + 2);
192
193 ++i;
194 if (i >= argc || !argv[i])
195 return std::string();
196 return argv[i];
197}
198
199static void update_loglevel(int argc, char* argv[], int& i)
200{
201 std::string value = get_strarg(argc, argv, i);
202 g_ShimDebugLevel = strtoul(value.c_str(), NULL, 10);
203}
204
205int main(int argc, char * argv[])
206{
207 std::string input, output;
208 srand(time(0));
209
210 for (int i = 1; i < argc; ++i)
211 {
212 if (argv[i][0] != '/' && argv[i][0] != '-')
213 continue;
214
215 switch(argv[i][1])
216 {
217 case 'i':
219 break;
220 case 'o':
221 output = get_strarg(argc, argv, i);
222 break;
223 case 'l':
225 break;
226 }
227 if (input.empty() || output.empty())
228 continue;
229
230 if (!run_one(input, output))
231 {
232 printf("Failed converting '%s' to '%s'\n", input.c_str(), output.c_str());
233 return 1;
234 }
235 }
236 return 0;
237}
static int argc
Definition: ServiceArgs.c:12
UINT32 strtoul(const char *String, char **Terminator, UINT32 Base)
Definition: utclib.c:696
char * va_list
Definition: acmsvcex.h:78
#define va_end(ap)
Definition: acmsvcex.h:90
#define va_start(ap, A)
Definition: acmsvcex.h:91
ACPI_BUFFER *RetBuffer ACPI_BUFFER *RetBuffer char ACPI_WALK_RESOURCE_CALLBACK void *Context ACPI_BUFFER *RetBuffer UINT16 ACPI_RESOURCE **ResourcePtr ACPI_GENERIC_ADDRESS *Reg UINT32 *ReturnValue UINT8 UINT8 *Slp_TypB ACPI_PHYSICAL_ADDRESS PhysicalAddress64 UINT32 UINT32 *TimeElapsed UINT32 ACPI_STATUS const char UINT32 ACPI_STATUS const char UINT32 const char * FunctionName
Definition: acpixf.h:1279
#define write
Definition: acwin.h:97
VOID * PDB
DWORD TAGID
INT PATH_TYPE
static PDB pdb
Definition: db.cpp:172
#define realloc
Definition: debug_ros.c:6
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
int main()
Definition: test.c:6
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
unsigned short WORD
Definition: ntddk_ex.h:93
#define printf
Definition: freeldr.h:93
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
GLsizeiptr size
Definition: glext.h:5919
GLfloat f
Definition: glext.h:7540
GLuint GLuint num
Definition: glext.h:9618
GLenum GLsizei len
Definition: glext.h:6722
GLenum GLenum GLenum input
Definition: glext.h:9031
GLuint pathA
Definition: glext.h:11719
GLintptr offset
Definition: glext.h:5920
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
_Check_return_ _CRTIMP FILE *__cdecl fopen(_In_z_ const char *_Filename, _In_z_ const char *_Mode)
_Check_return_opt_ _CRTIMP int __cdecl fclose(_Inout_ FILE *_File)
_Check_return_opt_ _CRTIMP size_t __cdecl fwrite(_In_reads_bytes_(_Size *_Count) const void *_Str, _In_ size_t _Size, _In_ size_t _Count, _Inout_ FILE *_File)
_Check_return_opt_ _CRTIMP int __cdecl vprintf(_In_z_ _Printf_format_string_ const char *_Format, va_list _ArgList)
void __cdecl srand(_In_ unsigned int _Seed)
#define f
Definition: ke_i.h:83
__u16 time
Definition: mkdosfs.c:8
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
#define ASSERT(a)
Definition: mode.c:44
#define TAG_NULL
Definition: apphelp.c:45
static char * dest
Definition: rtl.c:135
static PLARGE_INTEGER Time
Definition: time.c:105
#define argv
Definition: mplay32.c:18
#define SdbAlloc(size)
Definition: sdbpapi.h:35
enum _SHIM_LOG_LEVEL SHIM_LOG_LEVEL
#define SHIM_INFO(fmt,...)
Definition: sdbpapi.h:78
#define SdbFree(mem)
Definition: sdbpapi.h:37
#define SHIM_WARN(fmt,...)
Definition: sdbpapi.h:77
#define WINAPIV
Definition: sdbpapi.h:64
#define SHIM_ERR(fmt,...)
Definition: sdbpapi.h:76
void SdbpTableDestroy(struct SdbStringHashTable **pTable)
#define memset(x, y, z)
Definition: compat.h:39
#define TICKSPERSEC
Definition: main.cpp:161
void WINAPI SdbCloseDatabase(PDB pdb)
Definition: main.cpp:76
BOOL WINAPIV ShimDbgPrint(SHIM_LOG_LEVEL Level, PCSTR FunctionName, PCSTR Format,...)
Definition: main.cpp:130
BOOL WINAPI SdbpCheckTagType(TAG tag, WORD type)
Definition: main.cpp:91
TAG WINAPI SdbGetTagFromTagID(PDB pdb, TAGID tagid)
Definition: main.cpp:114
ULONG g_ShimDebugLevel
Definition: main.cpp:17
BOOL WINAPI SdbpReadData(PDB pdb, PVOID dest, DWORD offset, DWORD num)
Definition: main.cpp:98
VOID NTAPI RtlSecondsSince1970ToTime(IN ULONG SecondsSince1970, OUT PLARGE_INTEGER Time)
Definition: main.cpp:167
static void update_loglevel(int argc, char *argv[], int &i)
Definition: main.cpp:199
static std::string get_strarg(int argc, char *argv[], int &i)
Definition: main.cpp:188
LPVOID WINAPI SdbpReAlloc(LPVOID mem, SIZE_T size, SIZE_T oldSize)
Definition: main.cpp:24
bool xml_2_db(const char *xml, const WCHAR *sdb)
Definition: xml2sdb.cpp:765
void WINAPI SdbpFree(LPVOID mem)
Definition: main.cpp:34
void WINAPI SdbpFlush(PDB pdb)
Definition: main.cpp:69
static bool run_one(std::string &input, std::string &output)
Definition: main.cpp:179
#define TICKSTO1970
Definition: main.cpp:165
LPVOID WINAPI SdbpAlloc(SIZE_T size)
Definition: main.cpp:19
BOOL WINAPI SdbpCheckTagIDType(PDB pdb, TAGID tagid, WORD type)
Definition: main.cpp:122
DWORD WINAPI SdbpStrsize(PCWSTR string)
Definition: main.cpp:47
DWORD SdbpStrlen(PCWSTR string)
Definition: main.cpp:39
PDB WINAPI SdbpCreate(LPCWSTR path, PATH_TYPE type, BOOL write)
Definition: main.cpp:52
#define TAG_TYPE_MASK
Definition: shimdbg.c:106
Definition: sdbtypes.h:24
Definition: fs_rec.h:143
Definition: mem.c:156
Definition: ecma_167.h:138
const uint16_t * PCWSTR
Definition: typedefs.h:57
int64_t LONGLONG
Definition: typedefs.h:68
#define NTAPI
Definition: typedefs.h:36
ULONG_PTR SIZE_T
Definition: typedefs.h:80
const char * PCSTR
Definition: typedefs.h:52
#define IN
Definition: typedefs.h:39
uint32_t ULONG
Definition: typedefs.h:59
#define OUT
Definition: typedefs.h:40
LONGLONG QuadPart
Definition: typedefs.h:114
Definition: pdh_main.c:94
#define WINAPI
Definition: msvc.h:6
_IRQL_requires_same_ typedef _In_ ULONG _In_ UCHAR Level
Definition: wmitypes.h:56
std::basic_string< WCHAR > sdbstring
Definition: xml2sdb.h:27
__wchar_t WCHAR
Definition: xmlstorage.h:180
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
unsigned char BYTE
Definition: xxhash.c:193