mirror of
				https://gitlab.com/freepascal.org/fpc/source.git
				synced 2025-10-31 23:49:28 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			1014 lines
		
	
	
		
			31 KiB
		
	
	
	
		
			TeX
		
	
	
	
	
	
			
		
		
	
	
			1014 lines
		
	
	
		
			31 KiB
		
	
	
	
		
			TeX
		
	
	
	
	
	
| %
 | |
| %   $Id$
 | |
| %   This file is part of the FPC documentation.
 | |
| %   Copyright (C) 1997, by Michael Van Canneyt
 | |
| %
 | |
| %   The FPC documentation is free text; you can redistribute it and/or
 | |
| %   modify it under the terms of the GNU Library General Public License as
 | |
| %   published by the Free Software Foundation; either version 2 of the
 | |
| %   License, or (at your option) any later version.
 | |
| %
 | |
| %   The FPC Documentation 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.  See the GNU
 | |
| %   Library General Public License for more details.
 | |
| %
 | |
| %   You should have received a copy of the GNU Library General Public
 | |
| %   License along with the FPC documentation; see the file COPYING.LIB.  If not,
 | |
| %   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 | |
| %   Boston, MA 02111-1307, USA. 
 | |
| %
 | |
| \chapter{The DOS unit.}
 | |
| \FPCexampledir{dosex}
 | |
| 
 | |
| This chapter describes the \var{DOS} unit for Free pascal. The \var{DOS}
 | |
| unit gives access to some operating system calls related to files, the
 | |
| file system, date and time. Except for the \palmos target, this unit is
 | |
| available to all supported platforms.
 | |
| 
 | |
| The unit was first written for \dos by Florian kl\"ampfl. It was ported to 
 | |
| \linux by Mark May\footnote{Current e-mail address \textsf{mmay@dnaco.net}}, 
 | |
| and enhanced by Micha\"el Van Canneyt. The \amiga version was ported by
 | |
| Nils Sjoholm.
 | |
| 
 | |
| Under non-\dos systems, some of the functionality is lost, as it is either impossible 
 | |
| or meaningless to implement it. Other than that, the functionality for all 
 | |
| operating systems is the same.
 | |
| 
 | |
| This chapter is divided in three sections:
 | |
| \begin{itemize}
 | |
| \item The first section lists the pre-defined constants, types and variables. 
 | |
| \item The second section gives an overview of all functions available,
 | |
| grouped by category.
 | |
| \item The third section describes the functions which appear in the
 | |
| interface part of the DOS unit.
 | |
| \end{itemize}
 | |
| 
 | |
| \section{Types, Variables, Constants}
 | |
| 
 | |
| 
 | |
| \subsection {Constants}
 | |
| The DOS unit implements the following constants:
 | |
| 
 | |
| \subsubsection{File attributes}
 | |
| 
 | |
| The File Attribute constants are used in \seep{FindFirst}, \seep{FindNext} to
 | |
| determine what type of special file to search for in addition to normal files. 
 | |
| These flags are also used in the \seep{SetFAttr} and \seep{GetFAttr} routines to 
 | |
| set and retrieve attributes of files. For their definitions consult 
 | |
| \seet{fileattributes}.
 | |
| 
 | |
| \begin{FPCltable}{lll}{Possible file attributes}{fileattributes}
 | |
| \hline
 | |
| Constant & Description & Value\\ \hline
 | |
| \var{readonly} & Read only file & \$01\\
 | |
| \var{hidden} & Hidden file & \$02 \\
 | |
| \var{sysfile} & System file & \$04\\
 | |
| \var{volumeid} & Volume label & \$08\\
 | |
| \var{directory} & Directory & \$10\\
 | |
| \var{archive} & Archive & \$20\\ 
 | |
| \var{anyfile} & Any of the above special files & \$3F\\
 | |
| \hline
 | |
| \end{FPCltable}
 | |
| 
 | |
| \subsubsection{fmXXXX}
 | |
| 
 | |
| These constants are used in the \var{Mode} field of the \var{TextRec}
 | |
| record. Gives information on the filemode of the text I/O. For their
 | |
| definitions consult \seet{fmxxxconstants}.
 | |
| 
 | |
| \begin{FPCltable}{lll}{Possible mode constants}{fmxxxconstants}
 | |
| \hline
 | |
| Constant & Description & Value\\ \hline
 | |
| \var{fmclosed} & File is closed & \$D7B0\\
 | |
| \var{fminput} & File is read only & \$D7B1 \\
 | |
| \var{fmoutput} & File is write only & \$D7B2\\
 | |
| \var{fminout} & File is read and write & \$D7B3\\
 | |
| \hline
 | |
| \end{FPCltable}
 | |
| 
 | |
| \subsubsection{Other}
 | |
| 
 | |
| The following constants are not portable, and should not be used. They
 | |
| are present for compatibility only.
 | |
| 
 | |
| \begin{verbatim}
 | |
|   {Bitmasks for CPU Flags}
 | |
|   fcarry =     $0001;
 | |
|   fparity =    $0004;
 | |
|   fauxiliary = $0010;
 | |
|   fzero =      $0040;
 | |
|   fsign =      $0080;
 | |
|   foverflow  = $0800;
 | |
| \end{verbatim}  
 | |
|   
 | |
| \subsection{Types}
 | |
| The following string types are defined for easy handling of
 | |
| filenames :
 | |
| \begin{verbatim}
 | |
|   ComStr  = String[255];   { For command-lines } 
 | |
|   PathStr = String[255];   { For full path for file names }
 | |
|   DirStr  = String[255];   { For Directory and (DOS) drive string }
 | |
|   NameStr = String[255];   { For Name of file }
 | |
|   ExtStr  = String[255];   { For Extension of file }
 | |
| \end{verbatim}
 | |
| \begin{verbatim}
 | |
