ReactOS  0.4.12-dev-418-g3df31a8
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 
15 extern "C"
16 {
18 
20 {
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 {
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;
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 
135  if (Level > g_ShimDebugLevel)
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 
177 bool xml_2_db(const char* xml, const WCHAR* sdb);
178 
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 
188 static 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 
199 static void update_loglevel(int argc, char* argv[], int& i)
200 {
202  g_ShimDebugLevel = strtoul(value.c_str(), NULL, 10);
203 }
204 
205 int main(int argc, char * argv[])
206 {
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':
218  input = get_strarg(argc, argv, 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 }
#define realloc
Definition: debug_ros.c:6
static int argc
Definition: ServiceArgs.c:12
#define IN
Definition: typedefs.h:38
UINT32 strtoul(const char *String, char **Terminator, UINT32 Base)
Definition: utclib.c:696
#define TRUE
Definition: types.h:120
static UCHAR ULONG UCHAR ULONG UCHAR * output
Definition: bcrypt.c:29
static PDB pdb
Definition: db.cpp:160
enum _SHIM_LOG_LEVEL SHIM_LOG_LEVEL
INT PATH_TYPE
std::basic_string< WCHAR > sdbstring
Definition: xml2sdb.h:27
__wchar_t WCHAR
Definition: xmlstorage.h:180
PDB WINAPI SdbpCreate(LPCWSTR path, PATH_TYPE type, BOOL write)
Definition: main.cpp:52
const char * PCSTR
Definition: typedefs.h:51
static bool run_one(std::string &input, std::string &output)
Definition: main.cpp:179
#define free
Definition: debug_ros.c:5
Definition: sdbtypes.h:24
VOID * PDB
GLintptr offset
Definition: glext.h:5920
BOOL WINAPI SdbpCheckTagIDType(PDB pdb, TAGID tagid, WORD type)
Definition: main.cpp:122
void __cdecl srand(_In_ unsigned int _Seed)
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
Definition: ecma_167.h:138
VOID NTAPI RtlSecondsSince1970ToTime(IN ULONG SecondsSince1970, OUT PLARGE_INTEGER Time)
Definition: main.cpp:167
_IRQL_requires_same_ typedef _In_ ULONG _In_ UCHAR Level
Definition: wmitypes.h:55
__u16 time
Definition: mkdosfs.c:366
#define TAG_NULL
Definition: apphelp.c:43
#define TAG_TYPE_MASK
Definition: shimdbg.c:106
_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)
#define argv
Definition: mplay32.c:18
#define WCHAR
Definition: msvc.h:43
void SdbpTableDestroy(struct SdbStringHashTable **pTable)
BOOL WINAPIV ShimDbgPrint(SHIM_LOG_LEVEL Level, PCSTR FunctionName, PCSTR Format,...)
Definition: main.cpp:130
#define SdbFree(mem)
Definition: sdbpapi.h:37
void WINAPI SdbpFlush(PDB pdb)
Definition: main.cpp:69
#define write
Definition: acwin.h:73
#define SdbAlloc(size)
Definition: sdbpapi.h:35
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
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
Definition: IoEaTest.cpp:117
#define va_end(ap)
Definition: acmsvcex.h:90
void WINAPI SdbpFree(LPVOID mem)
Definition: main.cpp:34
BOOL WINAPI SdbpReadData(PDB pdb, PVOID dest, DWORD offset, DWORD num)
Definition: main.cpp:98
ULONG g_ShimDebugLevel
Definition: main.cpp:17
void WINAPI SdbCloseDatabase(PDB pdb)
Definition: main.cpp:76
int _STLP_CALL main(int argc, char **argv)
Definition: main.cpp:154
smooth NULL
Definition: ftsmooth.c:416
char * va_list
Definition: acmsvcex.h:78
int64_t LONGLONG
Definition: typedefs.h:66
GLfloat f
Definition: glext.h:7540
unsigned int BOOL
Definition: ntddk_ex.h:94
GLsizeiptr size
Definition: glext.h:5919
_Check_return_opt_ _CRTIMP int __cdecl vprintf(_In_z_ _Printf_format_string_ const char *_Format, va_list _ArgList)
LPVOID WINAPI SdbpReAlloc(LPVOID mem, SIZE_T size, SIZE_T oldSize)
Definition: main.cpp:24
unsigned short WORD
Definition: ntddk_ex.h:93
unsigned long DWORD
Definition: ntddk_ex.h:95
GLuint GLuint num
Definition: glext.h:9618
bool xml_2_db(const char *xml, const WCHAR *sdb)
Definition: xml2sdb.cpp:765
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
ASSERT((InvokeOnSuccess||InvokeOnError||InvokeOnCancel) ?(CompletionRoutine !=NULL) :TRUE)
BOOL WINAPI SdbpCheckTagType(TAG tag, WORD type)
Definition: main.cpp:91
TAG WINAPI SdbGetTagFromTagID(PDB pdb, TAGID tagid)
Definition: main.cpp:114
LPVOID WINAPI SdbpAlloc(SIZE_T size)
Definition: main.cpp:19
DWORD WINAPI SdbpStrsize(PCWSTR string)
Definition: main.cpp:47
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
GLenum GLsizei len
Definition: glext.h:6722
unsigned char BYTE
Definition: mem.h:68
_Check_return_opt_ _CRTIMP int __cdecl fclose(_Inout_ FILE *_File)
_Check_return_ _CRTIMP FILE *__cdecl fopen(_In_z_ const char *_Filename, _In_z_ const char *_Mode)
#define WINAPI
Definition: msvc.h:20
#define WINAPIV
Definition: sdbpapi.h:64
char string[160]
Definition: util.h:11
ULONG_PTR SIZE_T
Definition: typedefs.h:78
GLenum GLenum GLenum input
Definition: glext.h:9031
#define f
Definition: ke_i.h:83
Definition: services.c:325
static std::string get_strarg(int argc, char *argv[], int &i)
Definition: main.cpp:188
#define va_start(ap, A)
Definition: acmsvcex.h:91
Definition: fs_rec.h:142
#define TICKSPERSEC
Definition: main.cpp:161
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:1260
Definition: mem.c:156
#define calloc
Definition: rosglue.h:14
#define OUT
Definition: typedefs.h:39
unsigned int ULONG
Definition: retypes.h:1
GLuint pathA
Definition: glext.h:11719
DWORD SdbpStrlen(PCWSTR string)
Definition: main.cpp:39
static char * dest
Definition: rtl.c:135
const uint16_t * PCWSTR
Definition: typedefs.h:55
DWORD TAGID
#define memset(x, y, z)
Definition: compat.h:39
static void update_loglevel(int argc, char *argv[], int &i)
Definition: main.cpp:199
#define TICKSTO1970
Definition: main.cpp:165
static PLARGE_INTEGER Time
Definition: time.c:105
LONGLONG QuadPart
Definition: typedefs.h:112
#define printf
Definition: config.h:203