mirror of
				https://gitlab.com/freepascal.org/fpc/source.git
				synced 2025-10-31 17:31:42 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			147 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			147 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| {
 | |
|     This file is part of the Free Pascal run time library.
 | |
|     Copyright (c) 1999-2000 by Florian Klaempfl and Pavel Ozerski
 | |
|     member of the Free Pascal development team.
 | |
| 
 | |
|     FPC Pascal system unit for the Win32 API.
 | |
| 
 | |
|     See the file COPYING.FPC, included in this distribution,
 | |
|     for details about the copyright.
 | |
| 
 | |
|     This program is distributed in the hope that it will be useful,
 | |
|     but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
|     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 | |
| 
 | |
|  **********************************************************************}
 | |
| 
 | |
| {*****************************************************************************
 | |
|                            Directory Handling
 | |
| *****************************************************************************}
 | |
| 
 | |
| procedure DosDir(func:byte;const s:string);
 | |
| var
 | |
|   buffer : array[0..255] of char;
 | |
|   regs   : trealregs;
 | |
| begin
 | |
|   move(s[1],buffer,length(s));
 | |
|   buffer[length(s)]:=#0;
 | |
|   AllowSlash(pchar(@buffer));
 | |
|   { True DOS does not like backslashes at end
 | |
|     Win95 DOS accepts this !!
 | |
|     but "\" and "c:\" should still be kept and accepted hopefully PM }
 | |
|   if (length(s)>0) and (buffer[length(s)-1]='\') and
 | |
|      Not ((length(s)=1) or ((length(s)=3) and (s[2]=':'))) then
 | |
|     buffer[length(s)-1]:=#0;
 | |
|   syscopytodos(longint(@buffer),length(s)+1);
 | |
|   regs.realedx:=tb_offset;
 | |
|   regs.realds:=tb_segment;
 | |
|   if LFNSupport then
 | |
|    regs.realeax:=$7100+func
 | |
|   else
 | |
|    regs.realeax:=func shl 8;
 | |
|   sysrealintr($21,regs);
 | |
|   if (regs.realflags and carryflag) <> 0 then
 | |
|    GetInOutRes(lo(regs.realeax));
 | |
| end;
 | |
| 
 | |
| 
 | |
| procedure mkdir(const s : string);[IOCheck];
 | |
| begin
 | |
|   If (s='') or (InOutRes <> 0) then
 | |
|    exit;
 | |
|   DosDir($39,s);
 | |
| end;
 | |
| 
 | |
| 
 | |
| procedure rmdir(const s : string);[IOCheck];
 | |
| begin
 | |
|   if (s = '.' ) then
 | |
|     InOutRes := 16;
 | |
|   If (s='') or (InOutRes <> 0) then
 | |
|    exit;
 | |
|   DosDir($3a,s);
 | |
| end;
 | |
| 
 | |
| 
 | |
| procedure chdir(const s : string);[IOCheck];
 | |
| var
 | |
|   regs : trealregs;
 | |
| begin
 | |
|   If (s='') or (InOutRes <> 0) then
 | |
|    exit;
 | |
| { First handle Drive changes }
 | |
|   if (length(s)>=2) and (s[2]=':') then
 | |
|    begin
 | |
|      regs.realedx:=(ord(s[1]) and (not 32))-ord('A');
 | |
|      regs.realeax:=$0e00;
 | |
|      sysrealintr($21,regs);
 | |
|      regs.realeax:=$1900;
 | |
|      sysrealintr($21,regs);
 | |
|      if byte(regs.realeax)<>byte(regs.realedx) then
 | |
|       begin
 | |
|         Inoutres:=15;
 | |
|         exit;
 | |
|       end;
 | |
|      { DosDir($3b,'c:') give Path not found error on
 | |
|        pure DOS PM }
 | |
|      if length(s)=2 then
 | |
|        exit;
 | |
|    end;
 | |
| { do the normal dos chdir }
 | |
|   DosDir($3b,s);
 | |
| end;
 | |
| 
 | |
| 
 | |
| procedure GetDir (DriveNr: byte; var Dir: ShortString);
 | |
| var
 | |
|   temp : array[0..255] of char;
 | |
|   i    : longint;
 | |
|   regs : trealregs;
 | |
| begin
 | |
|   regs.realedx:=drivenr;
 | |
|   regs.realesi:=tb_offset;
 | |
|   regs.realds:=tb_segment;
 | |
|   if LFNSupport then
 | |
|    regs.realeax:=$7147
 | |
|   else
 | |
|    regs.realeax:=$4700;
 | |
|   sysrealintr($21,regs);
 | |
|   if (regs.realflags and carryflag) <> 0 then
 | |
|    Begin
 | |
|      GetInOutRes (lo(regs.realeax));
 | |
|      Dir := char (DriveNr + 64) + ':\';
 | |
|      exit;
 | |
|    end
 | |
|   else
 | |
|    syscopyfromdos(longint(@temp),251);
 | |
| { conversion to Pascal string including slash conversion }
 | |
|   i:=0;
 | |
|   while (temp[i]<>#0) do
 | |
|    begin
 | |
|      if temp[i]='/' then
 | |
|       temp[i]:='\';
 | |
|      dir[i+4]:=temp[i];
 | |
|      inc(i);
 | |
|    end;
 | |
|   dir[2]:=':';
 | |
|   dir[3]:='\';
 | |
|   dir[0]:=char(i+3);
 | |
| { upcase the string }
 | |
|   if not FileNameCaseSensitive then
 | |
|    dir:=upcase(dir);
 | |
|   if drivenr<>0 then   { Drive was supplied. We know it }
 | |
|    dir[1]:=char(65+drivenr-1)
 | |
|   else
 | |
|    begin
 | |
|    { We need to get the current drive from DOS function 19H  }
 | |
|    { because the drive was the default, which can be unknown }
 | |
|      regs.realeax:=$1900;
 | |
|      sysrealintr($21,regs);
 | |
|      i:= (regs.realeax and $ff) + ord('A');
 | |
|      dir[1]:=chr(i);
 | |
|    end;
 | |
| end;
 | |
| 
 | |
| 
 | |
| 
 | 
