|
@@ -54,13 +54,13 @@ const
|
|
StdErrorHandle: longint = UnusedHandle;
|
|
StdErrorHandle: longint = UnusedHandle;
|
|
|
|
|
|
var
|
|
var
|
|
- args: PChar;
|
|
|
|
- argc: LongInt;
|
|
|
|
- argv: PPChar;
|
|
|
|
- envp: PPChar;
|
|
|
|
-
|
|
|
|
- heapStart: pointer;
|
|
|
|
|
|
+ QL_ChannelIDNum : word;
|
|
|
|
+ QL_ChannelIDs: pdword;
|
|
|
|
+ QL_CommandLineLen : word;
|
|
|
|
+ QL_CommandLine : pchar;
|
|
|
|
|
|
|
|
+ argv: PPChar;
|
|
|
|
+ argc: Longint;
|
|
|
|
|
|
{$if defined(FPUSOFT)}
|
|
{$if defined(FPUSOFT)}
|
|
|
|
|
|
@@ -106,50 +106,82 @@ begin
|
|
GetProcessID := mt_inf(nil, nil);
|
|
GetProcessID := mt_inf(nil, nil);
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
+{*****************************************************************************
|
|
|
|
+ ParamStr
|
|
|
|
+*****************************************************************************}
|
|
|
|
+
|
|
var
|
|
var
|
|
- CmdLine_len : word; external name '__CmdLine_len';
|
|
|
|
- pCmdLine : pchar; external name '__pCmdLine';
|
|
|
|
|
|
+ args: PChar;
|
|
|
|
+
|
|
|
|
+{ number of args }
|
|
|
|
+function ParamCount: LongInt;
|
|
|
|
+begin
|
|
|
|
+ ParamCount:=argc;
|
|
|
|
+end;
|
|
|
|
+
|
|
|
|
+{ argument number l }
|
|
|
|
+function ParamStr(l: LongInt): string;
|
|
|
|
+begin
|
|
|
|
+ if (l >= 0) and (l <= argc) then
|
|
|
|
+ ParamStr:=argv[l]
|
|
|
|
+ else
|
|
|
|
+ ParamStr:='';
|
|
|
|
+end;
|
|
|
|
+
|
|
procedure SysInitParamsAndEnv;
|
|
procedure SysInitParamsAndEnv;
|
|
var
|
|
var
|
|
- str_len, i : word;
|
|
|
|
|
|
+ i,j : longint;
|
|
c : char;
|
|
c : char;
|
|
- in_word : boolean;
|
|
|
|
|
|
+ argv_size : longint;
|
|
const
|
|
const
|
|
word_separators=[' ',#0];
|
|
word_separators=[' ',#0];
|
|
begin
|
|
begin
|
|
- str_len:=CmdLine_len;
|
|
|
|
argc:=0;
|
|
argc:=0;
|
|
argv:=nil;
|
|
argv:=nil;
|
|
- args:=pCmdLine;
|
|
|
|
|
|
+ args:=GetMem(QL_CommandLineLen+1);
|
|
if not assigned(args) then
|
|
if not assigned(args) then
|
|
exit;
|
|
exit;
|
|
- { Parse command line }
|
|
|
|
- { Compute argc imply replace spaces by #0 }
|
|
|
|
|
|
+
|
|
|
|
+ Move(QL_CommandLine^,args^,QL_CommandLineLen);
|
|
|
|
+ args[QL_CommandLineLen]:=#0;
|
|
|
|
+
|
|
i:=0;
|
|
i:=0;
|
|
- in_word:=false;
|
|
|
|
- while (i < str_len) do
|
|
|
|
|
|
+ c:=' ';
|
|
|
|
+ while args[i]<>#0 do
|
|
begin
|
|
begin
|
|
|
|
+ if (c in word_separators) and not (args[i] in word_separators) then
|
|
|
|
+ inc(argc);
|
|
c:=args[i];
|
|
c:=args[i];
|
|
- if (not in_word) then
|
|
|
|
|
|
+ inc(i);
|
|
|
|
+ end;
|
|
|
|
+
|
|
|
|
+ { +2 is because argv[0] should be program name,
|
|
|
|
+ and argv[argc+1] is argv array terminator }
|
|
|
|
+ argv:=GetMem((argc+2)*sizeof(pointer));
|
|
|
|
+ if not assigned(argv) then
|
|
|
|
+ begin
|
|
|
|
+ argc:=0;
|
|
|
|
+ exit;
|
|
|
|
+ end;
|
|
|
|
+ argv[argc+1]:=nil;
|
|
|
|
+ { FIX ME: for now the 0th argument (program name) is just always empty }
|
|
|
|
+ argv[0]:=#0;
|
|
|
|
+
|
|
|
|
+ i:=0;
|
|
|
|
+ j:=1;
|
|
|
|
+ c:=' ';
|
|
|
|
+ while args[i]<>#0 do
|
|
|
|
+ begin
|
|
|
|
+ if (c in word_separators) and not (args[i] in word_separators) then
|
|
begin
|
|
begin
|
|
- if not(c in word_separators) then
|
|
|
|
- begin
|
|
|
|
- inc(argc);
|
|
|
|
- argv[argc]:=@args[i];
|
|
|
|
- in_word:=true;
|
|
|
|
- end
|
|
|
|
- else
|
|
|
|
- begin
|
|
|
|
- args[i]:=#0;
|
|
|
|
- end;
|
|
|
|
- end
|
|
|
|
- else if (c in word_separators) then
|
|
|
|
- begin
|
|
|
|
- in_word:=false;
|
|
|
|
- args[i]:=#0;
|
|
|
|
- end;
|
|
|
|
- inc(i);
|
|
|
|
- end;
|
|
|
|
|
|
+ argv[j]:=@args[i];
|
|
|
|
+ inc(j);
|
|
|
|
+ end;
|
|
|
|
+ c:=args[i];
|
|
|
|
+ if (c in word_separators) then
|
|
|
|
+ args[i]:=#0;
|
|
|
|
+ inc(i);
|
|
|
|
+ end;
|
|
end;
|
|
end;
|
|
|
|
|
|
procedure randomize;
|
|
procedure randomize;
|
|
@@ -175,11 +207,19 @@ end;
|
|
{*****************************************************************************
|
|
{*****************************************************************************
|
|
System Dependent Entry code
|
|
System Dependent Entry code
|
|
*****************************************************************************}
|
|
*****************************************************************************}
|
|
|
|
+var
|
|
|
|
+ jobStackDataPtr: pointer; external name '__job_stack_data_ptr';
|
|
|
|
+
|
|
{ QL/QDOS specific startup }
|
|
{ QL/QDOS specific startup }
|
|
procedure SysInitQDOS;
|
|
procedure SysInitQDOS;
|
|
var
|
|
var
|
|
r: TQLRect;
|
|
r: TQLRect;
|
|
begin
|
|
begin
|
|
|
|
+ QL_ChannelIDNum:=pword(jobStackDataPtr)[0];
|
|
|
|
+ QL_ChannelIDs:=@pword(jobStackDataPtr)[1];
|
|
|
|
+ QL_CommandLineLen:=pword(@QL_ChannelIDs[QL_ChannelIDNum])[0];
|
|
|
|
+ QL_CommandLine:=@pword(@QL_ChannelIDs[QL_ChannelIDNum])[1];
|
|
|
|
+
|
|
stdInputHandle:=io_open('con_',Q_OPEN);
|
|
stdInputHandle:=io_open('con_',Q_OPEN);
|
|
stdOutputHandle:=stdInputHandle;
|
|
stdOutputHandle:=stdInputHandle;
|
|
stdErrorHandle:=stdInputHandle;
|
|
stdErrorHandle:=stdInputHandle;
|
|
@@ -203,6 +243,11 @@ procedure system_exit;
|
|
const
|
|
const
|
|
anyKey: string = 'Press any key to exit';
|
|
anyKey: string = 'Press any key to exit';
|
|
begin
|
|
begin
|
|
|
|
+ if assigned(args) then
|
|
|
|
+ FreeMem(args);
|
|
|
|
+ if assigned(argv) then
|
|
|
|
+ FreeMem(argv);
|
|
|
|
+
|
|
io_sstrg(stdOutputHandle, -1, @anyKey[1], ord(anyKey[0]));
|
|
io_sstrg(stdOutputHandle, -1, @anyKey[1], ord(anyKey[0]));
|
|
io_fbyte(stdInputHandle, -1);
|
|
io_fbyte(stdInputHandle, -1);
|
|
|
|
|