[ros-diffs] [janderwald] 24688: - read lines into a vector of string lines - move os specific functions into an own file - fix a bug in command line options parsing - add function for converting ansi2Unicode

janderwald at svn.reactos.org janderwald at svn.reactos.org
Sun Nov 5 21:51:02 CET 2006


Author: janderwald
Date: Sun Nov  5 23:51:02 2006
New Revision: 24688

URL: http://svn.reactos.org/svn/reactos?rev=24688&view=rev
Log:
- read lines into a vector of string lines
- move os specific functions into an own file 
- fix a bug in command line options parsing
- add function for converting ansi2Unicode

Added:
    trunk/reactos/tools/sysreg/os_support.cpp
    trunk/reactos/tools/sysreg/os_support.h
    trunk/reactos/tools/sysreg/unicode.cpp
    trunk/reactos/tools/sysreg/unicode.h
Modified:
    trunk/reactos/tools/sysreg/conf_parser.cpp
    trunk/reactos/tools/sysreg/namedpipe_reader.cpp
    trunk/reactos/tools/sysreg/namedpipe_reader.h
    trunk/reactos/tools/sysreg/rosboot_test.cpp
    trunk/reactos/tools/sysreg/sample.cfg
    trunk/reactos/tools/sysreg/sysreg.cpp
    trunk/reactos/tools/sysreg/sysreg.mak

Modified: trunk/reactos/tools/sysreg/conf_parser.cpp
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/tools/sysreg/conf_parser.cpp?rev=24688&r1=24687&r2=24688&view=diff
==============================================================================
--- trunk/reactos/tools/sysreg/conf_parser.cpp (original)
+++ trunk/reactos/tools/sysreg/conf_parser.cpp Sun Nov  5 23:51:02 2006
@@ -38,7 +38,7 @@
 #endif
 		if (!file)
 		{
-			cerr << " Error: ConfigParser::parseFile failed to open configuration file " <<endl;
+			cerr << "Error: ConfigParser::parseFile failed to open configuration file " << FileName << endl;
 			return false;
 		}
 

Modified: trunk/reactos/tools/sysreg/namedpipe_reader.cpp
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/tools/sysreg/namedpipe_reader.cpp?rev=24688&r1=24687&r2=24688&view=diff
==============================================================================
--- trunk/reactos/tools/sysreg/namedpipe_reader.cpp (original)
+++ trunk/reactos/tools/sysreg/namedpipe_reader.cpp Sun Nov  5 23:51:02 2006
@@ -9,6 +9,7 @@
  */
 
 #include "namedpipe_reader.h"
+#include "unicode.h"
 
 #include <iostream>
 #include <assert.h>
