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 >
Pascal/Delphi Source File  |  1992-04-26  |  4KB  |  158 lines

  1. UNIT MSHSupport;
  2. {
  3.   Unit for MSH-Support, Jens Pirnay 1992,
  4.   MSH (the Mi-Shell) is copyright by Jean Michel and OPENetwork
  5. }
  6.  
  7. {-----------------------------------------------------}
  8. { Jens Pirnay <pirnay@rphs1.physik.uni-regensburg.de> }
  9. { This file is subject to the copyleft-regulations    }
  10. { of the Free Software Foundation (the guys from GNU) }
  11. {-----------------------------------------------------}
  12.  
  13. INTERFACE
  14.  
  15. USES DOS;
  16.  
  17.  TYPE MSHBuf = RECORD
  18.                 Len : WORD;
  19.                 Buf : ARRAY [1..$4000] OF CHAR; { should be enough }
  20.                END;
  21.  
  22.  VAR  IsMsh  : BOOLEAN; { Special cmd-line found   }
  23.       MSH    : ^MSHBuf; { Pointer to MSH-Structure }
  24.       DOSCmd : ^STRING; { Pointer to DOS-Cmd-Line  }
  25.  
  26.  FUNCTION MSHParamCount              : WORD;
  27.  { Equivalent to ParamCount }
  28.  
  29.  FUNCTION MSHParamStr (which : WORD) : STRING;
  30.  { Equivalent to ParamStr }
  31.  
  32.  FUNCTION CmdChar(idx:WORD) : CHAR;
  33.  { Low level: gives idx'th character of command-line }
  34.  
  35.  FUNCTION CmdLen : WORD;
  36.  { Low level: gives length of command-line }
  37.  
  38. IMPLEMENTATION
  39.  
  40. VAR ParCnt : WORD;
  41.  
  42.   FUNCTION CmdChar(idx:WORD) : CHAR;
  43.   VAR c : CHAR;
  44.   BEGIN
  45.     IF idx<= ORD(DOSCmd^[0]) THEN
  46.       C := DOSCmd^[idx]
  47.      ELSE
  48.       if IsMsh THEN
  49.         C := MSH^.Buf[idx-ORD(DOSCmd^[0])]
  50.        else
  51.         C := #0;
  52.     CmdChar := c;
  53.   END;
  54.  
  55.   FUNCTION CmdLen : WORD;
  56.   BEGIN
  57.     IF IsMSH THEN
  58.       CmdLen := MSH^.Len + ORD(DOSCmd^[0])
  59.      ELSE
  60.       CmdLen := ORD(DOSCmd^[0]);
  61.   END;
  62.  
  63.   PROCEDURE Init;
  64.   VAR ltoa : RECORD
  65.                CASE BOOLEAN OF
  66.                  TRUE  : ( l : LONGINT; );
  67.                  FALSE : ( a : POINTER; );
  68.              END;
  69.       i, len : INTEGER;
  70.       ch     : CHAR;
  71.       s      : STRING [20];
  72.  
  73.   BEGIN
  74.     IsMSH  := FALSE;
  75.     MSH    := NIL;
  76.     DosCmd := PTR (PrefixSeg, $80); { Ptr to DOS-CmdLine }
  77.     s      := GetEnv ('CMD@');
  78.     IF s <> '' THEN
  79.     BEGIN
  80.       VAL (s, ltoa.l, i);
  81.       IF i = 0 THEN
  82.       BEGIN
  83.         IsMSH := TRUE;
  84.         msh  := LToA.a;
  85.       END;
  86.     END;
  87.     ParCnt := 0;
  88.     i      := 1;
  89.     len    := CmdLen;
  90.     WHILE (i<=len) DO
  91.     BEGIN
  92.       WHILE (i<=len) AND (CmdChar(i)=' ') DO    { Skip Blanks }
  93.         INC(i);
  94.       IF (i<=len) THEN
  95.         INC(ParCnt);
  96.       WHILE (i<=len) AND (CmdChar(i)<>' ') DO    { Skip Word }
  97.         INC(i);
  98.     END;
  99. (*
  100.     WriteLn('"', DosCmd^, '"');
  101.     IF IsMSH THEN
  102.     BEGIN
  103.       FOR i:=1 TO 10 DO
  104.         s [i] := MSH^.Buf[i];
  105.       s[0] := #10;
  106.       WriteLn('"', s, '"');
  107.     END;
  108. *)
  109.   END;
  110.  
  111.   FUNCTION MSHParamCount : WORD;
  112.   BEGIN
  113.      MSHParamCount := ParCnt;
  114.   END;
  115.  
  116.   FUNCTION MSHParamStr (which : WORD) : STRING;
  117.   VAR res : STRING; i, wcnt, rlen, len : WORD;
  118.   BEGIN
  119.   (*
  120.     WriteLn(which); ReadLn;
  121.   *)
  122.     IF (which=0) THEN
  123.       res := ParamStr(0)
  124.     ELSE
  125.     BEGIN
  126.       rlen := 0;
  127.       IF which<=ParCnt THEN
  128.       BEGIN
  129.         len  := CmdLen;
  130.         wcnt := 1;
  131.         i    := 1;
  132.         WHILE (wcnt<which) DO
  133.         BEGIN
  134.           WHILE (i<=len) AND (CmdChar(i)=' ') DO
  135.             INC(i);
  136.           IF (i<=len) THEN
  137.             INC(wcnt);
  138.           WHILE (i<=len) AND (CmdChar(i)<>' ') DO
  139.             INC(i);
  140.         END;
  141.         WHILE (i<=len) AND (CmdChar(i)=' ') DO
  142.           INC(i);
  143.         WHILE (i<=len) AND (CmdChar(i)<>' ') DO
  144.         BEGIN
  145.           INC(rlen);
  146.           res[rlen] := CmdChar(i);
  147.           INC(i);
  148.         END;
  149.       END;
  150.       res[0] := CHR(rlen);
  151.     END;
  152.     MSHParamStr := res;
  153.   END;
  154.  
  155. BEGIN
  156.   Init;
  157. END.
  158.