home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / beehive / bbs / rosuncr.arc / ROSKOV.INC < prev    next >
Text File  |  1991-08-11  |  17KB  |  517 lines

  1. { ROSKOV.INC - Remote Operating System Kernel Overlayed Routines }
  2.  
  3. { 10dec87 wb - Modified LIST procedure to get sysmsg file search keys from
  4.   global array instead of heap.
  5. }
  6.  
  7. overlay procedure list(ch: char);
  8. { List a portion of the system message file }
  9.   var
  10.     line_count: integer;
  11.     this: SysmPtr;
  12.   begin
  13.     this := SysmBase;
  14.     while (this <> nil) and (this^.key <> ch) do
  15.       this := this^.next;
  16.     if this^.key = ch
  17.       then
  18.         begin
  19.           writeln(USR);
  20.           seek(sysm_file, succ(this^.loc));
  21.           read(sysm_file, sysm_rec);
  22.           line_count := 0;
  23.           while (not brk) and (not EOF(sysm_file)) and (sysm_rec[1] <> ':') do
  24.             begin
  25.               writeln(USR, sysm_rec);
  26.               read(sysm_file, sysm_rec);
  27.               if user_rec.lines <> 99
  28.                 then
  29.                   begin
  30.                     line_count := succ(line_count);
  31.                     if line_count mod user_rec.lines = 0
  32.                       then pause
  33.                   end
  34.             end
  35.         end
  36.   end;
  37.  
  38. { var
  39.     i,line_count: integer;
  40.   begin
  41.     i:=0;
  42.     while (i <= sysm_entries) and (sysm[i].key <> ch) do
  43.       i:=i+1;
  44.     if sysm[i].key = ch
  45.       then
  46.         begin
  47.           writeln(USR);
  48.           seek(sysm_file, succ(sysm[i].loc));
  49.           read(sysm_file, sysm_rec);
  50.           line_count := 0;
  51.           while (not brk) and (not EOF(sysm_file)) and (sysm_rec[1] <> ':') do
  52.             begin
  53.               writeln(USR, sysm_rec);
  54.               read(sysm_file, sysm_rec);
  55.               if user_rec.lines <> 99
  56.                 then
  57.                   begin
  58.                     line_count := succ(line_count);
  59.                     if line_count mod user_rec.lines = 0
  60.                       then pause
  61.                   end
  62.             end
  63.         end
  64.   end;
  65. }
  66.  
  67. overlay function correct_fn(str: FileName): FileName;
  68. { Correct possible errors in file name }
  69.   var
  70.     i, j: integer;
  71.   begin
  72.     i := 1;                                 { Remove blanks and invalid characters }
  73.     while i <= length(str) do
  74.       if str[i] in [' ', '*', ',', ':', ';', '=', '?', '_']
  75.         then delete(str, i, 1)
  76.         else i := succ(i);
  77.     while (str <> '') and (str[1] = '.') do { Remove leading '.' }
  78.       delete(str, 1, 1);
  79.     i := pos('.', str);                     { Remove redundant '.' }
  80.     j := 1;
  81.     while j <= length(str) do
  82.       if (str[j] = '.') and (j > i)
  83.         then delete(str, j, 1)
  84.         else j := succ(j);
  85.     i := pos('.', str);
  86.     if i = 0                                { Ensure name has '.' }
  87.       then
  88.         begin
  89.           str := copy(str, 1, 8);           { Ensure file name <= 8 characters }
  90.           if length(str) > 0
  91.             then str := str + '.'
  92.         end
  93.       else str := copy(str, 1, min(8, pred(i))) + '.' +
  94.                   copy(str, succ(i), min(3, length(str) - i));
  95.     correct_fn := str
  96.   end;
  97.  
  98. overlay function compress_fn(name: FileName): FileName;
  99. { Strip hi bits and remove all blanks from file name }
  100.   var
  101.     i: integer;
  102.   begin
  103.     for i := 1 to length(name) do
  104.       name[i] := chr($7F and ord(name[i]));
  105.     i := pos(' ', name);
  106.     while i > 0 do
  107.       begin
  108.         delete(name, i, 1);
  109.         i := pos(' ', name)
  110.       end;
  111.     compress_fn := name
  112.   end;
  113.  
  114. overlay procedure get_name(var fn: firstname; var ln: lastname);
  115. { Get user name }
  116.   begin
  117.     writeln(USR);
  118.     repeat
  119.       fn := trim(prompt('FIRST name', len_fn, 'ES'))
  120.     until (not online) or (fn <> '');
  121.     if fn = 'SYSOP'
  122.       then ln := ''
  123.       else
  124.         repeat
  125.           ln := trim(prompt(' LAST name', len_ln, 'ES'))
  126.         until (not online) or (ln <> '')
  127.   end;
  128.  
  129. overlay procedure get_old_password(pr: StrPr; var valid: boolean);
  130. { Accept and validate old password.  Only 'Max_Tries' will be allowed. }
  131.   var
  132.     tries: integer;
  133.   begin
  134.     tries := 1;
  135.     repeat
  136.       valid := (user_rec.pw = prompt(pr, len_pw, 'S'));
  137.       tries := succ(tries)
  138.     until (not online) or valid or (tries > Max_Tries);
  139.     if not valid
  140.       then writeln(USR, 'Only ', Max_Tries, ' tries allowed.')
  141.   end;
  142.  
  143. overlay procedure get_new_password;
  144. { Accept and validate new password. }
  145.   var
  146.     i: integer;
  147.     trial_pw: password;
  148.   begin
  149.     writeln(USR);
  150.     writeln(USR, 'Please select and enter a password of 4-', len_pw, ' characters');
  151.     writeln(USR, 'to ensure that no one else uses your name on the system.');
  152.     writeln(USR);
  153.     repeat
  154.       repeat
  155.         trial_pw := prompt('Password (will NOT display as you type)', len_pw, 'S');
  156.         i := length(trial_pw);
  157.         if (i < 4) or (i > len_pw)
  158.           then writeln(USR, 'Length must be 4-', len_pw, ' characters.');
  159.       until (not online) or ((4 <= i) and (i <= len_pw));
  160.       user_rec.pw := prompt(' Please enter it again for verification', len_pw, 'S');
  161.       if user_rec.pw <> trial_pw
  162.         then writeln(USR, 'No match.  Try again.')
  163.     until (not online) or (user_rec.pw = trial_pw);
  164.     writeln(USR);
  165.     writeln(USR, 'Please remember your password.');
  166.     writeln(USR, 'It will be required for all future calls.')
  167.   end;
  168.  
  169. overlay procedure get_case;
  170. { Get case switch from user }
  171.   begin
  172.     user_rec.shift_lock := not ask('Can your terminal display lower case')
  173.   end;
  174.  
  175. overlay procedure get_nulls;
  176. { Get nulls from user }
  177.   begin
  178.     user_rec.nulls := strint(prompt('How many nulls do you need [0-9]?', 1, 'AES'))
  179.   end;
  180.  
  181. overlay function mesg_start(pr: StrPr): integer;
  182. { Get starting message number from user }
  183.   var
  184.     i, lo, hi: integer;
  185.   begin
  186.     if MesgBase = nil
  187.       then
  188.         begin
  189.           lo := 0;
  190.           hi := 0
  191.         end
  192.       else
  193.         begin
  194.           lo := MesgBase^.MesgNo;
  195.           hi := MesgLast^.MesgNo
  196.         end;
  197.     i := strint(prompt(pr + ' [' + intstr(lo, 1) + '-' + intstr(hi, 1) + ']?', 5, 'E'));
  198.     if (i < lo) or (i > hi)
  199.       then
  200.         begin
  201.           i := succ(user_rec.lasthi);
  202.           writeln(USR, 'Starting after last high message (# ', user_rec.lasthi, ')...')
  203.         end;
  204.     mesg_start := i
  205.   end;
  206.  
  207. overlay procedure mesg_header_list(loc: integer; var first_line, last_line: integer);
  208. { Display message header }
  209.   var
  210.     to_fn, fr_fn: firstname;
  211.     to_ln, fr_ln: lastname;
  212.     str: StrTAD;
  213.     temp_user_rec: user_list;
  214.   begin
  215.     seek(summ_file, loc);
  216.     read(summ_file, summ_rec);
  217.     with summ_rec do
  218.       begin
  219.         if user_to = 0
  220.           then
  221.             begin
  222.               to_fn := 'ALL';
  223.               to_ln := ''
  224.             end
  225.         else if user_to = user_loc
  226.           then
  227.             begin
  228.               to_fn := user_rec.fn;
  229.               to_ln := user_rec.ln
  230.             end
  231.           else
  232.             begin
  233.               GetRec(DatF, user_to, temp_user_rec);
  234.               to_fn := temp_user_rec.fn;
  235.               to_ln := temp_user_rec.ln
  236.             end;
  237.         if user_from = user_loc
  238.           then
  239.             begin
  240.               fr_fn := user_rec.fn;
  241.               fr_ln := user_rec.ln
  242.             end
  243.           else
  244.             begin
  245.               GetRec(DatF, user_from, temp_user_rec);
  246.               fr_fn := temp_user_rec.fn;
  247.               fr_ln := temp_user_rec.ln
  248.             end;
  249.         str := FormTAD(date);
  250.         writeln(USR);
  251.         case status of
  252.           deleted: write(USR, 'Deleted');
  253.           read:    write(USR, 'Read');
  254.           private: write(USR, 'Private');
  255.           public:  write(USR, 'Public')
  256.         end;
  257.         writeln(USR, ' message # ', num, ' entered ', str);
  258.         writeln(USR, 'From: ', fr_fn, ' ', fr_ln);
  259.         writeln(USR, '  To: ', to_fn, ' ', to_ln);
  260.         writeln(USR, '  Re: ', subject);
  261.         if audit_on
  262.           then
  263.             begin
  264.               writeln(AuditFile);
  265.               case status of
  266.                 deleted: write(AuditFile, 'Deleted');
  267.                 read:    write(AuditFile, 'Read');
  268.                 private: write(AuditFile, 'Private');
  269.                 public:  write(AuditFile, 'Public')
  270.               end;
  271.               writeln(AuditFile, ' message # ', num, ' entered ', str);
  272.               writeln(AuditFile, 'From: ', fr_fn, ' ', fr_ln);
  273.               writeln(AuditFile, '  To: ', to_fn, ' ', to_ln);
  274.               writeln(AuditFile, '  Re: ', subject)
  275.             end;
  276.         first_line := st_rec;
  277.         last_line := size
  278.       end
  279.   end;
  280.  
  281. overlay procedure mesg_delete;
  282. { Delete the current message }
  283.   var
  284.     this: MesgPtr;
  285.   begin
  286.     summ_rec.status := deleted;
  287.     seek(summ_file, pred(FilePos(summ_file)));
  288.     write(summ_file, summ_rec);
  289.     this := MesgCurr;
  290.     if MesgCurr = MesgBase
  291.       then
  292.         begin
  293.           MesgCurr := MesgBase^.next;
  294.           MesgBase := MesgBase^.next;
  295.           dispose(this)
  296.         end
  297.     else if MesgCurr <> nil
  298.       then
  299.         begin
  300.           MesgCurr := MesgBase;             { Find previous record }
  301.           while MesgCurr^.next <> this do
  302.             MesgCurr := MesgCurr^.next;
  303.           MesgCurr^.next := this^.next;     { Make it point to next record }
  304.           if MesgLast = this
  305.             then MesgLast := MesgCurr;
  306.           MesgCurr := MesgCurr^.next;
  307.           dispose(this)
  308.         end;
  309.     writeln(USR, 'Message #', summ_rec.num, ' deleted.')
  310.   end;
  311.  
  312. overlay procedure mesg_build_index(mesg_area: byte);
  313. { Scan summary file and build message index list.  Public messages are tied
  314.   to the current message area.  Private and authored messages are independent
  315.   of area.  All messages are accessible in mesg_area #0 (SYSTEM). }
  316.   var
  317.     this: MesgPtr;
  318.   begin
  319.     while MesgBase <> nil do                { Delete old messages }
  320.       begin
  321.         this := MesgBase;
  322.         MesgBase := MesgBase^.next;         { Go to next on list }
  323.         dispose(this)                       { Reclaim space }
  324.       end;
  325.     msg_all := 0;
  326.     msg_ind := 0;
  327.     msg_aut := 0;
  328.     msg_sys := 0;
  329.     seek(summ_file, 1);
  330.     while not EOF(summ_file) do
  331.       with summ_rec do
  332.         begin
  333.           read(summ_file, summ_rec);
  334.           if (status = public) and (area = mesg_area)
  335.             then
  336.               begin                         { Public message }
  337.                 msg_all := succ(msg_all);
  338.                 mesg_insert(0)
  339.               end
  340.           else if (status <> deleted) and (user_loc = user_to)
  341.             then
  342.               begin                         { Private message }
  343.                 msg_ind := succ(msg_ind);
  344.                 mesg_insert(1)
  345.               end
  346.           else if (status <> deleted) and (user_loc = user_from)
  347.             then
  348.               begin                         { Author of message }
  349.                 msg_aut := succ(msg_aut);
  350.                 mesg_insert(2)
  351.               end
  352.           else if mesg_area = 0
  353.             then
  354.               begin                         { Sysop can view all messages }
  355.                 msg_sys := succ(msg_sys);
  356.                 mesg_insert(3)
  357.               end
  358.         end;
  359.     summ_rec.user_from := 0
  360.   end;
  361.  
  362. overlay procedure mesg_directory;
  363. { Display directory of messages }
  364.   const
  365.     col_width = 6;
  366.   var
  367.     hi, col_count, col_limit: integer;
  368.   begin
  369.     col_limit := max(1, user_rec.columns div col_width);
  370.     if MesgBase = nil
  371.       then hi := 0
  372.       else hi := MesgLast^.MesgNo;
  373.     writeln(USR, 'High message now  : ', hi);
  374.     writeln(USR, 'Public messages   : ', msg_all);
  375.     writeln(USR);
  376.     if msg_ind = 0
  377.       then writeln(USR, user_rec.fn, ', no messages for you at this time.')
  378.       else
  379.         begin
  380.           writeln(USR, user_rec.fn, ', the following messages are addressed to you:');
  381.           col_count := 0;
  382.           MesgCurr := MesgBase;
  383.           while (not brk) and (MesgCurr <> nil) do
  384.             begin
  385.               if MesgCurr^.TypMsg = 1
  386.                 then
  387.                   begin
  388.                     write(USR, MesgCurr^.MesgNo:col_width);
  389.                     col_count := succ(col_count);
  390.                     if (0 = col_count mod col_limit)
  391.                       then writeln(USR)
  392.                   end;
  393.               MesgCurr := MesgCurr^.next
  394.             end;
  395.           writeln(USR)
  396.         end;
  397.     if msg_aut > 0
  398.       then
  399.         begin
  400.           writeln(USR, user_rec.fn, ', the following messages were sent by you:');
  401.           col_count := 0;
  402.           MesgCurr := MesgBase;
  403.           while (not brk) and (MesgCurr <> nil) do
  404.             begin
  405.               if MesgCurr^.TypMsg = 2
  406.                 then
  407.                   begin
  408.                     write(USR, MesgCurr^.MesgNo:col_width);
  409.                     col_count := succ(col_count);
  410.                     if (0 = col_count mod col_limit)
  411.                       then writeln(USR)
  412.                   end;
  413.               MesgCurr := MesgCurr^.next
  414.             end;
  415.           writeln(USR)
  416.         end
  417.   end;
  418.  
  419. overlay procedure ReadDir(var entries, space_used: integer; var first: FilePtr);
  420. { Create an alphabetized list of files in the current file area }
  421.   var
  422.     i, j, off: integer;
  423.     this: FilePtr;
  424.     searchblk: FileBlock;                 { Buffer to define search params }
  425.     answerblk: array[0..3] of FileBlock;  { Buffer to receive file names }
  426.   begin
  427.     new_dir := TRUE;
  428.     space_used := 0;
  429.     while first <> nil do                 { Clean out any old directory list }
  430.       begin
  431.         this := first;
  432.         first := first^.Next;             { Go to next on chain }
  433.         dispose(this)                     { Reclaim space }
  434.       end;
  435.     DirEntries := 0;
  436.     with searchblk do
  437.       begin
  438.         drive := 0;
  439.         for i := 1 to 11 do
  440.           fname[i] := ord('?');
  441.         extent := ord('?');
  442.         s1     := ord('?');
  443.         s2     := ord('?');
  444.         reccount := 0;
  445.         for i := 16 to 31 do
  446.           map[i] := 0
  447.       end;
  448.     SetSect(SetDrv, SetUsr);
  449.     BDOS(setdma, addr(answerblk));
  450.     off := BDOS(findfirst, addr(searchblk));
  451.     while off <> 255 do
  452.       begin
  453.         with answerblk[off] do
  454.           { Non-system or sysop and not creating system directory? }
  455.           if (($80 and ord(fname[10])) = 0) or
  456.              ((user_rec.access >= 250) and (mode <> sysop_mode))
  457.             then InsertFile(fname, 0, reccount + (extent + (s2 shl 5)) shl 7,
  458.                             entries, space_used, first);
  459.         off := BDOS(findnext, addr(searchblk))
  460.       end;
  461.     BDOS(setdma, fcb);                    { Restore DMA buffer }
  462.     if user_rec.access >= 250
  463.       then free_space := diskfree;
  464.     SetSect(HomDrv, HomUsr)
  465.   end;
  466.  
  467. overlay procedure LibReadDir(var entries, space_used: integer; var first: FilePtr);
  468. { Read library directory }
  469.   var
  470.     i, off: integer;
  471.     LibBlock: array[0..3] of EntryBlock;
  472.   begin
  473.     SetSect(SetDrv, SetUsr);
  474.     Assign(libr_file, LibReq);
  475.     {$I-} Reset(libr_file) {$I+};
  476.     if IOresult = 0
  477.       then
  478.         begin
  479.           {$I-} blockread(libr_file, LibBlock, 1) {$I+};
  480.           in_library := (IOresult = 0);
  481.           i := 1;
  482.           while in_library and (i < 11) do
  483.             if LibBlock[0].fname[i] = $20
  484.               then i := succ(i)
  485.               else in_library := FALSE;
  486.           in_library := in_library and (LibBlock[0].status = 0);
  487.           if in_library
  488.             then
  489.               begin
  490.                 new_dir := TRUE;
  491.                 space_used := 0;
  492.                 LibEntries := 0;
  493.                 for i := 1 to pred(LibBlock[0].fsize shl 2) do
  494.                   begin
  495.                     off := i mod 4;
  496.                     if off = 0
  497.                       then blockread(libr_file, LibBlock, 1);
  498.                     with LibBlock[off] do
  499.                       if status < $FE
  500.                         then InsertFile(fname, index, fsize, entries, space_used, first)
  501.                   end
  502.               end
  503.         end;
  504.     SetSect(HomDrv, HomUsr)
  505.   end;
  506.  
  507. overlay function greg_to_jul(day, mon, yr: integer): real;
  508. { Convert from Gregorian date to Julian }
  509.   var
  510.     i: integer;
  511.   begin
  512.     i := (mon - 14) div 12;
  513.     greg_to_jul := day - 32075 + 367 * (mon - 2 - 12 * i) div 12 -
  514.                    3 * (yr + 6800 + i) div 400 + 365.25 * (yr + 6700 + i)
  515.   end;
  516.  
  517.