@@ -17,6 +18,7 @@
 {
 #define MIN(a, b)  (((a) < (b)) ? (a) : (b))
 
+	using std::vector;
 //---------------------------------------------------------------------------------------
 	NamedPipeReader::NamedPipeReader() : h_Pipe(NULL)
 	{
@@ -90,71 +92,126 @@
 		h_Pipe = NULL;
 		return true;
 	}
-
-//---------------------------------------------------------------------------------------
-
-	string::size_type NamedPipeReader::readPipe(string &Buffer)
-	{
-		TCHAR * buf = (TCHAR *)Buffer.c_str();
-		string::size_type buffer_size = Buffer.capacity();
-		string::size_type bytes_read = 0;
-		DWORD cbRead;
+//---------------------------------------------------------------------------------------
+	void NamedPipeReader::extractLines(TCHAR * buffer, std::vector<string> & vect, bool & append_line, unsigned long cbRead)
+	{
+		TCHAR * offset = _tcsstr(buffer, _T("\x0D"));
+		DWORD buf_offset = 0;
+		while(offset)
+		{
+			offset[0] = _T('\0');
+			string line = buffer;
+			if (append_line)
+			{
+				assert(vect.empty () == false);
+				string prev_line = vect[vect.size () -1];
+				prev_line += line;
+				vect.pop_back ();
+				vect.push_back (prev_line);
+				append_line = false;
+			}
+			else
+			{
+				vect.push_back (line);
+			}
+
+			offset += 2;
+						
+			buf_offset += line.length () + 2;
+			if (buf_offset >= cbRead)
+			{
+				break;
+			}
+			buffer = offset;
+			offset = _tcsstr(buffer, _T("\n"));
+		}
+		if (buf_offset < cbRead)
+		{
+			string line = buffer;
+			if (append_line)
+			{
+				assert(vect.empty () == false);
+				string prev_line = vect[vect.size () -1];
+				vect.pop_back ();
+				prev_line += line;
+				vect.push_back (prev_line);
+			}
+			else
+			{
+				vect.push_back (line);
+				append_line = true;
+			}
+		}
+		else
+		{
+			append_line = false;
+		}
+	}
+
+//---------------------------------------------------------------------------------------
+
+	size_t NamedPipeReader::readPipe(vector<string> & vect)
+	{
+		char * localbuf;
+		DWORD localsize = 100;
+		size_t lines = vect.size ();
+
+#ifdef WIN32
 		BOOL fSuccess;
-		TCHAR * localbuf;
-		DWORD localsize = MIN(100, buffer_size);
-
-//#ifdef NDEBUG
-		memset(buf, 0x0, sizeof(TCHAR) * buffer_size);
-//#endif
-
-#ifdef __LINUX__
-
-#else
-		localbuf = (TCHAR*) HeapAlloc(GetProcessHeap(), 0, localsize * sizeof(TCHAR));
+		localbuf = (char*) HeapAlloc(GetProcessHeap(), 0, localsize * sizeof(char));
+#ifdef UNICODE
+		wchar_t * wbuf = (WCHAR*) HeapAlloc(GetProcessHeap(), 0, localsize * sizeof(wchar_t));
+#endif
 		if (localbuf != NULL)
 		{
-
+			bool append_line = false;
 			do
 			{
+				DWORD cbRead;
 				do 
 				{ 
-					ZeroMemory(localbuf, localsize * sizeof(TCHAR));
+					ZeroMemory(localbuf, localsize * sizeof(char));
+#ifdef UNICODE
+					ZeroMemory(wbuf, localsize * sizeof(wchar_t));
+#endif
 
 					fSuccess = ReadFile( 
 						h_Pipe,
 						localbuf,
-						localsize * sizeof(TCHAR),
+						(localsize-1) * sizeof(char),
 						&cbRead,
 						NULL);
 				 
 					if (! fSuccess && GetLastError() != ERROR_MORE_DATA) 
 						break; 
-					
-					if(bytes_read + cbRead > buffer_size)
+
+#ifdef UNICODE
+					if (UnicodeConverter::ansi2Unicode(localbuf, wbuf, cbRead))
 					{
-						Buffer.reserve(bytes_read + localsize * 3);
-						buf = (TCHAR *)Buffer.c_str();
-						buffer_size = Buffer.capacity();
+						extractLines(wbuf, vect, append_line, cbRead);
 					}
-
-					memcpy(&buf[bytes_read], localbuf, cbRead);
-					bytes_read += cbRead;
+#else
+					extractLines(localbuf, vect, append_line, cbRead);
+#endif
 
 				} while (!fSuccess);  // repeat loop if ERROR_MORE_DATA 
-			} while (localbuf[_tcslen(localbuf)-1] != '\n');
+			} while (localbuf[strlen(localbuf)-1] != '\n');
 
 			if (!fSuccess)
 				return 0;
 
 			HeapFree(GetProcessHeap(), 0, localbuf);
+#ifdef UNICODE
+			HeapFree(GetProcessHeap(), 0, wbuf);
+#endif
 		}
 		else
 		{
 			return 0;
 		}
 #endif
-		buf[_tcslen(buf)-_tcslen(_T("\n"))-1] = '\0';
-		return _tcslen(buf);
+
+	return (vect.size () - lines);
 	}
 
 

Modified: trunk/reactos/tools/sysreg/namedpipe_reader.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/tools/sysreg/namedpipe_reader.h?rev=24688&r1=24687&r2=24688&view=diff
==============================================================================
--- trunk/reactos/tools/sysreg/namedpipe_reader.h (original)
+++ trunk/reactos/tools/sysreg/namedpipe_reader.h Sun Nov  5 23:51:02 2006
@@ -14,12 +14,13 @@
 
 
 #include "user_types.h"
+#include <vector>
 #include <stdio.h>
 #include <stdlib.h>
 
 #ifdef __LINUX__
 
-#else
+#elif defined(WIN32)
 	#include <windows.h>
 #endif
 
@@ -82,9 +83,9 @@
 /// false, call PipeReader::isEoF() to determine if the pipe should be closed
 ///
 /// @param Buffer to be written to
-/// @return string::size_type
+/// @return size_t
 
-		string::size_type readPipe(string & Buffer);
+		size_t readPipe(std::vector<string> & vect);
 
 //---------------------------------------------------------------------------------------
 ///
@@ -96,6 +97,21 @@
 	bool isEof();
 
 protected:
+//---------------------------------------------------------------------------------------
+///
+/// extractLines
+///
+/// Description: this functions extract lines from a buffer and pushes them into the supplied vector
+///
+/// @param buffer from which the lines are extracted from
+/// @param vect vector storing the extracted lines
+/// @param append_line if the line isnt fully read, the line is appended
+
+	void extractLines(TCHAR * buffer, std::vector<string> & vect, bool & append_line, unsigned long cbRead);
+
+
+
+
 	HANDLE h_Pipe;
 
 	}; // end of class NamedPipeReader

