Browse Source

* correct mapping of error codes for TP compatibility
+ implemented stack checking in ifdef dummy

carl 27 years ago
parent
commit
fac56c6baf
1 changed files with 135 additions and 20 deletions
  1. 135 20
      rtl/win32/syswin32.pp

+ 135 - 20
rtl/win32/syswin32.pp

@@ -85,6 +85,48 @@ implementation
 { some declarations for Win32 API calls }
 { some declarations for Win32 API calls }
 {$I win32.inc}
 {$I win32.inc}
 
 
+
+CONST
+  { These constants are used for conversion of error codes }
+  { from win32 i/o errors to tp i/o errors                 }
+  { errors 1 to 18 are the same as in Turbo Pascal         }
+  { DO NOT MODIFY UNLESS YOU KNOW EXACTLY WHAT YOU ARE DOING! }
+
+{  The media is write protected.                   }
+    ERROR_WRITE_PROTECT       =      19;
+{  The system cannot find the device specified.    }
+    ERROR_BAD_UNIT            =      20;
+{  The device is not ready.                        }
+    ERROR_NOT_READY           =      21;
+{  The device does not recognize the command.      }
+    ERROR_BAD_COMMAND         =      22;
+{  Data error (cyclic redundancy check)            }
+    ERROR_CRC                 =      23;
+{  The program issued a command but the            }
+{  command length is incorrect.                    }
+    ERROR_BAD_LENGTH           =     24;
+{  The drive cannot locate a specific              }
+{  area or track on the disk.                      }
+    ERROR_SEEK                 =     25;
+{  The specified disk or diskette cannot be accessed. }
+    ERROR_NOT_DOS_DISK         =     26;
+{  The drive cannot find the sector requested.     }
+    ERROR_SECTOR_NOT_FOUND      =    27;
+{  The printer is out of paper.                    }
+    ERROR_OUT_OF_PAPER          =    28;
+{  The system cannot write to the specified device. }
+    ERROR_WRITE_FAULT           =    29;
+{  The system cannot read from the specified device. }
+    ERROR_READ_FAULT            =    30;
+{  A device attached to the system is not functioning.}
+    ERROR_GEN_FAILURE           =    31;
+{  The process cannot access the file because         }
+{  it is being used by another process.               }
+    ERROR_SHARING_VIOLATION      =   32;
+
+var
+    errno : longint;
+
 type
 type
   plongint = ^longint;
   plongint = ^longint;
 
 
@@ -103,28 +145,48 @@ type
      external 'kernel32' name 'ExitProcess';
      external 'kernel32' name 'ExitProcess';
 
 
 
 
+   Procedure Errno2InOutRes;
+   Begin
+     { DO NOT MODIFY UNLESS YOU KNOW EXACTLY WHAT YOU ARE DOING }
+     if (errno >= ERROR_WRITE_PROTECT) and (errno <= ERROR_GEN_FAILURE) THEN
+       BEGIN
+          { This is the offset to the Win32 to add to directly map  }
+          { to the DOS/TP compatible error codes when in this range }
+          InOutRes := word(errno)+131;
+       END
+     else
+     { This case is special }
+     if errno=ERROR_SHARING_VIOLATION THEN
+       BEGIN
+         InOutRes :=5;
+       END
+     else
+     { other error codes can directly be mapped }
+         InOutRes := Word(errno);
+     errno:=0;
+   end;
+
+
 {$ifdef dummy}
 {$ifdef dummy}
 procedure int_stackcheck(stack_size:longint);[public,alias: 'STACKCHECK'];
 procedure int_stackcheck(stack_size:longint);[public,alias: 'STACKCHECK'];
 {
 {
   called when trying to get local stack if the compiler directive $S
   called when trying to get local stack if the compiler directive $S
   is set this function must preserve esi !!!! because esi is set by
   is set this function must preserve esi !!!! because esi is set by
   the calling proc for methods it must preserve all registers !!
   the calling proc for methods it must preserve all registers !!
+
+  With a 2048 byte safe area used to write to StdIo without crossing
+  the stack boundary
+
 }
 }
 begin
 begin
   asm
   asm
         pushl   %eax
         pushl   %eax
         pushl   %ebx
         pushl   %ebx
         movl    stack_size,%ebx
         movl    stack_size,%ebx
