func main() {
	fmt.Printf("Initializing Rosie... ")

	var messages C.struct_stringArray

	home := gostring_to_structStringptr("/Users/jjennings/Work/Dev/public/rosie-pattern-language")
	engine, err := C.initialize(home, &messages)
	fmt.Printf("done.\n")
	if engine == nil {
		fmt.Printf("Return value from initialize was NULL!")
		fmt.Printf("Err field returned by initialize was: %s\n", err)
		fmt.Printf("Messages returned from initialize:\n")
		print_structStringArray(messages)
		os.Exit(-1)
	}

	var a C.struct_stringArray
	cfg := gostring_to_structStringptr("{\"expression\":\"[:digit:]+\", \"encode\":\"json\"}")
	a, err = C.configure_engine(engine, cfg)
	retval := structString_to_GoString(*C.string_array_ref(a, 0))
	fmt.Printf("Return code from configure_engine: %s\n", retval)

	a, err = C.inspect_engine(engine)
	retval = structString_to_GoString(*C.string_array_ref(a, 0))
	fmt.Printf("Return code from inspect_engine: %s\n", retval)
	fmt.Printf("Config from inspect_engine: %s\n", structString_to_GoString(*C.string_array_ref(a, 1)))
	C.free_stringArray(a)

	var foo string = "1111111111222222222211111111112222222222111111111122222222221111111111222222222211111111112222222222"
	foo_string := C.new_string_ptr(C.int(len(foo)), C.CString(foo))

	a, err = C.match(engine, foo_string, nil)
	retval = structString_to_GoString(*C.string_array_ref(a, 0))
	fmt.Printf("Return code from match: %s\n", retval)
	fmt.Printf("Data|false from match: %s\n", structString_to_GoString(*C.string_array_ref(a, 1)))
	fmt.Printf("Leftover chars from match: %s\n", structString_to_GoString(*C.string_array_ref(a, 2)))

	var r C.struct_stringArray
	var code, js_str string
	var leftover int

	foo = "1239999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999"
	foo_string = C.new_string_ptr(C.int(len(foo)), C.CString(foo))

	r = C.match(engine, foo_string, nil)
	code = structString_to_GoString(*C.string_array_ref(r, 0))
	js_str = structString_to_GoString(*C.string_array_ref(r, 1))
	leftover, err = strconv.Atoi(structString_to_GoString(*C.string_array_ref(r, 2)))
	if code != "true" {
		fmt.Printf("Error in match: %s\n", js_str)
	} else {
		fmt.Printf("Return code from match: %s\n", code)
		fmt.Printf("Data|false from match: %s\n", js_str)
		fmt.Printf("Leftover chars from match: %d\n", leftover)

		var retvals map[string]map[string]interface{}
		err = json.Unmarshal([]byte(js_str), &retvals)
		if err != nil {
			fmt.Println("JSON parse error:", err)
		}
		fmt.Printf("Match table: %s\n", retvals)
		fmt.Printf("Text from match table: %s\n", retvals["*"]["text"])
		fmt.Printf("Pos from match table: %d\n", int(retvals["*"]["pos"].(float64)))
		if retvals["*"]["subs"] != nil {
			fmt.Printf("Subs from match table: %s\n", retvals["*"]["subs"].(string))
		} else {
			fmt.Printf("No subs from match table.\n")
		}
	}
	C.free_stringArray(r)

	fmt.Printf(" done.\n")

	C.finalize(engine)

}
func gostring_to_structStringptr(s string) *C.struct_string {
	var cstr_ptr = C.new_string_ptr(C.int(len(s)), C.CString(s))
	return cstr_ptr
}