Added: trunk/reactos/tools/sysreg/os_support.cpp
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/tools/sysreg/os_support.cpp?rev=24688&view=auto
==============================================================================
--- trunk/reactos/tools/sysreg/os_support.cpp (added)
+++ trunk/reactos/tools/sysreg/os_support.cpp Sun Nov  5 23:51:02 2006
@@ -1,0 +1,76 @@
+/* $Id: os_support.h 24643 2006-10-24 11:45:21Z janderwald $
+ *
+ * PROJECT:     System regression tool for ReactOS
+ * LICENSE:     GPL - See COPYING in the top level directory
+ * FILE:        tools/sysreg/conf_parser.h
+ * PURPOSE:     operating systems specific code
+ * PROGRAMMERS: Johannes Anderwald (johannes.anderwald at sbox tugraz at)
+ */
+
+#include "os_support.h"
+
+namespace System_
+{
+#ifdef WIN32
+	bool OsSupport::terminateProcess(OsSupport::ProcessID pid)
+	{
+		HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, pid);
+		if (!hProcess)
+		{
+			return false;
+		}
+
+		bool ret = TerminateProcess(hProcess, 0);
+		CloseHandle(hProcess);
+		return ret;
+	}
+
+	OsSupport::ProcessID OsSupport::createProcess(TCHAR *procname, int procargsnum, TCHAR **procargs)
+	{
+		STARTUPINFO siStartInfo;
+		PROCESS_INFORMATION piProcInfo; 
+		OsSupport::ProcessID pid;
+
+		UNREFERENCED_PARAMETER(procargsnum);
+		UNREFERENCED_PARAMETER(procargs);
+
+		ZeroMemory(&siStartInfo, sizeof(STARTUPINFO));
+		ZeroMemory(&piProcInfo, sizeof(PROCESS_INFORMATION));
+
+		siStartInfo.cb = sizeof(STARTUPINFO);
+		siStartInfo.wShowWindow = SW_SHOWNORMAL;
+		siStartInfo.dwFlags = STARTF_USESHOWWINDOW;
+
+		LPTSTR command = _tcsdup(procname);
+
+		if (!CreateProcess(NULL, procname, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &siStartInfo, &piProcInfo))
+		{
+			cerr << "Error: CreateProcess failed " << command <<endl;
+			pid = 0;
+		}
+		else
+		{
+			pid = piProcInfo.dwProcessId;
+			CloseHandle(piProcInfo.hProcess);
+			CloseHandle(piProcInfo.hThread);
+		}
+		free(command);
+		return pid;
+	}
+#elif defined (__LINUX__)
+/********************************************************************************************************************/
+	OsSupport::ProcessID OsSupport::createProcess(TCHAR *procname, int procargsnum, TCHAR **procargs)
+	{
+		ProcessID pid;
+
+		if ((pid = fork()) < 0)
+		{
+			cerr << "OsSupport::createProcess> fork failed" << endl;
+			return pid;
+		}
+
+	}
+
+#endif
+
+} // end of namespace System_

