home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / mbug / mbug184.arc / ROS34.LBR / ROSKIO.IZC / ROSKIO.INC
Text File  |  1979-12-31  |  11KB  |  382 lines

  1. { ROSKIO.INC - Remote Operating System Kernel - I/O routines }
  2.  
  3. function online: boolean;
  4. { Determine whether system is still online - local or remote }
  5.   begin
  6.     if remote_online
  7.       then if ch_carck
  8.              then online := TRUE
  9.              else
  10.                begin
  11.                  putstat('Carrier lost');
  12.                  mdhangup;
  13.                  remote_online := FALSE;
  14.                  online := FALSE
  15.                end
  16.       else online := local_online
  17.   end;
  18.  
  19. procedure PutByte(b: byte);
  20.   begin
  21.     if ch_carck
  22.       then ch_out(b)
  23.   end;
  24.  
  25. procedure PutChar(ch: char);
  26. { User written I/O driver to output character }
  27.   var
  28.     i: integer;
  29.   begin
  30.     if user_rec.shift_lock
  31.       then ch := UpCase(ch);
  32.     if printer_copy
  33.       then BDOS(5, ord(ch));
  34.     if online
  35.       then
  36.         begin
  37.           if (ch <> BEL) or local_online
  38.             then BDOS(6, ord(ch));
  39.           if remote_copy
  40.             then
  41.               begin
  42.                 ch_out($7F and ord(ch));
  43.                 if ch = CR
  44.                   then for i := 1 to user_rec.nulls do
  45.                     ch_out(ord(NUL));
  46.                 if ch = LF
  47.                   then for i := 1 to (user_rec.nulls shr 2) do
  48.                     ch_out(ord(NUL))
  49.               end
  50.         end
  51.   end;
  52.  
  53. function GetByte(sec: integer; var timeout: boolean): byte;
  54. { Get byte from modem with 'sec' seconds timeout }
  55.   var
  56.     count: real;
  57.   begin
  58.     count := sec * lps;
  59.     while (not ch_inprdy) and (ch_carck) and (count > 0.0) do
  60.       count := count - 1.0;
  61.     timeout := (not ch_carck) or (count <= 0.0);
  62.     if timeout
  63.       then GetByte := ord(NUL)
  64.       else GetByte := ch_inp
  65.   end;
  66.  
  67. function GetChar: char;
  68. { Get character: no wait, no echo }
  69.   var
  70.     ch: char;
  71.   begin
  72.     if keypressed
  73.       then
  74.         begin
  75.           read(KBD, ch);
  76.           if (not online) and (not (ch in [^C, LF, CR]))
  77.             then ch := NUL;
  78.           case ch of
  79.             ^W: begin
  80.                   op_chat := TRUE;
  81.                   ch := ' '
  82.                 end;
  83.             ^E: begin
  84.                   remote_copy := not remote_copy;
  85.                   if remote_copy
  86.                     then putstat('Remote copy on')
  87.                     else putstat('Remote copy off');
  88.                   ch := NUL
  89.                 end;
  90.             ^R: begin
  91.                   delay_down := not delay_down;
  92.                   if delay_down
  93.                     then putstat('Delayed shutdown on')
  94.                     else putstat('Delayed shutdown off');
  95.                   ch := NUL
  96.                 end;
  97.             ^T: begin
  98.                   remote_online := FALSE;
  99.                   mdhangup;
  100.                   ch := NUL
  101.                 end;
  102.             LF: begin
  103.                   if online
  104.                     then putstat('^W: CHAT, ^E: Remote copy on/off, ^R: Remote offline - delayed, ^T: Twit')
  105.                     else putstat('^C: Shutdown ROS, [C/R]: Local use');
  106.                   ch := NUL
  107.                 end
  108.           end
  109.         end
  110.     else if remote_online and remote_copy and ch_carck and ch_inprdy
  111.       then ch := chr($7F and ch_inp)
  112.       else ch := NUL;
  113.     GetChar := ch
  114.   end;
  115.  
  116. procedure GetStr(var inpstr: StrStd; var ch: char; maxlen: integer; mode: Str10);
  117. { Get a valid input string from the user }
  118.   type
  119.     charset = set of char;
  120.   const
  121.     editset: charset = [BS, RUB, CAN, TAB];
  122.     termset: charset = [LF, CR, ETX];
  123.     dispset: charset = [' '..'~'];
  124.   var
  125.     auto, echo, shiftlock, wrap, question: boolean;
  126.     i, len, cursor: integer;
  127.     count: real;
  128.   begin
  129.     if user_rec.columns < maxlen
  130.       then maxlen := user_rec.columns;
  131.     auto      := (pos('A', mode) > 0);      { Line complete when full }
  132.     echo      := (pos('E', mode) > 0);      { Display characters on entry }
  133.     shiftlock := (pos('S', mode) > 0);      { Make all characters upper case }
  134.     wrap      := (pos('W', mode) > 0);      { Word wrap }
  135.     question  := (pos('?', mode) > 0);      { Force inpstr := '?' when encountered }
  136.     auto := auto or wrap;                   { Wrap forces auto on }
  137.     len := length(inpstr);
  138.     cursor := succ(len);
  139.     if echo and (cursor > 0)
  140.       then Write(USR, inpstr);
  141.     repeat
  142.       count := timeout * lps * 0.574;       { This loop is slower than GetByte }
  143.       repeat
  144.         if (0 < macro_ptr) and (macro_ptr <= length(macro))
  145.           then
  146.             begin
  147.               ch := macro[macro_ptr];
  148.               if ch = '/'
  149.                 then ch := CR;
  150.               macro_ptr := succ(macro_ptr)
  151.             end
  152.           else ch := GetChar;
  153.         if remote_online
  154.           then count := count - 1.0
  155.       until (not online) or (ch <> NUL) or (count < 0.0);
  156.       if count < 0.0
  157.         then
  158.           begin
  159.             Writeln(USR, '++ Input timed out ++', BEL, BEL);
  160.             remote_online := FALSE;
  161.             mdhangup
  162.           end;
  163.       if shiftlock
  164.         then ch := UpCase(ch);
  165.       case ch of
  166.         TAB:
  167.           repeat
  168.             if echo
  169.               then Write(USR, ' ');
  170.             cursor := succ(cursor);
  171.             insert(' ', inpstr, cursor)
  172.           until (0 = cursor mod 5) or (cursor >= maxlen);
  173.         RUB, BS:
  174.           if cursor > 1
  175.             then
  176.               begin
  177.                 if echo
  178.                   then Write(USR, BS, ' ', BS);
  179.                 cursor := pred(cursor);
  180.                 delete(inpstr, cursor, 1)
  181.               end;
  182.         CAN:
  183.           while cursor > 1 do
  184.             begin
  185.               if echo
  186.                 then Write(USR, BS, ' ', BS);
  187.               cursor := pred(cursor);
  188.               delete(inpstr, cursor, 1)
  189.             end;
  190.         ^A:
  191.           while cursor > 1 do
  192.             begin
  193.               if echo
  194.                 then Write(USR, BS);
  195.               cursor := pred(cursor)
  196.             end;
  197.         ^S:
  198.           if cursor > 1
  199.             then
  200.               begin
  201.                 if echo
  202.                   then Write(USR, BS);
  203.                 cursor := pred(cursor)
  204.               end;
  205.         ^D:
  206.           if cursor <= length(inpstr)
  207.             then
  208.               begin
  209.                 if echo
  210.                   then Write(USR, inpstr[cursor]);
  211.                 cursor := succ(cursor)
  212.               end;
  213.         ^F:
  214.           while cursor <= length(inpstr) do
  215.             begin
  216.               if echo
  217.                 then Write(USR, inpstr[cursor]);
  218.               cursor := succ(cursor)
  219.             end;
  220.         ^G:
  221.           if cursor <= length(inpstr)
  222.             then delete(inpstr, cursor, 1);
  223.         else
  224.           if (ch in dispset) and ((len < maxlen) or auto)
  225.             then
  226.               begin
  227.                 if echo
  228.                   then Write(USR, ch);
  229.                 if (ch = '?') and question
  230.                   then
  231.                     begin
  232.                       inpstr := ch;
  233.                       ch := CR
  234.                     end
  235.                   else
  236.                     begin
  237.                       insert(ch, inpstr, cursor);
  238.                       cursor := succ(cursor)
  239.                     end
  240.               end
  241.       end;
  242.       len := length(inpstr)
  243.     until (not online) or (ch in termset) or ((len >= maxlen) and auto);
  244.     next_inpstr := '';
  245.     if wrap and (len >= maxlen)
  246.       then
  247.         begin
  248.           while (inpstr[len] <> ' ') and (len > 1) do
  249.             len := pred(len);
  250.           if len > 1
  251.             then
  252.               begin
  253.                 if echo
  254.                   then
  255.                     begin
  256.                       for i := succ(len) to length(inpstr) do
  257.                         Write(USR, BS);
  258.                       for i := succ(len) to length(inpstr) do
  259.                         Write(USR, ' ')
  260.                     end;
  261.                 next_inpstr := copy(inpstr, succ(len), length(inpstr));
  262.                 inpstr := copy(inpstr, 1, pred(len))
  263.               end
  264.         end
  265.   end;
  266.  
  267. function brk: boolean;
  268. { Check for break or pause }
  269.   var
  270.     ch: char;
  271.   begin
  272.     ch := GetChar;
  273.     while ch = DC3 do                       { ^S }
  274.       repeat
  275.         ch := GetChar
  276.       until (not online) or (ch <> NUL);
  277.     brk := (not online) or (ch = ETX)       { ^C }
  278.   end;
  279.  
  280. procedure pause;
  281. { Pause for user response before continuing }
  282.   begin
  283.     Write(USR, 'Press any key to continue...');
  284.     if user_rec.noisy
  285.       then Write(USR, BEL);
  286.     repeat
  287.     until (not online) or (GetChar <> NUL);
  288.     Write(USR, CR, ' ':28, CR)
  289.   end;
  290.  
  291. function ask(pr: StrPr): boolean;
  292. { Ask yes-or-no question and return TRUE for 'Y', FALSE otherwise }
  293.   var
  294.     ch: char;
  295.     reply: StrStd;
  296.   begin
  297.     reply := '';
  298.     Write(USR, pr, ' [y/n]?> ');
  299.     if user_rec.noisy
  300.       then Write(USR, BEL);
  301.     GetStr(reply, ch, 1, 'AS');
  302.     if reply = 'Y'
  303.       then
  304.         begin
  305.           Writeln(USR, 'Yes');
  306.           ask := TRUE
  307.         end
  308.       else
  309.         begin
  310.           Writeln(USR, 'No');
  311.           ask := FALSE
  312.         end
  313.   end;
  314.  
  315. function prompt(pr: StrPr; len: integer; mode: Str10): StrStd;
  316. { Prompt user and get response }
  317.   var
  318.     ch: char;
  319.     reply: StrStd;
  320.   begin
  321.     reply := '';
  322.     Write(USR, pr, '> ');
  323.     if user_rec.noisy
  324.       then Write(USR, BEL);
  325.     GetStr(reply, ch, len, mode);
  326.     Writeln(USR);
  327.     prompt := reply
  328.   end;
  329.  
  330. function select(pr: StrPr; st: Str100): char;
  331. { Prompt user and get single character response }
  332.   var
  333.     ch: char;
  334.     i, j: integer;
  335.     reply: StrStd;
  336.   begin
  337.     reply := '';
  338.     Write(USR, pr);
  339.     if user_rec.help_level > 1
  340.       then Write(USR, ' [press "?" for menu]');
  341.     Write(USR, '> ');
  342.     if user_rec.noisy
  343.       then Write(USR, BEL);
  344.     GetStr(reply, ch, 1, 'AS');
  345.     if reply = ''
  346.       then ch := ' '
  347.       else ch := reply;
  348.     i := pos(ch, st);
  349.     if i > 0
  350.       then
  351.         begin
  352.           j := i;
  353.           repeat
  354.             j := succ(j)
  355.           until (j > length(st)) or (st[j] in ['A'..'Z']);
  356.           Writeln(USR, copy(st, i, j - i))
  357.         end
  358.       else Writeln(USR, ch);
  359.     select := ch
  360.   end;
  361.  
  362. function getc(var inp_file: untype_file; var BufferPtr, remaining: integer): integer;
  363.   { Get an 8 bit value from the input buffer - read block if necessary }
  364.     var
  365.       NoOfRecs: integer;
  366.     begin
  367.       if BufferPtr > BufSize
  368.         then
  369.           begin
  370.             if BufBlocks < remaining
  371.               then NoOfRecs := BufBlocks
  372.               else NoOfRecs := remaining;
  373.             if NoOfRecs > 0
  374.               then BlockRead(inp_file, Buffer, NoOfRecs);
  375.             remaining := remaining - NoOfRecs;
  376.             BufferPtr := 1
  377.           end;
  378.       getc := Buffer[BufferPtr];
  379.       BufferPtr := succ(BufferPtr)
  380.     end;
  381.  
  382.