! mistype.h version 0.9 for Inform minimal parser

[ KeyboardPrimitive  i start len j c1 c2 t n alt;
  buffer->0=63; parse->0=5; parse->1=0;
  read buffer parse;           ! variables renamed
  if (buffer->1 > buffer->0-3) buffer->1 = buffer->0-3;

! check for misspelled words

  buffer->(2 + buffer->1) = 0; ! see library tokenise__

  for (i=0: i<parse->1: i++) 
    if (~~ (parse-->(n=i*2+1))) {  ! unrecognised word

      ! oops_from=saved_oops=i+1;
      ! it's be nice to do this in case of a miscorrection - need more work
      ! suggest putting 'oops_word=saved_oops;' in ParserError()

      ! try fixing word
      start=parse->(i*4+5); 
      len=parse->(i*4+4);
      if (buffer->start<='9') continue;

      !first try transpositions
      for (j=start+len - (i+1==parse->1 || parse-->(i*2+3) || len<3): j>start: j--) {
        c1=buffer->j; 
        buffer->j=buffer->(j-1);
        buffer->(j-1)=c1;
        @tokenise buffer parse;
        if (parse-->n) jump NxtChk;  ! fixed!
        buffer->(j-1)=buffer->j; ! undo transposition
        buffer->j=c1;
        } ! end of for loop

      !now try deletions
      if (len<3) jump NxtChk;
      t = start+len-1;
      c1 = ' ';
      for (j=t: j>=start: j--) { ! j represents the one that's missed out
        c2=buffer->j;
        buffer->j=c1;
        c1=c2;
        @tokenise buffer parse;
        if (parse-->n) jump NxtChk;  ! fixed!
        }
      ! and restore
      for (j=t: j>start: j--)
        buffer->j=buffer->(j-1);
      buffer->start=c2;

#ifndef QUICKCHECK;
      ! substitutions
      for (j=t: j>=start: j--) {
        c2=buffer->j;
        for (c1='a': c1<='z': c1++) {
          buffer->j=c1;
          @tokenise buffer parse;
          if (parse-->n) jump NxtChk;  ! fixed!
          }
        buffer->j=c2;
        }

      ! additions
!      (buffer->1)++;
!      for (j=buffer->1+1: j>t: j--)
!        buffer->(j+1)=buffer->j;
!      for (j=t+1: j>=start: j--) {
!        for (c1='a': c1<='z': c1++) {
!          buffer->j=c1;
!          @tokenise buffer parse;
!          if (parse-->n) jump NxtChk;  ! fixed!
!          }
!        buffer->j=buffer->(j-1);
!        }
!      ! restore
!      for (j=start: j<=buffer->1: j++)
!        buffer->j=buffer->(j+1);
!      (buffer->1)--;

#endif;

      .NxtChk; !outer loop
      if (parse-->n) alt++;
      } ! end of 'if' word needs fixing

  if (alt) {
    print "[The story read that as ~";
    for (i=2: i<=1+buffer->1: i++)
      print (char) buffer->i;
    print "~.]^";
    }

  ]; 
  


