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 / BEEHIVE / BBS / ROS341.ARC / ROSKOV.INC < prev    next >
Text File  |  2000-06-30  |  16KB  |  494 lines

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