home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / CPM / TURBOPAS / TBBS22.LBR / TBBSMSG.IQC / TBBSMSG.INC
Text File  |  2000-06-30  |  10KB  |  396 lines

  1. { TBBSMSG.INC - Turbo Bulletin Board System message routines }
  2.  
  3. procedure mesg_find(num: integer);
  4. begin
  5.   MesgCurr := MesgBase;
  6.   while (MesgCurr <> nil) and (MesgCurr^.MesgNo < num) do
  7.     MesgCurr := MesgCurr^.next
  8. end;
  9.  
  10. procedure mesg_insert;
  11. var
  12.   here: MesgPointer;
  13. begin
  14.   new(here);
  15.   if MesgBase = nil
  16.     then MesgBase := here
  17.     else MesgLast^.next := here;
  18.   MesgLast := here;
  19.   MesgLast^.MesgNo := summ_rec.summ_num;
  20.   MesgLast^.SummLoc := FilePos(summ_file) - 1;
  21.   MesgLast^.next := nil
  22. end;
  23.  
  24. procedure mesg_delete;
  25. var
  26.   here: MesgPointer;
  27. begin
  28.   if MesgCurr = MesgBase
  29.     then MesgBase := MesgBase^.next
  30.   else if MesgCurr <> nil
  31.     then
  32.       begin
  33.         here := MesgBase;
  34.         while here^.next <> MesgCurr do
  35.           here := here^.next;
  36.         here^.next := MesgCurr^.next;
  37.         if MesgLast = MesgCurr
  38.           then MesgLast := here;
  39.         dispose(MesgCurr)
  40.       end
  41. end;
  42.  
  43. procedure mesg_print(last_line: integer);
  44. { Display message currently being edited }
  45. var
  46.   i: integer;
  47. begin
  48.   writeln;
  49.   for i := 1 to last_line do
  50.     writeln(i, ': ', mesg_array[i])
  51. end;
  52.  
  53. procedure mesg_edit(last_line: integer);
  54. { Simple line-replacement 'editor' }
  55. var
  56.   i: integer;
  57.   msg: message;
  58. begin
  59.   writeln;
  60.   i := strint(prompt('Line number: ', 5, 'E'));
  61.   if (1 <= i) and (i <= last_line)
  62.     then
  63.       begin
  64.         writeln(i, ': ', mesg_array[i]);
  65.         writeln('Enter new line (C/R for no change):');
  66.         msg := prompt(intstr(i) + ': ', len_msg, 'EA');
  67.         if msg <> ''
  68.           then mesg_array[i] := msg;
  69.       end
  70.     else writeln('Line not found')
  71. end;
  72.  
  73. procedure mesg_in(var last_line: integer);
  74. { Input message }
  75. var
  76.   msg: message;
  77. begin
  78.   msg := ' ';
  79.   writeln;
  80.   while (last_line <= Max_lines) and (msg <> '') and (not brk) do
  81.     begin
  82.       msg := prompt(intstr(last_line) + ': ', len_msg, 'EA');
  83.       if msg <> ''
  84.         then
  85.           begin
  86.             mesg_array[last_line] := msg;
  87.             last_line := last_line + 1
  88.           end
  89.     end
  90. end;
  91.  
  92. procedure mesg_save(to_num: integer; subj: subject; last_line: integer;
  93.   var stop_msg: boolean);
  94. { Save message to disk }
  95. var
  96.   i, start: integer;
  97.   file_time: tad_array;
  98.   st: StdStr;
  99. begin
  100.   GetTAD(file_time);
  101.   st := systad(file_time);
  102.   start := filesize(mesg_file);
  103.   seek(summ_file, 0);
  104.   read(summ_file, summ_rec);
  105.   with summ_rec do
  106.     begin
  107.       summ_num      := summ_num + 1;
  108.       summ_date     := file_time;
  109.       summ_from_num := user_loc;
  110.       summ_to_num   := to_num;
  111.       summ_subject  := subj;
  112.       summ_st_rec   := start;
  113.       summ_size     := last_line
  114.     end;
  115.   seek(summ_file, 0);
  116.   write(summ_file, summ_rec);
  117.   seek(summ_file, filesize(summ_file));
  118.   write(summ_file, summ_rec);
  119.  
  120.   mesg_insert;
  121.  
  122.   seek(mesg_file, start);
  123.   for i := 1 to last_line do
  124.     begin
  125.       mesg_rec.mesg_text := mesg_array[i];
  126.       write(mesg_file, mesg_rec)
  127.     end;
  128.  
  129.   Close(summ_file);          { in case user hangs up }
  130.   Close(mesg_file);
  131.   Reset(summ_file);
  132.   Reset(mesg_file);
  133.  
  134.   writeln;
  135.   writeln('Message ', summ_rec.summ_num, ' filed at ', st);
  136.   stop_msg := TRUE
  137. end;
  138.  
  139. procedure mesg_quit(var stop_msg: boolean);
  140. { Return to command mode }
  141. begin
  142.   writeln;
  143.   writeln('Aborted.');
  144.   stop_msg := TRUE
  145. end;
  146.  
  147. procedure mesg_header_list(var start, last_line: integer);
  148. { Display message header }
  149. var
  150.   st: StdStr;
  151.   to_fn, fr_fn: firstname;
  152.   to_ln, fr_ln: lastname;
  153.   user_rec: user_list;
  154. begin
  155.   seek(summ_file, MesgCurr^.SummLoc);
  156.   read(summ_file, summ_rec);
  157.   with summ_rec, user_rec do
  158.     begin
  159.       if summ_to_num = mesg_pub
  160.         then
  161.           begin
  162.             to_fn := 'ALL';
  163.             to_ln := ''
  164.           end
  165.       else if summ_to_num = user_loc
  166.         then
  167.           begin
  168.             to_fn := fn;
  169.             to_ln := ln
  170.           end
  171.         else
  172.           begin
  173.             GetRec(DatF, summ_to_num, user_rec);
  174.             to_fn := user_firstname;
  175.             to_ln := user_lastname
  176.           end;
  177.       if summ_from_num = user_loc
  178.         then
  179.           begin
  180.             fr_fn := fn;
  181.             fr_ln := ln
  182.           end
  183.         else
  184.           begin
  185.             GetRec(DatF, summ_from_num, user_rec);
  186.             fr_fn := user_firstname;
  187.             fr_ln := user_lastname
  188.           end;
  189.       st := systad(summ_date);
  190.       writeln;
  191.       writeln('Message number ', summ_num, ' entered ', st, '.');
  192.       writeln('From: ', fr_fn, ' ', fr_ln);
  193.       writeln('  To: ', to_fn, ' ', to_ln);
  194.       writeln('  Re: ', summ_subject);
  195.       start := summ_st_rec;
  196.       last_line := summ_size
  197.     end
  198. end;
  199.  
  200. procedure mesg_text_list(start, last_line: integer);
  201. var
  202.   i: integer;
  203. begin
  204.   seek(mesg_file, start);
  205.   for i := 1 to last_line do
  206.     begin
  207.       read(mesg_file, mesg_rec);
  208.       writeln(mesg_rec.mesg_text)
  209.     end;
  210.   seek(summ_file, MesgCurr^.SummLoc);
  211.   read(summ_file, summ_rec);
  212.   if (user_loc = summ_rec.summ_from_num) or
  213.      (user_loc = summ_rec.summ_to_num) or
  214.      (fn = 'SYSOP')
  215.     then if ask('Do you wish to ERASE this message')
  216.       then
  217.         begin
  218.           summ_rec.summ_to_num := mesg_era;
  219.           seek(summ_file, MesgCurr^.SummLoc);
  220.           write(summ_file, summ_rec);
  221.           mesg_delete;
  222.           writeln('Erased.')
  223.         end
  224.       else writeln('Retained.')
  225. end;
  226.  
  227. procedure mesg_enter(comment: boolean);
  228. { Enter a new message }
  229. var
  230.   stop_msg: boolean;
  231.   last_line, to_loc: integer;
  232.   st: StdStr;
  233.   to_fn: firstname;
  234.   to_ln: lastname;
  235.   subj: subject;
  236. begin
  237.   repeat
  238.     writeln;
  239.     if (bbs_stat = 0) or (comment)
  240.       then
  241.         begin
  242.           to_fn := 'SYSOP';
  243.           writeln('To: ', to_fn)
  244.         end
  245.       else to_fn := prompt('To FIRST name (<RET> for ALL): ', len_fn, 'ES');
  246.     if to_fn = ''
  247.       then to_loc := mesg_pub
  248.       else
  249.         begin
  250.           if to_fn = 'SYSOP'
  251.             then to_ln := ''
  252.             else to_ln := prompt('LAST name: ', len_ln, 'ES');
  253.           to_loc := find_user(to_fn, to_ln);
  254.           if to_loc = -1
  255.             then
  256.               begin
  257.                 writeln(to_fn, ' ', to_ln, ' not known on system.');
  258.                 to_loc := -2
  259.               end
  260.         end
  261.   until to_loc >= -1;
  262.   if bbs_stat = 0
  263.     then
  264.       begin
  265.         subj := 'NEW USER';
  266.         writeln('Subject: ', subj)
  267.       end
  268.     else subj := prompt('Subject: ', len_subj, 'ES');
  269.   writeln;
  270.   writeln('To re-enter command mode, enter empty line (C/R only).');
  271.   writeln('Enter message (', Max_Lines, ' line limit):');
  272.   last_line := 1;
  273.   mesg_in(last_line);
  274.   stop_msg := FALSE;
  275.   repeat
  276.     writeln;
  277.     st := prompt('(L)ist, (E)dit, (C)ontinue, (S)ave, (Q)uit? ', 1, 'AES');
  278.     case st[1] of
  279.       'L': mesg_print(last_line - 1);
  280.       'E': mesg_edit(last_line - 1);
  281.       'C': mesg_in(last_line);
  282.       'S': mesg_save(to_loc, subj, last_line - 1, stop_msg);
  283.       'Q': mesg_quit(stop_msg);
  284.       else writeln(st, '?')
  285.     end
  286.   until stop_msg
  287. end;
  288.  
  289. function mesg_start(pr: StdStr): integer;
  290. { Get starting message number from user }
  291. var
  292.   i, lo, hi: integer;
  293. begin
  294.   if MesgBase = nil
  295.     then
  296.       begin
  297.         lo := 0;
  298.         hi := 0
  299.       end
  300.     else
  301.       begin
  302.         lo := MesgBase^.MesgNo;
  303.         hi := MesgLast^.MesgNo
  304.       end;
  305.   i := strint(prompt(pr + ' [' + intstr(lo) + '-' + intstr(hi) + ']? ', 5, 'E'));
  306.   if (i < lo) or (i > hi)
  307.     then i := lo;
  308.   mesg_start := i
  309. end;
  310.  
  311. procedure mesg_quick_scan;
  312. { Print abbreviated summary of messages }
  313. var
  314.   private: boolean;
  315.   sep: StdStr;
  316. begin
  317.   private := FALSE;
  318.   mesg_find(mesg_start('Start'));
  319.   writeln;
  320.   while (MesgCurr <> nil) and (not brk) do
  321.     begin
  322.       seek(summ_file, MesgCurr^.SummLoc);
  323.       read(summ_file, summ_rec);
  324.       if summ_rec.summ_to_num = mesg_pub
  325.         then sep := ': '
  326.         else
  327.           begin
  328.             sep := '* ';
  329.             private := TRUE
  330.           end;
  331.       writeln(summ_rec.summ_num, sep, summ_rec.summ_subject);
  332.       MesgCurr := MesgCurr^.next
  333.     end;
  334.   if private
  335.     then
  336.       begin
  337.         writeln;
  338.         writeln('"*" indicates a private message.')
  339.       end
  340. end;
  341.  
  342. procedure mesg_summary;
  343. { Message summary }
  344. var
  345.   start, last_line: integer;
  346. begin
  347.   mesg_find(mesg_start('Start'));
  348.   while (MesgCurr <> nil) and (not brk) do
  349.     begin
  350.       mesg_header_list(start, last_line);
  351.       MesgCurr := MesgCurr^.next
  352.     end
  353. end;
  354.  
  355. procedure mesg_read;
  356. { Read message }
  357. var
  358.   i, start, last_line: integer;
  359. begin
  360.   i := mesg_start('Message');
  361.   mesg_find(i);
  362.   if MesgCurr^.MesgNo = i
  363.     then
  364.       begin
  365.         mesg_header_list(start, last_line);
  366.         mesg_text_list(start, last_line)
  367.       end
  368.     else writeln('Not found.')
  369. end;
  370.  
  371. procedure mesg_build_index;
  372. { Scan summary file and build message index list }
  373. begin
  374.   msg_all := 0;
  375.   msg_ind := 0;
  376.   MesgBase := nil;
  377.   seek(summ_file, 1);
  378.   while not EOF(summ_file) do
  379.     begin
  380.       read(summ_file, summ_rec);
  381.       if summ_rec.summ_to_num = mesg_pub                 { public message }
  382.         then
  383.           begin
  384.             msg_all := succ(msg_all);
  385.             mesg_insert
  386.           end
  387.       else if (summ_rec.summ_to_num = user_loc)          { private message }
  388.           or ((summ_rec.summ_to_num <> mesg_era) and (fn = 'SYSOP'))
  389.         then
  390.           begin
  391.             msg_ind := succ(msg_ind);
  392.             mesg_insert
  393.           end
  394.     end
  395. end;
  396.