+        addl    $2048,%ebx
         movl    %esp,%eax
         movl    %esp,%eax
         subl    %ebx,%eax
         subl    %ebx,%eax
-{$ifdef SYSTEMDEBUG}
-        movl    U_SYSTEM_LOWESTSTACK,%ebx
-        cmpl    %eax,%ebx
-        jb      _is_not_lowest
-        movl    %eax,U_SYSTEM_LOWESTSTACK
-_is_not_lowest:
-{$endif SYSTEMDEBUG}
-        movl    __stkbottom,%ebx
+        movl    stacklimit,%ebx
         cmpl    %eax,%ebx
         cmpl    %eax,%ebx
         jae     __short_on_stack
         jae     __short_on_stack
         popl    %ebx
         popl    %ebx
@@ -267,7 +329,10 @@ procedure do_erase(p : pchar);
 begin
 begin
    AllowSlash(p);
    AllowSlash(p);
    if DeleteFile(p)=0 then
    if DeleteFile(p)=0 then
-      inoutres:=GetLastError;
+    Begin
+      errno:=GetLastError;
+      Errno2InoutRes;
+    end;
 end;
 end;
 
 
 
 
@@ -276,7 +341,10 @@ begin
   AllowSlash(p1);
   AllowSlash(p1);
   AllowSlash(p2);
   AllowSlash(p2);
   if MoveFile(p1,p2)=0 then
   if MoveFile(p1,p2)=0 then
-   inoutres:=GetLastError;
+   Begin
+      errno:=GetLastError;
+      Errno2InoutRes;
+   end;
 end;
 end;
 
 
 
 
@@ -285,7 +353,10 @@ var
    size:longint;
    size:longint;
 begin
 begin
    if writefile(h,pointer(addr),len,size,nil)=0 then
    if writefile(h,pointer(addr),len,size,nil)=0 then
-     inoutres:=GetLastError;
+    Begin
+      errno:=GetLastError;
+      Errno2InoutRes;
+    end;
    do_write:=size;
    do_write:=size;
 end;
 end;
 
 
@@ -295,7 +366,10 @@ var
   result:longint;
   result:longint;
 begin
 begin
   if readfile(h,pointer(addr),len,result,nil)=0 then
   if readfile(h,pointer(addr),len,result,nil)=0 then
-   inoutres:=GetLastError;
+    Begin
+      errno:=GetLastError;
+      Errno2InoutRes;
+    end;
   do_read:=result;
   do_read:=result;
 end;
 end;
 
 
@@ -308,7 +382,8 @@ begin
   if l=-1 then
   if l=-1 then
    begin
    begin
     l:=0;
     l:=0;
-    inoutres:=GetLastError;
+    errno:=GetLastError;
+    Errno2InoutRes;
    end;
    end;
   do_filepos:=l;
   do_filepos:=l;
 end;
 end;
@@ -317,7 +392,10 @@ end;
 procedure do_seek(handle,pos : longint);
 procedure do_seek(handle,pos : longint);
 begin
 begin
   if SetFilePointer(handle,pos,nil,FILE_BEGIN)=-1 then
   if SetFilePointer(handle,pos,nil,FILE_BEGIN)=-1 then
-   inoutres:=GetLastError;
+   Begin
+    errno:=GetLastError;
+    Errno2InoutRes;
+   end;
 end;
 end;
 
 
 
 
@@ -326,8 +404,8 @@ begin
   do_seekend:=SetFilePointer(handle,0,nil,FILE_END);
   do_seekend:=SetFilePointer(handle,0,nil,FILE_END);
   if do_seekend=-1 then
   if do_seekend=-1 then
     begin
     begin