Added: trunk/reactos/tools/sysreg/os_support.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/tools/sysreg/os_support.h?rev=24688&view=auto
==============================================================================
--- trunk/reactos/tools/sysreg/os_support.h (added)
+++ trunk/reactos/tools/sysreg/os_support.h Sun Nov  5 23:51:02 2006
@@ -1,0 +1,95 @@
+#ifndef OS_SUPPORT_H__
+#define OS_SUPPORT_H__
+
+/* $Id: os_support.h 24643 2006-10-24 11:45:21Z janderwald $
+ *
+ * PROJECT:     System regression tool for ReactOS
+ * LICENSE:     GPL - See COPYING in the top level directory
+ * FILE:        tools/sysreg/conf_parser.h
+ * PURPOSE:     operating systems specific code
+ * PROGRAMMERS: Johannes Anderwald (johannes.anderwald at sbox tugraz at)
+ */
+
+#ifdef WIN32
+#include <windows.h>
+#elif defined(__LINUX__)
+#include <unistd.h>
+#endif
+
+#include "user_types.h"
+
+namespace System_
+{
+//---------------------------------------------------------------------------------------
+///
+/// class OsSupport
+///
+/// Description: this class encapsulates operating system specific functions
+///
+///
+
+	class OsSupport
+	{
+	public:
+#ifdef WIN32
+
+		typedef DWORD ProcessID;
+
+#elif defined(__LINUX__)
+
+		typedef pid_t ProcessID;
+
+#else
+#error you need to define pid handle type for your platform
+#endif
+
+//---------------------------------------------------------------------------------------
+///
+/// OsSupport
+///
+/// Description: constructor of class OsSupport
+
+		virtual ~OsSupport()
+		{}
+
+//---------------------------------------------------------------------------------------
+///
+/// createProcess
+///
+/// Description: this functions creates a new process and returns its pid on success
+///
+/// @param procname name of the file to execute
+/// @param procargsnum num of arguments for the new process
+/// @param procargs arguments for the new process
+///
+///
+
+		static ProcessID createProcess(TCHAR * procname, int procargsnum, TCHAR ** procargs);
+
+//---------------------------------------------------------------------------------------
+///
+/// terminateProcess
+///
+/// Description: this function terminates a process given by its pid
+///
+/// Note: returns true if the process with the given pid was terminated
+///
+/// @param pid process id of the process to terminate
+
+	static bool terminateProcess(ProcessID pid);
+
+	protected:
+//---------------------------------------------------------------------------------------
+///
+/// OsSupport
+///
+/// Description: constructor of class OsSupport
+
+		OsSupport()
+		{}
+
+	}; // end of class OsSupport
+
+} // end of namespace System_
+
+#endif /* end of OS_SUPPORT_H__ */

Modified: trunk/reactos/tools/sysreg/rosboot_test.cpp
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/tools/sysreg/rosboot_test.cpp?rev=24688&r1=24687&r2=24688&view=diff
==============================================================================
--- trunk/reactos/tools/sysreg/rosboot_test.cpp (original)
+++ trunk/reactos/tools/sysreg/rosboot_test.cpp Sun Nov  5 23:51:02 2006
@@ -14,6 +14,7 @@
 #include "namedpipe_reader.h"
 #include "sym_file.h"
 #include "file_reader.h"
+#include "os_support.h"
 
 #include <iostream>
 #include <vector>
@@ -24,11 +25,6 @@
 #include <assert.h>
  
 