|   SearchRec = Packed Record
 | |
|     Fill : array[1..21] of byte;  
 | |
|     { Fill replaced with declarations below, for Linux}
 | |
|     Attr : Byte; {attribute of found file}
 | |
|     Time : LongInt; {last modify date of found file}
 | |
|     Size : LongInt; {file size of found file}
 | |
|     Reserved : Word; {future use}
 | |
|     Name : String[255]; {name of found file}
 | |
|     SearchSpec: String[255]; {search pattern}
 | |
|     NamePos: Word; {end of path, start of name position}
 | |
|     End;
 | |
| \end{verbatim}
 | |
| Under \linux, the \var{Fill} array is replaced with the following:
 | |
| \begin{verbatim}
 | |
|     SearchNum: LongInt; {to track which search this is}
 | |
|     SearchPos: LongInt; {directory position}
 | |
|     DirPtr: LongInt; {directory pointer for reading directory}
 | |
|     SearchType: Byte;  {0=normal, 1=open will close}
 | |
|     SearchAttr: Byte; {attribute we are searching for}
 | |
|     Fill: Array[1..07] of Byte; {future use}
 | |
| \end{verbatim}
 | |
| This is because the searching meachanism on Unix systems is substantially
 | |
| different from \dos's, and the calls have to be mimicked.
 | |
| \begin{verbatim}
 | |
| const
 | |
|   filerecnamelength = 255;
 | |
| type
 | |
|   FileRec = Packed Record
 | |
|     Handle,
 | |
|     Mode,  
 | |
|     RecSize   : longint;
 | |
|     _private  : array[1..32] of byte;
 | |
|     UserData  : array[1..16] of byte;
 | |
|     name      : array[0..filerecnamelength] of char;
 | |
|   End;
 | |
| \end{verbatim}
 | |
| \var{FileRec} is used for internal representation of typed and untyped files.
 | |
| Text files are handled by the following types :
 | |
| \begin{verbatim}
 | |
| const
 | |
|   TextRecNameLength = 256;
 | |
|   TextRecBufSize    = 256;
 | |
| type
 | |
|   TextBuf = array[0..TextRecBufSize-1] of char;
 | |
|   TextRec = Packed Record
 | |
|     Handle,
 | |
|     Mode,  
 | |
|     bufsize,
 | |
|     _private,
 | |
|     bufpos,  
 | |
|     bufend    : longint;
 | |
|     bufptr    : ^textbuf;
 | |
|     openfunc,
 | |
|     inoutfunc,
 | |
|     flushfunc,
 | |
|     closefunc : pointer;
 | |
|     UserData  : array[1..16] of byte;
 | |
|     name      : array[0..textrecnamelength-1] of char;
 | |
|     buffer    : textbuf;
 | |
|   End;
 | |
| \end{verbatim}
 | |
| Remark that this is not binary compatible with the Turbo Pascal definition
 | |
| of \var{TextRec}, since the sizes of the different fields are different.
 | |
| \begin{verbatim}
 | |
|     Registers = record
 | |
|       case i : integer of
 | |
|         0 : (ax,f1,bx,f2,cx,f3,dx,f4,bp,f5,si,
 | |
|              f51,di,f6,ds,f7,es,f8,flags,fs,gs : word);
 | |
|         1 : (al,ah,f9,f10,bl,bh,f11,f12,
 | |
|              cl,ch,f13,f14,dl,dh : byte);
 | |
|         2 : (eax,  ebx,  ecx,  edx,  ebp,  esi,  edi : longint);
 | |
|         End;
 | |
| \end{verbatim}
 | |
| The  \var{registers} type is used in the \var{MSDos} call.
 | |
| \begin{verbatim}
 | |
|   DateTime = record
 | |
|     Year: Word;
 | |
|     Month: Word;
 | |
|     Day: Word;
 | |
|     Hour: Word;
 | |
|     Min: Word;
 | |
|     Sec: word;
 | |
|     End;
 | |
| \end{verbatim}
 | |
| The \var{DateTime} type is used in \seep{PackTime} and \seep{UnPackTime} for
 | |
| setting/reading file times with \seep{GetFTime} and \seep{SetFTime}.
 | |
| \subsection{Variables}
 | |
| \begin{verbatim}
 | |
|     DosError : integer;
 | |
| \end{verbatim}
 | |
| The \var{DosError} variable is used by the procedures in the \dos unit to 
 | |
| report errors. It can have the following values :
 | |
| \begin{center}
 | |
| \begin{tabular}{cl}
 | |
| 2 & File not found. \\
 | |
| 3 & path not found. \\
 | |
| 5 & Access denied. \\
 | |
| 6 & Invalid handle. \\
 | |
| 8 & Not enough memory. \\
 | |
| 10 & Invalid environment. \\
 | |
| 11 & Invalid format. \\
 | |
| 18 & No more files.
 | |
| \end{tabular}
 | |
| \end{center}
 | |
| Other values are possible, but are not documented.
 | |
| %\begin{verbatim}
 | |
| %    drivestr : array [0..26] of pchar;
 | |
| %\end{verbatim}
 | |
| %This variable is defined in the \linux version of the \dos unit. It is used
 | |
| %in the \seef{DiskFree} and \seef{DiskSize} calls.
 | |
| 
 | |
| %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | |
| % Functions and procedures by category
 | |
| \section{Function list by category}
 | |
| What follows is a listing of the available functions, grouped by category.
 | |
| For each function there is a reference to the page where you can find the
 | |
| function.
 | |
| 
 | |
| \subsection{File handling}
 | |
| Routines to handle files on disk.
 | |
| \begin{funclist}
 | |
| \funcrefl{FExpand}{Dos:FExpand}{Expand filename to full path}
 | |
| \procref{FindClose}{Close finfirst/findnext session}
 | |
| \procref{FindFirst}{Start find of file}
 | |
