// This example illustrates global variable access from Go.

package main

import (
	"fmt"
	"./example"
)

func main() {
	// Try to set the values of some global variables

	example.SetIvar(42)
	example.SetSvar(-31000)
	example.SetLvar(65537)
	example.SetUivar(123456)
	example.SetUsvar(61000)
	example.SetUlvar(654321)
	example.SetScvar(-13)
	example.SetUcvar(251)
	example.SetCvar('S')
	example.SetFvar(3.14159)
	example.SetDvar(2.1828)
	example.SetStrvar("Hello World")
	example.SetIptrvar(example.New_int(37))
	example.SetPtptr(example.New_Point(37, 42))
	example.SetName("Bill")

	// Now print out the values of the variables

	fmt.Println("Variables (values printed from Go)")

	fmt.Println("ivar      =", example.GetIvar())
	fmt.Println("svar      =", example.GetSvar())
	fmt.Println("lvar      =", example.GetLvar())
	fmt.Println("uivar     =", example.GetUivar())
	fmt.Println("usvar     =", example.GetUsvar())
	fmt.Println("ulvar     =", example.GetUlvar())
	fmt.Println("scvar     =", example.GetScvar())
	fmt.Println("ucvar     =", example.GetUcvar())
	fmt.Println("fvar      =", example.GetFvar())
	fmt.Println("dvar      =", example.GetDvar())
	fmt.Printf("cvar      = %c\n", example.GetCvar())
	fmt.Println("strvar    =", example.GetStrvar())
	fmt.Println("cstrvar   =", example.GetCstrvar())
	fmt.Println("iptrvar   =", example.GetIptrvar())
	fmt.Println("name      =", example.GetName())
	fmt.Println("ptptr     =", example.GetPtptr(), example.Point_print(example.GetPtptr()))
	fmt.Println("pt        =", example.GetPt(), example.Point_print(example.GetPt()))

	fmt.Println("\nVariables (values printed from C)")

	example.Print_vars()

	// This line would not compile: since status is marked with
	// %immutable, there is no SetStatus function.
	// fmt.Println("\nNow I'm going to try and modify some read only variables")
	// example.SetStatus(0)

	fmt.Println("\nI'm going to try and update a structure variable.\n")

	example.SetPt(example.GetPtptr())

	fmt.Println("The new value is")
	example.Pt_print()
	fmt.Println("You should see the value", example.Point_print(example.GetPtptr()))
}
