Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I read something from stdin in gforth and store it in a variable?

Tags:

forth

I've tried the following code after reading the docs:

   create buff 128 allot
   buff 128 stdin read-line throw

I was hoping that this would get me a char for each successive address of buff, but I'm getting this weird number in there:

buff @  ok
. 3689349013085184353  ok

What am I missing here?

like image 306
ivarec Avatar asked Oct 24 '25 04:10

ivarec


1 Answers

buff put the address of your buff variable on the (data) stack. The memory by that address contained the input received from stdin, something like this:

Address  Value
-------  -----
N+0      0x61
N+1      0x61
N+2      0x61
N+3      0x61
N+4      0x61
N+5      0x33
N+6      0x33
N+7      0x33
...      ...

The @ word transformed the address left by buff into an integer value by that address. But since you've (apparently) got a 64-bit gforth version, @ returned a 64-bit, i.e. 8-byte, value starting at the given address, i.e. 0x3333336161616161, which is 3689349013085184353 in decimal. The . word just showed you that number.

If you want to fetch a particular byte, use c@ instead of @:

buff c@ .

That'll give you the code of the first character in the buffer (0x61 or 97). If you want to get the second item, increment the address before executing c@, like this:

buff 1+ c@ .

Similarly, this will get you the sixth character's code:

buff 5 + c@ .
like image 110
Andriy M Avatar answered Oct 27 '25 02:10

Andriy M



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!