test-c.sa


Generated by gen_html_sa_files from ICSI. Contact gomes@icsi.berkeley.edu for details
 
---------------------------> Sather 1.1 source file <-----------------------
---
-- test-fortran.sa: Test external fortran interface
-- Copyright (C) 1996, International Computer Science Institute
--
-- COPYRIGHT NOTICE: This code is provided WITHOUT ANY WARRANTY
-- and is subject to the terms of the SATHER LIBRARY GENERAL PUBLIC
-- LICENSE contained in the file: Sather/Doc/License of the
-- Sather distribution. The license is also available from ICSI,
-- 1947 Center St., Suite 600, Berkeley CA 94704, USA.

-- Author: Boris Vaysman -- Date: 7/29/96

class TEST_C

class TEST_C is -- Test external C interface include TEST; main is class_name("TEST_C"); -- Test C_INT type; i,j,k:C_INT; i:=#(1); j:=#(2); k := i+j; test("C_INT::plus", k.str, "3"); k := i-j; test("C_INT::minus", k.str, "-1"); k:=i*j; test("C_INT::times", k.str, "2"); k := #C_INT(6) / #C_INT(2); test("C_INT::div", k.str, "3"); i:=#(2); j:=#(3); k := TEST_C_INT::TEST_C_INT_plus(#(2),#(3)); test("TEST_C_INT::TEST_C_INT_plus", k.str, "5"); k := TEST_C_INT::TEST_C_INT_times(i,j); test("TEST_C_INT::TEST_C_INT_times", k.str, "6"); TEST_C_INT::TEST_C_INT_swap(inout i, inout j); test("TEST_C_INT::TEST_C_INT_swap", i.str+" "+j.str, "3 2"); --------------- TEST C_CHAR_PTR ----------------- char_ptr:C_CHAR_PTR; chars:ARRAY{CHAR} := #(6); char_ptr:=#(chars); TEST_C_CHAR_PTR::set_array_chars(char_ptr, #(chars.size)); str:STR; loop str := str+chars.elt!; end; test("TEST_C_CHAR_PTR::set_array_chars", str, "sather"); --------------- TEST C_INT_PTR ----------------- ints:ARRAY{INT} := #(5); TEST_C_INT_PTR::set_array_ints(#C_INT_PTR(ints), #(ints.size)); str:=#; loop str := str+ints.elt!; end; test("TEST_C_INT_PTR::set_array_ints", str, "01234"); --------------- TEST CALLBACKS FROM C ----------------- k:=TEST_C_CALLBACKS::test_callback1(#(1),#(2)); test("TEST_C_CALLBACKS::test_callback1", k.str, "3"); kf:C_FLOAT; kf:=TEST_C_CALLBACKS::test_callback2(#(1.0),#(2.0)); test("TEST_C_CALLBACKS::test_callback2", kf.str, "3"); i:=#(1); j:=#(2); TEST_C_CALLBACKS::test_callback3(inout i, inout j); test("TEST_C_CALLBACKS::test_callback3", i.str+" "+j.str, "2 1"); --------------- TEST C STRUCTURE MAPPING -------------- -- the layout needs to be generated by Sather bar:BAR; bar := BAR::create_bar; test("TEST STCRUCTS 0", bar.bar_attr_int.str+bar.bar_attr_float.str,"9999"); bar.bar_attr_int := #(1); bar.bar_attr_float := #(1.0); test("TEST STRUCTS 1", bar.bar_attr_int.str+bar.bar_attr_float.str, "11"); BAR::global_bar_float := #(100.0); test("TEST STRUCTS 2", BAR::global_bar_float.str, "100"); BAR::set_bar(bar, #(-1), #(-100.0)); test("TEST STRUCTS 2", bar.bar_attr_int.str + " " + bar.bar_attr_float.str, "-1 -100"); -- Layouts are provided by the included header files foo:FOO; foo := FOO::create_foo; foo.attribute_a := #C_INT(2); FOO::c_foo := foo; FOO::c_foo_int := #(2); end; end; external C class TEST_C_INT is TEST_C_INT_plus(a:C_INT,b:C_INT):C_INT; TEST_C_INT_times(a:C_INT,b:C_INT):C_INT; TEST_C_INT_swap(inout a:C_INT, inout b:C_INT); end; external C class TEST_C_CHAR_PTR is set_array_chars(p:C_CHAR_PTR, length:C_INT); end; external C class TEST_C_INT_PTR is set_array_ints(p:C_INT_PTR, length:C_INT); end; external C class TEST_C_CALLBACKS is callback1(a:C_INT, b:C_INT):C_INT is return a+b; end; callback2(a:C_FLOAT, b:C_FLOAT):C_FLOAT is return a+b; end; callback3(inout a:C_INT, inout b:C_INT) is tmp::=a; a := b; b:=tmp; end; -- C functions that call the above test_callback1(a:C_INT,b:C_INT):C_INT; test_callback2(a:C_FLOAT,b:C_FLOAT):C_FLOAT; test_callback3(inout a:C_INT, inout b:C_INT); end; -- Test structs -- The layout needs to be generated by Sather (both C_name and C_header -- constant attributes are missing) external C class BAR is attr bar_attr_int:C_INT; attr bar_attr_float:C_FLOAT; shared global_bar_float:C_FLOAT; create_bar:BAR; set_bar(bar:BAR, i:C_INT, f:C_FLOAT); end; external C class FOO is const C_name:STR := "C_FOO"; const C_header:STR := "../foo.h"; attr attribute_a: C_INT; attr attribute_b: C_FLOAT; attr attribute_c: C_CHAR; shared c_foo:FOO; shared c_foo_int:C_INT; create_foo:FOO; print_foo is end; end;