]> granicus.if.org Git - postgresql/blobdiff - src/backend/utils/adt/oracle_compat.c
Move some system includes into c.h, and remove duplicates.
[postgresql] / src / backend / utils / adt / oracle_compat.c
index 7f509aa48c45383600985036b00d237fdd9db6a2..50be811b22c8eabdd363c797cc50c98bf9756a19 100644 (file)
@@ -1,7 +1,7 @@
 /*
- *  Edmund Mergl <E.Mergl@bawue.de>
+ *     Edmund Mergl <E.Mergl@bawue.de>
  *
- *  $Id: oracle_compat.c,v 1.6 1997/05/07 02:46:45 scrappy Exp $
+ *     $Id: oracle_compat.c,v 1.20 1999/07/15 15:20:19 momjian Exp $
  *
  */
 
@@ -9,16 +9,16 @@
 #include <ctype.h>
 #include "postgres.h"
 
-
-text *lower(text *string);
-text *upper(text *string);
-text *initcap(text *string);
-text *lpad(text *string1, int4 len, text *string2);
-text *rpad(text *string1, int4 len, text *string2);
-text *ltrim(text *string, text *set);
-text *rtrim(text *string, text *set);
-text *substr(text *string, int4 m, int4 n);
-text *translate(text *string, char from, char to);
+text      *lower(text *string);
+text      *upper(text *string);
+text      *initcap(text *string);
+text      *lpad(text *string1, int4 len, text *string2);
+text      *rpad(text *string1, int4 len, text *string2);
+text      *btrim(text *string, text *set);
+text      *ltrim(text *string, text *set);
+text      *rtrim(text *string, text *set);
+text      *substr(text *string, int4 m, int4 n);
+text      *translate(text *string, char from, char to);
 
 
 /********************************************************************
@@ -27,35 +27,35 @@ text *translate(text *string, char from, char to);
  *
  * Syntax:
  *
- *   text *lower(text *string)
+ *      text *lower(text *string)
  *
  * Purpose:
  *
- *   Returns string, with all letters forced to lowercase.
+ *      Returns string, with all letters forced to lowercase.
  *
  ********************************************************************/
 
 text *
 lower(text *string)
 {
-  text *ret;
-  char *ptr, *ptr_ret;
-  int m;
+       text       *ret;
+       char       *ptr,
+                          *ptr_ret;
+       int                     m;
 
-  if ((string == (text *)NULL) || ((m = VARSIZE(string) - VARHDRSZ) <= 0))
-    return string;
+       if ((string == (text *) NULL) || ((m = VARSIZE(string) - VARHDRSZ) <= 0))
+               return string;
 
-  ret = (text *)palloc(VARSIZE(string));
-  VARSIZE(ret) = VARSIZE(string);
+       ret = (text *) palloc(VARSIZE(string));
+       VARSIZE(ret) = VARSIZE(string);
 
-  ptr     = VARDATA(string);
-  ptr_ret = VARDATA(ret);
+       ptr = VARDATA(string);
+       ptr_ret = VARDATA(ret);
 
-  while (m--) {
-    *ptr_ret++ = tolower(*ptr++);
-  }
+       while (m--)
+               *ptr_ret++ = tolower((unsigned char) *ptr++);
 
-  return ret;
+       return ret;
 }
 
 
@@ -65,35 +65,35 @@ lower(text *string)
  *
  * Syntax:
  *
- *   text *upper(text *string)
+ *      text *upper(text *string)
  *
  * Purpose:
  *
