ibase_blobs.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591
  1. /*
  2. +----------------------------------------------------------------------+
  3. | PHP Version 5 |
  4. +----------------------------------------------------------------------+
  5. | Copyright (c) 1997-2016 The PHP Group |
  6. +----------------------------------------------------------------------+
  7. | This source file is subject to version 3.01 of the PHP license, |
  8. | that is bundled with this package in the file LICENSE, and is |
  9. | available through the world-wide-web at the following url: |
  10. | http://www.php.net/license/3_01.txt |
  11. | If you did not receive a copy of the PHP license and are unable to |
  12. | obtain it through the world-wide-web, please send a note to |
  13. | license@php.net so we can mail you a copy immediately. |
  14. +----------------------------------------------------------------------+
  15. | Authors: Ard Biesheuvel <a.k.biesheuvel@its.tudelft.nl> |
  16. +----------------------------------------------------------------------+
  17. */
  18. #ifdef HAVE_CONFIG_H
  19. #include "config.h"
  20. #endif
  21. #include "php.h"
  22. #if HAVE_IBASE
  23. #include "php_interbase.h"
  24. #include "php_ibase_includes.h"
  25. #define BLOB_CLOSE 1
  26. #define BLOB_CANCEL 2
  27. static int le_blob;
  28. static void _php_ibase_free_blob(zend_rsrc_list_entry *rsrc TSRMLS_DC) /* {{{ */
  29. {
  30. ibase_blob *ib_blob = (ibase_blob *)rsrc->ptr;
  31. if (ib_blob->bl_handle != NULL) { /* blob open*/
  32. if (isc_cancel_blob(IB_STATUS, &ib_blob->bl_handle)) {
  33. _php_ibase_module_error("You can lose data. Close any blob after reading from or "
  34. "writing to it. Use ibase_blob_close() before calling ibase_close()" TSRMLS_CC);
  35. }
  36. }
  37. efree(ib_blob);
  38. }
  39. /* }}} */
  40. void php_ibase_blobs_minit(INIT_FUNC_ARGS) /* {{{ */
  41. {
  42. le_blob = zend_register_list_destructors_ex(_php_ibase_free_blob, NULL,
  43. "interbase blob", module_number);
  44. }
  45. /* }}} */
  46. int _php_ibase_string_to_quad(char const *id, ISC_QUAD *qd) /* {{{ */
  47. {
  48. /* shortcut for most common case */
  49. if (sizeof(ISC_QUAD) == sizeof(ISC_UINT64)) {
  50. return sscanf(id, BLOB_ID_MASK, (ISC_UINT64 *) qd);
  51. } else {
  52. ISC_UINT64 res;
  53. if (sscanf(id, BLOB_ID_MASK, &res)) {
  54. qd->gds_quad_high = (ISC_LONG) (res >> 0x20);
  55. qd->gds_quad_low = (ISC_LONG) (res & 0xFFFFFFFF);
  56. return 1;
  57. }
  58. return 0;
  59. }
  60. }
  61. /* }}} */
  62. char *_php_ibase_quad_to_string(ISC_QUAD const qd) /* {{{ */
  63. {
  64. char *result;
  65. /* shortcut for most common case */
  66. if (sizeof(ISC_QUAD) == sizeof(ISC_UINT64)) {
  67. spprintf(&result, BLOB_ID_LEN+1, "0x%0*" LL_MASK "x", 16, *(ISC_UINT64*)(void *) &qd);
  68. } else {
  69. ISC_UINT64 res = ((ISC_UINT64) qd.gds_quad_high << 0x20) | qd.gds_quad_low;
  70. spprintf(&result, BLOB_ID_LEN+1, "0x%0*" LL_MASK "x", 16, res);
  71. }
  72. return result;
  73. }
  74. /* }}} */
  75. typedef struct { /* {{{ */
  76. ISC_LONG max_segment; /* Length of longest segment */
  77. ISC_LONG num_segments; /* Total number of segments */
  78. ISC_LONG total_length; /* Total length of blob */
  79. int bl_stream; /* blob is stream ? */
  80. /* }}} */
  81. } IBASE_BLOBINFO;
  82. int _php_ibase_blob_get(zval *return_value, ibase_blob *ib_blob, unsigned long max_len TSRMLS_DC) /* {{{ */
  83. {
  84. if (ib_blob->bl_qd.gds_quad_high || ib_blob->bl_qd.gds_quad_low) { /*not null ?*/
  85. ISC_STATUS stat;
  86. char *bl_data;
  87. unsigned long cur_len;
  88. unsigned short seg_len;
  89. bl_data = safe_emalloc(1, max_len, 1);
  90. for (cur_len = stat = 0; (stat == 0 || stat == isc_segment) && cur_len < max_len; cur_len += seg_len) {
  91. unsigned short chunk_size = (max_len-cur_len) > USHRT_MAX ? USHRT_MAX
  92. : (unsigned short)(max_len-cur_len);
  93. stat = isc_get_segment(IB_STATUS, &ib_blob->bl_handle, &seg_len, chunk_size, &bl_data[cur_len]);
  94. }
  95. bl_data[cur_len] = '\0';
  96. if (IB_STATUS[0] == 1 && (stat != 0 && stat != isc_segstr_eof && stat != isc_segment)) {
  97. efree(bl_data);
  98. _php_ibase_error(TSRMLS_C);
  99. return FAILURE;
  100. }
  101. RETVAL_STRINGL(bl_data, cur_len, 0);
  102. } else { /* null blob */
  103. RETVAL_STRING("", 1); /* empty string */
  104. }
  105. return SUCCESS;
  106. }
  107. /* }}} */
  108. int _php_ibase_blob_add(zval **string_arg, ibase_blob *ib_blob TSRMLS_DC) /* {{{ */
  109. {
  110. unsigned long put_cnt = 0, rem_cnt;
  111. unsigned short chunk_size;
  112. convert_to_string_ex(string_arg);
  113. for (rem_cnt = Z_STRLEN_PP(string_arg); rem_cnt > 0; rem_cnt -= chunk_size) {
  114. chunk_size = rem_cnt > USHRT_MAX ? USHRT_MAX : (unsigned short)rem_cnt;
  115. if (isc_put_segment(IB_STATUS, &ib_blob->bl_handle, chunk_size, &Z_STRVAL_PP(string_arg)[put_cnt] )) {
  116. _php_ibase_error(TSRMLS_C);
  117. return FAILURE;
  118. }
  119. put_cnt += chunk_size;
  120. }
  121. return SUCCESS;
  122. }
  123. /* }}} */
  124. static int _php_ibase_blob_info(isc_blob_handle bl_handle, IBASE_BLOBINFO *bl_info TSRMLS_DC) /* {{{ */
  125. {
  126. static char bl_items[] = {
  127. isc_info_blob_num_segments,
  128. isc_info_blob_max_segment,
  129. isc_info_blob_total_length,
  130. isc_info_blob_type
  131. };
  132. char bl_inf[sizeof(long)*8], *p;
  133. bl_info->max_segment = 0;
  134. bl_info->num_segments = 0;
  135. bl_info->total_length = 0;
  136. bl_info->bl_stream = 0;
  137. if (isc_blob_info(IB_STATUS, &bl_handle, sizeof(bl_items), bl_items, sizeof(bl_inf), bl_inf)) {
  138. _php_ibase_error(TSRMLS_C);
  139. return FAILURE;
  140. }
  141. for (p = bl_inf; *p != isc_info_end && p < bl_inf + sizeof(bl_inf);) {
  142. unsigned short item_len;
  143. int item = *p++;
  144. item_len = (short) isc_vax_integer(p, 2);
  145. p += 2;
  146. switch (item) {
  147. case isc_info_blob_num_segments:
  148. bl_info->num_segments = isc_vax_integer(p, item_len);
  149. break;
  150. case isc_info_blob_max_segment:
  151. bl_info->max_segment = isc_vax_integer(p, item_len);
  152. break;
  153. case isc_info_blob_total_length:
  154. bl_info->total_length = isc_vax_integer(p, item_len);
  155. break;
  156. case isc_info_blob_type:
  157. bl_info->bl_stream = isc_vax_integer(p, item_len);
  158. break;
  159. case isc_info_end:
  160. break;
  161. case isc_info_truncated:
  162. case isc_info_error: /* hmm. don't think so...*/
  163. _php_ibase_module_error("PHP module internal error" TSRMLS_CC);
  164. return FAILURE;
  165. } /* switch */
  166. p += item_len;
  167. } /* for */
  168. return SUCCESS;
  169. }
  170. /* }}} */
  171. /* {{{ proto resource ibase_blob_create([resource link_identifier])
  172. Create blob for adding data */
  173. PHP_FUNCTION(ibase_blob_create)
  174. {
  175. zval *link = NULL;
  176. ibase_db_link *ib_link;
  177. ibase_trans *trans = NULL;
  178. ibase_blob *ib_blob;
  179. RESET_ERRMSG;
  180. if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|r", &link)) {
  181. RETURN_FALSE;
  182. }
  183. PHP_IBASE_LINK_TRANS(link, ib_link, trans);
  184. ib_blob = (ibase_blob *) emalloc(sizeof(ibase_blob));
  185. ib_blob->bl_handle = NULL;
  186. ib_blob->type = BLOB_INPUT;
  187. if (isc_create_blob(IB_STATUS, &ib_link->handle, &trans->handle, &ib_blob->bl_handle, &ib_blob->bl_qd)) {
  188. _php_ibase_error(TSRMLS_C);
  189. efree(ib_blob);
  190. RETURN_FALSE;
  191. }
  192. ZEND_REGISTER_RESOURCE(return_value, ib_blob, le_blob);
  193. }
  194. /* }}} */
  195. /* {{{ proto resource ibase_blob_open([ resource link_identifier, ] string blob_id)
  196. Open blob for retrieving data parts */
  197. PHP_FUNCTION(ibase_blob_open)
  198. {
  199. char *blob_id;
  200. int blob_id_len;
  201. zval *link = NULL;
  202. ibase_db_link *ib_link;
  203. ibase_trans *trans = NULL;
  204. ibase_blob *ib_blob;
  205. RESET_ERRMSG;
  206. switch (ZEND_NUM_ARGS()) {
  207. default:
  208. WRONG_PARAM_COUNT;
  209. case 1:
  210. if (FAILURE == zend_parse_parameters(1 TSRMLS_CC, "s", &blob_id, &blob_id_len)) {
  211. RETURN_FALSE;
  212. }
  213. break;
  214. case 2:
  215. if (FAILURE == zend_parse_parameters(2 TSRMLS_CC, "rs", &link, &blob_id, &blob_id_len)) {
  216. RETURN_FALSE;
  217. }
  218. break;
  219. }
  220. PHP_IBASE_LINK_TRANS(link, ib_link, trans);
  221. ib_blob = (ibase_blob *) emalloc(sizeof(ibase_blob));
  222. ib_blob->bl_handle = NULL;
  223. ib_blob->type = BLOB_OUTPUT;
  224. do {
  225. if (! _php_ibase_string_to_quad(blob_id, &ib_blob->bl_qd)) {
  226. _php_ibase_module_error("String is not a BLOB ID" TSRMLS_CC);
  227. break;
  228. }
  229. if (isc_open_blob(IB_STATUS, &ib_link->handle, &trans->handle, &ib_blob->bl_handle,
  230. &ib_blob->bl_qd)) {
  231. _php_ibase_error(TSRMLS_C);
  232. break;
  233. }
  234. ZEND_REGISTER_RESOURCE(return_value, ib_blob, le_blob);
  235. return;
  236. } while (0);
  237. efree(ib_blob);
  238. RETURN_FALSE;
  239. }
  240. /* }}} */
  241. /* {{{ proto bool ibase_blob_add(resource blob_handle, string data)
  242. Add data into created blob */
  243. PHP_FUNCTION(ibase_blob_add)
  244. {
  245. zval **blob_arg, **string_arg;
  246. ibase_blob *ib_blob;
  247. RESET_ERRMSG;
  248. if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &blob_arg, &string_arg) == FAILURE) {
  249. WRONG_PARAM_COUNT;
  250. }
  251. ZEND_FETCH_RESOURCE(ib_blob, ibase_blob *, blob_arg, -1, "Interbase blob", le_blob);
  252. if (ib_blob->type != BLOB_INPUT) {
  253. _php_ibase_module_error("BLOB is not open for input" TSRMLS_CC);
  254. RETURN_FALSE;
  255. }
  256. if (_php_ibase_blob_add(string_arg, ib_blob TSRMLS_CC) != SUCCESS) {
  257. RETURN_FALSE;
  258. }
  259. }
  260. /* }}} */
  261. /* {{{ proto string ibase_blob_get(resource blob_handle, int len)
  262. Get len bytes data from open blob */
  263. PHP_FUNCTION(ibase_blob_get)
  264. {
  265. zval **blob_arg, **len_arg;
  266. ibase_blob *ib_blob;
  267. RESET_ERRMSG;
  268. if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &blob_arg, &len_arg) == FAILURE) {
  269. WRONG_PARAM_COUNT;
  270. }
  271. ZEND_FETCH_RESOURCE(ib_blob, ibase_blob *, blob_arg, -1, "Interbase blob", le_blob);
  272. if (ib_blob->type != BLOB_OUTPUT) {
  273. _php_ibase_module_error("BLOB is not open for output" TSRMLS_CC);
  274. RETURN_FALSE;
  275. }
  276. convert_to_long_ex(len_arg);
  277. if (_php_ibase_blob_get(return_value, ib_blob, Z_LVAL_PP(len_arg) TSRMLS_CC) != SUCCESS) {
  278. RETURN_FALSE;
  279. }
  280. }
  281. /* }}} */
  282. static void _php_ibase_blob_end(INTERNAL_FUNCTION_PARAMETERS, int bl_end) /* {{{ */
  283. {
  284. zval **blob_arg;
  285. ibase_blob *ib_blob;
  286. RESET_ERRMSG;
  287. if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &blob_arg) == FAILURE) {
  288. WRONG_PARAM_COUNT;
  289. }
  290. ZEND_FETCH_RESOURCE(ib_blob, ibase_blob *, blob_arg, -1, "Interbase blob", le_blob);
  291. if (bl_end == BLOB_CLOSE) { /* return id here */
  292. if (ib_blob->bl_qd.gds_quad_high || ib_blob->bl_qd.gds_quad_low) { /*not null ?*/
  293. if (isc_close_blob(IB_STATUS, &ib_blob->bl_handle)) {
  294. _php_ibase_error(TSRMLS_C);
  295. RETURN_FALSE;
  296. }
  297. }
  298. ib_blob->bl_handle = NULL;
  299. RETVAL_STRINGL(_php_ibase_quad_to_string(ib_blob->bl_qd), BLOB_ID_LEN, 0);
  300. } else { /* discard created blob */
  301. if (isc_cancel_blob(IB_STATUS, &ib_blob->bl_handle)) {
  302. _php_ibase_error(TSRMLS_C);
  303. RETURN_FALSE;
  304. }
  305. ib_blob->bl_handle = NULL;
  306. RETVAL_TRUE;
  307. }
  308. zend_list_delete(Z_LVAL_PP(blob_arg));
  309. }
  310. /* }}} */
  311. /* {{{ proto string ibase_blob_close(resource blob_handle)
  312. Close blob */
  313. PHP_FUNCTION(ibase_blob_close)
  314. {
  315. _php_ibase_blob_end(INTERNAL_FUNCTION_PARAM_PASSTHRU, BLOB_CLOSE);
  316. }
  317. /* }}} */
  318. /* {{{ proto bool ibase_blob_cancel(resource blob_handle)
  319. Cancel creating blob */
  320. PHP_FUNCTION(ibase_blob_cancel)
  321. {
  322. _php_ibase_blob_end(INTERNAL_FUNCTION_PARAM_PASSTHRU, BLOB_CANCEL);
  323. }
  324. /* }}} */
  325. /* {{{ proto array ibase_blob_info([ resource link_identifier, ] string blob_id)
  326. Return blob length and other useful info */
  327. PHP_FUNCTION(ibase_blob_info)
  328. {
  329. char *blob_id;
  330. int blob_id_len;
  331. zval *link = NULL;
  332. ibase_db_link *ib_link;
  333. ibase_trans *trans = NULL;
  334. ibase_blob ib_blob = { NULL, BLOB_INPUT };
  335. IBASE_BLOBINFO bl_info;
  336. RESET_ERRMSG;
  337. switch (ZEND_NUM_ARGS()) {
  338. default:
  339. WRONG_PARAM_COUNT;
  340. case 1:
  341. if (FAILURE == zend_parse_parameters(1 TSRMLS_CC, "s", &blob_id, &blob_id_len)) {
  342. RETURN_FALSE;
  343. }
  344. break;
  345. case 2:
  346. if (FAILURE == zend_parse_parameters(2 TSRMLS_CC, "rs", &link, &blob_id, &blob_id_len)) {
  347. RETURN_FALSE;
  348. }
  349. break;
  350. }
  351. PHP_IBASE_LINK_TRANS(link, ib_link, trans);
  352. if (! _php_ibase_string_to_quad(blob_id, &ib_blob.bl_qd)) {
  353. _php_ibase_module_error("Unrecognized BLOB ID" TSRMLS_CC);
  354. RETURN_FALSE;
  355. }
  356. if (ib_blob.bl_qd.gds_quad_high || ib_blob.bl_qd.gds_quad_low) { /* not null ? */
  357. if (isc_open_blob(IB_STATUS, &ib_link->handle, &trans->handle, &ib_blob.bl_handle,
  358. &ib_blob.bl_qd)) {
  359. _php_ibase_error(TSRMLS_C);
  360. RETURN_FALSE;
  361. }
  362. if (_php_ibase_blob_info(ib_blob.bl_handle, &bl_info TSRMLS_CC)) {
  363. RETURN_FALSE;
  364. }
  365. if (isc_close_blob(IB_STATUS, &ib_blob.bl_handle)) {
  366. _php_ibase_error(TSRMLS_C);
  367. RETURN_FALSE;
  368. }
  369. } else { /* null blob, all values to zero */
  370. bl_info.max_segment = 0;
  371. bl_info.num_segments = 0;
  372. bl_info.total_length = 0;
  373. bl_info.bl_stream = 0;
  374. }
  375. array_init(return_value);
  376. add_index_long(return_value, 0, bl_info.total_length);
  377. add_assoc_long(return_value, "length", bl_info.total_length);
  378. add_index_long(return_value, 1, bl_info.num_segments);
  379. add_assoc_long(return_value, "numseg", bl_info.num_segments);
  380. add_index_long(return_value, 2, bl_info.max_segment);
  381. add_assoc_long(return_value, "maxseg", bl_info.max_segment);
  382. add_index_bool(return_value, 3, bl_info.bl_stream);
  383. add_assoc_bool(return_value, "stream", bl_info.bl_stream);
  384. add_index_bool(return_value, 4, (!ib_blob.bl_qd.gds_quad_high && !ib_blob.bl_qd.gds_quad_low));
  385. add_assoc_bool(return_value, "isnull", (!ib_blob.bl_qd.gds_quad_high && !ib_blob.bl_qd.gds_quad_low));
  386. }
  387. /* }}} */
  388. /* {{{ proto bool ibase_blob_echo([ resource link_identifier, ] string blob_id)
  389. Output blob contents to browser */
  390. PHP_FUNCTION(ibase_blob_echo)
  391. {
  392. char *blob_id;
  393. int blob_id_len;
  394. zval *link = NULL;
  395. ibase_db_link *ib_link;
  396. ibase_trans *trans = NULL;
  397. ibase_blob ib_blob_id = { NULL, BLOB_OUTPUT };
  398. char bl_data[IBASE_BLOB_SEG];
  399. unsigned short seg_len;
  400. RESET_ERRMSG;
  401. switch (ZEND_NUM_ARGS()) {
  402. default:
  403. WRONG_PARAM_COUNT;
  404. case 1:
  405. if (FAILURE == zend_parse_parameters(1 TSRMLS_CC, "s", &blob_id, &blob_id_len)) {
  406. RETURN_FALSE;
  407. }
  408. break;
  409. case 2:
  410. if (FAILURE == zend_parse_parameters(2 TSRMLS_CC, "rs", &link, &blob_id, &blob_id_len)) {
  411. RETURN_FALSE;
  412. }
  413. break;
  414. }
  415. PHP_IBASE_LINK_TRANS(link, ib_link, trans);
  416. if (! _php_ibase_string_to_quad(blob_id, &ib_blob_id.bl_qd)) {
  417. _php_ibase_module_error("Unrecognized BLOB ID" TSRMLS_CC);
  418. RETURN_FALSE;
  419. }
  420. do {
  421. if (isc_open_blob(IB_STATUS, &ib_link->handle, &trans->handle, &ib_blob_id.bl_handle,
  422. &ib_blob_id.bl_qd)) {
  423. break;
  424. }
  425. while (!isc_get_segment(IB_STATUS, &ib_blob_id.bl_handle, &seg_len, sizeof(bl_data), bl_data)
  426. || IB_STATUS[1] == isc_segment) {
  427. PHPWRITE(bl_data, seg_len);
  428. }
  429. if (IB_STATUS[0] && (IB_STATUS[1] != isc_segstr_eof)) {
  430. break;
  431. }
  432. if (isc_close_blob(IB_STATUS, &ib_blob_id.bl_handle)) {
  433. break;
  434. }
  435. RETURN_TRUE;
  436. } while (0);
  437. _php_ibase_error(TSRMLS_C);
  438. RETURN_FALSE;
  439. }
  440. /* }}} */
  441. /* {{{ proto string ibase_blob_import([ resource link_identifier, ] resource file)
  442. Create blob, copy file in it, and close it */
  443. PHP_FUNCTION(ibase_blob_import)
  444. {
  445. zval *link = NULL, *file;
  446. int size;
  447. unsigned short b;
  448. ibase_blob ib_blob = { NULL, 0 };
  449. ibase_db_link *ib_link;
  450. ibase_trans *trans = NULL;
  451. char bl_data[IBASE_BLOB_SEG];
  452. php_stream *stream;
  453. RESET_ERRMSG;
  454. if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r|r",
  455. (ZEND_NUM_ARGS()-1) ? &link : &file, &file)) {
  456. RETURN_FALSE;
  457. }
  458. PHP_IBASE_LINK_TRANS(link, ib_link, trans);
  459. php_stream_from_zval(stream, &file);
  460. do {
  461. if (isc_create_blob(IB_STATUS, &ib_link->handle, &trans->handle, &ib_blob.bl_handle,
  462. &ib_blob.bl_qd)) {
  463. break;
  464. }
  465. for (size = 0; (b = php_stream_read(stream, bl_data, sizeof(bl_data))); size += b) {
  466. if (isc_put_segment(IB_STATUS, &ib_blob.bl_handle, b, bl_data)) {
  467. break;
  468. }
  469. }
  470. if (isc_close_blob(IB_STATUS, &ib_blob.bl_handle)) {
  471. break;
  472. }
  473. RETURN_STRINGL( _php_ibase_quad_to_string(ib_blob.bl_qd), BLOB_ID_LEN, 0);
  474. } while (0);
  475. _php_ibase_error(TSRMLS_C);
  476. RETURN_FALSE;
  477. }
  478. /* }}} */
  479. #endif /* HAVE_IBASE */
  480. /*
  481. * Local variables:
  482. * tab-width: 4
  483. * c-basic-offset: 4
  484. * End:
  485. * vim600: sw=4 ts=4 fdm=marker
  486. * vim<600: sw=4 ts=4
  487. */