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

数据库系统

开发平台:

Unix_Linux

  1. /*
  2.  * Edmund Mergl <E.Mergl@bawue.de>
  3.  *
  4.  * $Id: oracle_compat.c,v 1.18.2.1 1999/08/02 05:24:56 scrappy Exp $
  5.  *
  6.  */
  7. #include <ctype.h>
  8. #include "postgres.h"
  9. text    *lower(text *string);
  10. text    *upper(text *string);
  11. text    *initcap(text *string);
  12. text    *lpad(text *string1, int4 len, text *string2);
  13. text    *rpad(text *string1, int4 len, text *string2);
  14. text    *btrim(text *string, text *set);
  15. text    *ltrim(text *string, text *set);
  16. text    *rtrim(text *string, text *set);
  17. text    *substr(text *string, int4 m, int4 n);
  18. text    *translate(text *string, char from, char to);
  19. /********************************************************************
  20.  *
  21.  * lower
  22.  *
  23.  * Syntax:
  24.  *
  25.  *  text *lower(text *string)
  26.  *
  27.  * Purpose:
  28.  *
  29.  *  Returns string, with all letters forced to lowercase.
  30.  *
  31.  ********************************************************************/
  32. text *
  33. lower(text *string)
  34. {
  35. text    *ret;
  36. char    *ptr,
  37.    *ptr_ret;
  38. int m;
  39. if ((string == (text *) NULL) || ((m = VARSIZE(string) - VARHDRSZ) <= 0))
  40. return string;
  41. ret = (text *) palloc(VARSIZE(string));
  42. VARSIZE(ret) = VARSIZE(string);
  43. ptr = VARDATA(string);
  44. ptr_ret = VARDATA(ret);
  45. while (m--)
  46. *ptr_ret++ = tolower((unsigned char) *ptr++);
  47. return ret;
  48. }
  49. /********************************************************************
  50.  *
  51.  * upper
  52.  *
  53.  * Syntax:
  54.  *
  55.  *  text *upper(text *string)
  56.  *
  57.  * Purpose:
  58.  *
  59.  *  Returns string, with all letters forced to uppercase.
  60.  *
  61.  ********************************************************************/
  62. text *
  63. upper(text *string)
  64. {
  65. text    *ret;
  66. char    *ptr,
  67.    *ptr_ret;
  68. int m;
  69. if ((string == (text *) NULL) || ((m = VARSIZE(string) - VARHDRSZ) <= 0))
  70. return string;
  71. ret = (text *) palloc(VARSIZE(string));
  72. VARSIZE(ret) = VARSIZE(string);
  73. ptr = VARDATA(string);
  74. ptr_ret = VARDATA(ret);
  75. while (m--)
  76. *ptr_ret++ = toupper((unsigned char) *ptr++);
  77. return ret;
  78. }
  79. /********************************************************************
  80.  *
  81.  * initcap
  82.  *
  83.  * Syntax:
  84.  *
  85.  *  text *initcap(text *string)
  86.  *
  87.  * Purpose:
  88.  *
  89.  *  Returns string, with first letter of each word in uppercase,
  90.  *  all other letters in lowercase. A word is delimited by white
  91.  *  space.
  92.  *
  93.  ********************************************************************/
  94. text *
  95. initcap(text *string)
  96. {
  97. text    *ret;
  98. char    *ptr,
  99.    *ptr_ret;
  100. int m;
  101. if ((string == (text *) NULL) || ((m = VARSIZE(string) - VARHDRSZ) <= 0))
  102. return string;
  103. ret = (text *) palloc(VARSIZE(string));
  104. VARSIZE(ret) = VARSIZE(string);
  105. ptr = VARDATA(string);
  106. ptr_ret = VARDATA(ret);
  107. *ptr_ret++ = toupper((unsigned char) *ptr++);
  108. --m;
  109. while (m--)
  110. {
  111. if (*(ptr_ret - 1) == ' ' || *(ptr_ret - 1) == ' ')
  112. *ptr_ret++ = toupper((unsigned char) *ptr++);
  113. else
  114. *ptr_ret++ = tolower((unsigned char) *ptr++);
  115. }
  116. return ret;
  117. }
  118. /********************************************************************
  119.  *
  120.  * lpad
  121.  *
  122.  * Syntax:
  123.  *
  124.  *  text *lpad(text *string1, int4 len, text *string2)
  125.  *
  126.  * Purpose:
  127.  *
  128.  *  Returns string1, left-padded to length len with the sequence of
  129.  *  characters in string2.
  130.  *
  131.  ********************************************************************/
  132. text *
  133. lpad(text *string1, int4 len, text *string2)
  134. {
  135. text    *ret;
  136. char    *ptr1,
  137.    *ptr2,
  138.    *ptr_ret;
  139. int m,
  140. n;
  141. if ((string1 == (text *) NULL) ||
  142. (len <= (VARSIZE(string1) - VARHDRSZ)) ||
  143. ((m = len - VARSIZE(string1) + VARHDRSZ) <= 0) ||
  144. (string2 == (text *) NULL) ||
  145. ((VARSIZE(string2) - VARHDRSZ) <= 0))
  146. return string1;
  147. ret = (text *) palloc(VARHDRSZ + len);
  148. VARSIZE(ret) = VARHDRSZ + len;
  149. ptr2 = VARDATA(string2);
  150. ptr_ret = VARDATA(ret);
  151. while (m--)
  152. {
  153. *ptr_ret++ = *ptr2;
  154. ptr2 = ptr2 == VARDATA(string2) + VARSIZE(string2) - VARHDRSZ - 1 ? VARDATA(string2) : ++ptr2;
  155. }
  156. n = VARSIZE(string1) - VARHDRSZ;
  157. ptr1 = VARDATA(string1);
  158. while (n--)
  159. *ptr_ret++ = *ptr1++;
  160. return ret;
  161. }
  162. /********************************************************************
  163.  *
  164.  * rpad
  165.  *
  166.  * Syntax:
  167.  *
  168.  *  text *rpad(text *string1, int4 len, text *string2)
  169.  *
  170.  * Purpose:
  171.  *
  172.  *  Returns string1, right-padded to length len with the sequence of
  173.  *  characters in string2.
  174.  *
  175.  ********************************************************************/
  176. text *
  177. rpad(text *string1, int4 len, text *string2)
  178. {
  179. text    *ret;
  180. char    *ptr1,
  181.    *ptr2,
  182.    *ptr_ret;
  183. int m,
  184. n;
  185. if ((string1 == (text *) NULL) ||
  186. (len <= (VARSIZE(string1) - VARHDRSZ)) ||
  187. ((m = len - VARSIZE(string1) + VARHDRSZ) <= 0) ||
  188. (string2 == (text *) NULL) ||
  189. ((VARSIZE(string2) - VARHDRSZ) <= 0))
  190. return string1;
  191. ret = (text *) palloc(VARHDRSZ + len);
  192. VARSIZE(ret) = VARHDRSZ + len;
  193. n = VARSIZE(string1) - VARHDRSZ;
  194. ptr1 = VARDATA(string1);
  195. ptr_ret = VARDATA(ret);
  196. while (n--)
  197. *ptr_ret++ = *ptr1++;
  198. ptr2 = VARDATA(string2);
  199. while (m--)
  200. {
  201. *ptr_ret++ = *ptr2;
  202. ptr2 = ptr2 == VARDATA(string2) + VARSIZE(string2) - VARHDRSZ - 1 ? VARDATA(string2) : ++ptr2;
  203. }
  204. return ret;
  205. }
  206. /********************************************************************
  207.  *
  208.  * btrim
  209.  *
  210.  * Syntax:
  211.  *
  212.  *  text *btrim(text *string, text *set)
  213.  *
  214.  * Purpose:
  215.  *
  216.  *  Returns string with characters removed from the front and back
  217.  *  up to the first character not in set.
  218.  *
  219.  ********************************************************************/
  220. text *
  221. btrim(text *string, text *set)
  222. {
  223. text    *ret;
  224. char    *ptr,
  225.    *end,
  226.    *ptr2,
  227.    *end2;
  228. int m;
  229. if ((string == (text *) NULL) ||
  230. ((m = VARSIZE(string) - VARHDRSZ) <= 0) ||
  231. (set == (text *) NULL) ||
  232. ((VARSIZE(set) - VARHDRSZ) <= 0))
  233. return string;
  234. ptr = VARDATA(string);
  235. ptr2 = VARDATA(set);
  236. end2 = VARDATA(set) + VARSIZE(set) - VARHDRSZ - 1;
  237. while (m--)
  238. {
  239. while (ptr2 <= end2)
  240. {
  241. if (*ptr == *ptr2)
  242. break;
  243. ++ptr2;
  244. }
  245. if (ptr2 > end2)
  246. break;
  247. ptr++;
  248. ptr2 = VARDATA(set);
  249. }
  250. ++m;
  251. end = VARDATA(string) + VARSIZE(string) - VARHDRSZ - 1;
  252. ptr2 = VARDATA(set);
  253. while (m--)
  254. {
  255. while (ptr2 <= end2)
  256. {
  257. if (*end == *ptr2)
  258. break;
  259. ++ptr2;
  260. }
  261. if (ptr2 > end2)
  262. break;
  263. --end;
  264. ptr2 = VARDATA(set);
  265. }
  266. ++m;
  267. ret = (text *) palloc(VARHDRSZ + m);
  268. VARSIZE(ret) = VARHDRSZ + m;
  269. memcpy(VARDATA(ret), ptr, m);
  270. return ret;
  271. } /* btrim() */
  272. /********************************************************************
  273.  *
  274.  * ltrim
  275.  *
  276.  * Syntax:
  277.  *
  278.  *  text *ltrim(text *string, text *set)
  279.  *
  280.  * Purpose:
  281.  *
  282.  *  Returns string with initial characters removed up to the first
  283.  *  character not in set.
  284.  *
  285.  ********************************************************************/
  286. text *
  287. ltrim(text *string, text *set)
  288. {
  289. text    *ret;
  290. char    *ptr,
  291.    *ptr2,
  292.    *end2;
  293. int m;
  294. if ((string == (text *) NULL) ||
  295. ((m = VARSIZE(string) - VARHDRSZ) <= 0) ||
  296. (set == (text *) NULL) ||
  297. ((VARSIZE(set) - VARHDRSZ) <= 0))
  298. return string;
  299. ptr = VARDATA(string);
  300. ptr2 = VARDATA(set);
  301. end2 = VARDATA(set) + VARSIZE(set) - VARHDRSZ - 1;
  302. while (m--)
  303. {
  304. while (ptr2 <= end2)
  305. {
  306. if (*ptr == *ptr2)
  307. break;
  308. ++ptr2;
  309. }
  310. if (ptr2 > end2)
  311. break;
  312. ptr++;
  313. ptr2 = VARDATA(set);
  314. }
  315. ++m;
  316. ret = (text *) palloc(VARHDRSZ + m);
  317. VARSIZE(ret) = VARHDRSZ + m;
  318. memcpy(VARDATA(ret), ptr, m);
  319. return ret;
  320. }
  321. /********************************************************************
  322.  *
  323.  * rtrim
  324.  *
  325.  * Syntax:
  326.  *
  327.  *  text *rtrim(text *string, text *set)
  328.  *
  329.  * Purpose:
  330.  *
  331.  *  Returns string with final characters removed after the last
  332.  *  character not in set.
  333.  *
  334.  ********************************************************************/
  335. text *
  336. rtrim(text *string, text *set)
  337. {
  338. text    *ret;
  339. char    *ptr,
  340.    *ptr2,
  341.    *end2,
  342.    *ptr_ret;
  343. int m;
  344. if ((string == (text *) NULL) ||
  345. ((m = VARSIZE(string) - VARHDRSZ) <= 0) ||
  346. (set == (text *) NULL) ||
  347. ((VARSIZE(set) - VARHDRSZ) <= 0))
  348. return string;
  349. ptr = VARDATA(string) + VARSIZE(string) - VARHDRSZ - 1;
  350. ptr2 = VARDATA(set);
  351. end2 = VARDATA(set) + VARSIZE(set) - VARHDRSZ - 1;
  352. while (m--)
  353. {
  354. while (ptr2 <= end2)
  355. {
  356. if (*ptr == *ptr2)
  357. break;
  358. ++ptr2;
  359. }
  360. if (ptr2 > end2)
  361. break;
  362. --ptr;
  363. ptr2 = VARDATA(set);
  364. }
  365. ++m;
  366. ret = (text *) palloc(VARHDRSZ + m);
  367. VARSIZE(ret) = VARHDRSZ + m;
  368. #ifdef NOT_USED
  369. memcpy(VARDATA(ret), ptr - VARSIZE(ret) + m, m);
  370. #endif
  371. ptr_ret = VARDATA(ret) + m - 1;
  372. while (m--)
  373. *ptr_ret-- = *ptr--;
  374. return ret;
  375. }
  376. /********************************************************************
  377.  *
  378.  * substr
  379.  *
  380.  * Syntax:
  381.  *
  382.  *  text *substr(text *string, int4 m, int4 n)
  383.  *
  384.  * Purpose:
  385.  *
  386.  *  Returns a portion of string, beginning at character m, n
  387.  *  characters long. The first position of string is 1.
  388.  *
  389.  ********************************************************************/
  390. #ifdef NOT_USED
  391. text *
  392. substr(text *string, int4 m, int4 n)
  393. {
  394. text    *ret;
  395. char    *ptr,
  396.    *ptr_ret;
  397. int len;
  398. if ((string == (text *) NULL) ||
  399. (m <= 0) || (n <= 0) ||
  400. ((len = VARSIZE(string) - VARHDRSZ - m + 1) <= 0))
  401. return string;
  402. len = len + 1 < n ? len + 1 : n;
  403. ret = (text *) palloc(VARHDRSZ + len);
  404. VARSIZE(ret) = VARHDRSZ + len;
  405. ptr = VARDATA(string) + m - 1;
  406. ptr_ret = VARDATA(ret);
  407. while (len--)
  408. *ptr_ret++ = *ptr++;
  409. return ret;
  410. }
  411. #endif
  412. /********************************************************************
  413.  *
  414.  * translate
  415.  *
  416.  * Syntax:
  417.  *
  418.  *  text *translate(text *string, char from, char to)
  419.  *
  420.  * Purpose:
  421.  *
  422.  *  Returns string after replacing all occurences of from with
  423.  *  the corresponding character in to. TRANSLATE will not remove
  424.  *   characters.
  425.  *
  426.  ********************************************************************/
  427. text *
  428. translate(text *string, char from, char to)
  429. {
  430. text    *ret;
  431. char    *ptr,
  432.    *ptr_ret;
  433. int m;
  434. if ((string == (text *) NULL) ||
  435. ((m = VARSIZE(string) - VARHDRSZ) <= 0))
  436. return string;
  437. ret = (text *) palloc(VARSIZE(string));
  438. VARSIZE(ret) = VARSIZE(string);
  439. ptr = VARDATA(string);
  440. ptr_ret = VARDATA(ret);
  441. while (m--)
  442. {
  443. *ptr_ret++ = *ptr == from ? to : *ptr;
  444. ptr++;
  445. }
  446. return ret;
  447. }
  448. /* EOF */