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

数据库系统

开发平台:

Unix_Linux

  1. /*-------------------------------------------------------------------------
  2.  *
  3.  * int8.c
  4.  *   Internal 64-bit integer operations
  5.  *
  6.  *-------------------------------------------------------------------------
  7.  */
  8. #include <ctype.h>
  9. #include <time.h>
  10. #include <math.h>
  11. #include <float.h>
  12. #include "postgres.h"
  13. #ifdef HAVE_LIMITS_H
  14. #include <limits.h>
  15. #endif
  16. #include "utils/int8.h"
  17. #define MAXINT8LEN 25
  18. #ifndef INT_MAX
  19. #define INT_MAX (0x7FFFFFFFL)
  20. #endif
  21. #ifndef INT_MIN
  22. #define INT_MIN (-INT_MAX-1)
  23. #endif
  24. #ifndef SHRT_MAX
  25. #define SHRT_MAX (0x7FFF)
  26. #endif
  27. #ifndef SHRT_MIN
  28. #define SHRT_MIN (-SHRT_MAX-1)
  29. #endif
  30. /***********************************************************************
  31.  **
  32.  ** Routines for 64-bit integers.
  33.  **
  34.  ***********************************************************************/
  35. /*----------------------------------------------------------
  36.  * Formatting and conversion routines.
  37.  *---------------------------------------------------------*/
  38. /* int8in()
  39.  */
  40. int64 *
  41. int8in(char *str)
  42. {
  43. int64    *result = palloc(sizeof(int64));
  44. char    *ptr = str;
  45. int64 tmp = 0;
  46. int sign = 1;
  47. if (!PointerIsValid(str))
  48. elog(ERROR, "Bad (null) int8 external representation");
  49. /*
  50.  * Do our own scan, rather than relying on sscanf which might be
  51.  * broken for long long.  NOTE: this will not detect int64 overflow...
  52.  * but sscanf doesn't either...
  53.  */
  54. while (*ptr && isspace(*ptr)) /* skip leading spaces */
  55. ptr++;
  56. if (*ptr == '-') /* handle sign */
  57. sign = -1, ptr++;
  58. else if (*ptr == '+')
  59. ptr++;
  60. if (!isdigit(*ptr)) /* require at least one digit */
  61. elog(ERROR, "Bad int8 external representation '%s'", str);
  62. while (*ptr && isdigit(*ptr)) /* process digits */
  63. tmp = tmp * 10 + (*ptr++ - '0');
  64. if (*ptr) /* trailing junk? */
  65. elog(ERROR, "Bad int8 external representation '%s'", str);
  66. *result = (sign < 0) ? -tmp : tmp;
  67. return result;
  68. } /* int8in() */
  69. /* int8out()
  70.  */
  71. char *
  72. int8out(int64 *val)
  73. {
  74. char    *result;
  75. int len;
  76. char buf[MAXINT8LEN + 1];
  77. if (!PointerIsValid(val))
  78. return NULL;
  79. if ((len = snprintf(buf, MAXINT8LEN, INT64_FORMAT, *val)) < 0)
  80. elog(ERROR, "Unable to format int8");
  81. result = palloc(len + 1);
  82. strcpy(result, buf);
  83. return result;
  84. } /* int8out() */
  85. /*----------------------------------------------------------
  86.  * Relational operators for int8s.
  87.  *---------------------------------------------------------*/
  88. /* int8relop()
  89.  * Is val1 relop val2?
  90.  */
  91. bool
  92. int8eq(int64 *val1, int64 *val2)
  93. {
  94. if (!val1 || !val2)
  95. return 0;
  96. return *val1 == *val2;
  97. } /* int8eq() */
  98. bool
  99. int8ne(int64 *val1, int64 *val2)
  100. {
  101. if (!val1 || !val2)
  102. return 0;
  103. return *val1 != *val2;
  104. } /* int8ne() */
  105. bool
  106. int8lt(int64 *val1, int64 *val2)
  107. {
  108. if (!val1 || !val2)
  109. return 0;
  110. return *val1 < *val2;
  111. } /* int8lt() */
  112. bool
  113. int8gt(int64 *val1, int64 *val2)
  114. {
  115. if (!val1 || !val2)
  116. return 0;
  117. return *val1 > *val2;
  118. } /* int8gt() */
  119. bool
  120. int8le(int64 *val1, int64 *val2)
  121. {
  122. if (!val1 || !val2)
  123. return 0;
  124. return *val1 <= *val2;
  125. } /* int8le() */
  126. bool
  127. int8ge(int64 *val1, int64 *val2)
  128. {
  129. if (!val1 || !val2)
  130. return 0;
  131. return *val1 >= *val2;
  132. } /* int8ge() */
  133. /* int84relop()
  134.  * Is 64-bit val1 relop 32-bit val2?
  135.  */
  136. bool
  137. int84eq(int64 *val1, int32 val2)
  138. {
  139. if (!val1)
  140. return 0;
  141. return *val1 == val2;
  142. } /* int84eq() */
  143. bool
  144. int84ne(int64 *val1, int32 val2)
  145. {
  146. if (!val1)
  147. return 0;
  148. return *val1 != val2;
  149. } /* int84ne() */
  150. bool
  151. int84lt(int64 *val1, int32 val2)
  152. {
  153. if (!val1)
  154. return 0;
  155. return *val1 < val2;
  156. } /* int84lt() */
  157. bool
  158. int84gt(int64 *val1, int32 val2)
  159. {
  160. if (!val1)
  161. return 0;
  162. return *val1 > val2;
  163. } /* int84gt() */
  164. bool
  165. int84le(int64 *val1, int32 val2)
  166. {
  167. if (!val1)
  168. return 0;
  169. return *val1 <= val2;
  170. } /* int84le() */
  171. bool
  172. int84ge(int64 *val1, int32 val2)
  173. {
  174. if (!val1)
  175. return 0;
  176. return *val1 >= val2;
  177. } /* int84ge() */
  178. /* int48relop()
  179.  * Is 32-bit val1 relop 64-bit val2?
  180.  */
  181. bool
  182. int48eq(int32 val1, int64 *val2)
  183. {
  184. if (!val2)
  185. return 0;
  186. return val1 == *val2;
  187. } /* int48eq() */
  188. bool
  189. int48ne(int32 val1, int64 *val2)
  190. {
  191. if (!val2)
  192. return 0;
  193. return val1 != *val2;
  194. } /* int48ne() */
  195. bool
  196. int48lt(int32 val1, int64 *val2)
  197. {
  198. if (!val2)
  199. return 0;
  200. return val1 < *val2;
  201. } /* int48lt() */
  202. bool
  203. int48gt(int32 val1, int64 *val2)
  204. {
  205. if (!val2)
  206. return 0;
  207. return val1 > *val2;
  208. } /* int48gt() */
  209. bool
  210. int48le(int32 val1, int64 *val2)
  211. {
  212. if (!val2)
  213. return 0;
  214. return val1 <= *val2;
  215. } /* int48le() */
  216. bool
  217. int48ge(int32 val1, int64 *val2)
  218. {
  219. if (!val2)
  220. return 0;
  221. return val1 >= *val2;
  222. } /* int48ge() */
  223. /*----------------------------------------------------------
  224.  * Arithmetic operators on 64-bit integers.
  225.  *---------------------------------------------------------*/
  226. int64 *
  227. int8um(int64 *val)
  228. {
  229. int64 temp = 0;
  230. int64    *result = palloc(sizeof(int64));
  231. if (!PointerIsValid(val))
  232. return NULL;
  233. result = int8mi(&temp, val);
  234. return result;
  235. } /* int8um() */
  236. int64 *
  237. int8pl(int64 *val1, int64 *val2)
  238. {
  239. int64    *result = palloc(sizeof(int64));
  240. if ((!PointerIsValid(val1)) || (!PointerIsValid(val2)))
  241. return NULL;
  242. *result = *val1 + *val2;
  243. return result;
  244. } /* int8pl() */
  245. int64 *
  246. int8mi(int64 *val1, int64 *val2)
  247. {
  248. int64    *result = palloc(sizeof(int64));
  249. if ((!PointerIsValid(val1)) || (!PointerIsValid(val2)))
  250. return NULL;
  251. *result = *val1 - *val2;
  252. return result;
  253. } /* int8mi() */
  254. int64 *
  255. int8mul(int64 *val1, int64 *val2)
  256. {
  257. int64    *result = palloc(sizeof(int64));
  258. if ((!PointerIsValid(val1)) || (!PointerIsValid(val2)))
  259. return NULL;
  260. *result = *val1 * *val2;
  261. return result;
  262. } /* int8mul() */
  263. int64 *
  264. int8div(int64 *val1, int64 *val2)
  265. {
  266. int64    *result = palloc(sizeof(int64));
  267. if ((!PointerIsValid(val1)) || (!PointerIsValid(val2)))
  268. return NULL;
  269. *result = *val1 / *val2;
  270. return result;
  271. } /* int8div() */
  272. int64 *
  273. int8larger(int64 *val1, int64 *val2)
  274. {
  275. int64    *result = palloc(sizeof(int64));
  276. if ((!PointerIsValid(val1)) || (!PointerIsValid(val2)))
  277. return NULL;
  278. *result = ((*val1 > *val2) ? *val1 : *val2);
  279. return result;
  280. } /* int8larger() */
  281. int64 *
  282. int8smaller(int64 *val1, int64 *val2)
  283. {
  284. int64    *result = palloc(sizeof(int64));
  285. if ((!PointerIsValid(val1)) || (!PointerIsValid(val2)))
  286. return NULL;
  287. *result = ((*val1 < *val2) ? *val1 : *val2);
  288. return result;
  289. } /* int8smaller() */
  290. int64 *
  291. int84pl(int64 *val1, int32 val2)
  292. {
  293. int64    *result = palloc(sizeof(int64));
  294. if (!PointerIsValid(val1))
  295. return NULL;
  296. *result = *val1 + (int64) val2;
  297. return result;
  298. } /* int84pl() */
  299. int64 *
  300. int84mi(int64 *val1, int32 val2)
  301. {
  302. int64    *result = palloc(sizeof(int64));
  303. if (!PointerIsValid(val1))
  304. return NULL;
  305. *result = *val1 - (int64) val2;
  306. return result;
  307. } /* int84mi() */
  308. int64 *
  309. int84mul(int64 *val1, int32 val2)
  310. {
  311. int64    *result = palloc(sizeof(int64));
  312. if (!PointerIsValid(val1))
  313. return NULL;
  314. *result = *val1 * (int64) val2;
  315. return result;
  316. } /* int84mul() */
  317. int64 *
  318. int84div(int64 *val1, int32 val2)
  319. {
  320. int64    *result = palloc(sizeof(int64));
  321. if (!PointerIsValid(val1))
  322. return NULL;
  323. *result = *val1 / (int64) val2;
  324. return result;
  325. } /* int84div() */
  326. int64 *
  327. int48pl(int32 val1, int64 *val2)
  328. {
  329. int64    *result = palloc(sizeof(int64));
  330. if (!PointerIsValid(val2))
  331. return NULL;
  332. *result = (int64) val1 + *val2;
  333. return result;
  334. } /* int48pl() */
  335. int64 *
  336. int48mi(int32 val1, int64 *val2)
  337. {
  338. int64    *result = palloc(sizeof(int64));
  339. if (!PointerIsValid(val2))
  340. return NULL;
  341. *result = (int64) val1 - *val2;
  342. return result;
  343. } /* int48mi() */
  344. int64 *
  345. int48mul(int32 val1, int64 *val2)
  346. {
  347. int64    *result = palloc(sizeof(int64));
  348. if (!PointerIsValid(val2))
  349. return NULL;
  350. *result = (int64) val1 **val2;
  351. return result;
  352. } /* int48mul() */
  353. int64 *
  354. int48div(int32 val1, int64 *val2)
  355. {
  356. int64    *result = palloc(sizeof(int64));
  357. if (!PointerIsValid(val2))
  358. return NULL;
  359. *result = (int64) val1 / *val2;
  360. return result;
  361. } /* int48div() */
  362. /*----------------------------------------------------------
  363.  * Conversion operators.
  364.  *---------------------------------------------------------*/
  365. int64 *
  366. int48(int32 val)
  367. {
  368. int64    *result = palloc(sizeof(int64));
  369. *result = val;
  370. return result;
  371. } /* int48() */
  372. int32
  373. int84(int64 *val)
  374. {
  375. int32 result;
  376. if (!PointerIsValid(val))
  377. elog(ERROR, "Invalid (null) int64, can't convert int8 to int4");
  378. if ((*val < INT_MIN) || (*val > INT_MAX))
  379. elog(ERROR, "int8 conversion to int4 is out of range");
  380. result = *val;
  381. return result;
  382. } /* int84() */
  383. #if NOT_USED
  384. int64 *
  385. int28 (int16 val)
  386. {
  387. int64    *result;
  388. result = palloc(sizeof(int64));
  389. *result = val;
  390. return result;
  391. } /* int28() */
  392. int16
  393. int82(int64 *val)
  394. {
  395. int16 result;
  396. if (!PointerIsValid(val))
  397. elog(ERROR, "Invalid (null) int8, can't convert to int2");
  398. if ((*val < SHRT_MIN) || (*val > SHRT_MAX))
  399. elog(ERROR, "int8 conversion to int2 is out of range");
  400. result = *val;
  401. return result;
  402. } /* int82() */
  403. #endif
  404. float64
  405. i8tod(int64 *val)
  406. {
  407. float64 result = palloc(sizeof(float64data));
  408. if (!PointerIsValid(val))
  409. elog(ERROR, "Invalid (null) int8, can't convert to float8");
  410. *result = *val;
  411. return result;
  412. } /* i8tod() */
  413. /* dtoi8()
  414.  * Convert double float to 8-byte integer.
  415.  * Do a range check before the conversion.
  416.  * Note that the comparison probably isn't quite right
  417.  * since we only have ~52 bits of precision in a double float
  418.  * and so subtracting one from a large number gives the large
  419.  * number exactly. However, for some reason the comparison below
  420.  * does the right thing on my i686/linux-rh4.2 box.
  421.  * - thomas 1998-06-16
  422.  */
  423. int64 *
  424. dtoi8(float64 val)
  425. {
  426. int64    *result = palloc(sizeof(int64));
  427. if (!PointerIsValid(val))
  428. elog(ERROR, "Invalid (null) float8, can't convert to int8");
  429. if ((*val < (-pow(2, 63) + 1)) || (*val > (pow(2, 63) - 1)))
  430. elog(ERROR, "Floating point conversion to int64 is out of range");
  431. *result = *val;
  432. return result;
  433. } /* dtoi8() */
  434. /* text_int8()
  435.  */
  436. int64 *
  437. text_int8(text *str)
  438. {
  439. int len;
  440. char    *s;
  441. if (!PointerIsValid(str))
  442. elog(ERROR, "Bad (null) int8 external representation");
  443. len = (VARSIZE(str) - VARHDRSZ);
  444. s = palloc(len + 1);
  445. memmove(s, VARDATA(str), len);
  446. *(s + len) = '';
  447. return int8in(s);
  448. } /* text_int8() */
  449. /* int8_text()
  450.  */
  451. text *
  452. int8_text(int64 *val)
  453. {
  454. text    *result;
  455. int len;
  456. char    *s;
  457. if (!PointerIsValid(val))
  458. return NULL;
  459. s = int8out(val);
  460. len = strlen(s);
  461. result = palloc(VARHDRSZ + len);
  462. VARSIZE(result) = len + VARHDRSZ;
  463. memmove(VARDATA(result), s, len);
  464. return result;
  465. } /* int8out() */