cbuilderbase.nim 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. import ropes, int128
  2. type
  3. Snippet* = string
  4. Builder* = object
  5. buf*: string
  6. template newBuilder*(s: string): Builder =
  7. Builder(buf: s)
  8. proc extract*(builder: Builder): Snippet =
  9. builder.buf
  10. proc add*(builder: var Builder, s: string) =
  11. builder.buf.add(s)
  12. proc add*(builder: var Builder, s: char) =
  13. builder.buf.add(s)
  14. proc addIntValue*(builder: var Builder, val: int) =
  15. builder.buf.addInt(val)
  16. proc addIntValue*(builder: var Builder, val: int64) =
  17. builder.buf.addInt(val)
  18. proc addIntValue*(builder: var Builder, val: uint64) =
  19. builder.buf.addInt(val)
  20. proc addIntValue*(builder: var Builder, val: Int128) =
  21. builder.buf.addInt128(val)
  22. template cIntValue*(val: int): Snippet = $val
  23. template cIntValue*(val: int64): Snippet = $val
  24. template cIntValue*(val: uint64): Snippet = $val
  25. template cIntValue*(val: Int128): Snippet = $val
  26. import std/formatfloat
  27. proc addFloatValue*(builder: var Builder, val: float) =
  28. builder.buf.addFloat(val)
  29. template cFloatValue*(val: float): Snippet = $val
  30. proc addInt64Literal*(result: var Builder; i: BiggestInt) =
  31. if i > low(int64):
  32. result.add "IL64($1)" % [rope(i)]
  33. else:
  34. result.add "(IL64(-9223372036854775807) - IL64(1))"
  35. proc addUint64Literal*(result: var Builder; i: uint64) =
  36. result.add rope($i & "ULL")
  37. proc addIntLiteral*(result: var Builder; i: BiggestInt) =
  38. if i > low(int32) and i <= high(int32):
  39. result.addIntValue(i)
  40. elif i == low(int32):
  41. # Nim has the same bug for the same reasons :-)
  42. result.add "(-2147483647 -1)"
  43. elif i > low(int64):
  44. result.add "IL64($1)" % [rope(i)]
  45. else:
  46. result.add "(IL64(-9223372036854775807) - IL64(1))"
  47. proc addIntLiteral*(result: var Builder; i: Int128) =
  48. addIntLiteral(result, toInt64(i))
  49. proc cInt64Literal*(i: BiggestInt): Snippet =
  50. if i > low(int64):
  51. result = "IL64($1)" % [rope(i)]
  52. else:
  53. result = "(IL64(-9223372036854775807) - IL64(1))"
  54. proc cUint64Literal*(i: uint64): Snippet =
  55. result = $i & "ULL"
  56. proc cIntLiteral*(i: BiggestInt): Snippet =
  57. if i > low(int32) and i <= high(int32):
  58. result = rope(i)
  59. elif i == low(int32):
  60. # Nim has the same bug for the same reasons :-)
  61. result = "(-2147483647 -1)"
  62. elif i > low(int64):
  63. result = "IL64($1)" % [rope(i)]
  64. else:
  65. result = "(IL64(-9223372036854775807) - IL64(1))"
  66. proc cIntLiteral*(i: Int128): Snippet =
  67. result = cIntLiteral(toInt64(i))