(* Copyright (C) 1989, Digital Equipment Corporation *) (* All rights reserved. *) (* See the file COPYRIGHT for a full description. *) (* File: M3toC.m3 *) (* Last modified on Tue Apr 24 16:40:16 1990 by jerome *) (* modified on Fri Mar 16 01:59:14 1990 by muller *) UNSAFE MODULE M3toC; IMPORT Ctypes, Cstring, Text; VAR zeroValue := 0; TYPE M3Text = REF RECORD string: ADDRESS; size: INTEGER END; (* Converts a Modula3 Text into a C CharStar *) PROCEDURE TtoS (t: Text.T): Ctypes.CharStar = VAR tmp: M3Text; BEGIN IF (t = NIL) OR (t = "") THEN RETURN ADR (zeroValue) (* the magic to indirect on an open array *) ELSE tmp := LOOPHOLE (t, M3Text); RETURN (tmp.string) END; END TtoS; (* Converts a C CharStar into a Modula3Text *) PROCEDURE StoT (s: Ctypes.CharStar): Text.T = VAR tmp: M3Text; BEGIN tmp := NEW (M3Text); tmp.string := s; tmp.size := 1 + Cstring.strlen (s); RETURN (LOOPHOLE (tmp, Text.T)); END StoT; (* Converts a Modula3 INTEGER into a C Pointer *) PROCEDURE ItoP (t: INTEGER): ADDRESS = BEGIN RETURN (LOOPHOLE (t, ADDRESS)); END ItoP; (* Converts a Modula3 REAL into a C Pointer *) PROCEDURE RtoP (t: REAL): ADDRESS = BEGIN RETURN (LOOPHOLE (t, ADDRESS)); END RtoP; (* Convert a Ctypes.UnsignedLong into a C Pointer *) PROCEDURE UtoP (t: Ctypes.UnsignedLong): ADDRESS = BEGIN RETURN (LOOPHOLE (t, ADDRESS)); END UtoP; (* Converts a C Pointer into a Modula3 INTEGER *) PROCEDURE PtoI (t: ADDRESS): INTEGER = BEGIN RETURN (LOOPHOLE (t, INTEGER)); END PtoI; (* Converts a C Pointer into a Modula3 REAL *) PROCEDURE PtoR (t: ADDRESS): REAL = BEGIN RETURN (LOOPHOLE (t, REAL)); END PtoR; (* Converts a C Pointer into a Modula3 FloatStar *) PROCEDURE PtoFS (t: ADDRESS): Ctypes.FloatStar = BEGIN RETURN (LOOPHOLE (t, Ctypes.FloatStar)); END PtoFS; (* Converts a C Pointer into a Modula3 DoubleStar *) PROCEDURE PtoDS (t: ADDRESS): Ctypes.DoubleStar = BEGIN RETURN (LOOPHOLE (t, Ctypes.DoubleStar)); END PtoDS; <*EXTERNAL*> VAR env_argc: INTEGER; env_argv: Argv; BEGIN argc := env_argc; adr_argc := ADR (env_argc); argv := env_argv; null := TtoS(""); nullString := ADR (zeroValue); END M3toC.