-#ifndef __LINUX__
-#include <windows.h>
-#endif
-
-
 namespace Sysreg_
 {
 	using std::vector;
@@ -36,6 +32,7 @@
 	using System_::NamedPipeReader;
 	using System_::SymbolFile;
 	using System_::FileReader;
+	using System_::OsSupport;
 
 	string RosBootTest::VARIABLE_NAME = _T("ROSBOOT_CMD");
 	string RosBootTest::CLASS_NAME = _T("rosboot");
@@ -113,9 +110,11 @@
 		///
 
 		conf_parser.getStringValue (RosBootTest::CHECK_POINT, m_Checkpoint);
-		conf_parser.getStringValue (RosBootTest::PID_FILE, m_PidFile);
 		conf_parser.getStringValue (RosBootTest::CRITICAL_APP, m_CriticalApp);
-
+		if (conf_parser.getStringValue (RosBootTest::PID_FILE, m_PidFile))
+		{
+			_tremove(m_PidFile.c_str ());
+		}
 		
 		if (!_tcscmp(debug_port.c_str(), _T("pipe")))
 		{
@@ -318,40 +317,19 @@
 	{
 		NamedPipeReader namedpipe_reader;
 		string pipecmd = _T("");
-
-#ifdef __LINUX__
-		pid_t pid;
-#else
-		STARTUPINFO siStartInfo;
-		PROCESS_INFORMATION piProcInfo; 
-		DWORD pid;
-
-		ZeroMemory(&siStartInfo, sizeof(STARTUPINFO));
-		ZeroMemory(&piProcInfo, sizeof(PROCESS_INFORMATION));
-
-		siStartInfo.cb = sizeof(STARTUPINFO);
-		siStartInfo.wShowWindow = SW_SHOWNORMAL;
-		siStartInfo.dwFlags = STARTF_USESHOWWINDOW;
-
-		LPTSTR command = _tcsdup(boot_cmd.c_str());
-
-		if (!CreateProcess(NULL, command, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &siStartInfo, &piProcInfo))
-		{
-			cerr << "Error: CreateProcess failed " << boot_cmd <<endl;
-			return false;
-		}
-		else
-		{
-			pid = piProcInfo.dwProcessId;
-		}
-#endif
+		
+		///
+		/// FIXME
+		/// split up arguments
+
+		OsSupport::ProcessID pid = OsSupport::createProcess ((TCHAR*)boot_cmd.c_str (), 0, NULL); 
 
 		string::size_type pipe_pos = boot_cmd.find (_T("serial pipe:"));
 		pipe_pos += 12;
 		string::size_type pipe_pos_end = boot_cmd.find (_T(" "), pipe_pos);
 		if (pipe_pos != string::npos && pipe_pos > 0 && pipe_pos < boot_cmd.size())
 		{
-			pipecmd = "\\\\.\\pipe\\" + boot_cmd.substr (pipe_pos, pipe_pos_end - pipe_pos);
+			pipecmd = _T("\\\\.\\pipe\\") + boot_cmd.substr (pipe_pos, pipe_pos_end - pipe_pos);
 		}
 		else
 		{
@@ -385,10 +363,8 @@
 				break;
 			}
 
-			if (namedpipe_reader.readPipe (Buffer) != 0)
-			{
-				vect.push_back (Buffer.c_str());
-
+			if (namedpipe_reader.readPipe (vect) != 0)
+			{
 				DebugState state = checkDebugData(vect);
 				if (state == DebugStateBSODDetected || state == DebugStateUMEDetected)
 				{
@@ -402,17 +378,8 @@
 			}
 		}
 		namedpipe_reader.closePipe ();
-
-#ifdef __LINUX__
-		kill(pid, SIGTERM);
-#else
-		HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, pid);
-		if (hProcess)
-		{
-			TerminateProcess(hProcess, 0);
-		}
-		CloseHandle(hProcess);
-#endif
+		_sleep(3* CLOCKS_PER_SEC);
+		OsSupport::terminateProcess (pid);
 
 		return ret;
 	}
@@ -421,7 +388,7 @@
 	{
 		PipeReader pipe_reader;
 		_tremove(debug_log.c_str ());
-		_tremove(m_PidFile.c_str ());
+
 		if (!pipe_reader.openPipe(boot_cmd, string(_T("rt"))))
 		{
 			cerr << "Error: failed to open pipe with cmd: " << boot_cmd << endl;
@@ -437,7 +404,7 @@
 			_sleep( (clock_t)m_Delayread * CLOCKS_PER_SEC );
 		}
 
-		int pid = 0;
+		OsSupport::ProcessID pid = 0;
 
 		if (m_PidFile != _T(""))
 		{
@@ -502,17 +469,9 @@
 
 		if (pid)
 		{
-#ifdef __LINUX__
-			kill(pid, SIGTERM);
-#else
-			HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, pid);
-			if (hProcess)
-			{
-				TerminateProcess(hProcess, 0);
-			}
-			CloseHandle(hProcess);
-#endif
-		}
+			OsSupport::terminateProcess (pid);
+		}
+
 		pipe_reader.closePipe ();	
 		return ret;
 	}

Modified: trunk/reactos/tools/sysreg/sample.cfg
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/tools/sysreg/sample.cfg?rev=24688&r1=24687&r2=24688&view=diff
==============================================================================
--- trunk/reactos/tools/sysreg/sample.cfg (original)
+++ trunk/reactos/tools/sysreg/sample.cfg Sun Nov  5 23:51:02 2006
@@ -27,7 +27,7 @@
 ; This value is the command which is executed to gain debugging data
 ; this value is mandatory
 
-ROSBOOT_CMD=D:\sysreg\qemu\qemu.exe -serial file:debug.log -boot c -m 128 -L D:\sysreg\qemu\ D:\sysreg\qemu\RosVM.vmdk -cdrom D:\Reactos\ReactOS-RegTest.iso -pidfile pid.txt
+ROSBOOT_CMD=D:\sysreg\qemu\qemu.exe -serial pipe:qemu -boot c -m 128 -L D:\sysreg\qemu\ D:\sysreg\qemu\RosVM.vmdk -cdrom D:\Reactos\ReactOS-RegTest.iso -pidfile pid.txt
 
 ;
 ; ROSBOOT_PIDFILE
@@ -47,8 +47,8 @@
 ; If the value is set to pipe, then sysreg will read from pipe created by the
 ; ROSBOOT_CMD
 ;
-;ROSBOOT_DEBUG_PORT=pipe
-ROSBOOT_DEBUG_PORT=file
+;ROSBOOT_DEBUG_PORT=file
+ROSBOOT_DEBUG_PORT=pipe
 
 ;
 ; ROSBOOT_DEBUG_FILE

Modified: trunk/reactos/tools/sysreg/sysreg.cpp
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/tools/sysreg/sysreg.cpp?rev=24688&r1=24687&r2=24688&view=diff
==============================================================================
--- trunk/reactos/tools/sysreg/sysreg.cpp (original)
+++ trunk/reactos/tools/sysreg/sysreg.cpp Sun Nov  5 23:51:02 2006
@@ -36,6 +36,7 @@
 	ComponentFactory comp_factory;
 	TCHAR DefaultConfig[] = _T("sysreg.cfg");
 	TCHAR *ConfigFile;
+	TCHAR * TestName;
 
 	if ((argc != 3) && (argc != 2))
 	{
@@ -59,9 +60,15 @@
 	}
 
 	if (argc == 2)
-		_tcscpy(ConfigFile, DefaultConfig);
+	{
+		ConfigFile = DefaultConfig;
+		TestName = argv[1];
+	}
 	else
+	{
 		ConfigFile = argv[1];
+		TestName = argv[2];
+	}
 
 
 	if (!config.parseFile (ConfigFile))
@@ -70,7 +77,7 @@
 		return -1;
 	}
 
