Previous | Contents | Index |
The programs shown in Examples 2-11 and 2-12 use an input procedure as the source for the body of a message to be sent. In the Pascal program example, the procedure msg_proc
will continue to read input until a blank line is entered at which point the message will be sent. In the C program example, the input proocedure msg_proc
will read input until the run-time library routine fgets() signals an EOF (e.g., a control-Z has been input). In both programs, the address of the procedure msg_proc is passed to PMDF_send
via a PMDF_MSG_PROC
item code and PMDF_send
itself repeatedly calls the procedure until a value of 0
is returned by the procedure.
Example 2-11 Using an Input Procedure (Pascal) |
---|
(* send_example7.pas -- Demonstrate the use of PMDF_MSG_PROC *) [inherit ('pmdf_exe:apidef')] program send_example7 (input, output); type string = varying [ALFA_SIZE] of char; string_ptr = ^string; var item_index : integer := 0; item_list : array [1..4] of PMDF_item_list; subject : string := 'PMDF callable SEND example'; to_adr : string := 'system'; function SYS$EXIT (%immed status : integer := %immed 1) : integer; extern; (* Push an entry onto the item list *) procedure push (code : integer; adr : unsigned; len : integer); begin (* push *) item_index := succ (item_index); with item_list[item_index] do begin item_code := code; item_address := adr::$stringptr; item_length := len; end; (* with *) end; (* push *) function msg_proc (var str_i : integer; var str_len : integer) : integer; type chars = packed array [1..BIGALFA_SIZE] of char; char_ptr = ^chars; var buffer : string; i : integer; str : char_ptr; begin (* msg_proc *) write ('input: '); readln (buffer); if buffer.length = 0 then begin str_len := 0; msg_proc := 0; end else begin str := (iaddress (str_i))::char_ptr; str_len := min (buffer.length, str_len); for i := 1 to str_len do str^[i] := buffer[i]; msg_proc := 1; end; (* if *) end; (* msg_proc *) begin (* send_example7 *) push (PMDF_SUBJECT, iaddress (subject.body), subject.length); push (PMDF_TO, iaddress (to_adr.body), to_adr.length); push (PMDF_MSG_PROC, iaddress (msg_proc), 4); push (PMDF_END_LIST, 0, 0); SYS$EXIT (PMDF_send ((iaddress (item_list))::PMDF_item_list_ptr)); end. (* send_example7 *) |
Example 2-12 Using an Input Procedure (C) |
---|
/* send_example8.c -- Demonstrate the use of PMDF_MSG_PROC */ #include <stdio.h> #include <stdlib.h> #include <string.h> #ifdef __VMS #include "pmdf_com:apidef.h" #else #include "/pmdf/include/apidef.h" #endif /* Push an entry onto the item list */ #define ITEM(item,adr,len) item_list[item_index].item_code = (item); \ item_list[item_index].item_address = (char *)(adr); \ item_list[item_index].item_length = (len); \ item_index++ int msg_proc (char *str, int *str_len) { printf ("input: "); if (fgets (str, *str_len, stdin)) { *str_len = strlen (str); if (str[*str_len-1] == '\n') *str_len -= 1; return (1); } else { *str_len = 0; return (0); } } main () { int istat, item_index = 0; PMDF_item_list item_list[4]; char *subject = "PMDF callable SEND example"; #ifdef _VMS char *to_adr = "system"; #else char *to_adr = "root"; #endif if (!(1 & (istat = PMDFinitialize (0)))) exit (istat); ITEM (PMDF_SUBJECT, subject, strlen (subject)); ITEM (PMDF_TO, to_adr, strlen (to_adr)); ITEM (PMDF_MSG_PROC, msg_proc, 4); ITEM (PMDF_END_LIST, 0, 0); exit (PMDF_send (item_list)); } |
Previous | Next | Contents | Index |