Basically bumping from here in the hopes that someone who knows I6 will see this… I guess I shouldn’t run into intractable problems over an American holiday. Happy Thanksgiving, those who celebrate it! Hope you had/are having relatively easy trips, if you’re taking them.
So I’m working on something where I want to take a string that has been stored in an I6 array and hand it over to an I7 rulebook for processing. The context is a call to LanguageContraction whose argument is StorageForShortName, from this code block within PrefaceByArticle (for Glulx only):
if (findout) {
if (pluralise)
Glulx_PrintAnyToArray(StorageForShortName, 160, EnglishNumber, pluralise);
else
Glulx_PrintAnyToArray(StorageForShortName, 160, PSN__, obj);
acode = acode + 3*LanguageContraction(StorageForShortName);
}
(Apologies; the copy-paste from the web I6 template is munging the tab stops. But it’s I6 code so they shouldn’t be essential.)
LanguageContraction as it stands is very simple:
[LanguageContraction text;
if (text->0 == ’a’ or ’e’ or ’i’ or ’o’ or ’u’
or ’A’ or ’E’ or ’I’ or ’O’ or ’U’) return 1;
return 0;
]
What I’d like to do is replace that with a call to an I7 rulebook that does something more complex than simply check whether the first letter of text is a vowel. (So we can tell it that it should be “an hourglass,” “a unicorn,” and other things.) In the other thread, Draconis said that when he has to pass a string from I6 to I7, he copies it into a buffer and makes an I7 say phrase to read that buffer out. (This is also how Text Capture exports its captured text buffer to the “[captured text]” substitution.) So I made this routine:
[code]To say the/-- I6 buffer:
(- PrintI6Buffer(); -).
Include (-
Array I6Buffer buffer 250;
[ PrintI6Buffer len i;
len = I6Buffer–>0;
for ( i = 0 : i < len : i++ )
{
glk_put_char_uni(I6Buffer–>(i + 1));
}
];
-)
.[/code]
(Changing “buffer” to “table” seems to leave everything the same.)
And then I defined the rulebook I wanted to run:
[code]The initial sound rules are a rulebook. The initial sound rules have outcomes vowel and consonant.
An initial sound rule (this is the basic initial sound test rule):
let temp be the substituted form of “[I6 buffer]”;
say “(DBG: [temp])”;
if “[temp]” starts with a vowel sound:
vowel;
otherwise:
consonant.[/code]
and tried to edit it into Language Contraction, thus:
[code]Include (-
Constant LanguageAnimateGender = male;
Constant LanguageInanimateGender = neuter;
Constant LanguageContractionForms = 2; ! English has two:
! 0 = starting with a consonant
! 1 = starting with a vowel
[ LanguageContraction text result rv i;
!!! This is the old routine:
!if (text->0 == ’a’ or ’e’ or ’i’ or ’o’ or ’u’
!or ’A’ or ’E’ or ’I’ or ’O’ or ’U’) return 1;
!return 0;
!!! Out w/ old – in w/ new:
for (i=1:i<20:i++) I6Buffer → i = text → i;
rv = FollowRulebook( (+ initial sound rules +) );
if ((rv) && RulebookSucceeded()) {
result = ResultOfRule();
if (result == (+ vowel outcome +)) return 1;
return 0;}
return 0;
];
Array LanguageArticles →
! Contraction form 0: Contraction form 1:
! Cdef Def Indef Cdef Def Indef
"The " "the " "a " "The " "the " "an " ! Articles 0
"The " "the " "some " "The " "the " "some "; ! Articles 1
! a i
! s p s p
! m f n m f n m f n m f n
Array LanguageGNAsToArticles → 0 0 0 1 1 1 0 0 0 1 1 1;
-) instead of “Articles” in “Language.i6t”.[/code]
Running this on a test scenario (which I’ll put in spoilers at the end of the post) yields this:
So obviously the copy isn’t working here, as the I6 Buffer is turning into some Unicode stuff. I’m pretty sure the suspect line is this:
for (i=1:i<20:i++) I6Buffer --> i = text --> i;
But nothing else I’m trying works. If I change i<20 to i<90 or higher, I get a Glulxe fatal error: memory access out of range. (-76FFFF9E or so.) If I try BlkValueCopy:
BlkValueCopy(I6Buffer, text);
I get “You can see” and then a memory access out of range error (686F6E69).
If I try using BlkValueWrite and BlkValueRead:
for (i=1:i<89:i++) BlkValueWrite(I6Buffer, i, BlkValueRead(text, i));
I get the same memory access out of range error (686F6E66).
I’m at my wit’s end here and I’ve been brickwalled for something like a week on this. Obviously I don’t know what I’m doing, but this seems like the simplest freaking operation I6–I just want to copy one array into another–and the I6 Designer’s Manual doesn’t have anything about how to do this, while Appendix B doesn’t give me any hints either. Is it that I don’t know the type of the things I’m trying to copy? And this all arises from trying to puzzle out how Inform is managing to guess what articles to use, which I’m no further along at; I can see where it’s looking for an initial vowel, but I don’t know how it’s managing to get the string that it’s about to print sequestered into something that lets it check the initial vowel before printing.
Anyway, Happy Thanksgiving, and I appreciate any help you can give!
Test bed (largely courtesy of Skinny Mike):
[spoiler][code]The Lab is a room.
An animal can be honest or dishonest. Understand the honest property as describing an animal.
Before printing the name of an animal (called beast): say "[if beast is dishonest]dis[end if]honest ".
The unicorn is an animal. It is honest.
The yak is an animal. It is dishonest.
A block is a kind of thing. It has a number called weight. The description of a block is “It looks to be about [weight of the item described in words] pound[s].”
After examining a block (called B):
now the printed name of B is “[weight of B in words] - pound block of [B]”.
The yttrium is a block. The weight is one.
The uniform is wearable. The description is “It’s a United States Army uniform.”
After examining the uniform for the first time:
now the printed name of the uniform is “United States Army uniform”.
A unicorn, a uniform, an hourglass, a yak and yttrium are in the lab.
[Matt’s code - additions noted]
[create a global variable to be called later in i6:]
[Current vowel sound is a number that varies. Current vowel sound variable translates into i6 as “vowel_sound”.
Before printing the name of a thing (called x):
let T be a text;
now T is the printed name of x;
now Current vowel sound is T evaluated.
[say Current vowel sound.]
To decide what number is (s - a text) evaluated:
if s starts with a vowel sound:
decide on 1;
decide on 0. ]
To decide whether (string - a text) starts with a vowel sound (this is vowel sound checking):
let the first word be punctuated word number 1 in string;
if the first word is a word listed in the Table of Words That Start With Vowel Sounds, yes;
if the first word is a word listed in the Table of Words That Don’t Start With Vowel Sounds, no;
if character number 1 in the first word is a vowel, yes;
no.
To decide whether (letter - a text) is a vowel:
if letter exactly matches the regular expression “a|e|i|o|u|A|E|I|O|U”, yes;
no.
The initial sound rules are a rulebook. The initial sound rules have outcomes vowel and consonant.
An initial sound rule (this is the basic initial sound test rule):
let temp be the substituted form of “[I6 buffer]”;
say “(DBG: [temp])”;
if “[temp]” starts with a vowel sound:
vowel;
otherwise:
consonant.
To say the/-- I6 buffer:
(- PrintI6Buffer(); -).
Include (-
Array I6Buffer buffer 250;
[ PrintI6Buffer len i;
len = I6Buffer–>0;
for ( i = 0 : i < len : i++ )
{
glk_put_char_uni(I6Buffer–>(i + 1));
}
];
-)
.
Table of Words That Start With Vowel Sounds
word
“hour”
“hourglass”
“honest”
“yttrium”
Table of Words That Don’t Start With Vowel Sounds
word
“uniform”
“unicorn”
“united”
“United”
“one”
[end]
[Include (-
Global vowel_sound = 0;
-) after “Definitions.i6t”.]
Include (-
Constant LanguageAnimateGender = male;
Constant LanguageInanimateGender = neuter;
Constant LanguageContractionForms = 2; ! English has two:
! 0 = starting with a consonant
! 1 = starting with a vowel
[ LanguageContraction text result rv i;
!!! This is the old routine:
!if (text->0 == ’a’ or ’e’ or ’i’ or ’o’ or ’u’
!or ’A’ or ’E’ or ’I’ or ’O’ or ’U’) return 1;
!return 0;
!!! Out w/ old – in w/ new:
for (i=1:i<10:i++) BlkValueWrite(I6Buffer, i, BlkValueRead(text, i));
rv = FollowRulebook( (+ initial sound rules +) );
if ((rv) && RulebookSucceeded()) {
result = ResultOfRule();
if (result == (+ vowel outcome +)) return 1;
return 0;}
return 0;
];
Array LanguageArticles →
! Contraction form 0: Contraction form 1:
! Cdef Def Indef Cdef Def Indef
"The " "the " "a " "The " "the " "an " ! Articles 0
"The " "the " "some " "The " "the " "some "; ! Articles 1
! a i
! s p s p
! m f n m f n m f n m f n
Array LanguageGNAsToArticles → 0 0 0 1 1 1 0 0 0 1 1 1;
-) instead of “Articles” in “Language.i6t”.[/code][/spoiler]