home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #20 / NN_1992_20.iso / spool / comp / os / vms / 15012 < prev    next >
Encoding:
Text File  |  1992-09-14  |  9.5 KB  |  264 lines

  1. Path: sparky!uunet!olivea!spool.mu.edu!news.nd.edu!bsu-cs!bsu-ucs.uucp!00mjstum
  2. From: 00mjstum@bsu-ucs.uucp (Matthew J. Stum)
  3. Newsgroups: comp.os.vms
  4. Subject: Re: VAX Pascal and callable mail
  5. Message-ID: <1992Sep14.120352.9516@bsu-ucs.uucp>
  6. Date: 14 Sep 92 17:03:52 GMT
  7. References: <1992Sep9.141711.8781@vax.oxford.ac.uk>
  8. Lines: 254
  9.  
  10. > I've been playing -- rather naively -- with Joe Meadows' callable
  11. > mail materials, but with singular lack of success. I don't know C,
  12. > the language his examples are in, and Pascal fails to perform.
  13. > In fact it won't even compile, sticking at the first mention of a
  14. > MAIL$xxx routine, calling it an undeclared identifier. This is
  15. > despite ``inheriting'' STARLET, which contains the definitions of
  16. > all the MAIL$_xxx codes, but not the MAIL$xxx routines. I've gone
  17. > hunting for definitions of the routines in most of the files in
  18. > SYS$LIBRARY, and there don't seem to be any, not even in MAILDEF.H. 
  19. > Can someone give me a hint, please???
  20.  
  21. The following program (below my sig) is rather specific to a local
  22. application (it extracts SCA Digest messages from NEWMAIL into appropriately
  23. named files), but hopefully you can see how to call the MAIL$ routines
  24. from VAX Pascal.  (I have some nicer, general-purpose VAX Pascal MAIL
  25. routines, but I wrote them before the official documentation came out
  26. so some of the data-structures are seriously gross, but work.)
  27.  
  28. -- 
  29. Matt Stum                    Gwydion ap Myrddin       Ball State University
  30. 00mjstum@leo.bsuvc.bsu.edu   Shire of Afonlyn, MK     Muncie, IN  USA
  31.  
  32. ---------------- CUT HERE ---------------------
  33. [inherit('sys$library:starlet')]
  34. program secretary(input,output);
  35.  
  36. const
  37.   MAIL$_NOMOREREC = 8314792; {can't find this anywhere}
  38.  
  39. type
  40.   uword = [word] 0..65535;
  41.   u255word = [byte] 0..255;
  42.   itmrec_mail = record
  43.                   buf_len : uword;
  44.                   item_code : uword;
  45.                   buf_adr : unsigned;
  46.                   ret_len_adr : unsigned;
  47.                 end;
  48.   itmlst_mail = array [1..10] of itmrec_mail;
  49.   v255string = varying [255] of char;
  50.  
  51. var
  52.  
  53.   stat : unsigned;
  54.   in_itmlst,out_itmlst,null : itmlst_mail;
  55.   mfc,mc,uc : unsigned;
  56.   line : array [1..6] of record
  57.                            line : v255string;
  58.                            a,b:uword;
  59.                          end;
  60.   junk : unsigned;
  61.   i,j : integer;
  62.  
  63.   new_messages : uword;
  64.   messages : integer;
  65.   filename : v255string;
  66.   outfile : text;
  67.  
  68. [external] function mail$mailfile_begin(var context:unsigned;
  69.                     var in_item_list:itmlst_mail;
  70.                     var out_item_list:itmlst_mail):unsigned; extern;
  71. [external] function mail$mailfile_open(var context:unsigned;
  72.                     var in_item_list:itmlst_mail;
  73.                     var out_item_list:itmlst_mail):unsigned; extern;
  74. [external] function mail$mailfile_close(var context:unsigned;
  75.                     var in_item_list:itmlst_mail;
  76.                     var out_item_list:itmlst_mail):unsigned; extern;
  77. [external] function mail$mailfile_end(var context:unsigned;
  78.                     var in_item_list:itmlst_mail;
  79.                     var out_item_list:itmlst_mail):unsigned; extern;
  80.  
  81.  
  82. [external] function mail$message_begin(var context:unsigned;
  83.                     var in_item_list:itmlst_mail;
  84.                     var out_item_list:itmlst_mail):unsigned; extern;
  85. [external] function mail$message_delete(var context:unsigned;
  86.                     var in_item_list:itmlst_mail;
  87.                     var out_item_list:itmlst_mail):unsigned; extern;
  88. [external] function mail$message_get(var context:unsigned;
  89.                     var in_item_list:itmlst_mail;
  90.                     var out_item_list:itmlst_mail):unsigned; extern;
  91. [external] function mail$message_select(var context:unsigned;
  92.                     var in_item_list:itmlst_mail;
  93.                     var out_item_list:itmlst_mail):unsigned; extern;
  94. [external] function mail$message_copy(var context:unsigned;
  95.                     var in_item_list:itmlst_mail;
  96.                     var out_item_list:itmlst_mail):unsigned; extern;
  97. [external] function mail$message_end(var context:unsigned;
  98.                     var in_item_list:itmlst_mail;
  99.                     var out_item_list:itmlst_mail):unsigned; extern;
  100.  
  101. [external] function mail$user_begin(var context:unsigned;
  102.                     var in_item_list:itmlst_mail;
  103.                     var out_item_list:itmlst_mail):unsigned; extern;
  104. [external] function mail$user_set_info(var context:unsigned;
  105.                     var in_item_list:itmlst_mail;
  106.                     var out_item_list:itmlst_mail):unsigned; extern;
  107. [external] function mail$user_end(var context:unsigned;
  108.                     var in_item_list:itmlst_mail;
  109.                     var out_item_list:itmlst_mail):unsigned; extern;
  110.  
  111. begin
  112.  
  113.   null[1] := zero;
  114.   mfc := 0; {MESSAGE FILE CONTEXT}
  115.   mc := 0;  {MESSAGE CONTEXT}
  116.   uc := 0;  {USER CONTEXT}
  117.   stat := mail$mailfile_begin(mfc,null,null);
  118.   stat := mail$mailfile_open(mfc,null,null);
  119.   in_itmlst[1].buf_len := 4;
  120.   in_itmlst[1].item_code := MAIL$_MESSAGE_FILE_CTX;
  121.   in_itmlst[1].buf_adr := iaddress(mfc);
  122.   in_itmlst[1].ret_len_adr := 0;
  123.   in_itmlst[2] := zero;
  124.   stat := mail$message_begin(mc,in_itmlst,null);
  125.  
  126.   line[1].line := 'NEWMAIL';
  127.   in_itmlst[1].buf_len := line[1].line.length;
  128.   in_itmlst[1].item_code := MAIL$_MESSAGE_FOLDER;
  129.   in_itmlst[1].buf_adr := iaddress(line[1].line.body);
  130.   in_itmlst[1].ret_len_adr := 0;
  131.  
  132.   line[2].line := 'IN%"SCA@mc.lcs.mit.edu"';
  133.   in_itmlst[2].buf_len := line[2].line.length;
  134.   in_itmlst[2].item_code := MAIL$_MESSAGE_FROM_SUBSTRING;
  135.   in_itmlst[2].buf_adr := iaddress(line[2].line.body);
  136.   in_itmlst[2].ret_len_adr := 0;
  137.  
  138.   line[3].line := 'IN%"SCA@mc.lcs.mit.edu"';
  139.   in_itmlst[3].buf_len := line[3].line.length;
  140.   in_itmlst[3].item_code := MAIL$_MESSAGE_TO_SUBSTRING;
  141.   in_itmlst[3].buf_adr := iaddress(line[3].line.body);
  142.   in_itmlst[3].ret_len_adr := 0;
  143.  
  144.   line[4].line := 'SCA Digest V';
  145.   in_itmlst[4].buf_len := line[4].line.length;
  146.   in_itmlst[4].item_code := MAIL$_MESSAGE_SUBJ_SUBSTRING;
  147.   in_itmlst[4].buf_adr := iaddress(line[4].line.body);
  148.   in_itmlst[4].ret_len_adr := 0;
  149.  
  150.   in_itmlst[5] := zero;
  151.  
  152.   out_itmlst[1].buf_len := 4;
  153.   out_itmlst[1].item_code := MAIL$_MESSAGE_SELECTED;
  154.   out_itmlst[1].buf_adr := iaddress(messages);
  155.   out_itmlst[1].ret_len_adr := iaddress(junk);
  156.  
  157.   out_itmlst[2] := zero;
  158.  
  159.   stat := mail$message_select(mc,in_itmlst,out_itmlst);
  160.  
  161. writeln('Processing ',messages:1,' messages...');
  162.  
  163.   for i := 1 to messages do
  164.     begin
  165.       in_itmlst[1].buf_len := 0;
  166.       in_itmlst[1].item_code := MAIL$_MESSAGE_NEXT;
  167.       in_itmlst[1].buf_adr := 0;
  168.       in_itmlst[1].ret_len_adr := 0;
  169.  
  170.       in_itmlst[2] := zero;
  171.  
  172.       out_itmlst[1].buf_len := 255;
  173.       out_itmlst[1].item_code := MAIL$_MESSAGE_DATE;
  174.       out_itmlst[1].buf_adr := iaddress(line[1].line.body);
  175.       out_itmlst[1].ret_len_adr := iaddress(line[1].a);
  176.  
  177.       out_itmlst[2].buf_len := 255;
  178.       out_itmlst[2].item_code := MAIL$_MESSAGE_SUBJECT;
  179.       out_itmlst[2].buf_adr := iaddress(line[2].line.body);
  180.       out_itmlst[2].ret_len_adr := iaddress(line[2].a);
  181.  
  182.       out_itmlst[3] := zero;
  183.  
  184.       stat := mail$message_get(mc,in_itmlst,out_itmlst);
  185.       line[1].line.length := line[1].a;
  186.       line[2].line.length := line[2].a;
  187.  
  188.       filename := 'RIALTO$ARCHIVE:DIGEST_V';
  189.       {line[2].line should be "SCA Digest Vn #nnn"}
  190.       line[2].line:=substr(line[2].line,13,line[2].line.length-12);
  191.       j := index(line[2].line,' ');
  192.       if j=2 then filename:=filename+'0';
  193.       filename := filename+substr(line[2].line,1,j-1)+'_';
  194.       j := index(line[2].line,'#');
  195.       line[2].line := substr(line[2].line,j+1,line[2].line.length-j);
  196.       if line[2].line.length=1 then filename:=filename+'000';
  197.       if line[2].line.length=2 then filename:=filename+'00';
  198.       if line[2].line.length=3 then filename:=filename+'0';
  199.       filename := filename+line[2].line+'.TXT';
  200.  
  201.       open(file_name := filename,
  202.            file_variable := outfile,
  203.            history := new);
  204.       rewrite(outfile);
  205.  
  206.       writeln(outfile,'Date:   ',line[1].line);
  207.  
  208.       in_itmlst[1].buf_len := 0;
  209.       in_itmlst[1].item_code := MAIL$_MESSAGE_CONTINUE;
  210.       in_itmlst[1].buf_adr := 0;
  211.       in_itmlst[1].ret_len_adr := 0;
  212.  
  213.       in_itmlst[2].buf_len := 0;
  214.       in_itmlst[2].item_code := MAIL$_MESSAGE_AUTO_NEWMAIL;
  215.       in_itmlst[2].buf_adr := 0;
  216.       in_itmlst[2].ret_len_adr := 0;
  217.  
  218.       in_itmlst[3] :=  zero;
  219.  
  220.       out_itmlst[1].buf_len := 255;
  221.       out_itmlst[1].item_code := MAIL$_MESSAGE_RECORD;
  222.       out_itmlst[1].buf_adr := iaddress(line[1].line.body);
  223.       out_itmlst[1].ret_len_adr := iaddress(line[1].a);
  224.  
  225.       out_itmlst[2] := zero;
  226.  
  227.       repeat
  228.           stat := MAIL$MESSAGE_GET(mc,in_itmlst,out_itmlst);
  229.           if stat<>MAIL$_NOMOREREC then
  230.             begin
  231.               line[1].line.length := line[1].a;
  232.               writeln(outfile,line[1].line);
  233.             end;
  234.       until stat=MAIL$_NOMOREREC;
  235.       close(outfile);
  236.  
  237.       out_itmlst[1].buf_len := 2;
  238.       out_itmlst[1].item_code := MAIL$_USER_NEW_MESSAGES;
  239.       out_itmlst[1].buf_adr := iaddress(new_messages);
  240.       out_itmlst[1].ret_len_adr := iaddress(junk);
  241.  
  242.       out_itmlst[2] := zero;
  243.  
  244.       stat := mail$user_begin(uc,null,out_itmlst);
  245.       new_messages := new_messages - 1;
  246.  
  247.       in_itmlst[1].buf_len := 2;
  248.       in_itmlst[1].item_code := MAIL$_USER_SET_NEW_MESSAGES;
  249.       in_itmlst[1].buf_adr := iaddress(new_messages);
  250.       in_itmlst[1].ret_len_adr := 0;
  251.  
  252.       in_itmlst[2] :=  zero;
  253.  
  254.       stat := mail$user_set_info(uc,in_itmlst,null);
  255.       stat := mail$user_end(uc,null,null);
  256.     end;
  257.  
  258.   stat := mail$message_end(mc,null,null);
  259.   stat := mail$mailfile_end(mfc,null,null);
  260.  
  261. end.
  262.