Advertisement
Guest User

Untitled

a guest
Feb 27th, 2017
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.83 KB | None | 0 0
  1. {.deadCodeElim: on.}
  2. when defined(windows):
  3. const
  4. libname* = "libbearlibterminal.dll"
  5. elif defined(macosx):
  6. const
  7. libname* = "libbearlibterminal.dylib"
  8. else:
  9. const
  10. libname* = "libbearlibterminal.so"
  11. type
  12. color_t* = uint32
  13. dimensions_t* = object
  14. width*: cint
  15. height*: cint
  16.  
  17.  
  18. proc terminal_open*(): cint {.cdecl, importc: "terminal_open", dynlib: libname.}
  19. proc terminal_close*() {.cdecl, importc: "terminal_close", dynlib: libname.}
  20. proc terminal_set8*(value: ptr int8): cint {.cdecl, importc: "terminal_set8",
  21. dynlib: libname.}
  22. proc terminal_set16*(value: ptr int16): cint {.cdecl, importc: "terminal_set16",
  23. dynlib: libname.}
  24. proc terminal_set32*(value: ptr int32): cint {.cdecl, importc: "terminal_set32",
  25. dynlib: libname.}
  26. proc terminal_refresh*() {.cdecl, importc: "terminal_refresh", dynlib: libname.}
  27. proc terminal_clear*() {.cdecl, importc: "terminal_clear", dynlib: libname.}
  28. proc terminal_clear_area*(x: cint; y: cint; w: cint; h: cint) {.cdecl,
  29. importc: "terminal_clear_area", dynlib: libname.}
  30. proc terminal_crop*(x: cint; y: cint; w: cint; h: cint) {.cdecl, importc: "terminal_crop",
  31. dynlib: libname.}
  32. proc terminal_layer*(index: cint) {.cdecl, importc: "terminal_layer", dynlib: libname.}
  33. proc terminal_color*(color: color_t) {.cdecl, importc: "terminal_color",
  34. dynlib: libname.}
  35. proc terminal_bkcolor*(color: color_t) {.cdecl, importc: "terminal_bkcolor",
  36. dynlib: libname.}
  37. proc terminal_composition*(mode: cint) {.cdecl, importc: "terminal_composition",
  38. dynlib: libname.}
  39. proc terminal_put*(x: cint; y: cint; code: cint) {.cdecl, importc: "terminal_put",
  40. dynlib: libname.}
  41. proc terminal_put_ext*(x: cint; y: cint; dx: cint; dy: cint; code: cint;
  42. corners: ptr color_t) {.cdecl, importc: "terminal_put_ext",
  43. dynlib: libname.}
  44. proc terminal_pick*(x: cint; y: cint; index: cint): cint {.cdecl,
  45. importc: "terminal_pick", dynlib: libname.}
  46. proc terminal_pick_color*(x: cint; y: cint; index: cint): color_t {.cdecl,
  47. importc: "terminal_pick_color", dynlib: libname.}
  48. proc terminal_pick_bkcolor*(x: cint; y: cint): color_t {.cdecl,
  49. importc: "terminal_pick_bkcolor", dynlib: libname.}
  50. proc terminal_print_ext8*(x: cint; y: cint; w: cint; h: cint; align: cint; s: ptr int8;
  51. out_w: ptr cint; out_h: ptr cint) {.cdecl,
  52. importc: "terminal_print_ext8", dynlib: libname.}
  53. proc terminal_print_ext16*(x: cint; y: cint; w: cint; h: cint; align: cint; s: ptr int16;
  54. out_w: ptr cint; out_h: ptr cint) {.cdecl,
  55. importc: "terminal_print_ext16", dynlib: libname.}
  56. proc terminal_print_ext32*(x: cint; y: cint; w: cint; h: cint; align: cint; s: ptr int32;
  57. out_w: ptr cint; out_h: ptr cint) {.cdecl,
  58. importc: "terminal_print_ext32", dynlib: libname.}
  59. proc terminal_measure_ext8*(w: cint; h: cint; s: ptr int8; out_w: ptr cint; out_h: ptr cint) {.
  60. cdecl, importc: "terminal_measure_ext8", dynlib: libname.}
  61. proc terminal_measure_ext16*(w: cint; h: cint; s: ptr int16; out_w: ptr cint;
  62. out_h: ptr cint) {.cdecl,
  63. importc: "terminal_measure_ext16", dynlib: libname.}
  64. proc terminal_measure_ext32*(w: cint; h: cint; s: ptr int32; out_w: ptr cint;
  65. out_h: ptr cint) {.cdecl,
  66. importc: "terminal_measure_ext32", dynlib: libname.}
  67. proc terminal_has_input*(): cint {.cdecl, importc: "terminal_has_input",
  68. dynlib: libname.}
  69. proc terminal_state*(code: cint): cint {.cdecl, importc: "terminal_state",
  70. dynlib: libname.}
  71. proc terminal_read*(): cint {.cdecl, importc: "terminal_read", dynlib: libname.}
  72. proc terminal_read_str8*(x: cint; y: cint; buffer: ptr int8; max: cint): cint {.cdecl,
  73. importc: "terminal_read_str8", dynlib: libname.}
  74. proc terminal_read_str16*(x: cint; y: cint; buffer: ptr int16; max: cint): cint {.cdecl,
  75. importc: "terminal_read_str16", dynlib: libname.}
  76. proc terminal_read_str32*(x: cint; y: cint; buffer: ptr int32; max: cint): cint {.cdecl,
  77. importc: "terminal_read_str32", dynlib: libname.}
  78. proc terminal_peek*(): cint {.cdecl, importc: "terminal_peek", dynlib: libname.}
  79. proc terminal_delay*(period: cint) {.cdecl, importc: "terminal_delay", dynlib: libname.}
  80. proc terminal_get8*(key: ptr int8; def: ptr int8): ptr int8 {.cdecl,
  81. importc: "terminal_get8", dynlib: libname.}
  82. proc terminal_get16*(key: ptr int16; def: ptr int16): ptr int16 {.cdecl,
  83. importc: "terminal_get16", dynlib: libname.}
  84. proc terminal_get32*(key: ptr int32; def: ptr int32): ptr int32 {.cdecl,
  85. importc: "terminal_get32", dynlib: libname.}
  86. proc color_from_name8*(name: ptr int8): color_t {.cdecl, importc: "color_from_name8",
  87. dynlib: libname.}
  88. proc color_from_name16*(name: ptr int16): color_t {.cdecl,
  89. importc: "color_from_name16", dynlib: libname.}
  90. proc color_from_name32*(name: ptr int32): color_t {.cdecl,
  91. importc: "color_from_name32", dynlib: libname.}
  92.  
  93. proc terminal_vsprintf*(s: cstring; args: va_list): cstring {.inline, cdecl.} =
  94. var buffer_size: cint
  95. var buffer: cstring
  96. var rc: cint
  97. if s.isNil: return nil
  98. elif buffer.isNil: buffer = cast[cstring](malloc(buffer_size))
  99. while 1:
  100. buffer[buffer_size - 1] = '\0'
  101. rc = vsnprintf(buffer, buffer_size, s, args)
  102. if rc >= buffer_size or buffer[buffer_size - 1] != '\0':
  103. if buffer_size >= 65536: return nil
  104. buffer_size = buffer_size * 2
  105. buffer = cast[cstring](realloc(buffer, buffer_size))
  106. else:
  107. break
  108. return if rc >= 0: buffer else: nil
  109.  
  110. proc terminal_vswprintf*(s: ptr wchar_t; args: va_list): ptr wchar_t {.inline, cdecl.} =
  111. var buffer_size: cint
  112. var buffer: ptr wchar_t
  113. var rc: cint
  114. if not s:
  115. return nil
  116. elif not buffer:
  117. buffer = cast[ptr wchar_t](malloc(buffer_size * sizeof((wchar_t))))
  118. while 1:
  119. buffer[buffer_size - 1] = '\0'
  120. rc = vswprintf(buffer, buffer_size, s, args)
  121. if rc >= buffer_size or buffer[buffer_size - 1] != '\0':
  122. if buffer_size >= 65536: return nil
  123. buffer_size = buffer_size * 2
  124. buffer = cast[ptr wchar_t](realloc(buffer, buffer_size * sizeof((wchar_t))))
  125. else:
  126. break
  127. return if rc >= 0: buffer else: nil
  128.  
  129. proc terminal_set*(s: cstring): cint {.inline, cdecl.} =
  130. return terminal_set8(cast[ptr int8](s))
  131.  
  132. proc terminal_setf*(s: cstring): cint {.inline, varargs, cdecl.} =
  133. var ret: cint
  134. var args: va_list
  135. va_start(args, s)
  136. ret = terminal_set(terminal_vsprintf(s, args))
  137. va_end(args)
  138. return ret
  139.  
  140. proc terminal_wset*(s: ptr wchar_t): cint {.inline, cdecl.} =
  141. return terminal_set32(cast[ptr int32](s))
  142.  
  143. proc terminal_wsetf*(s: ptr wchar_t): cint {.inline, varargs, cdecl.} =
  144. var ret: cint
  145. var args: va_list
  146. va_start(args, s)
  147. ret = terminal_wset(terminal_vswprintf(s, args))
  148. va_end(args)
  149. return ret
  150.  
  151. proc terminal_print*(x: cint; y: cint; s: cstring): dimensions_t {.inline, cdecl.} =
  152. var ret: dimensions_t
  153. terminal_print_ext8(x, y, 0, 0, 0, cast[ptr int8](s), addr(ret.width),
  154. addr(ret.height))
  155. return ret
  156.  
  157. proc terminal_printf*(x: cint; y: cint; s: cstring): dimensions_t {.inline, varargs, cdecl.} =
  158. var ret: dimensions_t
  159. var args: va_list
  160. va_start(args, s)
  161. ret = terminal_print(x, y, terminal_vsprintf(s, args))
  162. va_end(args)
  163. return ret
  164.  
  165. proc terminal_wprint*(x: cint; y: cint; s: ptr wchar_t): dimensions_t {.inline, cdecl.} =
  166. var ret: dimensions_t
  167. terminal_print_ext32(x, y, 0, 0, 0, cast[ptr int32](s), addr(ret.width),
  168. addr(ret.height))
  169. return ret
  170.  
  171. proc terminal_wprintf*(x: cint; y: cint; s: ptr wchar_t): dimensions_t {.inline, varargs,
  172. cdecl.} =
  173. var ret: dimensions_t
  174. var args: va_list
  175. va_start(args, s)
  176. ret = terminal_wprint(x, y, terminal_vswprintf(s, args))
  177. va_end(args)
  178. return ret
  179.  
  180. proc terminal_print_ext*(x: cint; y: cint; w: cint; h: cint; align: cint; s: cstring): dimensions_t {.
  181. inline, cdecl.} =
  182. var ret: dimensions_t
  183. terminal_print_ext8(x, y, w, h, align, cast[ptr int8](s), addr(ret.width),
  184. addr(ret.height))
  185. return ret
  186.  
  187. proc terminal_printf_ext*(x: cint; y: cint; w: cint; h: cint; align: cint; s: cstring): dimensions_t {.
  188. inline, varargs, cdecl.} =
  189. var ret: dimensions_t
  190. var args: va_list
  191. va_start(args, s)
  192. ret = terminal_print_ext(x, y, w, h, align, terminal_vsprintf(s, args))
  193. va_end(args)
  194. return ret
  195. nil
  196.  
  197. proc terminal_wprint_ext*(x: cint; y: cint; w: cint; h: cint; align: cint; s: ptr wchar_t): dimensions_t {.
  198. inline, cdecl.} =
  199. var ret: dimensions_t
  200. terminal_print_ext32(x, y, w, h, align, cast[ptr int32](s), addr(ret.width),
  201. addr(ret.height))
  202. return ret
  203.  
  204. proc terminal_wprintf_ext*(x: cint; y: cint; w: cint; h: cint; align: cint; s: ptr wchar_t): dimensions_t {.
  205. inline, varargs, cdecl.} =
  206. var ret: dimensions_t
  207. var args: va_list
  208. va_start(args, s)
  209. ret = terminal_wprint_ext(x, y, w, h, align, terminal_vswprintf(s, args))
  210. va_end(args)
  211. return ret
  212.  
  213. proc terminal_measure*(s: cstring): dimensions_t {.inline, cdecl.} =
  214. var ret: dimensions_t
  215. terminal_measure_ext8(0, 0, cast[ptr int8](s), addr(ret.width), addr(ret.height))
  216. return ret
  217.  
  218. proc terminal_measuref*(s: cstring): dimensions_t {.inline, varargs, cdecl.} =
  219. var ret: dimensions_t
  220. var args: va_list
  221. va_start(args, s)
  222. ret = terminal_measure(terminal_vsprintf(s, args))
  223. va_end(args)
  224. return ret
  225.  
  226. proc terminal_wmeasure*(s: ptr wchar_t): dimensions_t {.inline, cdecl.} =
  227. var ret: dimensions_t
  228. terminal_measure_ext32(0, 0, cast[ptr int32](s), addr(ret.width), addr(ret.height))
  229. return ret
  230.  
  231. proc terminal_wmeasuref*(s: ptr wchar_t): dimensions_t {.inline, varargs, cdecl.} =
  232. var ret: dimensions_t
  233. var args: va_list
  234. va_start(args, s)
  235. ret = terminal_wmeasure(terminal_vswprintf(s, args))
  236. va_end(args)
  237. return ret
  238.  
  239. proc terminal_measure_ext*(w: cint; h: cint; s: cstring): dimensions_t {.inline, cdecl.} =
  240. var ret: dimensions_t
  241. terminal_measure_ext8(w, h, cast[ptr int8](s), addr(ret.width), addr(ret.height))
  242. return ret
  243.  
  244. proc terminal_measuref_ext*(w: cint; h: cint; s: cstring): dimensions_t {.inline,
  245. varargs, cdecl.} =
  246. var ret: dimensions_t
  247. var args: va_list
  248. va_start(args, s)
  249. ret = terminal_measure_ext(w, h, terminal_vsprintf(s, args))
  250. va_end(args)
  251. return ret
  252.  
  253. proc terminal_wmeasure_ext*(w: cint; h: cint; s: ptr wchar_t): dimensions_t {.inline,
  254. cdecl.} =
  255. var ret: dimensions_t
  256. terminal_measure_ext32(w, h, cast[ptr int32](s), addr(ret.width), addr(ret.height))
  257. return ret
  258.  
  259. proc terminal_wmeasuref_ext*(w: cint; h: cint; s: ptr wchar_t): dimensions_t {.inline,
  260. varargs, cdecl.} =
  261. var ret: dimensions_t
  262. var args: va_list
  263. va_start(args, s)
  264. ret = terminal_wmeasure_ext(w, h, terminal_vswprintf(s, args))
  265. va_end(args)
  266. return ret
  267.  
  268. proc terminal_read_str*(x: cint; y: cint; buffer: cstring; max: cint): cint {.inline, cdecl.} =
  269. return terminal_read_str8(x, y, cast[ptr int8](buffer), max)
  270.  
  271. proc terminal_read_wstr*(x: cint; y: cint; buffer: ptr wchar_t; max: cint): cint {.inline,
  272. cdecl.} =
  273. return terminal_read_str32(x, y, cast[ptr int32](buffer), max)
  274.  
  275. proc terminal_get*(key: cstring; def: cstring): cstring {.inline, cdecl.} =
  276. return cast[cstring](terminal_get8(cast[ptr int8](key), cast[ptr int8](def)))
  277.  
  278. proc terminal_wget*(key: ptr wchar_t; def: ptr wchar_t): ptr wchar_t {.inline, cdecl.} =
  279. return cast[ptr wchar_t](terminal_get32(cast[ptr int32](key), cast[ptr int32](def)))
  280.  
  281. proc color_from_name*(name: cstring): color_t {.inline, cdecl.} =
  282. return color_from_name8(cast[ptr int8](name))
  283.  
  284. proc color_from_wname*(name: ptr wchar_t): color_t {.inline, cdecl.} =
  285. return color_from_name32(cast[ptr int32](name))
  286.  
  287. proc color_from_argb*(a: uint8; r: uint8; g: uint8; b: uint8): color_t {.inline, cdecl.} =
  288. return (cast[color_t](a) shl 24) or (r shl 16) or (g shl 8) or b
  289.  
  290. proc terminal_check*(code: cint): cint {.inline, cdecl.} =
  291. return terminal_state(code) > 0
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement