1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
|
IMPLEMENTATION MODULE ShellVars;
FROM ASCII IMPORT nul;
FROM SYSTEM IMPORT ADDRESS,TSIZE;
FROM CPROC IMPORT margc,margv,menvp;
%{
extern int m2argc;
extern char **m2argv,**m2envp;
#define margc(v) v=m2argc
#define margv(v) *(char ***)&(v)=m2argv
#define menvp(v) *(char ***)&(v)=m2envp
%}
TYPE PtrToArgs=POINTER TO POINTER TO CHAR;
PROCEDURE GetNArg():CARDINAL;
VAR
argc:CARDINAL;argv,envp:PtrToArgs;
BEGIN
margc(argc);
margv(argv);
menvp(envp);
RETURN argc;
END GetNArg;
PROCEDURE GetNthArgStr(n:CARDINAL;VAR str: ARRAY OF CHAR);
VAR
argc:CARDINAL;argv,envp:PtrToArgs;
BEGIN
str[0]:=nul;
margc(argc);
margv(argv);
menvp(envp);
IF n>=argc THEN RETURN END;
argv:=PtrToArgs(CARDINAL(argv)+n*TSIZE(ADDRESS));
GetStr(argv,str);
END GetNthArgStr;
PROCEDURE GetNthEnvStr(n:CARDINAL;VAR str: ARRAY OF CHAR);
VAR
argc:CARDINAL;argv,envp:PtrToArgs;i:CARDINAL;
BEGIN
str[0]:=nul;
margc(argc);
margv(argv);
menvp(envp);
i:=0;
LOOP
IF envp^=NIL THEN RETURN END;
IF i=n THEN EXIT END;
envp:=PtrToArgs(CARDINAL(envp)+TSIZE(ADDRESS));
INC(i);
END;
GetStr(envp,str);
END GetNthEnvStr;
(*----- internal procedure:---------*)
PROCEDURE GetStr(p:PtrToArgs;VAR str:ARRAY OF CHAR);
TYPE PtrToChar=POINTER TO CHAR;
VAR
i:CARDINAL; pch: PtrToChar;
BEGIN
pch:=PtrToChar(p^); i:=0;
WHILE (i<=CARDINAL(HIGH(str))) & (pch^#nul) DO
str[i]:=pch^; pch:=PtrToChar(CARDINAL(pch)+1); INC(i);
END;
IF i<=CARDINAL(HIGH(str)) THEN str[i]:=nul END;
END GetStr;
BEGIN
END ShellVars.
|