- *   Returns string, with all letters forced to uppercase.
+ *      Returns string, with all letters forced to uppercase.
  *
  ********************************************************************/
 
 text *
 upper(text *string)
 {
-  text *ret;
-  char *ptr, *ptr_ret;
-  int m;
+       text       *ret;
+       char       *ptr,
+                          *ptr_ret;
+       int                     m;
 
-  if ((string == (text *)NULL) || ((m = VARSIZE(string) - VARHDRSZ) <= 0))
-    return string;
+       if ((string == (text *) NULL) || ((m = VARSIZE(string) - VARHDRSZ) <= 0))
+               return string;
 
-  ret = (text *)palloc(VARSIZE(string));
-  VARSIZE(ret) = VARSIZE(string);
+       ret = (text *) palloc(VARSIZE(string));
+       VARSIZE(ret) = VARSIZE(string);
 
-  ptr     = VARDATA(string);
-  ptr_ret = VARDATA(ret);
+       ptr = VARDATA(string);
+       ptr_ret = VARDATA(ret);
 
-  while (m--) {
-    *ptr_ret++ = toupper(*ptr++);
-  }
+       while (m--)
+               *ptr_ret++ = toupper((unsigned char) *ptr++);
 
-  return ret;
+       return ret;
 }
 
 
@@ -103,44 +103,45 @@ upper(text *string)
  *
  * Syntax:
  *
- *   text *initcap(text *string)
+ *      text *initcap(text *string)
  *
  * Purpose:
  *
- *   Returns string, with first letter of each word in uppercase,
- *   all other letters in lowercase. A word is delimited by white
- *   space.
+ *      Returns string, with first letter of each word in uppercase,
+ *      all other letters in lowercase. A word is delimited by white
+ *      space.
  *
  ********************************************************************/
 
 text *
 initcap(text *string)
 {
-  text *ret;
-  char *ptr, *ptr_ret;
-  int m;
+       text       *ret;
+       char       *ptr,
+                          *ptr_ret;
+       int                     m;
 
-  if ((string == (text *)NULL) || ((m = VARSIZE(string) - VARHDRSZ) <= 0))
-    return string;
+       if ((string == (text *) NULL) || ((m = VARSIZE(string) - VARHDRSZ) <= 0))
+               return string;
 
-  ret = (text *)palloc(VARSIZE(string));
-  VARSIZE(ret) = VARSIZE(string);
+       ret = (text *) palloc(VARSIZE(string));
+       VARSIZE(ret) = VARSIZE(string);
 
-  ptr  = VARDATA(string);
-  ptr_ret = VARDATA(ret);
+       ptr = VARDATA(string);
+       ptr_ret = VARDATA(ret);
 
-  *ptr_ret++ = toupper(*ptr++);
-  --m;
+       *ptr_ret++ = toupper((unsigned char) *ptr++);
+       --m;
 
-  while (m--) {
-    if (*(ptr_ret - 1) == ' ' || *(ptr_ret - 1) == '   ') {
-      *ptr_ret++ = toupper(*ptr++);
-    } else {
-      *ptr_ret++ = tolower(*ptr++);
-    }
-  }
+       while (m--)
+       {
+               if (*(ptr_ret - 1) == ' ' || *(ptr_ret - 1) == '        ')
+                       *ptr_ret++ = toupper((unsigned char) *ptr++);
+               else
+                       *ptr_ret++ = tolower((unsigned char) *ptr++);
+       }
 
-  return ret;
+       return ret;
 }
 
 
@@ -150,48 +151,51 @@ initcap(text *string)
  *
  * Syntax:
  *
- *   text *lpad(text *string1, int4 len, text *string2)
+ *      text *lpad(text *string1, int4 len, text *string2)
  *
  * Purpose:
  *