| \procref{FindNext}{Find next file}
 | |
| \funcrefl{FSearch}{Dos:FSearch}{Search for file in a path}
 | |
| \procref{FSplit}{Split filename in parts}
 | |
| \procref{GetFAttr}{Return file attributes}
 | |
| \procref{GetFTime}{Return file time}
 | |
| \funcref{GetLongName}{Convert short filename to long filename (DOS only)}
 | |
| \funcref{GetShortName}{Convert long filename to short filename (DOS only)}
 | |
| \procref{SetFAttr}{Set file attributes}
 | |
| \procref{SetFTime}{Set file time}
 | |
| \end{funclist}
 | |
| 
 | |
| \subsection{Directory and disk handling}
 | |
| Routines to handle disk information.
 | |
| \begin{funclist}
 | |
| \procref{AddDisk}{Add disk to list of disks (UNIX only)}
 | |
| \funcref{DiskFree}{Return size of free disk space}
 | |
| \funcref{DiskSize}{Return total disk size}
 | |
| \end{funclist}
 | |
| 
 | |
| \subsection{Process handling}
 | |
| Functions to handle process information and starting new processes.
 | |
| \begin{funclist}
 | |
| \funcref{DosExitCode}{Exit code of last executed program}
 | |
| \funcref{EnvCount}{Return number of environment variables}
 | |
| \funcref{EnvStr}{Return environment string pair}
 | |
| \procref{Exec}{Execute program}
 | |
| \funcrefl{GetEnv}{Dos:GetEnv}{Return specified environment string}
 | |
| \end{funclist}
 | |
| 
 | |
| \subsection{System information}
 | |
| Functions for retrieving and setting general system information such as date
 | |
| and time.
 | |
| \begin{funclist}
 | |
| \funcref{DosVersion}{Get OS version}
 | |
| \procref{GetCBreak}{Get setting of control-break handling flag}
 | |
| \procrefl{GetDate}{Dos:GetDate}{Get system date}
 | |
| \procref{GetIntVec}{Get interrupt vector status}
 | |
| \procrefl{GetTime}{Dos:GetTime}{Get system time}
 | |
| \procref{GetVerify}{Get verify flag}
 | |
| \procref{Intr}{Execute an interrupt}
 | |
| \procref{Keep}{Keep process in memory and exit}
 | |
| \procref{MSDos}{Execute MS-dos function call}
 | |
| \procref{PackTime}{Pack time for file time}
 | |
| \procref{SetCBreak}{Set control-break handling flag}
 | |
| \procref{SetDate}{Set system date}
 | |
| \procref{SetIntVec}{Set interrupt vectors}
 | |
| \procref{SetTime}{Set system time}
 | |
| \procref{SetVerify}{Set verify flag}
 | |
| \procref{SwapVectors}{Swap interrupt vectors}
 | |
| \procref{UnPackTime}{Unpack file time}
 | |
| \end{funclist}
 | |
| 
 | |
| %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | |
| % Functions and procedures
 | |
| \section{Functions and Procedures}
 | |
| \begin{procedure}{AddDisk}
 | |
| \Declaration
 | |
| Procedure AddDisk (Const S : String);
 | |
| \Description
 | |
| \var{AddDisk} adds a filename \var{S} to the internal list of disks. It is
 | |
| implemented for systems which do not use DOS type drive letters.
 | |
|  This list is used to determine which disks to use in the \seef{DiskFree}
 | |
| and \seef{DiskSize} calls. 
 | |
| The \seef{DiskFree} and \seef{DiskSize} functions need a file on the 
 | |
| specified drive, since this is required for the \var{statfs} system call.
 | |
| The names are added sequentially. The dos
 | |
| initialization code presets the first three disks to:
 | |
| \begin{itemize}
 | |
| \item \var{'.'} for the current drive, 
 | |
| \item \var{'/fd0/.'} for the first floppy-drive (linux only).
 | |
| \item \var{'/fd1/.'} for the second floppy-drive (linux only).
 | |
| \item \var{'/'} for the first hard disk.
 | |
| \end{itemize}
 | |
| The first call to \var{AddDisk} will therefore add a name for the second
 | |
| harddisk, The second call for the third drive, and so on until 23 drives
 | |
| have been added (corresponding to drives \var{'D:'} to \var{'Z:'})
 | |
| \Errors
 | |
| None
 | |
| \SeeAlso
 | |
| \seef{DiskFree}, \seef{DiskSize} 
 | |
| \end{procedure}
 | |
| 
 | |
| 
 | |
| \begin{function}{DiskFree}
 | |
| \Declaration
 | |
| Function DiskFree (Drive: byte) : int64;
 | |
| \Description
 | |
| 
 | |
| \var{DiskFree} returns the number of free bytes on a disk. The parameter
 | |
| \var{Drive} indicates which disk should be checked. This parameter is 1 for
 | |
| floppy \var{a:}, 2 for floppy \var{b:}, etc. A value of 0 returns the free
 | |
| space on the current drive. 
 | |
| 
 | |
| \textbf{For \unix only:}\\
 | |
| The \var{diskfree} and \var{disksize} functions need a file on the 
 | |
| specified drive, since this is required for the \var{statfs} system call.
 | |
| These filenames are set in the initialization of the dos unit, and have 
 | |
| been preset to :
 | |
| \begin{itemize}
 | |
| \item \var{'.'} for the current drive, 
 | |
| \item \var{'/fd0/.'} for the first floppy-drive (linux only).
 | |
| \item \var{'/fd1/.'} for the second floppy-drive (linux only).
 | |
| \item \var{'/'} for the first hard disk.
 | |
| \end{itemize}
 | |
| There is room for 1-26 drives. You can add a drive with the
 | |
| \seep{AddDisk} procedure.
 | |
| These settings can be coded in \var{dos.pp}, in the initialization part.
 | |
