mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-12-06 19:49:06 +01:00
241 lines
5.8 KiB
PHP
241 lines
5.8 KiB
PHP
{
|
|
$Id$
|
|
This file is part of the Free Pascal run time library.
|
|
Copyright (c) 1993,97 by Pierre Muller,
|
|
member of the Free Pascal development team.
|
|
|
|
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.
|
|
|
|
**********************************************************************}
|
|
|
|
var argc : longint;
|
|
doscmd : string;
|
|
args : ^pchar;
|
|
|
|
function far_strlen(selector : word;linear_address : longint) : longint;
|
|
begin
|
|
asm
|
|
movl linear_address,%edx
|
|
movl %edx,%ecx
|
|
movw selector,%gs
|
|
Larg19:
|
|
movb %gs:(%edx),%al
|
|
testb %al,%al
|
|
je Larg20
|
|
incl %edx
|
|
jmp Larg19
|
|
Larg20:
|
|
movl %edx,%eax
|
|
subl %ecx,%eax
|
|
movl %eax,__RESULT
|
|
end;
|
|
end;
|
|
|
|
function atohex(s : pchar) : longint;
|
|
var rv : longint;
|
|
v : byte;
|
|
begin
|
|
rv := 0;
|
|
while (s^ <>#0) do
|
|
begin
|
|
v := ord(s^) - ord('0');
|
|
if (v > 9) then v := v - 7;
|
|
v := v and 15; { in case it's lower case }
|
|
rv := rv*16 + v;
|
|
inc(longint(s));
|
|
end;
|
|
atohex := rv;
|
|
end;
|
|
|
|
procedure setup_arguments;
|
|
type arrayword = array [0..0] of word;
|
|
var psp : word;
|
|
i,j : byte;
|
|
quote : char;
|
|
proxy_s : string[7];
|
|
al,proxy_argc,proxy_seg,proxy_ofs,lin : longint;
|
|
largs : array[0..127] of pchar;
|
|
rm_argv : ^arrayword;
|
|
begin
|
|
for i := 1 to 127 do
|
|
largs[i] := nil;
|
|
psp:=stub_info^.psp_selector;
|
|
largs[0]:=dos_argv0;
|
|
argc := 1;
|
|
sysseg_move(psp, 128, get_ds, longint(@doscmd), 128);
|
|
{$IfDef SYSTEMDEBUG}
|
|
Writeln('Dos command line is #',doscmd,'# size = ',length(doscmd));
|
|
{$EndIf SYSTEMDEBUG}
|
|
j := 1;
|
|
quote := #0;
|
|
for i:=1 to length(doscmd) do
|
|
Begin
|
|
if doscmd[i] = quote then
|
|
begin
|
|
quote := #0;
|
|
doscmd[i] := #0;
|
|
largs[argc]:=@doscmd[j];
|
|
inc(argc);
|
|
j := i+1;
|
|
end else
|
|
if (quote = #0) and ((doscmd[i] = '''') or (doscmd[i]='"')) then
|
|
begin
|
|
quote := doscmd[i];
|
|
j := i + 1;
|
|
end else
|
|
if (quote = #0) and ((doscmd[i] = ' ')
|
|
or (doscmd[i] = #9) or (doscmd[i] = #10) or
|
|
(doscmd[i] = #12) or (doscmd[i] = #9)) then
|
|
begin
|
|
doscmd[i]:=#0;
|
|
if j<i then
|
|
begin
|
|
largs[argc]:=@doscmd[j];
|
|
inc(argc);
|
|
j := i+1;
|
|
end else inc(j);
|
|
end else
|
|
if (i = length(doscmd)) then
|
|
begin
|
|
doscmd[i+1]:=#0;
|
|
largs[argc]:=@doscmd[j];
|
|
inc(argc);
|
|
end;
|
|
end;
|
|
|
|
if (argc > 1) and (far_strlen(get_ds,longint(largs[1])) = 6) then
|
|
begin
|
|
move(largs[1]^,proxy_s[1],6);
|
|
proxy_s[0] := #6;
|
|
if (proxy_s = '!proxy') then
|
|
begin
|
|
{$IfDef SYSTEMDEBUG}
|
|
Writeln('proxy command line ');
|
|
{$EndIf SYSTEMDEBUG}
|
|
proxy_argc := atohex(largs[2]);
|
|
proxy_seg := atohex(largs[3]);
|
|
proxy_ofs := atohex(largs[4]);
|
|
getmem(rm_argv,proxy_argc*sizeof(word));
|
|
sysseg_move(dos_selector,proxy_seg*16+proxy_ofs, get_ds,longint(rm_argv),proxy_argc*sizeof(word));
|
|
for i:=0 to proxy_argc - 1 do
|
|
begin
|
|
lin := proxy_seg*16 + rm_argv^[i];
|
|
al :=far_strlen(dos_selector, lin);
|
|
getmem(largs[i],al+1);
|
|
sysseg_move(dos_selector, lin, get_ds,longint(largs[i]), al+1);
|
|
{$IfDef SYSTEMDEBUG}
|
|
Writeln('arg ',i,' #',largs[i],'#');
|
|
{$EndIf SYSTEMDEBUG}
|
|
end;
|
|
argc := proxy_argc;
|
|
end;
|
|
end;
|
|
getmem(args,argc*SizeOf(pchar));
|
|
for i := 0 to argc-1 do
|
|
args[i] := largs[i];
|
|
end;
|
|
|
|
function strcopy(dest,source : pchar) : pchar;
|
|
|
|
begin
|
|
asm
|
|
cld
|
|
movl 12(%ebp),%edi
|
|
movl $0xffffffff,%ecx
|
|
xorb %al,%al
|
|
repne
|
|
scasb
|
|
not %ecx
|
|
movl 8(%ebp),%edi
|
|
movl 12(%ebp),%esi
|
|
movl %ecx,%eax
|
|
shrl $2,%ecx
|
|
rep
|
|
movsl
|
|
movl %eax,%ecx
|
|
andl $3,%ecx
|
|
rep
|
|
movsb
|
|
movl 8(%ebp),%eax
|
|
leave
|
|
ret $8
|
|
end;
|
|
end;
|
|
|
|
|
|
procedure setup_environment;
|
|
var env_selector : word;
|
|
env_count : longint;
|
|
dos_env,cp : pchar;
|
|
stubaddr : p_stub_info;
|
|
begin
|
|
asm
|
|
movl __stubinfo,%eax
|
|
movl %eax,stubaddr
|
|
end;
|
|
stub_info:=stubaddr;
|
|
getmem(dos_env,stub_info^.env_size);
|
|
env_count:=0;
|
|
sysseg_move(stub_info^.psp_selector,$2c, get_ds, longint(@env_selector), 2);
|
|
sysseg_move(env_selector, 0, get_ds, longint(dos_env), stub_info^.env_size);
|
|
cp:=dos_env;
|
|
while cp ^ <> #0 do
|
|
begin
|
|
inc(env_count);
|
|
while (cp^ <> #0) do inc(longint(cp)); { skip to NUL }
|
|
inc(longint(cp)); { skip to next character }
|
|
end;
|
|
getmem(environ,(env_count+1) * sizeof(pchar));
|
|
if (environ = nil) then exit;
|
|
cp:=dos_env;
|
|
env_count:=0;
|
|
while cp^ <> #0 do
|
|
begin
|
|
getmem(environ[env_count],strlen(cp)+1);
|
|
strcopy(environ[env_count], cp);
|
|
{$IfDef SYSTEMDEBUG}
|
|
Writeln('env ',env_count,' = "',environ[env_count],'"');
|
|
{$EndIf SYSTEMDEBUG}
|
|
inc(env_count);
|
|
while (cp^ <> #0) do inc(longint(cp)); { skip to NUL }
|
|
inc(longint(cp)); { skip to next character }
|
|
end;
|
|
environ[env_count]:=nil;
|
|
inc(longint(cp),3);
|
|
getmem(dos_argv0,strlen(cp)+1);
|
|
if (dos_argv0 = nil) then halt;
|
|
strcopy(dos_argv0, cp);
|
|
end;
|
|
|
|
{
|
|
$Log$
|
|
Revision 1.1 1998-03-25 11:18:42 root
|
|
Initial revision
|
|
|
|
Revision 1.3 1998/01/26 11:57:15 michael
|
|
+ Added log at the end
|
|
|
|
|
|
|
|
Working file: rtl/dos/go32v2/sargs.inc
|
|
description:
|
|
----------------------------
|
|
revision 1.2
|
|
date: 1997/12/01 15:35:01; author: michael; state: Exp; lines: +14 -0
|
|
+ Added copyright reference in header.
|
|
----------------------------
|
|
revision 1.1
|
|
date: 1997/11/27 08:33:52; author: michael; state: Exp;
|
|
Initial revision
|
|
----------------------------
|
|
revision 1.1.1.1
|
|
date: 1997/11/27 08:33:52; author: michael; state: Exp; lines: +0 -0
|
|
FPC RTL CVS start
|
|
=============================================================================
|
|
}
|