- *   Returns string1, left-padded to length len with the sequence of
- *   characters in string2.
+ *      Returns string1, left-padded to length len with the sequence of
+ *      characters in string2.
  *
  ********************************************************************/
 
 text *
 lpad(text *string1, int4 len, text *string2)
 {
-  text *ret;
-  char *ptr1, *ptr2, *ptr_ret;
-  int m, n;
-
-  if ((string1 == (text *)NULL) ||
-      (len <= (VARSIZE(string1) - VARHDRSZ)) ||
-      ((m = len - VARSIZE(string1) + VARHDRSZ) <= 0) ||
-      (string2 == (text *)NULL) ||
-      ((VARSIZE(string2) - VARHDRSZ) <= 0))
-    return string1;
-
-  ret = (text *)palloc(VARHDRSZ + len);
-  VARSIZE(ret) = VARHDRSZ + len;
-
-  ptr2    = VARDATA(string2);
-  ptr_ret = VARDATA(ret);
-
-  while (m--) {
-    *ptr_ret++ = *ptr2;
-    ptr2 = ptr2 == VARDATA(string2) + VARSIZE(string2) - VARHDRSZ - 1 ? VARDATA(string2) : ++ptr2;
-  }
-
-  n    = VARSIZE(string1) - VARHDRSZ;
-  ptr1 = VARDATA(string1);
-
-  while (n--) {
-    *ptr_ret++ = *ptr1++;
-  }
-
-  return ret;
+       text       *ret;
+       char       *ptr1,
+                          *ptr2,
+                          *ptr_ret;
+       int                     m,
+                               n;
+
+       if ((string1 == (text *) NULL) ||
+               (len <= (VARSIZE(string1) - VARHDRSZ)) ||
+               ((m = len - VARSIZE(string1) + VARHDRSZ) <= 0) ||
+               (string2 == (text *) NULL) ||
+               ((VARSIZE(string2) - VARHDRSZ) <= 0))
+               return string1;
+
+       ret = (text *) palloc(VARHDRSZ + len);
+       VARSIZE(ret) = VARHDRSZ + len;
+
+       ptr2 = VARDATA(string2);
+       ptr_ret = VARDATA(ret);
+
+       while (m--)
+       {
+               *ptr_ret++ = *ptr2;
+               ptr2 = ptr2 == VARDATA(string2) + VARSIZE(string2) - VARHDRSZ - 1 ? VARDATA(string2) : ++ptr2;
+       }
+
+       n = VARSIZE(string1) - VARHDRSZ;
+       ptr1 = VARDATA(string1);
+
+       while (n--)
+               *ptr_ret++ = *ptr1++;
+
+       return ret;
 }
 
 
@@ -201,49 +205,130 @@ lpad(text *string1, int4 len, text *string2)
  *
  * Syntax:
  *
- *   text *rpad(text *string1, int4 len, text *string2)
+ *      text *rpad(text *string1, int4 len, text *string2)
  *
  * Purpose:
  *
- *   Returns string1, right-padded to length len with the sequence of
- *   characters in string2.
+ *      Returns string1, right-padded to length len with the sequence of
+ *      characters in string2.
  *
  ********************************************************************/
 
 text *
 rpad(text *string1, int4 len, text *string2)
 {
-  text *ret;
-  char *ptr1, *ptr2, *ptr_ret;
-  int m, n;
-
-  if ((string1 == (text *)NULL) ||
-      (len <= (VARSIZE(string1) - VARHDRSZ)) ||
-      ((m = len - VARSIZE(string1) + VARHDRSZ) <= 0) ||
-      (string2 == (text *)NULL) ||
-      ((VARSIZE(string2) - VARHDRSZ) <= 0))
-    return string1;
-
-  ret = (text *)palloc(VARHDRSZ + len);
-  VARSIZE(ret) = VARHDRSZ + len;
-
-  n       = VARSIZE(string1) - VARHDRSZ;
-  ptr1    = VARDATA(string1);
-  ptr_ret = VARDATA(ret);
-
-  while (n--) {
-    *ptr_ret++ = *ptr1++;
-  }
+       text       *ret;
+       char       *ptr1,
+                          *ptr2,
+                          *ptr_ret;
+       int                     m,
+                               n;
+
+       if ((string1 == (text *) NULL) ||
+               (len <= (VARSIZE(string1) - VARHDRSZ)) ||
+               ((m = len - VARSIZE(string1) + VARHDRSZ) <= 0) ||
+               (string2 == (text *) NULL) ||
+               ((VARSIZE(string2) - VARHDRSZ) <= 0))
+               return string1;
+
+       ret = (text *) palloc(VARHDRSZ + len);
+       VARSIZE(ret) = VARHDRSZ + len;
+
+       n = VARSIZE(string1) - VARHDRSZ;
+       ptr1 = VARDATA(string1);
+       ptr_ret = VARDATA(ret);
+
+       while (n--)
+               *ptr_ret++ = *ptr1++;
+
+       ptr2 = VARDATA(string2);
+
+       while (m--)
+       {
+               *ptr_ret++ = *ptr2;
+               ptr2 = ptr2 == VARDATA(string2) + VARSIZE(string2) - VARHDRSZ - 1 ? VARDATA(string2) : ++ptr2;
+       }
+
+       return ret;
+}
 