| 
 | |
| \Errors
 | |
| -1 when a failure occurs, or an invalid drive number is given.
 | |
| \SeeAlso
 | |
| \seef{DiskSize}, \seep{AddDisk}
 | |
| \end{function}
 | |
| 
 | |
| \FPCexample{ex6}
 | |
| 
 | |
| \begin{function}{DiskSize}
 | |
| \Declaration
 | |
| Function DiskSize (Drive: byte) : int64;
 | |
| \Description
 | |
| 
 | |
| \var{DiskSize} returns the total size (in bytes) of a disk. The parameter
 | |
| \var{Drive} indicates which disk should be checked. This parameter is 1 for
 | |
| floppy \var{a:}, 2 for floppy \var{b:}, etc. A value of 0 returns the size
 | |
| of the current drive. 
 | |
| 
 | |
| \textbf{For \unix only:}\\
 | |
| The \var{diskfree} and \var{disksize} functions need a file on the specified drive, since this
 | |
| is required for the \var{statfs} system call.
 | |
|   These filenames are set in the initialization of the dos unit, and have 
 | |
| been preset to :
 | |
| \begin{itemize}
 | |
| \item \var{'.'} for the current drive, 
 | |
| \item \var{'/fd0/.'} for the first floppy-drive (linux only).
 | |
| \item \var{'/fd1/.'} for the second floppy-drive (linux only).
 | |
| \item \var{'/'} for the first hard disk.
 | |
| \end{itemize}
 | |
| There is room for 1-26 drives. You can add a drive with the
 | |
| \seep{AddDisk} procedure.
 | |
| These settings can be coded in \var{dos.pp}, in the initialization part.
 | |
| 
 | |
| \Errors
 | |
| -1 when a failure occurs, or an invalid drive number is given.
 | |
| \SeeAlso
 | |
| \seef{DiskFree}, \seep{AddDisk}
 | |
| \end{function}
 | |
| For an example, see \seef{DiskFree}.
 | |
| \begin{function}{DosExitCode}
 | |
| \Declaration
 | |
| Function DosExitCode  : Word;
 | |
| \Description
 | |
| 
 | |
| \var{DosExitCode} contains (in the low byte) the exit-code of a program 
 | |
| executed with the \var{Exec} call.
 | |
| \Errors
 | |
| None.
 | |
| \SeeAlso
 | |
| \seep{Exec}
 | |
| \end{function}
 | |
| 
 | |
| \FPCexample{ex5}
 | |
| 
 | |
| \begin{function}{DosVersion}
 | |
| \Declaration
 | |
| Function DosVersion  : Word;
 | |
| \Description
 | |
| \var{DosVersion} returns the operating system or kernel version. The
 | |
| low byte contains the major version number, while the high byte 
 | |
| contains the minor version number.
 | |
| \Portability
 | |
| On systems where versions consists of more then two numbers, 
 | |
| only the first two numbers will be returned. For example Linux version 2.1.76 
 | |
| will give you DosVersion 2.1. Some operating systems, such as \freebsd, do not
 | |
| have system calls to return the kernel version, in that case a value of 0 will
 | |
| be returned.
 | |
| \Errors
 | |
| None.
 | |
| \SeeAlso
 | |
| 
 | |
| \end{function}
 | |
| 
 | |
| 
 | |
| \FPCexample{ex1}
 | |
| 
 | |
| 
 | |
| \begin{function}{EnvCount}
 | |
| \Declaration
 | |
| Function EnvCount  : longint;\Description
 | |
| \var{EnvCount} returns the number of environment variables.
 | |
| \Errors
 | |
| None.
 | |
| \SeeAlso
 | |
| \seef{EnvStr}, \seef{Dos:GetEnv}
 | |
| \end{function}
 | |
| 
 | |
| \begin{function}{EnvStr}
 | |
| \Declaration
 | |
| Function EnvStr (Index: integer) : string;\Description
 | |
| 
 | |
| \var{EnvStr} returns the \var{Index}-th \var{Name=Value} pair from the list
 | |
| of environment variables. 
 | |
| The index of the first pair is zero.
 | |
| \Errors
 | |
| The length is limited to 255 characters. 
 | |
| \SeeAlso
 | |
| \seef{EnvCount}, \seef{Dos:GetEnv}
 | |
| \end{function}
 | |
| 
 | |
| \FPCexample{ex13}
 | |
| 
 | |
| \begin{procedure}{Exec}
 | |
| \Declaration
 | |
| Procedure Exec (const Path: pathstr; const ComLine: comstr);
 | |
| \Description
 | |
| 
 | |
| \var{Exec} executes the program in \var{Path}, with the options given by
 | |
| \var{ComLine}.
 | |
| After the program has terminated, the procedure returns. The Exit value of
 | |
| the program can be consulted with the \var{DosExitCode} function.
 | |
| 
 | |
| \Errors
 | |
| Errors are reported in \var{DosError}.
 | |
| \SeeAlso
 | |
| \seef{DosExitCode}
 | |
| \end{procedure}
 | |
| For an example, see \seef{DosExitCode}
 | |
| \begin{functionl}{FExpand}{Dos:FExpand}
 | |
| \Declaration
 | |
| Function FExpand (const path: pathstr) : pathstr;
 | |
| \Description
 | |
| 
 | |
| \var{FExpand} takes its argument and expands it to a complete filename, i.e.
 | |
| a filename starting from the root directory of the current drive, prepended
 | |
| with the drive-letter or volume name (when supported).
 | |
| \Portability
 | |
| On case sensitive file systems (such as \unix and \linux), the resulting
 | |
| name is left as it is, otherwise it is converted to uppercase.
 | |
| \Errors
 | |
| \seep{FSplit}
 | |
| \SeeAlso
 | |
| \lstinputlisting{dosex/ex5.pp}
 | |