-	RegressionTest * regtest = comp_factory.createComponent (argv[2]);
+	RegressionTest * regtest = comp_factory.createComponent (TestName);
 	if (!regtest)
 	{
 		cerr << "Error: the requested regression test does not exist" << endl;
@@ -82,7 +89,7 @@
 	config.getStringValue (ros, envvar);
 
 	SymbolFile::initialize (config, envvar);
-
+	
 	if (regtest->execute (config))
 	{
 		cout << "The regression test " << regtest->getName () << " completed successfully" << endl;

Modified: trunk/reactos/tools/sysreg/sysreg.mak
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/tools/sysreg/sysreg.mak?rev=24688&r1=24687&r2=24688&view=diff
==============================================================================
--- trunk/reactos/tools/sysreg/sysreg.mak (original)
+++ trunk/reactos/tools/sysreg/sysreg.mak Sun Nov  5 23:51:02 2006
@@ -27,6 +27,8 @@
 	sym_file.cpp \
 	sysreg.cpp \
 	file_reader.cpp \
+	os_support.cpp \
+	unicode.cpp \
 	)
 
 SYSREGBUILD_OBJECTS = \
@@ -76,6 +78,14 @@
 	$(ECHO_CC)
 	${host_gpp} $(SYSREGBUILD_HOST_CFLAGS) -c $< -o $@
 
+$(SYSREGBUILD_INT_)os_support.o: $(SYSREGBUILD_BASE_)os_support.cpp | $(SYSREGBUILD_INT)
+	$(ECHO_CC)
+	${host_gpp} $(SYSREGBUILD_HOST_CFLAGS) -c $< -o $@
+
+$(SYSREGBUILD_INT_)unicode.o: $(SYSREGBUILD_BASE_)unicode.cpp | $(SYSREGBUILD_INT)
+	$(ECHO_CC)
+	${host_gpp} $(SYSREGBUILD_HOST_CFLAGS) -c $< -o $@
+
 .PHONY: sysregbuild_clean
 sysreg_clean:
 	-@$(rm) $(SYSREGBUILD_TARGET) $(SYSREGBUILD_OBJECTS) 2>$(NUL)

Added: trunk/reactos/tools/sysreg/unicode.cpp
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/tools/sysreg/unicode.cpp?rev=24688&view=auto
==============================================================================
--- trunk/reactos/tools/sysreg/unicode.cpp (added)
+++ trunk/reactos/tools/sysreg/unicode.cpp Sun Nov  5 23:51:02 2006
@@ -1,0 +1,31 @@
+#include "unicode.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+
+namespace System_
+{
+//---------------------------------------------------------------------------------------
+	bool UnicodeConverter::ansi2Unicode(char * abuf, wchar_t *outbuf, size_t length)
+	{
+		size_t i = 0;
+		int conv;
+
+		while((conv = mbtowc(&outbuf[i], &abuf[i], length - i)))
+		{
+			i += conv;
+			if (i == length)
+				break;
+		}
+		outbuf[i] = L'\0';
+
+		if (i)
+		{
+			return true;
+		}
+		else
+		{
+			return false;
+		}
+	}
+} // end of namespace System_

Added: trunk/reactos/tools/sysreg/unicode.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/tools/sysreg/unicode.h?rev=24688&view=auto
==============================================================================
--- trunk/reactos/tools/sysreg/unicode.h (added)
+++ trunk/reactos/tools/sysreg/unicode.h Sun Nov  5 23:51:02 2006
@@ -1,0 +1,55 @@
+#ifndef UNICODE_H__
+#define UNICODE_H__ // unicode.h
+
+#include "user_types.h"
+
+namespace System_
+{
+
+	class UnicodeConverter
+	{
+	public:
+//---------------------------------------------------------------------------------------
+///
+/// UnicodeConverter
+///
+/// Description: destructor of class UnicodeConverter
+
+	virtual ~UnicodeConverter()
+	{}
+
+//---------------------------------------------------------------------------------------
+///
+/// UnicodeConverter
+///
+/// Description: converts an ANSI buffer to wide character buffer
+/// using standard c routines
+///
+/// Note: make sure before calling that outbuf is big enough to receive the result
+///
+/// @param abuf ansi buffer used a source
+/// @param outbuf wide character buffer receives result
+/// @param length length of abuf
+///
+/// @return bool
+
+	static bool ansi2Unicode(char * abuf, wchar_t * outbuf, size_t length);
+
+
+	protected:
+//---------------------------------------------------------------------------------------
+///
+/// UnicodeConverter
+///
+/// Description: constructor of class UnicodeConverter
+
+		UnicodeConverter()
+		{}
+
+	}; // end of class UnicodeConverter
+
+
+
+} // end of namespace System_
+
+#endif /* end of UNICODE_H__ */




More information about the Ros-diffs mailing list