-  ptr2  = VARDATA(string2);
 
-  while (m--) {
-    *ptr_ret++ = *ptr2;
-    ptr2 = ptr2 == VARDATA(string2) + VARSIZE(string2) - VARHDRSZ - 1 ? VARDATA(string2) : ++ptr2;
-  }
+/********************************************************************
+ *
+ * btrim
+ *
+ * Syntax:
+ *
+ *      text *btrim(text *string, text *set)
+ *
+ * Purpose:
+ *
+ *      Returns string with characters removed from the front and back
+ *      up to the first character not in set.
+ *
+ ********************************************************************/
 
-  return ret;
-}
+text *
+btrim(text *string, text *set)
+{
+       text       *ret;
+       char       *ptr,
+                          *end,
+                          *ptr2,
+                          *end2;
+       int                     m;
+
+       if ((string == (text *) NULL) ||
+               ((m = VARSIZE(string) - VARHDRSZ) <= 0) ||
+               (set == (text *) NULL) ||
+               ((VARSIZE(set) - VARHDRSZ) <= 0))
+               return string;
+
+       ptr = VARDATA(string);
+       ptr2 = VARDATA(set);
+       end2 = VARDATA(set) + VARSIZE(set) - VARHDRSZ - 1;
+
+       while (m--)
+       {
+               while (ptr2 <= end2)
+               {
+                       if (*ptr == *ptr2)
+                               break;
+                       ++ptr2;
+               }
+               if (ptr2 > end2)
+                       break;
+               ptr++;
+               ptr2 = VARDATA(set);
+       }
+
+       ++m;
+
+       end = VARDATA(string) + VARSIZE(string) - VARHDRSZ - 1;
+       ptr2 = VARDATA(set);
+
+       while (m--)
+       {
+               while (ptr2 <= end2)
+               {
+                       if (*end == *ptr2)
+                               break;
+                       ++ptr2;
+               }
+               if (ptr2 > end2)
+                       break;
+               --end;
+               ptr2 = VARDATA(set);
+       }
+
+       ++m;
+
+       ret = (text *) palloc(VARHDRSZ + m);
+       VARSIZE(ret) = VARHDRSZ + m;
+       memcpy(VARDATA(ret), ptr, m);
+
+       return ret;
+}      /* btrim() */
 
 
 /********************************************************************
@@ -252,58 +337,56 @@ rpad(text *string1, int4 len, text *string2)
  *
  * Syntax:
  *
- *   text *ltrim(text *string, text *set)
+ *      text *ltrim(text *string, text *set)
  *
  * Purpose:
  *
- *   Returns string with initial characters removed up to the first
- *   character not in set.
+ *      Returns string with initial characters removed up to the first
+ *      character not in set.
  *
  ********************************************************************/
 
 text *
 ltrim(text *string, text *set)
 {
-  text *ret;
-  char *ptr, *ptr2, *end2, *ptr_ret;
-  int m;
-
-  if ((string == (text *)NULL) ||
-      ((m = VARSIZE(string) - VARHDRSZ) <= 0) ||
-      (set == (text *)NULL) ||
-      ((VARSIZE(set) - VARHDRSZ) <= 0))
-    return string;
-
-  ptr  = VARDATA(string);
-  ptr2 = VARDATA(set);
-  end2 = VARDATA(set) + VARSIZE(set) - VARHDRSZ - 1;
-  
-  while (m--) {
-    while (ptr2 <= end2) {
-      if (*ptr == *ptr2) {
-        break;
-      }
-      ++ptr2;
-    }
-    if (*ptr != *ptr2) {
-      break;
-    }
-    ptr++;
-    ptr2 = VARDATA(set);
-  }
-
-  ++m;
-
-  ret = (text *)palloc(VARHDRSZ + m);
-  VARSIZE(ret) = VARHDRSZ + m;
-
-  ptr_ret = VARDATA(ret);
-
-  while (m--) {
-    *ptr_ret++ = *ptr++;
-  }
-
-  return ret;
+       text       *ret;
+       char       *ptr,
+                          *ptr2,
+                          *end2;
+       int                     m;
+
+       if ((string == (text *) NULL) ||
+               ((m = VARSIZE(string) - VARHDRSZ) <= 0) ||
+               (set == (text *) NULL) ||
+               ((VARSIZE(set) - VARHDRSZ) <= 0))
+               return string;
+
+       ptr = VARDATA(string);
+       ptr2 = VARDATA(set);
+       end2 = VARDATA(set) + VARSIZE(set) - VARHDRSZ - 1;
+
+       while (m--)
+       {
+               while (ptr2 <= end2)
+               {
+                       if (*ptr == *ptr2)
+                               break;
+                       ++ptr2;
+               }
+               if (ptr2 > end2)
+                       break;
+               ptr++;
+               ptr2 = VARDATA(set);
+       }
+
+       ++m;
+
+       ret = (text *) palloc(VARHDRSZ + m);
+       VARSIZE(ret) = VARHDRSZ + m;
+
+       memcpy(VARDATA(ret), ptr, m);
+
+       return ret;
 }
 
 