| \end{functionl}
 | |
| 
 | |
| \begin{procedure}{FindClose}
 | |
| \Declaration
 | |
| Procedure FindClose (Var F: SearchRec);
 | |
| \Description
 | |
| \var{FindClose} frees any resources associated with the search record
 | |
| \var{F}.
 | |
| 
 | |
| This call is needed to free any internal resources allocated by the 
 | |
| \seef{FindFirst} or \seef{FindNext} calls.
 | |
| 
 | |
| 
 | |
| The \linux implementation of the \dos unit therefore keeps a table of open
 | |
| directories, and when the table is full, closes one of the directories, and
 | |
| reopens another. This system is adequate but slow if you use a lot of
 | |
| \var{searchrecs}.
 | |
| So, to speed up the findfirst/findnext system, the \var{FindClose} call was
 | |
| implemented. When you don't need a \var{searchrec} any more, you can tell
 | |
| this to the \dos unit by issuing a \var{FindClose} call. The directory
 | |
| which is kept open for this \var{searchrec} is then closed, and the table slot
 | |
| freed.
 | |
| 
 | |
| \Portability
 | |
| It is recommended to use the \linux call \var{Glob} when looking for files 
 | |
| on \linux.
 | |
| 
 | |
| \Errors
 | |
| Errors are reported in DosError.
 | |
| \SeeAlso
 | |
| \seef{Glob}.
 | |
| \end{procedure}
 | |
| 
 | |
| \begin{procedure}{FindFirst}
 | |
| \Declaration
 | |
| Procedure FindFirst (const Path: pathstr; Attr: word; var F: SearchRec);
 | |
| \Description
 | |
| 
 | |
| \var{FindFirst} searches the file specified in \var{Path}. Normal files,
 | |
| as well as all special files which have the attributes specified in
 | |
| \var{Attr} will be returned.
 | |
| 
 | |
| It returns a \var{SearchRec} record for further searching in \var{F}.
 | |
| \var{Path} can contain the wildcard characters \var{?} (matches any single
 | |
| character) and \var{*} (matches 0 ore more arbitrary characters). In this
 | |
| case \var{FindFirst} will return the first file which matches the specified
 | |
| criteria.
 | |
| If \var{DosError} is different from zero, no file(s) matching the criteria 
 | |
| was(were) found.
 | |
| 
 | |
| \Portability
 | |
| On \ostwo, you cannot issue two different \var{FindFirst} calls. That is,
 | |
| you must close any previous search operation with \seep{FindClose} before
 | |
| starting a new one. Failure to do so will end in a Run-Time Error 6 
 | |
| (Invalid file handle)
 | |
| 
 | |
| \Errors
 | |
| Errors are reported in DosError.
 | |
| \SeeAlso
 | |
| \seep{FindNext},
 | |
| \seep{FindClose}
 | |
| \end{procedure}
 | |
| 
 | |
| \FPCexample{ex7}
 | |
| 
 | |
| \begin{procedure}{FindNext}
 | |
| \Declaration
 | |
| Procedure FindNext (var f: searchRec);
 | |
| \Description
 | |
| 
 | |
| \var{FindNext} takes as an argument a \var{SearchRec} from a previous
 | |
| \var{FindNext} call, or a \var{FindFirst} call, and tries to find another
 | |
| file which matches the criteria, specified in the \var{FindFirst} call.
 | |
| If \var{DosError} is different from zero, no more files matching the
 | |
| criteria were found.
 | |
| \Errors
 | |
| \var{DosError} is used to report errors.
 | |
| \SeeAlso
 | |
| \seep{FindFirst}, \seep{FindClose}
 | |
| \end{procedure}
 | |
| For an example, see \seep{FindFirst}.
 | |
| \begin{functionl}{FSearch}{Dos:FSearch}
 | |
| \Declaration
 | |
| Function FSearch (Path: pathstr; DirList: string) : pathstr;
 | |
| \Description
 | |
| \var{FSearch} searches the file \var{Path} in all directories listed in
 | |
| \var{DirList}. The full name of the found file is returned.
 | |
| \var{DirList} must be a list of directories, separated by semi-colons.
 | |
| When no file is found, an empty string is returned.
 | |
| \Portability
 | |
| On \unix systems, \var{DirList} can also be separated by colons, as is
 | |
| customary on those environments.
 | |
| \Errors
 | |
| None.
 | |
| \SeeAlso
 | |
| \seefl{FExpand}{Dos:FExpand}
 | |
| \end{functionl}
 | |
| 
 | |
| \FPCexample{ex10}
 | |
| 
 | |
|  
 | |
| \begin{procedure}{FSplit}
 | |
| \Declaration
 | |
| Procedure FSplit (path: pathstr; \\ var dir: dirstr; var name: namestr;
 | |
|   var ext: extstr);
 | |
| \Description
 | |
| 
 | |
| \var{FSplit} splits a full file name into 3 parts : A \var{Path}, a
 | |
| \var{Name} and an extension  (in \var{ext}.) 
 | |
| The extension is taken to be all letters after the {\em last} dot (.). For 
 | |
| \dos, however, an exception is made when \var{LFNSupport=False}, then
 | |
| the extension is defined as all characters after the {\em first} dot.
 | |
| 
 | |
| \Errors
 | |
| None.
 | |
| \SeeAlso
 | |
| \seefl{FSearch}{Dos:FSearch}
 | |
| \end{procedure}
 | |
| 
 | |
| \FPCexample{ex12}
 | |
| 
 | |
| \begin{procedure}{GetCBreak}
 | |
| \Declaration
 | |
| Procedure GetCBreak (var breakvalue: boolean);
 | |
| \Description
 | |
| 
 | |
| \var{GetCBreak} gets the status of CTRL-Break checking under \dos and \amiga.
 | |