-       inoutres:=GetLastError;
-       do_seekend:=0;
+      errno:=GetLastError;
+      Errno2InoutRes;
     end;
     end;
 end;
 end;
 
 
@@ -346,7 +424,10 @@ procedure do_truncate (handle,pos:longint);
 begin
 begin
    do_seek(handle,pos);
    do_seek(handle,pos);
    if not(SetEndOfFile(handle)) then
    if not(SetEndOfFile(handle)) then
-     inoutres:=GetLastError;
+    begin
+      errno:=GetLastError;
+      Errno2InoutRes;
+    end;
 end;
 end;
 
 
 
 
@@ -426,7 +507,10 @@ begin
    end;
    end;
 { get errors }
 { get errors }
   if filerec(f).handle=0 then
   if filerec(f).handle=0 then
-   inoutres:=GetLastError;
+    begin
+      errno:=GetLastError;
+      Errno2InoutRes;
+    end;
 end;
 end;
 
 
 
 
@@ -481,7 +565,10 @@ begin
   buffer[length(s)]:=#0;
   buffer[length(s)]:=#0;
   AllowSlash(pchar(@buffer));
   AllowSlash(pchar(@buffer));
   if aFunc(@buffer)=0 then
   if aFunc(@buffer)=0 then
-   inoutres:=GetLastError;
+    begin
+      errno:=GetLastError;
+      Errno2InoutRes;
+    end;
 end;
 end;
 
 
 function CreateDirectoryTrunc(name:pointer):word;
 function CreateDirectoryTrunc(name:pointer):word;
@@ -620,9 +707,29 @@ begin
    { that's all folks }
    { that's all folks }
    ExitProcess(0);
    ExitProcess(0);
 end;
 end;
+
+{$ifdef dummy}
+Function SetUpStack : longint;
+{ This routine does the following :                            }
+{  returns the value of the initial SP - __stklen              }
+begin
+  asm
+    pushl %ebx
+    pushl %eax
+    movl  __stklen,%ebx
+    movl  %esp,%eax
+    subl  %ebx,%eax
+    movl  %eax,__RESULT
+    popl  %eax
+    popl  %ebx
+  end;
+end;
+{$endif}
 {$ASMMODE ATT}
 {$ASMMODE ATT}
 
 
 
 
+
+
 begin
 begin
 { get some helpful informations }
 { get some helpful informations }
   GetStartupInfo(@startupinfo);
   GetStartupInfo(@startupinfo);
@@ -632,6 +739,8 @@ begin
   cmdshow:=startupinfo.wshowwindow;
   cmdshow:=startupinfo.wshowwindow;
 { to test stack depth }
 { to test stack depth }
   loweststack:=maxlongint;
   loweststack:=maxlongint;
+{ real test stack depth        }
+{   stacklimit := setupstack;  }
 { Setup heap }
 { Setup heap }
 {$ifndef WinHeap}
 {$ifndef WinHeap}
   InitHeap;
   InitHeap;
@@ -647,11 +756,17 @@ begin
   setup_arguments;
   setup_arguments;
 { Reset IO Error }
 { Reset IO Error }
   InOutRes:=0;
   InOutRes:=0;
+{ Reset internal error variable }
+  errno := 0;
 end.
 end.
 
 
 {
 {
   $Log$
   $Log$
-  Revision 1.11  1998-07-02 12:33:18  carl
+  Revision 1.12  1998-07-07 12:37:28  carl
+    * correct mapping of error codes for TP compatibility
+    + implemented stack checking in ifdef dummy
+
+  Revision 1.11  1998/07/02 12:33:18  carl
     * IOCheck/InOutRes check for mkdir,rmdir and chdir like in TP
     * IOCheck/InOutRes check for mkdir,rmdir and chdir like in TP
 
 
   Revision 1.10  1998/07/01 15:30:02  peter
   Revision 1.10  1998/07/01 15:30:02  peter