mevalffi.nim 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. # re-enable for windows once libffi can be installed in koch.nim
  2. # With win32 (not yet win64), libffi on windows works and this test passes.
  3. when defined(linux) or defined(bsd):
  4. {.passL: "-lm".} # for exp
  5. proc c_exp(a: float64): float64 {.importc: "exp", header: "<math.h>".}
  6. proc c_printf(frmt: cstring): cint {.importc: "printf", header: "<stdio.h>", varargs, discardable.}
  7. const snprintfName = when defined(windows): "_snprintf" else: "snprintf"
  8. proc c_snprintf*(buffer: pointer, buf_size: uint, format: cstring): cint {.importc: snprintfName, header: "<stdio.h>", varargs .}
  9. proc c_malloc(size:uint):pointer {.importc:"malloc", header: "<stdlib.h>".}
  10. proc c_free(p: pointer) {.importc:"free", header: "<stdlib.h>".}
  11. proc fun() =
  12. block: # c_exp
  13. var x = 0.3
  14. let b = c_exp(x)
  15. let b2 = int(b*1_000_000) # avoids floating point equality
  16. doAssert b2 == 1349858
  17. doAssert c_exp(0.3) == c_exp(x)
  18. const x2 = 0.3
  19. doAssert c_exp(x2) == c_exp(x)
  20. block: # c_printf
  21. c_printf("foo\n")
  22. c_printf("foo:%d\n", 100)
  23. c_printf("foo:%d\n", 101.cint)
  24. c_printf("foo:%d:%d\n", 102.cint, 103.cint)
  25. let temp = 104.cint
  26. c_printf("foo:%d:%d:%d\n", 102.cint, 103.cint, temp)
  27. var temp2 = 105.cint
  28. c_printf("foo:%g:%s:%d:%d\n", 0.03, "asdf", 103.cint, temp2)
  29. block: # c_snprintf, c_malloc, c_free
  30. let n: uint = 50
  31. var buffer2: pointer = c_malloc(n)
  32. var s: cstring = "foobar"
  33. var age: cint = 25
  34. discard c_snprintf(buffer2, n, "s1:%s s2:%s age:%d pi:%g", s, s, age, 3.14)
  35. c_printf("ret={%s}\n", buffer2)
  36. c_free(buffer2) # not sure it has an effect
  37. block: # c_printf bug
  38. var a = 123
  39. var a2 = a.addr
  40. #[
  41. bug: different behavior between CT RT in this case:
  42. at CT, shows foo2:a=123
  43. at RT, shows foo2:a=<address as int>
  44. ]#
  45. if false:
  46. c_printf("foo2:a=%d\n", a2)
  47. static:
  48. fun()
  49. fun()
  50. import system/ansi_c
  51. block:
  52. proc fun2()=
  53. c_fprintf(cstderr, "hello world stderr\n")
  54. write(stderr, "hi stderr\n")
  55. static: fun2()
  56. fun2()