int8.c
上传用户:blenddy
上传日期:2007-01-07
资源大小:6495k
文件大小:7k
源码类别:

数据库系统

开发平台:

Unix_Linux

  1. /*-------------------------------------------------------------------------
  2.  *
  3.  * int8.c--
  4.  *   Internal 64-bit integer operations
  5.  *
  6.  *-------------------------------------------------------------------------
  7.  */
  8. #include <stdio.h> /* for sprintf proto, etc. */
  9. #include <stdlib.h> /* for strtod, etc. */
  10. #include <string.h>
  11. #include <ctype.h>
  12. #include <time.h>
  13. #include <math.h>
  14. #include <float.h>
  15. #include <limits.h>
  16. #include "postgres.h"
  17. #include "utils/palloc.h"
  18. #define MAXINT8LEN 25
  19. #if defined(__alpha) || defined(__GNUC__)
  20. #define HAVE_64BIT_INTS 1
  21. #endif
  22. #ifndef HAVE_64BIT_INTS
  23. typedef char[8]
  24. int64;
  25. #elif defined(__alpha)
  26. typedef long int int64;
  27. #define INT64_FORMAT "%ld"
  28. #elif defined(__GNUC__)
  29. typedef long long int int64;
  30. #define INT64_FORMAT "%Ld"
  31. #else
  32. typedef long int int64;
  33. #define INT64_FORMAT "%ld"
  34. #endif
  35. int64    *int8in(char *str);
  36. char    *int8out(int64 *val);
  37. bool int8eq(int64 *val1, int64 *val2);
  38. bool int8ne(int64 *val1, int64 *val2);
  39. bool int8lt(int64 *val1, int64 *val2);
  40. bool int8gt(int64 *val1, int64 *val2);
  41. bool int8le(int64 *val1, int64 *val2);
  42. bool int8ge(int64 *val1, int64 *val2);
  43. bool int84eq(int64 *val1, int32 val2);
  44. bool int84ne(int64 *val1, int32 val2);
  45. bool int84lt(int64 *val1, int32 val2);
  46. bool int84gt(int64 *val1, int32 val2);
  47. bool int84le(int64 *val1, int32 val2);
  48. bool int84ge(int64 *val1, int32 val2);
  49. int64    *int8um(int64 *val);
  50. int64    *int8pl(int64 *val1, int64 *val2);
  51. int64    *int8mi(int64 *val1, int64 *val2);
  52. int64    *int8mul(int64 *val1, int64 *val2);
  53. int64    *int8div(int64 *val1, int64 *val2);
  54. int64    *int48(int32 val);
  55. int32 int84(int64 *val);
  56. #if FALSE
  57. int64    *int28 (int16 val);
  58. int16 int82(int64 *val);
  59. #endif
  60. float64 i8tod(int64 *val);
  61. int64    *dtoi8(float64 val);
  62. /***********************************************************************
  63.  **
  64.  ** Routines for 64-bit integers.
  65.  **
  66.  ***********************************************************************/
  67. /*----------------------------------------------------------
  68.  * Formatting and conversion routines.
  69.  *---------------------------------------------------------*/
  70. /* int8in()
  71.  */
  72. int64 *
  73. int8in(char *str)
  74. {
  75. int64    *result = palloc(sizeof(int64));
  76. #if HAVE_64BIT_INTS
  77. if (!PointerIsValid(str))
  78. elog(ERROR, "Bad (null) int8 external representation", NULL);
  79. if (sscanf(str, INT64_FORMAT, result) != 1)
  80. elog(ERROR, "Bad int8 external representation '%s'", str);
  81. #else
  82. elog(ERROR, "64-bit integers are not supported", NULL);
  83. result = NULL;
  84. #endif
  85. return (result);
  86. } /* int8in() */
  87. /* int8out()
  88.  */
  89. char *
  90. int8out(int64 *val)
  91. {
  92. char    *result;
  93. int len;
  94. char buf[MAXINT8LEN + 1];
  95. #if HAVE_64BIT_INTS
  96. if (!PointerIsValid(val))
  97. return (NULL);
  98. if ((len = snprintf(buf, MAXINT8LEN, INT64_FORMAT, *val)) < 0)
  99. elog(ERROR, "Unable to format int8", NULL);
  100. result = palloc(len + 1);
  101. strcpy(result, buf);
  102. #else
  103. elog(ERROR, "64-bit integers are not supported", NULL);
  104. result = NULL;
  105. #endif
  106. return (result);
  107. } /* int8out() */
  108. /*----------------------------------------------------------
  109.  * Relational operators for int8s.
  110.  *---------------------------------------------------------*/
  111. /* int8relop()
  112.  * Is val1 relop val2?
  113.  */
  114. bool
  115. int8eq(int64 *val1, int64 *val2)
  116. {
  117. return (*val1 == *val2);
  118. } /* int8eq() */
  119. bool
  120. int8ne(int64 *val1, int64 *val2)
  121. {
  122. return (*val1 != *val2);
  123. } /* int8ne() */
  124. bool
  125. int8lt(int64 *val1, int64 *val2)
  126. {
  127. return (*val1 < *val2);
  128. } /* int8lt() */
  129. bool
  130. int8gt(int64 *val1, int64 *val2)
  131. {
  132. return (*val1 > *val2);
  133. } /* int8gt() */
  134. bool
  135. int8le(int64 *val1, int64 *val2)
  136. {
  137. return (*val1 <= *val2);
  138. } /* int8le() */
  139. bool
  140. int8ge(int64 *val1, int64 *val2)
  141. {
  142. return (*val1 >= *val2);
  143. } /* int8ge() */
  144. /* int84relop()
  145.  * Is 64-bit val1 relop 32-bit val2?
  146.  */
  147. bool
  148. int84eq(int64 *val1, int32 val2)
  149. {
  150. return (*val1 == val2);
  151. } /* int84eq() */
  152. bool
  153. int84ne(int64 *val1, int32 val2)
  154. {
  155. return (*val1 != val2);
  156. } /* int84ne() */
  157. bool
  158. int84lt(int64 *val1, int32 val2)
  159. {
  160. return (*val1 < val2);
  161. } /* int84lt() */
  162. bool
  163. int84gt(int64 *val1, int32 val2)
  164. {
  165. return (*val1 > val2);
  166. } /* int84gt() */
  167. bool
  168. int84le(int64 *val1, int32 val2)
  169. {
  170. return (*val1 <= val2);
  171. } /* int84le() */
  172. bool
  173. int84ge(int64 *val1, int32 val2)
  174. {
  175. return (*val1 >= val2);
  176. } /* int84ge() */
  177. /*----------------------------------------------------------
  178.  * Arithmetic operators on 64-bit integers.
  179.  *---------------------------------------------------------*/
  180. int64 *
  181. int8um(int64 *val)
  182. {
  183. int64    *result = palloc(sizeof(int64));
  184. if (!PointerIsValid(val))
  185. return NULL;
  186. *result = (-*val);
  187. return (result);
  188. } /* int8um() */
  189. int64 *
  190. int8pl(int64 *val1, int64 *val2)
  191. {
  192. int64    *result = palloc(sizeof(int64));
  193. if ((!PointerIsValid(val1)) || (!PointerIsValid(val2)))
  194. return NULL;
  195. *result = *val1 + *val2;
  196. return (result);
  197. } /* int8pl() */
  198. int64 *
  199. int8mi(int64 *val1, int64 *val2)
  200. {
  201. int64    *result = palloc(sizeof(int64));
  202. if ((!PointerIsValid(val1)) || (!PointerIsValid(val2)))
  203. return NULL;
  204. *result = *val1 - *val2;
  205. return (result);
  206. } /* int8mi() */
  207. int64 *
  208. int8mul(int64 *val1, int64 *val2)
  209. {
  210. int64    *result = palloc(sizeof(int64));
  211. if ((!PointerIsValid(val1)) || (!PointerIsValid(val2)))
  212. return NULL;
  213. *result = *val1 * *val2;
  214. return (result);
  215. } /* int8mul() */
  216. int64 *
  217. int8div(int64 *val1, int64 *val2)
  218. {
  219. int64    *result = palloc(sizeof(int64));
  220. if ((!PointerIsValid(val1)) || (!PointerIsValid(val2)))
  221. return NULL;
  222. *result = *val1 / *val2;
  223. return (result);
  224. } /* int8div() */
  225. /*----------------------------------------------------------
  226.  * Conversion operators.
  227.  *---------------------------------------------------------*/
  228. int64 *
  229. int48(int32 val)
  230. {
  231. int64    *result = palloc(sizeof(int64));
  232. *result = val;
  233. return (result);
  234. } /* int48() */
  235. int32
  236. int84(int64 *val)
  237. {
  238. int32 result;
  239. if (!PointerIsValid(val))
  240. elog(ERROR, "Invalid (null) int64, can't convert int8 to int4", NULL);
  241. if ((*val < INT_MIN) || (*val > INT_MAX))
  242. elog(ERROR, "int8 conversion to int4 is out of range", NULL);
  243. result = *val;
  244. return (result);
  245. } /* int84() */
  246. #if FALSE
  247. int64 *
  248. int28 (int16 val)
  249. {
  250. int64    *result;
  251. if (!PointerIsValid(result = palloc(sizeof(int64))))
  252. elog(ERROR, "Memory allocation failed, can't convert int8 to int2", NULL);
  253. *result = val;
  254. return (result);
  255. } /* int28() */
  256. int16
  257. int82(int64 *val)
  258. {
  259. int16 result;
  260. if (!PointerIsValid(val))
  261. elog(ERROR, "Invalid (null) int8, can't convert to int2", NULL);
  262. result = *val;
  263. return (result);
  264. } /* int82() */
  265. #endif
  266. float64
  267. i8tod(int64 *val)
  268. {
  269. float64 result = palloc(sizeof(float64data));
  270. *result = *val;
  271. return (result);
  272. } /* i8tod() */
  273. int64 *
  274. dtoi8(float64 val)
  275. {
  276. int64    *result = palloc(sizeof(int64));
  277. if ((*val < (-pow(2, 64) + 1)) || (*val > (pow(2, 64) - 1)))
  278. elog(ERROR, "Floating point conversion to int64 is out of range", NULL);
  279. *result = *val;
  280. return (result);
  281. } /* dtoi8() */