2020-01-10 01:10:09 +02:00
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
< html >
< head >
2020-01-27 03:22:21 +02:00
< title > S/pt< / title >
2020-01-10 01:10:09 +02:00
< meta http-equiv = "Content-Type" content = "text/html; charset=utf-8" >
< meta http-equiv = "Content-Language" content = "en-gb" >
< link href = "inweb.css" rel = "stylesheet" rev = "stylesheet" type = "text/css" >
< / head >
< body >
<!-- Weave of 'S/nt' generated by 7 -->
2020-01-27 03:22:21 +02:00
< ul class = "crumbs" > < li > < a href = "../webs.html" > ★ < / a > < / li > < li > < a href = "index.html" > CommandParserKit< / a > < / li > < li > < b > Number Template< / b > < / li > < / ul > < p class = "purpose" > Support for parsing integers.< / p >
2020-01-10 01:10:09 +02:00
< ul class = "toc" > < li > < a href = "#SP1" > § 1. Understanding< / a > < / li > < li > < a href = "#SP2" > § 2. Truth states< / a > < / li > < li > < a href = "#SP3" > § 3. Real numbers< / a > < / li > < / ul > < hr class = "tocbar" >
< p class = "inwebparagraph" > < a id = "SP1" > < / a > < b > § 1. Understanding. < / b > In our target virtual machines, numbers are stored in twos-complement form,
so that a 16-bit VM can hold the range of integers -2^{15} = -32768 to
2^{15}-1 = +32767, while a 32-bit VM can hold -2^{31} = -2147483648 to
2^{31}-1 = +2147483647: the token below accepts exactly those ranges.
< / p >
< pre class = "display" >
2020-01-13 13:02:57 +02:00
< span class = "plain" > [ < / span > < span class = "identifier" > DECIMAL_TOKEN< / span > < span class = "plain" > < / span > < span class = "identifier" > wnc< / span > < span class = "plain" > < / span > < span class = "identifier" > wna< / span > < span class = "plain" > < / span > < span class = "identifier" > r< / span > < span class = "plain" > < / span > < span class = "identifier" > n< / span > < span class = "plain" > < / span > < span class = "identifier" > wa< / span > < span class = "plain" > < / span > < span class = "identifier" > wl< / span > < span class = "plain" > < / span > < span class = "identifier" > sign< / span > < span class = "plain" > < / span > < span class = "identifier" > base< / span > < span class = "plain" > < / span > < span class = "identifier" > digit< / span > < span class = "plain" > < / span > < span class = "identifier" > digit_count< / span > < span class = "plain" > < / span > < span class = "identifier" > original_wn< / span > < span class = "plain" > < / span > < span class = "identifier" > group_wn< / span > < span class = "plain" > ;< / span >
< span class = "identifier" > wnc< / span > < span class = "plain" > = < / span > < span class = "identifier" > wn< / span > < span class = "plain" > ; < / span > < span class = "identifier" > original_wn< / span > < span class = "plain" > = < / span > < span class = "identifier" > wn< / span > < span class = "plain" > ; < / span > < span class = "identifier" > group_wn< / span > < span class = "plain" > = < / span > < span class = "identifier" > wn< / span > < span class = "plain" > ;< / span >
< span class = "identifier" > r< / span > < span class = "plain" > = < / span > < span class = "identifier" > DECIMAL_TOKEN_INNER< / span > < span class = "plain" > ();< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > r< / span > < span class = "plain" > ~= < / span > < span class = "identifier" > GPR_FAIL< / span > < span class = "plain" > ) < / span > < span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > r< / span > < span class = "plain" > ;< / span >
< span class = "identifier" > wn< / span > < span class = "plain" > = < / span > < span class = "identifier" > wnc< / span > < span class = "plain" > ;< / span >
< span class = "identifier" > r< / span > < span class = "plain" > = < / span > < span class = "identifier" > ParseTokenStopped< / span > < span class = "plain" > (< / span > < span class = "identifier" > ELEMENTARY_TT< / span > < span class = "plain" > , < / span > < span class = "identifier" > NUMBER_TOKEN< / span > < span class = "plain" > );< / span >
< span class = "reserved" > if< / span > < span class = "plain" > ((< / span > < span class = "identifier" > r< / span > < span class = "plain" > == < / span > < span class = "identifier" > GPR_NUMBER< / span > < span class = "plain" > ) & & (< / span > < span class = "identifier" > parsed_number< / span > < span class = "plain" > ~= < / span > < span class = "constant" > 10000< / span > < span class = "plain" > )) < / span > < span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > r< / span > < span class = "plain" > ;< / span >
< span class = "identifier" > wn< / span > < span class = "plain" > = < / span > < span class = "identifier" > wnc< / span > < span class = "plain" > ;< / span >
< span class = "identifier" > wa< / span > < span class = "plain" > = < / span > < span class = "identifier" > WordAddress< / span > < span class = "plain" > (< / span > < span class = "identifier" > wn< / span > < span class = "plain" > );< / span >
< span class = "identifier" > wl< / span > < span class = "plain" > = < / span > < span class = "identifier" > WordLength< / span > < span class = "plain" > (< / span > < span class = "identifier" > wn< / span > < span class = "plain" > );< / span >
< span class = "identifier" > sign< / span > < span class = "plain" > = < / span > < span class = "constant" > 1< / span > < span class = "plain" > ; < / span > < span class = "identifier" > base< / span > < span class = "plain" > = < / span > < span class = "constant" > 10< / span > < span class = "plain" > ; < / span > < span class = "identifier" > digit_count< / span > < span class = "plain" > = < / span > < span class = "constant" > 0< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > wa< / span > < span class = "plain" > -> 0 ~= < / span > < span class = "character" > '-'< / span > < span class = "plain" > < / span > < span class = "reserved" > or< / span > < span class = "plain" > < / span > < span class = "character" > '$'< / span > < span class = "plain" > < / span > < span class = "reserved" > or< / span > < span class = "plain" > < / span > < span class = "character" > '0'< / span > < span class = "plain" > < / span > < span class = "reserved" > or< / span > < span class = "plain" > < / span > < span class = "character" > '1'< / span > < span class = "plain" > < / span > < span class = "reserved" > or< / span > < span class = "plain" > < / span > < span class = "character" > '2'< / span > < span class = "plain" > < / span > < span class = "reserved" > or< / span > < span class = "plain" > < / span > < span class = "character" > '3'< / span > < span class = "plain" > < / span > < span class = "reserved" > or< / span > < span class = "plain" > < / span > < span class = "character" > '4'< / span >
< span class = "reserved" > or< / span > < span class = "plain" > < / span > < span class = "character" > '5'< / span > < span class = "plain" > < / span > < span class = "reserved" > or< / span > < span class = "plain" > < / span > < span class = "character" > '6'< / span > < span class = "plain" > < / span > < span class = "reserved" > or< / span > < span class = "plain" > < / span > < span class = "character" > '7'< / span > < span class = "plain" > < / span > < span class = "reserved" > or< / span > < span class = "plain" > < / span > < span class = "character" > '8'< / span > < span class = "plain" > < / span > < span class = "reserved" > or< / span > < span class = "plain" > < / span > < span class = "character" > '9'< / span > < span class = "plain" > )< / span >
< span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > GPR_FAIL< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > wa< / span > < span class = "plain" > -> 0 == < / span > < span class = "character" > '-'< / span > < span class = "plain" > ) { < / span > < span class = "identifier" > sign< / span > < span class = "plain" > = < / span > < span class = "constant" > -1< / span > < span class = "plain" > ; < / span > < span class = "identifier" > wl< / span > < span class = "plain" > --; < / span > < span class = "identifier" > wa< / span > < span class = "plain" > ++; }< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > wl< / span > < span class = "plain" > == < / span > < span class = "constant" > 0< / span > < span class = "plain" > ) < / span > < span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > GPR_FAIL< / span > < span class = "plain" > ;< / span >
< span class = "identifier" > n< / span > < span class = "plain" > = < / span > < span class = "constant" > 0< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > while< / span > < span class = "plain" > (< / span > < span class = "identifier" > wl< / span > < span class = "plain" > > < / span > < span class = "constant" > 0< / span > < span class = "plain" > ) {< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > wa< / span > < span class = "plain" > -> 0 > = < / span > < span class = "character" > 'a'< / span > < span class = "plain" > ) < / span > < span class = "identifier" > digit< / span > < span class = "plain" > = < / span > < span class = "identifier" > wa< / span > < span class = "plain" > -> 0 < / span > < span class = "constant" > -< / span > < span class = "plain" > < / span > < span class = "character" > 'a'< / span > < span class = "plain" > + < / span > < span class = "constant" > 10< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > else< / span > < span class = "plain" > < / span > < span class = "identifier" > digit< / span > < span class = "plain" > = < / span > < span class = "identifier" > wa< / span > < span class = "plain" > -> 0 < / span > < span class = "constant" > -< / span > < span class = "plain" > < / span > < span class = "character" > '0'< / span > < span class = "plain" > ;< / span >
< span class = "identifier" > digit_count< / span > < span class = "plain" > ++;< / span >
< span class = "reserved" > switch< / span > < span class = "plain" > (< / span > < span class = "identifier" > base< / span > < span class = "plain" > ) {< / span >
< span class = "constant" > 2< / span > < span class = "plain" > : < / span > < span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > digit_count< / span > < span class = "plain" > == < / span > < span class = "constant" > 17< / span > < span class = "plain" > ) < / span > < span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > GPR_FAIL< / span > < span class = "plain" > ;< / span >
< span class = "constant" > 10< / span > < span class = "plain" > :< / span >
< span class = "plain" > #< / span > < span class = "identifier" > Iftrue< / span > < span class = "plain" > (< / span > < span class = "identifier" > WORDSIZE< / span > < span class = "plain" > == < / span > < span class = "constant" > 2< / span > < span class = "plain" > );< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > digit_count< / span > < span class = "plain" > == < / span > < span class = "constant" > 6< / span > < span class = "plain" > ) < / span > < span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > GPR_FAIL< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > digit_count< / span > < span class = "plain" > == < / span > < span class = "constant" > 5< / span > < span class = "plain" > ) {< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > n< / span > < span class = "plain" > > < / span > < span class = "constant" > 3276< / span > < span class = "plain" > ) < / span > < span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > GPR_FAIL< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > n< / span > < span class = "plain" > == < / span > < span class = "constant" > 3276< / span > < span class = "plain" > ) {< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > sign< / span > < span class = "plain" > == < / span > < span class = "constant" > 1< / span > < span class = "plain" > & & < / span > < span class = "identifier" > digit< / span > < span class = "plain" > > < / span > < span class = "constant" > 7< / span > < span class = "plain" > ) < / span > < span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > GPR_FAIL< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > sign< / span > < span class = "plain" > == < / span > < span class = "constant" > -1< / span > < span class = "plain" > & & < / span > < span class = "identifier" > digit< / span > < span class = "plain" > > < / span > < span class = "constant" > 8< / span > < span class = "plain" > ) < / span > < span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > GPR_FAIL< / span > < span class = "plain" > ;< / span >
2020-01-10 01:10:09 +02:00
< span class = "plain" > }< / span >
< span class = "plain" > }< / span >
2020-01-13 13:02:57 +02:00
< span class = "plain" > #< / span > < span class = "identifier" > Ifnot< / span > < span class = "plain" > ; < / span > < span class = "comment" > ! i.e., if (WORDSIZE == 4)< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > digit_count< / span > < span class = "plain" > == < / span > < span class = "constant" > 11< / span > < span class = "plain" > ) < / span > < span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > GPR_FAIL< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > digit_count< / span > < span class = "plain" > == < / span > < span class = "constant" > 10< / span > < span class = "plain" > ) {< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > n< / span > < span class = "plain" > > < / span > < span class = "constant" > 214748364< / span > < span class = "plain" > ) < / span > < span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > GPR_FAIL< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > n< / span > < span class = "plain" > == < / span > < span class = "constant" > 214748364< / span > < span class = "plain" > ) {< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > sign< / span > < span class = "plain" > == < / span > < span class = "constant" > 1< / span > < span class = "plain" > & & < / span > < span class = "identifier" > digit< / span > < span class = "plain" > > < / span > < span class = "constant" > 7< / span > < span class = "plain" > ) < / span > < span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > GPR_FAIL< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > sign< / span > < span class = "plain" > == < / span > < span class = "constant" > -1< / span > < span class = "plain" > & & < / span > < span class = "identifier" > digit< / span > < span class = "plain" > > < / span > < span class = "constant" > 8< / span > < span class = "plain" > ) < / span > < span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > GPR_FAIL< / span > < span class = "plain" > ;< / span >
2020-01-10 01:10:09 +02:00
< span class = "plain" > }< / span >
< span class = "plain" > }< / span >
2020-01-13 13:02:57 +02:00
< span class = "plain" > #< / span > < span class = "identifier" > Endif< / span > < span class = "plain" > ;< / span >
< span class = "constant" > 16< / span > < span class = "plain" > : < / span > < span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > digit_count< / span > < span class = "plain" > == < / span > < span class = "constant" > 5< / span > < span class = "plain" > ) < / span > < span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > GPR_FAIL< / span > < span class = "plain" > ;< / span >
2020-01-10 01:10:09 +02:00
< span class = "plain" > }< / span >
2020-01-13 13:02:57 +02:00
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > digit< / span > < span class = "plain" > > = < / span > < span class = "constant" > 0< / span > < span class = "plain" > & & < / span > < span class = "identifier" > digit< / span > < span class = "plain" > < < / span > < span class = "identifier" > base< / span > < span class = "plain" > ) < / span > < span class = "identifier" > n< / span > < span class = "plain" > = < / span > < span class = "identifier" > base< / span > < span class = "plain" > *< / span > < span class = "identifier" > n< / span > < span class = "plain" > + < / span > < span class = "identifier" > digit< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > else< / span > < span class = "plain" > < / span > < span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > GPR_FAIL< / span > < span class = "plain" > ;< / span >
< span class = "identifier" > wl< / span > < span class = "plain" > --; < / span > < span class = "identifier" > wa< / span > < span class = "plain" > ++;< / span >
2020-01-10 01:10:09 +02:00
< span class = "plain" > }< / span >
2020-01-13 13:02:57 +02:00
< span class = "identifier" > parsed_number< / span > < span class = "plain" > = < / span > < span class = "identifier" > n< / span > < span class = "plain" > *< / span > < span class = "identifier" > sign< / span > < span class = "plain" > ; < / span > < span class = "identifier" > wn< / span > < span class = "plain" > ++;< / span >
< span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > GPR_NUMBER< / span > < span class = "plain" > ;< / span >
2020-01-10 01:10:09 +02:00
< span class = "plain" > ];< / span >
< / pre >
< p class = "inwebparagraph" > < / p >
< p class = "inwebparagraph" > < a id = "SP2" > < / a > < b > § 2. Truth states. < / b > And although truth states are not strictly speaking numbers, this seems as
good a point as any to parse them:
< / p >
< pre class = "display" >
2020-01-13 13:02:57 +02:00
< span class = "plain" > [ < / span > < span class = "identifier" > TRUTH_STATE_TOKEN< / span > < span class = "plain" > < / span > < span class = "identifier" > original_wn< / span > < span class = "plain" > < / span > < span class = "identifier" > wd< / span > < span class = "plain" > ;< / span >
< span class = "identifier" > original_wn< / span > < span class = "plain" > = < / span > < span class = "identifier" > wn< / span > < span class = "plain" > ;< / span >
< span class = "identifier" > wd< / span > < span class = "plain" > = < / span > < span class = "identifier" > TRUTH_STATE_TOKEN_INNER< / span > < span class = "plain" > ();< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > wd< / span > < span class = "plain" > ~= < / span > < span class = "identifier" > GPR_FAIL< / span > < span class = "plain" > ) < / span > < span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > wd< / span > < span class = "plain" > ;< / span >
< span class = "identifier" > wn< / span > < span class = "plain" > = < / span > < span class = "identifier" > original_wn< / span > < span class = "plain" > ;< / span >
< span class = "identifier" > wd< / span > < span class = "plain" > = < / span > < span class = "identifier" > NextWordStopped< / span > < span class = "plain" > ();< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > wd< / span > < span class = "plain" > == < / span > < span class = "character" > 'true'< / span > < span class = "plain" > ) { < / span > < span class = "identifier" > parsed_number< / span > < span class = "plain" > = < / span > < span class = "constant" > 1< / span > < span class = "plain" > ; < / span > < span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > GPR_NUMBER< / span > < span class = "plain" > ; }< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > wd< / span > < span class = "plain" > == < / span > < span class = "character" > 'false'< / span > < span class = "plain" > ) { < / span > < span class = "identifier" > parsed_number< / span > < span class = "plain" > = < / span > < span class = "constant" > 0< / span > < span class = "plain" > ; < / span > < span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > GPR_NUMBER< / span > < span class = "plain" > ; }< / span >
< span class = "identifier" > wn< / span > < span class = "plain" > = < / span > < span class = "identifier" > original_wn< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > GPR_FAIL< / span > < span class = "plain" > ;< / span >
2020-01-10 01:10:09 +02:00
< span class = "plain" > ];< / span >
< / pre >
< p class = "inwebparagraph" > < / p >
< p class = "inwebparagraph" > < a id = "SP3" > < / a > < b > § 3. Real numbers. < / b > An I6 grammar routine (GPR) for floats. On success, this returns
GPR_NUMBER and stores a value in the global parsed_number.
< / p >
< p class = "inwebparagraph" > This is quite a nuisance, actually, because "." is a word separator.
Also, we want to accept command sequences like "type 4. look"So we
need to collect a set of words made up of digits, signs, periods, and
the letter "e", but without any intervening whitespace, and excluding
a trailing period.
< / p >
< p class = "inwebparagraph" > (This will fail to correctly parse "type 4.e", but I think that is a
small flaw. A player would more likely try "type 4. e" or, really,
not concatenate commands at all. It will also parse "type 4. on keyboard"
as two commands, even though "4." is a legitimate float literal.
Contrariwise, "type 4. x me" will be taken as one command. (Because the "x"
*could* be a continuation of the float, and I don't back up when it turns
out not to be.) I don't plan to worry about these cases.)
< / p >
< pre class = "display" >
2020-01-13 13:02:57 +02:00
< span class = "plain" > #< / span > < span class = "identifier" > Ifdef< / span > < span class = "plain" > < / span > < span class = "identifier" > TARGET_GLULX< / span > < span class = "plain" > ;< / span >
< span class = "plain" > [ < / span > < span class = "identifier" > FLOAT_TOKEN< / span > < span class = "plain" > < / span > < span class = "identifier" > buf< / span > < span class = "plain" > < / span > < span class = "identifier" > bufend< / span > < span class = "plain" > < / span > < span class = "identifier" > ix< / span > < span class = "plain" > < / span > < span class = "identifier" > ch< / span > < span class = "plain" > < / span > < span class = "identifier" > firstwd< / span > < span class = "plain" > < / span > < span class = "identifier" > newstart< / span > < span class = "plain" > < / span > < span class = "identifier" > newlen< / span > < span class = "plain" > < / span > < span class = "identifier" > lastchar< / span > < span class = "plain" > < / span > < span class = "identifier" > lastwasdot< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > wn< / span > < span class = "plain" > > < / span > < span class = "identifier" > num_words< / span > < span class = "plain" > )< / span >
< span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > GPR_FAIL< / span > < span class = "plain" > ;< / span >
< span class = "comment" > ! We're going to collect a set of words. Start with zero words.< / span >
< span class = "identifier" > firstwd< / span > < span class = "plain" > = < / span > < span class = "identifier" > wn< / span > < span class = "plain" > ;< / span >
< span class = "identifier" > buf< / span > < span class = "plain" > = < / span > < span class = "identifier" > WordAddress< / span > < span class = "plain" > (< / span > < span class = "identifier" > wn< / span > < span class = "plain" > );< / span >
< span class = "identifier" > bufend< / span > < span class = "plain" > = < / span > < span class = "identifier" > buf< / span > < span class = "plain" > ;< / span >
< span class = "identifier" > lastchar< / span > < span class = "plain" > = < / span > < span class = "constant" > 0< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > while< / span > < span class = "plain" > (< / span > < span class = "identifier" > wn< / span > < span class = "plain" > < = < / span > < span class = "identifier" > num_words< / span > < span class = "plain" > ) {< / span >
< span class = "identifier" > newstart< / span > < span class = "plain" > = < / span > < span class = "identifier" > WordAddress< / span > < span class = "plain" > (< / span > < span class = "identifier" > wn< / span > < span class = "plain" > );< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > newstart< / span > < span class = "plain" > ~= < / span > < span class = "identifier" > bufend< / span > < span class = "plain" > ) {< / span >
< span class = "comment" > ! There's whitespace between the previous word and this one.< / span >
< span class = "comment" > ! Whitespace is okay around an asterisk...< / span >
< span class = "reserved" > if< / span > < span class = "plain" > ((< / span > < span class = "identifier" > lastchar< / span > < span class = "plain" > ~= < / span > < span class = "character" > '*'< / span > < span class = "plain" > < / span > < span class = "reserved" > or< / span > < span class = "plain" > < / span > < span class = "character" > 'x'< / span > < span class = "plain" > < / span > < span class = "reserved" > or< / span > < span class = "plain" > < / span > < span class = "character" > 'X'< / span > < span class = "plain" > < / span > < span class = "reserved" > or< / span > < span class = "plain" > < / span > < span class = "constant" > $D7< / span > < span class = "plain" > )< / span >
< span class = "plain" > & & (< / span > < span class = "identifier" > newstart< / span > < span class = "plain" > -> 0 ~= < / span > < span class = "character" > '*'< / span > < span class = "plain" > < / span > < span class = "reserved" > or< / span > < span class = "plain" > < / span > < span class = "character" > 'x'< / span > < span class = "plain" > < / span > < span class = "reserved" > or< / span > < span class = "plain" > < / span > < span class = "character" > 'X'< / span > < span class = "plain" > < / span > < span class = "reserved" > or< / span > < span class = "plain" > < / span > < span class = "constant" > $D7< / span > < span class = "plain" > )) {< / span >
< span class = "comment" > ! But around any other character, it's not.< / span >
< span class = "comment" > ! Don't include the new word.< / span >
< span class = "reserved" > break< / span > < span class = "plain" > ;< / span >
2020-01-10 01:10:09 +02:00
< span class = "plain" > }< / span >
< span class = "plain" > }< / span >
2020-01-13 13:02:57 +02:00
< span class = "identifier" > newlen< / span > < span class = "plain" > = < / span > < span class = "identifier" > WordLength< / span > < span class = "plain" > (< / span > < span class = "identifier" > wn< / span > < span class = "plain" > );< / span >
< span class = "reserved" > for< / span > < span class = "plain" > (< / span > < span class = "identifier" > ix< / span > < span class = "plain" > =0 : < / span > < span class = "identifier" > ix< / span > < span class = "plain" > < < / span > < span class = "identifier" > newlen< / span > < span class = "plain" > : < / span > < span class = "identifier" > ix< / span > < span class = "plain" > ++) {< / span >
< span class = "identifier" > ch< / span > < span class = "plain" > = < / span > < span class = "identifier" > newstart< / span > < span class = "plain" > -> < / span > < span class = "identifier" > ix< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (~~((< / span > < span class = "identifier" > ch< / span > < span class = "plain" > > = < / span > < span class = "character" > '0'< / span > < span class = "plain" > & & < / span > < span class = "identifier" > ch< / span > < span class = "plain" > < = < / span > < span class = "character" > '9'< / span > < span class = "plain" > )< / span >
< span class = "plain" > || (< / span > < span class = "identifier" > ch< / span > < span class = "plain" > == < / span > < span class = "character" > '-'< / span > < span class = "plain" > < / span > < span class = "reserved" > or< / span > < span class = "plain" > < / span > < span class = "character" > '+'< / span > < span class = "plain" > < / span > < span class = "reserved" > or< / span > < span class = "plain" > < / span > < span class = "character" > 'E'< / span > < span class = "plain" > < / span > < span class = "reserved" > or< / span > < span class = "plain" > < / span > < span class = "character" > 'e'< / span > < span class = "plain" > < / span > < span class = "reserved" > or< / span > < span class = "plain" > < / span > < span class = "character" > '.'< / span > < span class = "plain" > < / span > < span class = "reserved" > or< / span > < span class = "plain" > < / span > < span class = "character" > 'x'< / span > < span class = "plain" > < / span > < span class = "reserved" > or< / span > < span class = "plain" > < / span > < span class = "character" > 'X'< / span > < span class = "plain" > < / span > < span class = "reserved" > or< / span > < span class = "plain" > < / span > < span class = "character" > '*'< / span > < span class = "plain" > < / span > < span class = "reserved" > or< / span > < span class = "plain" > < / span > < span class = "constant" > $D7< / span > < span class = "plain" > < / span > < span class = "reserved" > or< / span > < span class = "plain" > < / span > < span class = "constant" > $5E< / span > < span class = "plain" > )))< / span >
< span class = "reserved" > break< / span > < span class = "plain" > ;< / span >
2020-01-10 01:10:09 +02:00
< span class = "plain" > }< / span >
2020-01-13 13:02:57 +02:00
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > ix< / span > < span class = "plain" > < < / span > < span class = "identifier" > newlen< / span > < span class = "plain" > ) {< / span >
< span class = "comment" > ! This word contains an invalid character.< / span >
< span class = "comment" > ! Don't include the new word.< / span >
< span class = "reserved" > break< / span > < span class = "plain" > ;< / span >
2020-01-10 01:10:09 +02:00
< span class = "plain" > }< / span >
2020-01-13 13:02:57 +02:00
< span class = "comment" > ! Okay, include it.< / span >
< span class = "identifier" > bufend< / span > < span class = "plain" > = < / span > < span class = "identifier" > newstart< / span > < span class = "plain" > + < / span > < span class = "identifier" > newlen< / span > < span class = "plain" > ;< / span >
< span class = "identifier" > wn< / span > < span class = "plain" > ++;< / span >
< span class = "identifier" > lastchar< / span > < span class = "plain" > = (< / span > < span class = "identifier" > bufend< / span > < span class = "plain" > -1)-> 0;< / span >
< span class = "identifier" > lastwasdot< / span > < span class = "plain" > = (< / span > < span class = "identifier" > newlen< / span > < span class = "plain" > == < / span > < span class = "constant" > 1< / span > < span class = "plain" > & & < / span > < span class = "identifier" > lastchar< / span > < span class = "plain" > == < / span > < span class = "character" > '.'< / span > < span class = "plain" > );< / span >
2020-01-10 01:10:09 +02:00
< span class = "plain" > }< / span >
2020-01-13 13:02:57 +02:00
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > wn< / span > < span class = "plain" > > < / span > < span class = "identifier" > firstwd< / span > < span class = "plain" > & & < / span > < span class = "identifier" > lastwasdot< / span > < span class = "plain" > ) {< / span >
< span class = "comment" > ! Exclude a trailing period.< / span >
< span class = "identifier" > wn< / span > < span class = "plain" > --;< / span >
< span class = "identifier" > bufend< / span > < span class = "plain" > --;< / span >
2020-01-10 01:10:09 +02:00
< span class = "plain" > }< / span >
2020-01-13 13:02:57 +02:00
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > wn< / span > < span class = "plain" > == < / span > < span class = "identifier" > firstwd< / span > < span class = "plain" > ) {< / span >
< span class = "comment" > ! No words accepted.< / span >
< span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > GPR_FAIL< / span > < span class = "plain" > ;< / span >
2020-01-10 01:10:09 +02:00
< span class = "plain" > }< / span >
2020-01-13 13:02:57 +02:00
< span class = "identifier" > parsed_number< / span > < span class = "plain" > = < / span > < span class = "identifier" > FloatParse< / span > < span class = "plain" > (< / span > < span class = "identifier" > buf< / span > < span class = "plain" > , < / span > < span class = "identifier" > bufend< / span > < span class = "plain" > -< / span > < span class = "identifier" > buf< / span > < span class = "plain" > , < / span > < span class = "reserved" > true< / span > < span class = "plain" > );< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > parsed_number< / span > < span class = "plain" > == < / span > < span class = "identifier" > FLOAT_NAN< / span > < span class = "plain" > )< / span >
< span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > GPR_FAIL< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > GPR_NUMBER< / span > < span class = "plain" > ;< / span >
2020-01-10 01:10:09 +02:00
< span class = "plain" > ];< / span >
2020-01-13 13:02:57 +02:00
< span class = "plain" > #< / span > < span class = "identifier" > Endif< / span > < span class = "plain" > ; < / span > < span class = "comment" > ! TARGET_GLULX< / span >
2020-01-10 01:10:09 +02:00
< / pre >
< p class = "inwebparagraph" > < / p >
< hr class = "tocbar" >
2020-01-27 03:22:21 +02:00
< ul class = "toc" > < li > < a href = "S-pt.html" > Back to 'Parser Template'< / a > < / li > < li > < i > (This section ends Sections.)< / i > < / li > < / ul > < hr class = "tocbar" >
2020-01-10 01:10:09 +02:00
<!-- End of weave -->
< / body >
< / html >