@@ -313,58 +396,63 @@ ltrim(text *string, text *set)
  *
  * Syntax:
  *
- *   text *rtrim(text *string, text *set)
+ *      text *rtrim(text *string, text *set)
  *
  * Purpose:
  *
- *   Returns string with final characters removed after the last
- *   character not in set.
+ *      Returns string with final characters removed after the last
+ *      character not in set.
  *
  ********************************************************************/
 
 text *
 rtrim(text *string, text *set)
 {
-  text *ret;
-  char *ptr, *ptr2, *end2, *ptr_ret;
-  int m;
-
-  if ((string == (text *)NULL) ||
-      ((m = VARSIZE(string) - VARHDRSZ) <= 0) ||
-      (set == (text *)NULL) ||
-      ((VARSIZE(set) - VARHDRSZ) <= 0))
-    return string;
-
-  ptr   = VARDATA(string) + VARSIZE(string) - VARHDRSZ - 1;
-  ptr2  = VARDATA(set);
-  end2  = VARDATA(set)    + VARSIZE(set)    - VARHDRSZ - 1;
-  
-  while (m--) {
-    while (ptr2 <= end2) {
-      if (*ptr == *ptr2) {
-        break;
-      }
-      ++ptr2;
-    }
-    if (*ptr != *ptr2) {
-      break;
-    }
-    --ptr;
-    ptr2 = VARDATA(set);
-  }
-
-  ++m;
-
-  ret = (text *)palloc(VARHDRSZ + m);
-  VARSIZE(ret) = VARHDRSZ + m;
-
-  ptr_ret = VARDATA(ret) + m - 1;
-
-  while (m--) {
-    *ptr_ret-- = *ptr--;
-  }
-
-  return ret;
+       text       *ret;
+       char       *ptr,
+                          *ptr2,
+                          *end2,
+                          *ptr_ret;
+       int                     m;
+
+       if ((string == (text *) NULL) ||
+               ((m = VARSIZE(string) - VARHDRSZ) <= 0) ||
+               (set == (text *) NULL) ||
+               ((VARSIZE(set) - VARHDRSZ) <= 0))
+               return string;
+
+       ptr = VARDATA(string) + VARSIZE(string) - VARHDRSZ - 1;
+       ptr2 = VARDATA(set);
+       end2 = VARDATA(set) + VARSIZE(set) - VARHDRSZ - 1;
+
+       while (m--)
+       {
+               while (ptr2 <= end2)
+               {
+                       if (*ptr == *ptr2)
+                               break;
+                       ++ptr2;
+               }
+               if (ptr2 > end2)
+                       break;
+               --ptr;
+               ptr2 = VARDATA(set);
+       }
+
+       ++m;
+
+       ret = (text *) palloc(VARHDRSZ + m);
+       VARSIZE(ret) = VARHDRSZ + m;
+#ifdef NOT_USED
+       memcpy(VARDATA(ret), ptr - VARSIZE(ret) + m, m);
+#endif
+
+       ptr_ret = VARDATA(ret) + m - 1;
+
+       while (m--)
+               *ptr_ret-- = *ptr--;
+
+       return ret;
 }
 
 