| When \var{BreakValue} is \var{false}, then \dos only checks for the 
 | |
| CTRL-Break key-press when I/O is performed. When it is set to \var{True},
 | |
| then a check is done at every system call.
 | |
| \Portability
 | |
| Under non-\dos and non-\amiga operating systems, \var{BreakValue} always returns 
 | |
| \var{True}.
 | |
| \Errors 
 | |
| None
 | |
| \SeeAlso
 | |
| \seep{SetCBreak}
 | |
| \end{procedure}
 | |
| 
 | |
| \begin{procedurel}{GetDate}{Dos:GetDate}
 | |
| \Declaration
 | |
| Procedure GetDate (var year, month, mday, wday: word);\Description
 | |
| 
 | |
| \var{GetDate} returns the system's date. \var{Year} is a number in the range
 | |
| 1980..2099.\var{mday} is the day of the month,
 | |
| \var{wday} is the day of the week, starting with Sunday as day 0.
 | |
| \Errors
 | |
| None.
 | |
| \SeeAlso
 | |
| \seepl{GetTime}{Dos:GetTime},\seep{SetDate}
 | |
| \end{procedurel}
 | |
| 
 | |
| \FPCexample{ex2}
 | |
| 
 | |
| \begin{functionl}{GetEnv}{Dos:GetEnv}
 | |
| \Declaration
 | |
| Function GetEnv (EnvVar: String) : String;
 | |
| \Description
 | |
| 
 | |
| \var{Getenv} returns the value of the environment variable \var{EnvVar}.
 | |
| When there is no environment variable \var{EnvVar} defined, an empty
 | |
| string is returned.
 | |
| \Portability
 | |
| Under some operating systems (such as \unix), case is important when looking
 | |
| for \var{EnvVar}.
 | |
| \Errors
 | |
| None.
 | |
| \SeeAlso
 | |
| \seef{EnvCount}, \seef{EnvStr}
 | |
| \end{functionl}
 | |
| 
 | |
| \FPCexample{ex14}
 | |
| 
 | |
| \begin{procedure}{GetFAttr}
 | |
| \Declaration
 | |
| Procedure GetFAttr (var F; var Attr: word);
 | |
| \Description
 | |
| 
 | |
| \var{GetFAttr} returns the file attributes of the file-variable \var{f}.
 | |
|  \var{F} can be a untyped or typed file, or of type \var{Text}. \var{f} must
 | |
| have been assigned, but not opened. The attributes can be examined with the
 | |
| following constants :
 | |
| \begin{itemize}
 | |
| \item \var{ReadOnly}
 | |
| \item \var{Hidden}
 | |
| \item \var{SysFile}
 | |
| \item \var{VolumeId}
 | |
| \item \var{Directory}
 | |
| \item \var{Archive}
 | |
| \end{itemize}
 | |
| Under \linux, supported attributes are:
 | |
| \begin{itemize}
 | |
| \item \var{Directory}
 | |
| \item \var{ReadOnly} if the current process doesn't have access to the file.
 | |
| \item \var{Hidden} for files whose name starts with a dot \var{('.')}.
 | |
| \end{itemize}
 | |
| 
 | |
| \Errors
 | |
| Errors are reported in \var{DosError}
 | |
| \SeeAlso
 | |
| \seep{SetFAttr}
 | |
| \end{procedure}
 | |
| 
 | |
| \FPCexample{ex8}
 | |
| 
 | |
| \begin{procedure}{GetFTime}
 | |
| \Declaration
 | |
| Procedure GetFTime (var F; var Time: longint);
 | |
| \Description
 | |
| 
 | |
| \var{GetFTime} returns the modification time of a file.
 | |
| This time is encoded and must be decoded with \var{UnPackTime}. 
 | |
| \var{F} must be a file type, which has been assigned, and
 | |
| opened.
 | |
| \Errors
 | |
| Errors are reported in \var{DosError}
 | |
| \SeeAlso
 | |
| \seep{SetFTime}, \seep{PackTime},\seep{UnPackTime}
 | |
| \end{procedure}
 | |
| 
 | |
| \FPCexample{ex9}
 | |
| 
 | |
| \begin{procedure}{GetIntVec}
 | |
| \Declaration
 | |
| Procedure GetIntVec (IntNo: byte; var Vector: pointer);
 | |
| \Description
 | |
| 
 | |
| \var{GetIntVec} returns the address of interrupt vector
 | |
| \var{IntNo}.
 | |
| \Portability
 | |
| This call does nothing, it is present for compatibility only.
 | |
| \Errors
 | |
| None.
 | |
| \SeeAlso
 | |
| \seep{SetIntVec}
 | |
| \end{procedure}
 | |
| 
 | |
| \begin{function}{GetLongName}
 | |
| \Declaration
 | |
| function GetLongName(var p : String) : boolean;\Description
 | |
| This function is only implemented in the GO32V2 version of \fpc.
 | |
| 
 | |
| \var{GetLongName} changes the filename \var{p} to a long filename
 | |
| if the \dos call to do this is successful. The resulting string
 | |
| is the long  file name corresponding to the short filename \var{p}.
 | |
| 
 | |
| The function returns \var{True} if the \dos call was successful, 
 | |
| \var{False} otherwise.
 | |
| 
 | |
| This function should only be necessary when using the DOS extender
 | |
| under Windows 95 and higher.
 | |
| \Errors
 | |
| If the \dos call was not succesfull, \var{False} is returned.
 | |
| \SeeAlso
 | |
| \seef{GetShortName}
 | |
| \end{function}
 | |
| 
 | |
| \begin{function}{GetShortName}
 | |
| \Declaration
 | |
| function GetShortName(var p : String) : boolean;\Description
 | |
| This function is only implemented in the GO32V2 version of \fpc.
 | |
| 
 | |
| \var{GetShortName} changes the filename \var{p} to a short filename
 | |
