| // Copyright 2010 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. |
| |
| // This file contains test cases for cgo. |
| |
| package stdio |
| |
| /* |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <sys/stat.h> |
| #include <errno.h> |
| |
| #define SHIFT(x, y) ((x)<<(y)) |
| #define KILO SHIFT(1, 10) |
| |
| enum { |
| Enum1 = 1, |
| Enum2 = 2, |
| }; |
| */ |
| import "C" |
| import ( |
| "os" |
| "unsafe" |
| ) |
| |
| const EINVAL = C.EINVAL /* test #define */ |
| |
| var KILO = C.KILO |
| |
| func Size(name string) (int64, os.Error) { |
| var st C.struct_stat |
| p := C.CString(name) |
| _, err := C.stat(p, &st) |
| C.free(unsafe.Pointer(p)) |
| if err != nil { |
| return 0, err |
| } |
| return int64(C.ulong(st.st_size)), nil |
| } |
| |
| func Strtol(s string, base int) (int, os.Error) { |
| p := C.CString(s) |
| n, err := C.strtol(p, nil, C.int(base)) |
| C.free(unsafe.Pointer(p)) |
| return int(n), err |
| } |
| |
| func Atol(s string) int { |
| p := C.CString(s) |
| n := C.atol(p) |
| C.free(unsafe.Pointer(p)) |
| return int(n) |
| } |
| |
| func TestEnum() { |
| if C.Enum1 != 1 || C.Enum2 != 2 { |
| println("bad enum", C.Enum1, C.Enum2) |
| } |
| } |
| |
| func TestAtol() { |
| l := Atol("123") |
| if l != 123 { |
| println("Atol 123: ", l) |
| panic("bad atol") |
| } |
| } |
| |
| func TestErrno() { |
| n, err := Strtol("asdf", 123) |
| if n != 0 || err != os.EINVAL { |
| println("Strtol: ", n, err) |
| panic("bad atoi2") |
| } |
| } |
| |
| var ( |
| uint = (C.uint)(0) |
| ulong C.ulong |
| char C.char |
| ) |
| |
| func Test() { |
| TestAlign() |
| TestAtol() |
| TestEnum() |
| TestErrno() |
| } |