Author: eliot Date: 2011-12-01 14:12:32 -0800 (Thu, 01 Dec 2011) New Revision: 2521
Added: trunk/platforms/win32/plugins/BochsIA32Plugin/ trunk/platforms/win32/plugins/BochsIA32Plugin/Makefile Modified: trunk/platforms/win32/plugins/FilePlugin/sqWin32FilePrims.c Log: Add Bochs plugin makefiles for win32. Add console stdio support for win32.
Added: trunk/platforms/win32/plugins/BochsIA32Plugin/Makefile =================================================================== --- trunk/platforms/win32/plugins/BochsIA32Plugin/Makefile (rev 0) +++ trunk/platforms/win32/plugins/BochsIA32Plugin/Makefile 2011-12-01 22:12:32 UTC (rev 2521) @@ -0,0 +1,24 @@ +DLLTOOLEXTRA := $(PLATDIR)/../processors/IA32/winbochs/cpu/libcpu.a \ + $(PLATDIR)/../processors/IA32/winbochs/fpu/libfpu.a \ + $(PLATDIR)/../processors/IA32/winbochs/disasm/libdisasm.a +DLLWRAPEXTRA := $(DLLTOOLEXTRA) + +LINK_WITH_GPP := yes +EXTRALIBS:= -L../../../processors/IA32/winbochs/cpu \ + -L../../../processors/IA32/winbochs/fpu \ + -L../../../processors/IA32/winbochs/disasm \ + -lcpu -lfpu -ldisasm + +include ../../Makefile.plugin + +CXXINCLUDES:= -I$(PLATDIR)/../processors/IA32/winbochs \ + -I$(PLATDIR)/../processors/IA32/bochs \ + -I$(PLATDIR)/../processors/IA32/bochs/instrument/stubs + +CXXFLAGS:= -m32 -mno-cygwin -DWIN32 -msse2 -ggdb2 -mwindows -mthreads -mwin32 \ + -mno-rtd -mms-bitfields -mno-accumulate-outgoing-args + +.cpp.o: + $(CXX) -c $(CXXFLAGS) $(CXXINCLUDES) $< + +CXX:=g++
Modified: trunk/platforms/win32/plugins/FilePlugin/sqWin32FilePrims.c =================================================================== --- trunk/platforms/win32/plugins/FilePlugin/sqWin32FilePrims.c 2011-12-01 22:10:33 UTC (rev 2520) +++ trunk/platforms/win32/plugins/FilePlugin/sqWin32FilePrims.c 2011-12-01 22:12:32 UTC (rev 2521) @@ -80,7 +80,11 @@ sqInt sqFileAtEnd(SQFile *f) { win32FileOffset ofs; /* Return true if the file's read/write head is at the end of the file. */ - if (!sqFileValid(f)) FAIL(); + if (!sqFileValid(f)) + FAIL(); + /* If a stdio handle then assume not at end. */ + if (f->isStdioStream) + return 0; ofs.offset = 0; ofs.dwLow = SetFilePointer(FILE_HANDLE(f), 0, &ofs.dwHigh, FILE_CURRENT); return ofs.offset >= sqFileSize(f); @@ -89,8 +93,10 @@ sqInt sqFileClose(SQFile *f) { /* Close the given file. */
- if (!sqFileValid(f)) FAIL(); - if(!CloseHandle(FILE_HANDLE(f))) FAIL(); + if (!sqFileValid(f)) + FAIL(); + if(!CloseHandle(FILE_HANDLE(f))) + FAIL(); RemoveHandleFromTable(win32Files, FILE_HANDLE(f)); f->file = NULL; f->sessionID = 0; @@ -103,18 +109,22 @@ int sz; /* convert the file name into a null-terminated C string */ sz = MultiByteToWideChar(CP_UTF8, 0, fileNameIndex, fileNameSize, NULL, 0); - if(sz > MAX_PATH) FAIL(); + if(sz > MAX_PATH) + FAIL(); MultiByteToWideChar(CP_UTF8, 0, fileNameIndex, fileNameSize, win32Path, sz); win32Path[sz] = 0; - if(hasCaseSensitiveDuplicate(win32Path)) FAIL(); - if(!DeleteFileW(win32Path)) FAIL(); + if(hasCaseSensitiveDuplicate(win32Path)) + FAIL(); + if(!DeleteFileW(win32Path)) + FAIL(); return 1; }
squeakFileOffsetType sqFileGetPosition(SQFile *f) { win32FileOffset ofs; /* Return the current position of the file's read/write head. */ - if (!sqFileValid(f)) FAIL(); + if (!sqFileValid(f)) + FAIL(); ofs.offset = 0; ofs.dwLow = SetFilePointer(FILE_HANDLE(f), 0, &ofs.dwHigh, FILE_CURRENT); return ofs.offset; @@ -152,7 +162,8 @@
/* convert the file name into a null-terminated C string */ sz = MultiByteToWideChar(CP_UTF8, 0, fileNameIndex, fileNameSize, NULL, 0); - if(sz > MAX_PATH) FAIL(); + if(sz > MAX_PATH) + FAIL(); MultiByteToWideChar(CP_UTF8, 0, fileNameIndex, fileNameSize, win32Path, sz); win32Path[sz] = 0;
@@ -192,12 +203,14 @@ sqInt sqFileStdioHandlesInto(SQFile files[3]) { + DWORD mode; + files[0].sessionID = thisSession; files[0].file = GetStdHandle(STD_INPUT_HANDLE); files[0].fileSize = 0; files[0].writable = false; files[0].lastOp = 0; /* unused on win32 */ - files[0].isStdioStream = 1; + files[0].isStdioStream = GetConsoleMode(files[0].file, &mode) != 0; AddHandleToTable(win32Files, files[0].file);
files[1].sessionID = thisSession; @@ -205,7 +218,7 @@ files[1].fileSize = 0; files[1].writable = true; files[1].lastOp = 0; /* unused on win32 */ - files[1].isStdioStream = 1; + files[1].isStdioStream = GetConsoleMode(files[1].file, &mode) != 0; AddHandleToTable(win32Files, files[1].file);
files[2].sessionID = thisSession; @@ -213,7 +226,7 @@ files[2].fileSize = 0; files[2].writable = true; files[2].lastOp = 0; /* unused on win32 */ - files[2].isStdioStream = 1; + files[2].isStdioStream = GetConsoleMode(files[2].file, &mode) != 0; AddHandleToTable(win32Files, files[2].file);
return 7; @@ -228,8 +241,14 @@ */ DWORD dwReallyRead;
- if (!sqFileValid(f)) FAIL(); - ReadFile(FILE_HANDLE(f), (LPVOID) (byteArrayIndex+startIndex), count, &dwReallyRead, NULL); + if (!sqFileValid(f)) + FAIL(); + if (f->isStdioStream) + ReadConsole(FILE_HANDLE(f), (LPVOID) (byteArrayIndex+startIndex), count, + &dwReallyRead, NULL); + else + ReadFile(FILE_HANDLE(f), (LPVOID) (byteArrayIndex+startIndex), count, + &dwReallyRead, NULL); return (int)dwReallyRead; }
@@ -241,18 +260,22 @@
/* convert the file name into a null-terminated C string */ sz = MultiByteToWideChar(CP_UTF8, 0, oldNameIndex, oldNameSize, NULL,0); - if(sz > MAX_PATH) FAIL(); + if(sz > MAX_PATH) + FAIL(); MultiByteToWideChar(CP_UTF8, 0, oldNameIndex, oldNameSize, oldPath, sz); oldPath[sz] = 0;
/* convert the file name into a null-terminated C string */ sz = MultiByteToWideChar(CP_UTF8, 0, newNameIndex, newNameSize, NULL,0); - if(sz > MAX_PATH) FAIL(); + if(sz > MAX_PATH) + FAIL(); MultiByteToWideChar(CP_UTF8, 0, newNameIndex, newNameSize, newPath, sz); newPath[sz] = 0;
- if(hasCaseSensitiveDuplicate(oldPath)) FAIL(); - if(!MoveFileW(oldPath, newPath)) FAIL(); + if(hasCaseSensitiveDuplicate(oldPath)) + FAIL(); + if(!MoveFileW(oldPath, newPath)) + FAIL(); return 1; }
@@ -261,7 +284,8 @@ win32FileOffset ofs; ofs.offset = position; /* Set the file's read/write head to the given position. */ - if (!sqFileValid(f)) FAIL(); + if (!sqFileValid(f)) + FAIL(); SetFilePointer(FILE_HANDLE(f), ofs.dwLow, &ofs.dwHigh, FILE_BEGIN); return 1; } @@ -269,14 +293,16 @@ squeakFileOffsetType sqFileSize(SQFile *f) { /* Return the length of the given file. */ win32FileOffset ofs; - if (!sqFileValid(f)) FAIL(); + if (!sqFileValid(f)) + FAIL(); ofs.offset = 0; ofs.dwLow = GetFileSize(FILE_HANDLE(f), &ofs.dwHigh); return ofs.offset; }
sqInt sqFileFlush(SQFile *f) { - if (!sqFileValid(f)) FAIL(); + if (!sqFileValid(f)) + FAIL(); /* note: ignores the return value in case of read-only access */ FlushFileBuffers(FILE_HANDLE(f)); return 1; @@ -285,7 +311,8 @@ sqInt sqFileTruncate(SQFile *f, squeakFileOffsetType offset) { win32FileOffset ofs; ofs.offset = offset; - if (!sqFileValid(f)) FAIL(); + if (!sqFileValid(f)) + FAIL(); SetFilePointer(FILE_HANDLE(f), ofs.dwLow, &ofs.dwHigh, FILE_BEGIN); if(!SetEndOfFile(FILE_HANDLE(f))) return 0; return 1; @@ -308,11 +335,16 @@ */ DWORD dwReallyWritten; win32FileOffset ofs; - if (!(sqFileValid(f) && f->writable)) FAIL(); + if (!(sqFileValid(f) && f->writable)) + FAIL();
- WriteFile(FILE_HANDLE(f), (LPVOID) (byteArrayIndex + startIndex), count, &dwReallyWritten, NULL); + if (f->isStdioStream) + WriteConsole(FILE_HANDLE(f), (LPVOID) (byteArrayIndex + startIndex), count, &dwReallyWritten, NULL); + else + WriteFile(FILE_HANDLE(f), (LPVOID) (byteArrayIndex + startIndex), count, &dwReallyWritten, NULL);
- if ((int)dwReallyWritten != count) FAIL(); + if ((int)dwReallyWritten != count) + FAIL(); return (int) dwReallyWritten; }
@@ -342,7 +374,8 @@ } /* convert the file name into a null-terminated C string */ sz = MultiByteToWideChar(CP_UTF8, 0, fileName, -1, NULL,0); - if(sz > MAX_PATH) FAIL(); + if(sz > MAX_PATH) + FAIL(); MultiByteToWideChar(CP_UTF8, 0, fileName, -1, win32Path, sz); win32Path[sz] = 0;
vm-dev@lists.squeakfoundation.org