Dynamic Loading Program Example [ Resource Management Programmer's Guide ] MPE/iX 5.0 Documentation
Resource Management Programmer's Guide
Appendix A Dynamic Loading Program Example
This HP Pascal/XL program example illustrates the use of the
HPGETPROCPLABEL intrinsic.
HPGETPROCPLABEL returns the plabel of the COMMAND intrinsic. The program
requests the user to input the name of a CI command. Both the plabel and
the CI command are passed to the HP Pascal/XL CALL procedure which calls
COMMAND and directs it to execute the user-specified CI command.
$standard_level 'FULL_MODCAL'$
$type_coercion 'NONCOMPATIBLE'$
$tables off$
PROGRAM hpgetprocplabel_test(input, output);
TYPE
c80 = packed array [1..80] of char;
mpexl_status = record
case integer of
0 : (all : integer);
1 : (info : shortint;
subsys : shortint);
end;
Proc_Type = procedure(VAR command : c80; VAR error, parm : shortint);
Proc_Name_Type = string[[32]];
File_Name_Type = packed array [1..36] of char;
bit32 = minint..maxint;
{ bit32 = 0..4294967295; }
VAR
status : mpexl_status;
Proc_Name : Proc_Name_Type;
plabel : bit32;
Invoke_Proc : Proc_Type;
command_str : string[[80]];
command : c80;
str_cr : string[[ 1 ]];
cr : packed array [1..1] of char;
error, parm : shortint;
cicat : shortint;
catname : File_Name_Type;
PROCEDURE hpgetprocplabel; INTRINSIC;
PROCEDURE fclose; INTRINSIC;
FUNCTION fopen : shortint; INTRINSIC;
PROCEDURE genmessage; INTRINSIC;
PROCEDURE terminate; INTRINSIC;
000 begin
001 Proc_Name := ' COMMAND ';
002 writeln('About to call hpgetprocplabel');
003
004 hpgetprocplabel(Proc_Name, plabel, status);
005
006 if (status.all <> 0) or
007 (ccode <> 2) then
008 begin
009 writeln('status.subsys:', status.subsys);
010 writeln('status.info: ', status.info);
011 end
012 else
013 begin
014 writeln('hpgetprocplabel successfully called');
015 end;
016
017 Invoke_Proc := Proc_Type(plabel); { coerce 32 bit ptr to 64 bit }
018
019 prompt('Enter MPE XL Command:');
020 readln(command_str);
021 cr[[ 1 ]] := chr(13);
022 strmove(1, cr, 1, str_cr, 1);
023 strappend(command_str, str_cr);
024 strmove(strlen(command_str), command_str, 1, command, 1);
025
026 CALL(Invoke_Proc, command, error, parm);
027
028 if error <> 0 then
029 begin
030 writeln('Error in command:', command);
031 catname := 'catalog.pub.sys ';
032 cicat := fopen(catname, 5, octal('420'));
033 genmessage(cicat, 2, abs(error));
034 fclose(cicat, 0, 0);
035 end;
036
037 end.
MPE/iX 5.0 Documentation