@@ -374,42 +462,43 @@ rtrim(text *string, text *set)
  *
  * Syntax:
  *
- *   text *substr(text *string, int4 m, int4 n)
+ *      text *substr(text *string, int4 m, int4 n)
  *
  * Purpose:
  *
- *   Returns a portion of string, beginning at character m, n
- *   characters long. The first position of string is 1.
+ *      Returns a portion of string, beginning at character m, n
+ *      characters long. The first position of string is 1.
  *
  ********************************************************************/
 
+#ifdef NOT_USED
 text *
 substr(text *string, int4 m, int4 n)
 {
-  text *ret;
-  char *ptr, *ptr_ret;
-  int len;
+       text       *ret;
+       char       *ptr,
+                          *ptr_ret;
+       int                     len;
 
-  if ((string == (text *)NULL) ||
-      (m <= 0) || (n <= 0) ||
-      ((len = VARSIZE(string) - VARHDRSZ - m) <= 0))
-    return string;
+       if ((string == (text *) NULL) ||
+               (m <= 0) || (n <= 0) ||
+               ((len = VARSIZE(string) - VARHDRSZ - m + 1) <= 0))
+               return string;
 
-  len = len + 1 < n ? len + 1 : n;
+       len = len + 1 < n ? len + 1 : n;
 
-  ret = (text *)palloc(VARHDRSZ + len);
-  VARSIZE(ret) = VARHDRSZ + len;
+       ret = (text *) palloc(VARHDRSZ + len);
+       VARSIZE(ret) = VARHDRSZ + len;
 
-  ptr     = VARDATA(string) + m - 1;
-  ptr_ret = VARDATA(ret);
+       ptr = VARDATA(string) + m - 1;
+       ptr_ret = VARDATA(ret);
 
-  while (len--) {
-    *ptr_ret++ = *ptr++;
-  }
+       while (len--)
+               *ptr_ret++ = *ptr++;
 
-  return ret;
+       return ret;
 }
-
+#endif
 
 /********************************************************************
  *
@@ -417,48 +506,42 @@ substr(text *string, int4 m, int4 n)
  *
  * Syntax:
  *
- *   text *translate(text *string, char from, char to)
+ *      text *translate(text *string, char from, char to)
  *
  * Purpose:
  *
- *   Returns string after replacing all occurences of from with
- *   the corresponding character in to. TRANSLATE will not remove
- *    characters.
+ *      Returns string after replacing all occurences of from with
+ *      the corresponding character in to. TRANSLATE will not remove
+ *       characters.
  *
  ********************************************************************/
 
 text *
 translate(text *string, char from, char to)
 {
-  text *ret;
-  char *ptr, *ptr_ret;
-  int m;
+       text       *ret;
+       char       *ptr,
+                          *ptr_ret;
+       int                     m;
 
-  if ((string == (text *)NULL) ||
-      ((m = VARSIZE(string) - VARHDRSZ) <= 0))
-    return string;
+       if ((string == (text *) NULL) ||
+               ((m = VARSIZE(string) - VARHDRSZ) <= 0))
+               return string;
 
-  ret = (text *)palloc(VARSIZE(string));
-  VARSIZE(ret) = VARSIZE(string);
+       ret = (text *) palloc(VARSIZE(string));
+       VARSIZE(ret) = VARSIZE(string);
 
-  ptr     = VARDATA(string);
-  ptr_ret = VARDATA(ret);
+       ptr = VARDATA(string);
+       ptr_ret = VARDATA(ret);
 
-  while (m--) {
-    *ptr_ret++ = *ptr == from ? to : *ptr;
-    ptr++;
-  }
+       while (m--)
+       {
+               *ptr_ret++ = *ptr == from ? to : *ptr;
+               ptr++;
+       }
 
-  return ret;
+       return ret;
 }
 
 
 /* EOF */
-
-
-
-
-
-
-
-