// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.


package foop	// rename to avoid redeclaration

func	mal(uint32) *any;
func	breakpoint();
func	panicl(int32);

func	printbool(bool);
func	printfloat(double);
func	printint(int64);
func	printstring(string);
func	printpointer(*any);

func	catstring(string, string) string;
func	cmpstring(string, string) int32;
func	slicestring(string, int32, int32) string;
func	indexstring(string, int32) byte;
func	intstring(int64) string;
func	byteastring(*byte, int32) string;
func	mkiface(*byte, *byte, *struct{}) interface{};

func	argc() int32;
func	envc() int32;
func	argv(int32) string;
func	envv(int32) string;

func	frexp(float64) (float64, int32);	// break fp into exp,fract
func	ldexp(float64, int32) float64;		// make fp from exp,fract
func	modf(float64) (float64, float64);	// break fp into double.double
func	isInf(float64, int32) bool;		// test for infinity
func	isNaN(float64) bool;			// test for not-a-number
func	Inf(int32) float64;			// return signed Inf
func	NaN() float64;				// return a NaN

func	newmap(keysize uint32, valsize uint32,
		keyalg uint32, valalg uint32,
		hint uint32) (hmap *map[any]any);
func	mapaccess1(hmap *map[any]any, key any) (val any);
func	mapaccess2(hmap *map[any]any, key any) (val any, pres bool);
func	mapassign1(hmap *map[any]any, key any, val any);
func	mapassign2(hmap *map[any]any, key any, val any, pres bool);

func	newchan(elemsize uint32, elemalg uint32, hint uint32) (hchan *chan any);
func	chanrecv1(hchan *chan any) (elem any);
func	chanrecv2(hchan *chan any) (elem any, pres bool);
func	chanrecv3(hchan *chan any) (elem any, pres bool);
func	chansend1(hchan *chan any, elem any);
func	chansend2(hchan *chan any, elem any) (pres bool);

func	gosched();
func	goexit();

func	readfile(string) (string, bool);	// read file into string; boolean status
func	writefile(string, string) (bool);	// write string into file; boolean status
func	bytestorune(*byte, int32, int32) (int32, int32);	// convert bytes to runes	
func	stringtorune(string, int32, int32) (int32, int32);	// convert bytes to runes	

func	exit(int32);

export
	mal
	breakpoint

	// print panic
	panicl
	printbool
	printfloat
	printint
	printstring
	printpointer

	// op string
	catstring
	cmpstring
	slicestring
	indexstring
	intstring
	byteastring
	mkiface

	// args
	argc
	envc
	argv
	envv

	// fp
	frexp
	ldexp
	modf
	isInf,
	isNaN,
	Inf,
	NaN,

	// map
	newmap
	mapaccess1
	mapaccess2
	mapassign1
	mapassign2

	// chan
	newchan
	chanrecv1
	chanrecv2
	chanrecv3
	chansend1
	chansend2

	// go routines
	gosched
	goexit

	// files
	readfile
	writefile

	// runes and utf-8
	bytestorune
	stringtorune

	// system calls
	exit
	;