| if the \dos call to do this is successful. The resulting string
 | |
| is the short file name corresponding to the long filename \var{p}.
 | |
| 
 | |
| The function returns \var{True} if the \dos call was successful, 
 | |
| \var{False} otherwise.
 | |
| 
 | |
| This function should only be necessary when using the DOS extender
 | |
| under Windows 95 and higher.
 | |
| \Errors
 | |
| If the \dos call was not successful, \var{False} is returned.
 | |
| \SeeAlso
 | |
| \seef{GetLongName}
 | |
| \end{function}
 | |
| 
 | |
| \begin{procedurel}{GetTime}{Dos:GetTime}
 | |
| \Declaration
 | |
| Procedure GetTime (var hour, minute, second, sec100: word);
 | |
| \Description
 | |
| 
 | |
| \var{GetTime} returns the system's time. \var{Hour} is a on a 24-hour time
 | |
| scale. \var{sec100} is in hundredth of a
 | |
| second.
 | |
| \Portability
 | |
| Certain operating systems (such as \amiga), always set the \var{sec100} field
 | |
| to zero.
 | |
| \Errors
 | |
| None.
 | |
| \SeeAlso
 | |
| \seepl{GetDate}{Dos:GetDate},
 | |
| \seep{SetTime}
 | |
| \end{procedurel}
 | |
| 
 | |
| 
 | |
| \FPCexample{ex3}
 | |
| 
 | |
| 
 | |
| \begin{procedure}{GetVerify}
 | |
| \Declaration
 | |
| Procedure GetVerify (var verify: boolean);
 | |
| \Description
 | |
| 
 | |
| \var{GetVerify} returns the status of the verify flag under \dos. When
 | |
| \var{Verify} is \var{True}, then \dos checks data which are written to disk,
 | |
| by reading them after writing. If \var{Verify} is \var{False}, then data
 | |
| written to disk are not verified.
 | |
| \Portability
 | |
| Under non-\dos systems (excluding \ostwo applications running under vanilla DOS),  
 | |
| Verify is always \var{True}.
 | |
| \Errors
 | |
| None.
 | |
| \SeeAlso
 | |
| \seep{SetVerify}
 | |
| \end{procedure}
 | |
| \begin{procedure}{Intr}
 | |
| \Declaration
 | |
| Procedure Intr (IntNo: byte; var Regs: registers);
 | |
| \Description
 | |
| 
 | |
| \var{Intr} executes a software interrupt number \var{IntNo} (must be between
 | |
| 0 and 255), with processor registers set to \var{Regs}. After the interrupt call
 | |
| returned, the processor registers are saved in \var{Regs}.
 | |
| \Portability
 | |
| Under non-\dos operating systems, this call does nothing.
 | |
| \Errors
 | |
| None.
 | |
| \SeeAlso
 | |
| \seep{MSDos}, see the \linux unit.
 | |
| \end{procedure}
 | |
| 
 | |
| \begin{procedure}{Keep}
 | |
| \Declaration
 | |
| Procedure Keep (ExitCode: word);
 | |
| \Description
 | |
| \var{Keep} terminates the program, but stays in memory. This is used for TSR
 | |
| (Terminate Stay Resident) programs which catch some interrupt.
 | |
| \var{ExitCode} is the same parameter as the \var{Halt} function takes.
 | |
| \Portability
 | |
| This call does nothing, it is present for compatibility only.
 | |
| \Errors
 | |
| None.
 | |
| \SeeAlso
 | |
| \seem{Halt}{}
 | |
| \end{procedure}
 | |
| \begin{procedure}{MSDos}
 | |
| \Declaration
 | |
| Procedure MSDos (var regs: registers);
 | |
| \Description
 | |
| 
 | |
| \var{MSDos} executes an operating system. This is the same as doing a
 | |
| \var{Intr} call with the interrupt number for an os call.
 | |
| \Portability
 | |
| Under non-\dos operating systems, this call does nothing. On \dos systems,
 | |
| this calls interrupt \$21.
 | |
| \Errors
 | |
| None.
 | |
| \SeeAlso
 | |
| \seep{Intr}
 | |
| \end{procedure}
 | |
| \begin{procedure}{PackTime}
 | |
| \Declaration
 | |
| Procedure PackTime (var T: datetime; var P: longint);
 | |
| \Description
 | |
| 
 | |
| \var{UnPackTime} converts the date and time specified in \var{T}
 | |
| to a packed-time format which can be fed to \var{SetFTime}.
 | |
| \Errors
 | |
| None.
 | |
| \SeeAlso
 | |
| \seep{SetFTime}, \seep{FindFirst}, \seep{FindNext}, \seep{UnPackTime}
 | |
| \end{procedure}
 | |
| 
 | |
| \FPCexample{ex4}
 | |
| 
 | |
| \begin{procedure}{SetCBreak}
 | |
| \Declaration
 | |
| Procedure SetCBreak (breakvalue: boolean);
 | |
| \Description
 | |
| 
 | |
| \var{SetCBreak} sets the status of CTRL-Break checking. When 
 | |
| \var{BreakValue} is \var{false}, then \dos only checks for the CTRL-Break 
 | |
| key-press when I/O is performed. When it is set to \var{True}, then a 
 | |
| check is done at every system call.
 | |
| \Portability
 | |
| Under non-\dos and non-\amiga operating systems, this call does nothing.
 | |
| \Errors
 | |
| None.
 | |
| \SeeAlso
 | |
| \seep{GetCBreak}
 | |
| \end{procedure}
 | |
| \begin{procedure}{SetDate}
 | |
| \Declaration
 | |
| Procedure SetDate (year,month,day: word);
 | |
| \Description
 | |
| 
 | |
| \var{SetDate} sets the system's internal date. \var{Year} is a number
 | |
| between 1980 and 2099.
 | |
