mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-06 21:47:58 +02:00
252 lines
5.4 KiB
ObjectPascal
252 lines
5.4 KiB
ObjectPascal
{
|
|
This file is part of the Free Pascal run time library.
|
|
Copyright (c) 2011 by Francesco Lombardi.
|
|
|
|
System unit for Nintendo Wii
|
|
|
|
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.
|
|
|
|
**********************************************************************}
|
|
|
|
unit System;
|
|
|
|
interface
|
|
|
|
{$define FPC_IS_SYSTEM}
|
|
{$define HAS_CMDLINE}
|
|
{$define FPC_HAS_FEATURE_THREADING}
|
|
{$define FPC_HAS_FEATURE_CONSOLEIO}
|
|
{$define FPC_HAS_FEATURE_COMMANDARGS}
|
|
{$define FPC_HAS_FEATURE_TEXTIO}
|
|
{$define FPC_HAS_FEATURE_FILEIO}
|
|
|
|
{$i systemh.inc}
|
|
{$i libch.inc}
|
|
{$i wiih.inc}
|
|
|
|
|
|
|
|
const
|
|
LineEnding = #10;
|
|
LFNSupport = true;
|
|
DirectorySeparator = '/';
|
|
DriveSeparator = ':';
|
|
ExtensionSeparator = '.';
|
|
PathSeparator = ':';
|
|
AllowDirectorySeparators : set of AnsiChar = ['\','/'];
|
|
AllowDriveSeparators : set of AnsiChar = [':'];
|
|
maxExitCode = 255;
|
|
|
|
MaxPathLen = 1024; // BSDs since 1993, Solaris 10, Darwin
|
|
AllFilesMask = '*';
|
|
|
|
UnusedHandle = -1;
|
|
StdInputHandle = 0;
|
|
StdOutputHandle = 1;
|
|
StdErrorHandle = 2;
|
|
|
|
FileNameCaseSensitive : boolean = true;
|
|
FileNameCasePreserving: boolean = true;
|
|
CtrlZMarksEOF: boolean = true; (* #26 not considered as end of file *)
|
|
|
|
sLineBreak = LineEnding;
|
|
DefaultTextLineBreakStyle : TTextLineBreakStyle = tlbsLF;
|
|
|
|
var
|
|
argc: LongInt = 0;
|
|
argv: PPAnsiChar;
|
|
envp: PPAnsiChar;
|
|
// errno: integer;
|
|
|
|
function get_cmdline:PAnsiChar;
|
|
|
|
property cmdline:PAnsiChar read get_cmdline;
|
|
|
|
implementation
|
|
|
|
const
|
|
calculated_cmdline: PAnsiChar = nil;
|
|
{ System limits, POSIX value in parentheses, used for buffer and stack allocation }
|
|
ARG_MAX = 65536; {4096} { Maximum number of argument size }
|
|
PATH_MAX = 1024; {255} { Maximum number of bytes in pathname }
|
|
|
|
|
|
{$i system.inc}
|
|
{$i libc.inc}
|
|
{$i wii.inc}
|
|
|
|
|
|
|
|
{$ifdef FPC_HAS_FEATURE_PROCESSES}
|
|
function GetProcessID: SizeUInt;
|
|
begin
|
|
GetProcessID := 0;
|
|
end;
|
|
{$endif}
|
|
|
|
|
|
{*****************************************************************************
|
|
Misc. System Dependent Functions
|
|
*****************************************************************************}
|
|
procedure System_exit;
|
|
begin
|
|
// Boo!
|
|
end;
|
|
|
|
{*****************************************************************************
|
|
ParamStr/Randomize
|
|
*****************************************************************************}
|
|
|
|
{ set randseed to a new pseudo random value }
|
|
procedure randomize;
|
|
begin
|
|
|
|
end;
|
|
|
|
|
|
Function ParamCount: Longint;
|
|
Begin
|
|
Paramcount:=argc-1
|
|
End;
|
|
|
|
|
|
{ variable where full path and filename and executable is stored }
|
|
{ is setup by the startup of the system unit. }
|
|
var
|
|
execpathstr : shortstring;
|
|
|
|
function paramstr(l: longint) : shortstring;
|
|
begin
|
|
{ stricly conforming POSIX applications }
|
|
{ have the executing filename as argv[0] }
|
|
if l=0 then
|
|
begin
|
|
paramstr := execpathstr;
|
|
end
|
|
else if (l > 0) and ( l < argc ) then
|
|
paramstr:=strpas(argv[l])
|
|
else
|
|
paramstr:='';
|
|
end;
|
|
|
|
{*****************************************************************************
|
|
cmdline
|
|
*****************************************************************************}
|
|
|
|
procedure SetupCmdLine;
|
|
var
|
|
bufsize,
|
|
len,j,
|
|
size,i : longint;
|
|
found : boolean;
|
|
buf : PAnsiChar;
|
|
|
|
procedure AddBuf;
|
|
begin
|
|
sysreallocmem(calculated_cmdline,size+bufsize);
|
|
move(buf^,calculated_cmdline[size],bufsize);
|
|
inc(size,bufsize);
|
|
bufsize:=0;
|
|
end;
|
|
|
|
begin
|
|
if argc<=0 then
|
|
exit;
|
|
GetMem(buf,ARG_MAX);
|
|
size:=0;
|
|
bufsize:=0;
|
|
i:=0;
|
|
while (i<argc) do
|
|
begin
|
|
len:=strlen(argv[i]);
|
|
if len>ARG_MAX-2 then
|
|
len:=ARG_MAX-2;
|
|
found:=false;
|
|
for j:=1 to len do
|
|
if argv[i][j]=' ' then
|
|
begin
|
|
found:=true;
|
|
break;
|
|
end;
|
|
if bufsize+len>=ARG_MAX-2 then
|
|
AddBuf;
|
|
if found then
|
|
begin
|
|
buf[bufsize]:='"';
|
|
inc(bufsize);
|
|
end;
|
|
move(argv[i]^,buf[bufsize],len);
|
|
inc(bufsize,len);
|
|
if found then
|
|
begin
|
|
buf[bufsize]:='"';
|
|
inc(bufsize);
|
|
end;
|
|
if i<argc-1 then
|
|
buf[bufsize]:=' '
|
|
else
|
|
buf[bufsize]:=#0;
|
|
inc(bufsize);
|
|
inc(i);
|
|
end;
|
|
AddBuf;
|
|
FreeMem(buf,ARG_MAX);
|
|
end;
|
|
|
|
function get_cmdline:PAnsiChar;
|
|
|
|
begin
|
|
if calculated_cmdline=nil then
|
|
setupcmdline;
|
|
get_cmdline:=calculated_cmdline;
|
|
end;
|
|
|
|
|
|
procedure SysInitStdIO;
|
|
begin
|
|
OpenStdIO(Input,fmInput,StdInputHandle);
|
|
OpenStdIO(Output,fmOutput,StdOutputHandle);
|
|
OpenStdIO(ErrOutput,fmOutput,StdErrorHandle);
|
|
OpenStdIO(StdOut,fmOutput,StdOutputHandle);
|
|
OpenStdIO(StdErr,fmOutput,StdErrorHandle);
|
|
end;
|
|
|
|
|
|
function CheckInitialStkLen(stklen : SizeUInt) : SizeUInt;
|
|
begin
|
|
result := stklen;
|
|
end;
|
|
|
|
|
|
begin
|
|
StackLength := CheckInitialStkLen(InitialStkLen);
|
|
StackBottom := Sptr - StackLength;
|
|
{ OS specific startup }
|
|
|
|
{ Set up signals handlers }
|
|
|
|
|
|
{ Setup heap }
|
|
InitHeap;
|
|
SysInitExceptions;
|
|
initunicodestringmanager;
|
|
SetupCmdLine;
|
|
|
|
{$ifdef FPC_HAS_FEATURE_CONSOLEIO}
|
|
{ Setup stdin, stdout and stderr }
|
|
SysInitStdIO;
|
|
{ Reset IO Error }
|
|
InOutRes:=0;
|
|
{$endif FPC_HAS_FEATURE_CONSOLEIO}
|
|
{ Arguments }
|
|
{$ifdef FPC_HAS_FEATURE_THREADING}
|
|
{ threading }
|
|
InitSystemThreads;
|
|
{$endif FPC_HAS_FEATURE_THREADING}
|
|
end.
|