Keyboard (lines 609-729)
Back to List
Browsing parserm.h
0609 [ Keyboard a_buffer a_table nw i w w2 x1 x2;
0610
0611 DisplayStatus();
0612 .FreshInput;
0613
0614 ! Save the start of the buffer, in case "oops" needs to restore it
0615 ! to the previous time's buffer
0616
0617 for (i=0:i<64:i++) oops_workspace->i = a_buffer->i;
0618
0619 ! In case of an array entry corruption that shouldn't happen, but would be
0620 ! disastrous if it did:
0621
0622 a_buffer->0 = 120;
0623 a_table->0 = 15; ! Allow to split input into this many words
0624
0625 ! Print the prompt, and read in the words and dictionary addresses
0626
0627 L__M(##Prompt);
0628 AfterPrompt();
0629 #IFV5; DrawStatusLine(); #ENDIF;
0630 KeyboardPrimitive(a_buffer, a_table);
0631 nw=a_table->1;
0632
0633 ! If the line was blank, get a fresh line
0634 if (nw == 0)
0635 { L__M(##Miscellany,10); jump FreshInput; }
0636
0637 ! Unless the opening word was "oops", return
0638
0639 w=a_table-->1;
0640 if (w == OOPS1__WD or OOPS2__WD or OOPS3__WD) jump DoOops;
0641
0642 #IFV5;
0643 ! Undo handling
0644
0645 if ((w == UNDO1__WD or UNDO2__WD or UNDO3__WD) && (parse->1==1))
0646 { if (turns==1)
0647 { L__M(##Miscellany,11); jump FreshInput;
0648 }
0649 if (undo_flag==0)
0650 { L__M(##Miscellany,6); jump FreshInput;
0651 }
0652 if (undo_flag==1) jump UndoFailed;
0653 if (just_undone==1)
0654 { L__M(##Miscellany,12); jump FreshInput;
0655 }
0656 @restore_undo i;
0657 if (i==0)
0658 { .UndoFailed;
0659 L__M(##Miscellany,7);
0660 }
0661 jump FreshInput;
0662 }
0663 @save_undo i;
0664 just_undone=0;
0665 undo_flag=2;
0666 if (i==-1) undo_flag=0;
0667 if (i==0) undo_flag=1;
0668 if (i==2)
0669 { style bold;
0670 print (name) location, "^";
0671 style roman;
0672 L__M(##Miscellany,13);
0673 just_undone=1;
0674 jump FreshInput;
0675 }
0676 #ENDIF;
0677
0678 return nw;
0679
0680 .DoOops;
0681 if (oops_from == 0)
0682 { L__M(##Miscellany,14); jump FreshInput; }
0683 if (nw == 1)
0684 { L__M(##Miscellany,15); jump FreshInput; }
0685 if (nw > 2)
0686 { L__M(##Miscellany,16); jump FreshInput; }
0687
0688 ! So now we know: there was a previous mistake, and the player has
0689 ! attempted to correct a single word of it.
0690
0691 for (i=0:i<=120:i++) buffer2->i = a_buffer->i;
0692 x1 = a_table->9; ! Start of word following "oops"
0693 x2 = a_table->8; ! Length of word following "oops"
0694
0695 ! Repair the buffer to the text that was in it before the "oops"
0696 ! was typed:
0697
0698 for (i=0:i<64:i++) a_buffer->i = oops_workspace->i;
0699 Tokenise__(a_buffer,a_table);
0700
0701 ! Work out the position in the buffer of the word to be corrected:
0702
0703 w = a_table->(4*oops_from + 1); ! Start of word to go
0704 w2 = a_table->(4*oops_from); ! Length of word to go
0705
0706 ! Write spaces over the word to be corrected:
0707
0708 for (i=0:i<w2:i++) a_buffer->(i+w) = ' ';
0709
0710 if (w2 < x2)
0711 { ! If the replacement is longer than the original, move up...
0712
0713 for (i=120:i>=w+x2:i--)
0714 a_buffer->i = a_buffer->(i-x2+w2);
0715
0716 ! ...increasing buffer size accordingly.
0717
0718 a_buffer->1 = (a_buffer->1) + (x2-w2);
0719 }
0720
0721 ! Write the correction in:
0722
0723 for (i=0:i<x2:i++) a_buffer->(i+w) = buffer2->(i+x1);
0724
0725 Tokenise__(a_buffer,a_table);
0726 nw=a_table->1;
0727
0728 return nw;
0729 ];
Last updated 27 February 2004.
This site is no longer supported; information may be out of date.
Maintained as a historical archive by the Interactive Fiction Technology Foundation.
Copyright 1993-2018 IFTF, CC-BY-SA unless otherwise noted.
This page was originally managed by Graham Nelson (graham@gnelson.demon.co.uk) assisted by C Knight.