| \Portability
 | |
| On a \linux machine, there must be root privileges, otherwise this
 | |
| routine will do nothing. On other \unix systems, this call currently
 | |
| does nothing.
 | |
| \Errors
 | |
| None.
 | |
| \SeeAlso
 | |
| \seep{Dos:GetDate},
 | |
| \seep{SetTime}
 | |
| \end{procedure}
 | |
| 
 | |
| \begin{procedure}{SetFAttr}
 | |
| \Declaration
 | |
| Procedure SetFAttr (var F; Attr: word);
 | |
| \Description
 | |
| 
 | |
| \var{SetFAttr} sets the file attributes of the file-variable \var{F}.
 | |
|  \var{F} can be a untyped or typed file, or of type \var{Text}. \var{F} must
 | |
| have been assigned, but not opened. The attributes can be a sum of the
 | |
| following constants:
 | |
| \begin{itemize}
 | |
| \item \var{ReadOnly}
 | |
| \item \var{Hidden}
 | |
| \item \var{SysFile}
 | |
| \item \var{VolumeId}
 | |
| \item \var{Directory}
 | |
| \item \var{Archive}
 | |
| \end{itemize}
 | |
| 
 | |
| \Portability
 | |
| Under \unix like systems (such as \linux and \beos) the call exists, but is not implemented, 
 | |
| i.e. it does nothing.
 | |
| \Errors
 | |
| Errors are reported in \var{DosError}.
 | |
| \SeeAlso
 | |
| \seep{GetFAttr}
 | |
| \end{procedure}
 | |
| \begin{procedure}{SetFTime}
 | |
| \Declaration
 | |
| Procedure SetFTime (var F; Time: longint);
 | |
| \Description
 | |
| 
 | |
| \var{SetFTime} sets the modification time of a file,
 | |
| this time is encoded and must be encoded with \var{PackTime}. 
 | |
| \var{F} must be a file type, which has been assigned, and
 | |
| opened.
 | |
| \Portability
 | |
| Under \unix like systems (such as \linux and \beos) the call exists, but is not implemented, 
 | |
| i.e. it does nothing.
 | |
| \Errors
 | |
| Errors are reported in \var{DosError}
 | |
| \SeeAlso
 | |
| \seep{GetFTime}, \seep{PackTime},\seep{UnPackTime}
 | |
| \end{procedure}
 | |
| 
 | |
| \begin{procedure}{SetIntVec}
 | |
| \Declaration
 | |
| Procedure SetIntVec (IntNo: byte; Vector: pointer);
 | |
| \Description
 | |
| \var{SetIntVec} sets interrupt vector \var{IntNo} to \var{Vector}.
 | |
| \var{Vector} should point to an interrupt procedure.
 | |
| \Portability
 | |
| This call does nothing, it is present for compatibility only.
 | |
| \Errors
 | |
| None.
 | |
| \SeeAlso
 | |
| \seep{GetIntVec}
 | |
| \end{procedure}
 | |
| 
 | |
| \begin{procedure}{SetTime}
 | |
| \Declaration
 | |
| Procedure SetTime (hour,minute,second,sec100: word);
 | |
| \Description
 | |
| \var{SetTime} sets the system's internal clock. The \var{Hour} parameter is
 | |
| on a 24-hour time scale.
 | |
| \Portability
 | |
| On a \linux machine, there must be root privileges, otherwise this
 | |
| routine will do nothing. On other \unix systems, this call currently
 | |
| does nothing.
 | |
| \Errors
 | |
| None.
 | |
| \SeeAlso
 | |
| \seep{Dos:GetTime}, \seep{SetDate}
 | |
| \end{procedure}
 | |
| \begin{procedure}{SetVerify}
 | |
| \Declaration
 | |
| Procedure SetVerify (verify: boolean);
 | |
| \Description
 | |
| 
 | |
| \var{SetVerify} sets the status of the verify flag under \dos. When
 | |
| \var{Verify} is \var{True}, then \dos checks data which are written to disk,
 | |
| by reading them after writing. If \var{Verify} is \var{False}, then data
 | |
| written to disk are not verified.
 | |
| \Portability
 | |
| Under non-\dos operating systems (excluding \ostwo applications running
 | |
| under vanilla dos), Verify is always \var{True}.
 | |
| \Errors
 | |
| None.
 | |
| \SeeAlso
 | |
| \seep{SetVerify}
 | |
| \end{procedure}
 | |
| \begin{procedure}{SwapVectors}
 | |
| \Declaration
 | |
| Procedure SwapVectors ;
 | |
| \Description
 | |
| 
 | |
| \var{SwapVectors} swaps the contents of the internal table of interrupt 
 | |
| vectors with the current contents of the interrupt vectors.
 | |
| This is called typically in before and after an \var{Exec} call.
 | |
| 
 | |
| \Portability
 | |
| Under certain operating systems, this routine may be implemented
 | |
| as an empty stub.
 | |
| \Errors
 | |
| None.
 | |
| \SeeAlso
 | |
| \seep{Exec}, \seep{SetIntVec}
 | |
| \end{procedure}
 | |
| \begin{procedure}{UnPackTime}
 | |
| \Declaration
 | |
| Procedure UnPackTime (p: longint; var T: datetime);
 | |
| \Description
 | |
| 
 | |
| \var{UnPackTime} converts the file-modification time in \var{p}
 | |
| to a \var{DateTime} record. The file-modification time can be 
 | |
| returned by \var{GetFTime}, \var{FindFirst} or \var{FindNext} calls.
 | |
| \Errors
 | |
| None.
 | |
| \SeeAlso
 | |
| \seep{GetFTime}, \seep{FindFirst}, \seep{FindNext}, \seep{PackTime}
 | |
| \end{procedure}
 | |
| For an example, see \seep{PackTime}.
 | |
| 
 | |
| 
 | 
