home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The World of Computer Software
/
World_Of_Computer_Software-02-387-Vol-3of3.iso
/
m
/
msh_ut11.zip
/
MSHSUPPO.PAS
< prev
next >
Wrap
Pascal/Delphi Source File
|
1992-04-26
|
4KB
|
158 lines
UNIT MSHSupport;
{
Unit for MSH-Support, Jens Pirnay 1992,
MSH (the Mi-Shell) is copyright by Jean Michel and OPENetwork
}
{-----------------------------------------------------}
{ Jens Pirnay <pirnay@rphs1.physik.uni-regensburg.de> }
{ This file is subject to the copyleft-regulations }
{ of the Free Software Foundation (the guys from GNU) }
{-----------------------------------------------------}
INTERFACE
USES DOS;
TYPE MSHBuf = RECORD
Len : WORD;
Buf : ARRAY [1..$4000] OF CHAR; { should be enough }
END;
VAR IsMsh : BOOLEAN; { Special cmd-line found }
MSH : ^MSHBuf; { Pointer to MSH-Structure }
DOSCmd : ^STRING; { Pointer to DOS-Cmd-Line }
FUNCTION MSHParamCount : WORD;
{ Equivalent to ParamCount }
FUNCTION MSHParamStr (which : WORD) : STRING;
{ Equivalent to ParamStr }
FUNCTION CmdChar(idx:WORD) : CHAR;
{ Low level: gives idx'th character of command-line }
FUNCTION CmdLen : WORD;
{ Low level: gives length of command-line }
IMPLEMENTATION
VAR ParCnt : WORD;
FUNCTION CmdChar(idx:WORD) : CHAR;
VAR c : CHAR;
BEGIN
IF idx<= ORD(DOSCmd^[0]) THEN
C := DOSCmd^[idx]
ELSE
if IsMsh THEN
C := MSH^.Buf[idx-ORD(DOSCmd^[0])]
else
C := #0;
CmdChar := c;
END;
FUNCTION CmdLen : WORD;
BEGIN
IF IsMSH THEN
CmdLen := MSH^.Len + ORD(DOSCmd^[0])
ELSE
CmdLen := ORD(DOSCmd^[0]);
END;
PROCEDURE Init;
VAR ltoa : RECORD
CASE BOOLEAN OF
TRUE : ( l : LONGINT; );
FALSE : ( a : POINTER; );
END;
i, len : INTEGER;
ch : CHAR;
s : STRING [20];
BEGIN
IsMSH := FALSE;
MSH := NIL;
DosCmd := PTR (PrefixSeg, $80); { Ptr to DOS-CmdLine }
s := GetEnv ('CMD@');
IF s <> '' THEN
BEGIN
VAL (s, ltoa.l, i);
IF i = 0 THEN
BEGIN
IsMSH := TRUE;
msh := LToA.a;
END;
END;
ParCnt := 0;
i := 1;
len := CmdLen;
WHILE (i<=len) DO
BEGIN
WHILE (i<=len) AND (CmdChar(i)=' ') DO { Skip Blanks }
INC(i);
IF (i<=len) THEN
INC(ParCnt);
WHILE (i<=len) AND (CmdChar(i)<>' ') DO { Skip Word }
INC(i);
END;
(*
WriteLn('"', DosCmd^, '"');
IF IsMSH THEN
BEGIN
FOR i:=1 TO 10 DO
s [i] := MSH^.Buf[i];
s[0] := #10;
WriteLn('"', s, '"');
END;
*)
END;
FUNCTION MSHParamCount : WORD;
BEGIN
MSHParamCount := ParCnt;
END;
FUNCTION MSHParamStr (which : WORD) : STRING;
VAR res : STRING; i, wcnt, rlen, len : WORD;
BEGIN
(*
WriteLn(which); ReadLn;
*)
IF (which=0) THEN
res := ParamStr(0)
ELSE
BEGIN
rlen := 0;
IF which<=ParCnt THEN
BEGIN
len := CmdLen;
wcnt := 1;
i := 1;
WHILE (wcnt<which) DO
BEGIN
WHILE (i<=len) AND (CmdChar(i)=' ') DO
INC(i);
IF (i<=len) THEN
INC(wcnt);
WHILE (i<=len) AND (CmdChar(i)<>' ') DO
INC(i);
END;
WHILE (i<=len) AND (CmdChar(i)=' ') DO
INC(i);
WHILE (i<=len) AND (CmdChar(i)<>' ') DO
BEGIN
INC(rlen);
res[rlen] := CmdChar(i);
INC(i);
END;
END;
res[0] := CHR(rlen);
END;
MSHParamStr := res;
END;
BEGIN
Init;
END.