! --------------------------------------------------------------
! Dunno - A Libary Extension by Neil Cerutti ([email protected])
! Version 1.0 - 25 Jun 1999
!   Initial release
! Version 1.1 - 2 Apr 2001
!   Modified by Andrew Plotkin for Glulx compatibility.
!
! If, for some reason, you always wanted the Infocom-style error
! messages that say:
!
!  I don't know the word "kludge".
!
! here's one way to do it.
!
! To use this file, put the command
!
!   Include "dunno.h";
!
! somewhere in your program's source code.
!
! The DontKnowError() routine must be called from within your
! program in one of the following two ways:
!
! 1. in the ParserError entry point [Inform Designer's Manual,
!    Graham Nelson, Section 29]. For example:
!
!   [ ParserError pe;
!     if (pe == CANTSEE_PE) return DontKnowError();
!     rfalse;
!   ];
!
! or
!
! 2. in the LibraryMessages object [Nelson, Section 21]. For example:
!
!   Object LibraryMessages with before [;
!     Miscellany: if (lm_n == 30) return DontKnowError();
!   ];
!
! If you need help getting this to work, or just have comments or
! suggestions, write me at [email protected].
! ---------------------------------------------------------------

! Check for an unknown word in the input starting at word 2. If one
! is found, print "I don't know the word ~xxx~." and return true.
! Otherwise, return false.
[ DontKnowError
 wordnum;
 wordnum=FindUnknownWordToken(2);
 if (wordnum ~= 0)
 { print "I don't know the word ~";
   PrintToken(wordnum);
   "~.";
 }
 else rfalse;
];

! Find the word number of the word in the input that is an
! unknown word, starting at wordnum, and return it. If no unknown
! word is found, return false.
!
! An unknown word is defined: An item that is not in the
! dictionary and not a number.
[ FindUnknownWordToken wordnum
 w twn numwds;
#ifdef TARGET_GLULX;
 numwds = parse-->0;
#ifnot;
 numwds = parse->1;
#endif; ! TARGET_GLULX;
 ! Throw out invalid word numbers
 if (wordnum <= 0 || wordnum > numwds) rfalse;
 twn=wn; ! save the value of wn so it can be restored
 wn=wordnum;
 while (1)
 { w=NextWordStopped();
   if (w == -1) { wn=twn; rfalse; }
   if (w == 0 && TryNumber(wn-1) == -1000)
   { wordnum=wn-1;
     wn=twn;
     return wordnum;
   }
 }
];

! Print the exact text in the input at wordnum.
[ PrintToken wordnum
 k l m numwds;
#ifdef TARGET_GLULX;
 numwds = parse-->0;
#ifnot;
 numwds = parse->1;
#endif; ! TARGET_GLULX;
 if (wordnum <= 0 || wordnum > numwds) return;
 k=WordAddress(wordnum);
 l=WordLength(wordnum);
 for (m=0: m < l: m++)
   print (char) k->m;
];

! ---------------------------------------------------------------