runtime/src/POSIX/RTArgs.m3


Copyright (C) 1994, Digital Equipment Corp.
On Posix systems, envp points at a NIL-terminated list of string pointers

UNSAFE MODULE RTArgs;

IMPORT RTLinker, Ctypes, M3toC;

VAR env_c : CARDINAL := 0;

PROCEDURE ArgC (): CARDINAL =
  BEGIN
    RETURN RTLinker.info.argc;
  END ArgC;

PROCEDURE GetArg (n: CARDINAL): TEXT =
  VAR p: Ctypes.char_star_star := RTLinker.info.argv + n * ADRSIZE (ADDRESS);
      a: ARRAY [0..1] OF INTEGER;
  BEGIN
    IF (n >= RTLinker.info.argc) THEN
      n := 2;  n := a[n];  (* force a subscript fault *)
    END;
    RETURN M3toC.StoT (p^);
  END GetArg;

PROCEDURE EnvC (): CARDINAL =
  VAR
    cnt  : CARDINAL := 0;
    envp : Ctypes.char_star_star := RTLinker.info.envp;
  BEGIN
    IF (env_c = 0) THEN
      WHILE envp^ # NIL DO
        INC (envp, ADRSIZE (ADDRESS));
        INC (cnt);
      END;
      env_c := cnt;
    END;
    RETURN env_c;
  END EnvC;

PROCEDURE GetEnv (n: CARDINAL): TEXT =
  VAR p: Ctypes.char_star_star := RTLinker.info.envp + n * ADRSIZE (ADDRESS);
      a: ARRAY [0..1] OF INTEGER;
  BEGIN
    IF (n >= EnvC ()) THEN
      n := 2;  n := a[n];  (* force a subscript fault *)
    END;
    RETURN M3toC.StoT (p^);
  END GetEnv;

BEGIN
END RTArgs.