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

数据库系统

开发平台:

Unix_Linux

  1. /*-------------------------------------------------------------------------
  2.  *
  3.  * name.c
  4.  *   Functions for the built-in type "name".
  5.  * name replaces char16 and is carefully implemented so that it
  6.  * is a string of length NAMEDATALEN.  DO NOT use hard-coded constants anywhere
  7.  * always use NAMEDATALEN as the symbolic constant!   - jolly 8/21/95
  8.  *
  9.  *
  10.  * Copyright (c) 1994, Regents of the University of California
  11.  *
  12.  *
  13.  * IDENTIFICATION
  14.  *   $Header: /usr/local/cvsroot/pgsql/src/backend/utils/adt/name.c,v 1.18.2.1 1999/08/02 05:24:55 scrappy Exp $
  15.  *
  16.  *-------------------------------------------------------------------------
  17.  */
  18. #include "postgres.h"
  19. #include "utils/builtins.h"
  20. /*****************************************************************************
  21.  *  USER I/O ROUTINES (none)  *
  22.  *****************************************************************************/
  23. /*
  24.  * namein - converts "..." to internal representation
  25.  *
  26.  * Note:
  27.  * [Old] Currently if strlen(s) < NAMEDATALEN, the extra chars are nulls
  28.  * Now, always NULL terminated
  29.  */
  30. NameData   *
  31. namein(char *s)
  32. {
  33. NameData   *result;
  34. int len;
  35. if (s == NULL)
  36. return NULL;
  37. result = (NameData *) palloc(NAMEDATALEN);
  38. /* always keep it null-padded */
  39. StrNCpy(result->data, s, NAMEDATALEN);
  40. len = strlen(result->data);
  41. while (len < NAMEDATALEN)
  42. {
  43. *(result->data + len) = '';
  44. len++;
  45. }
  46. return result;
  47. }
  48. /*
  49.  * nameout - converts internal reprsentation to "..."
  50.  */
  51. char *
  52. nameout(NameData *s)
  53. {
  54. if (s == NULL)
  55. return "-";
  56. else
  57. return pstrdup(s->data);
  58. }
  59. /*****************************************************************************
  60.  *  PUBLIC ROUTINES  *
  61.  *****************************************************************************/
  62. /*
  63.  * nameeq - returns 1 iff arguments are equal
  64.  * namene - returns 1 iff arguments are not equal
  65.  *
  66.  * BUGS:
  67.  * Assumes that "xya" should be equal to "xyb".
  68.  * If not, can do the comparison backwards for efficiency.
  69.  *
  70.  * namelt - returns 1 iff a < b
  71.  * namele - returns 1 iff a <= b
  72.  * namegt - returns 1 iff a < b
  73.  * namege - returns 1 iff a <= b
  74.  *
  75.  */
  76. bool
  77. nameeq(NameData *arg1, NameData *arg2)
  78. {
  79. if (!arg1 || !arg2)
  80. return 0;
  81. else
  82. return (bool) strncmp(arg1->data, arg2->data, NAMEDATALEN) == 0;
  83. }
  84. bool
  85. namene(NameData *arg1, NameData *arg2)
  86. {
  87. if (arg1 == NULL || arg2 == NULL)
  88. return (bool) 0;
  89. return (bool) (strncmp(arg1->data, arg2->data, NAMEDATALEN) != 0);
  90. }
  91. bool
  92. namelt(NameData *arg1, NameData *arg2)
  93. {
  94. if (arg1 == NULL || arg2 == NULL)
  95. return (bool) 0;
  96. return (bool) (strncmp(arg1->data, arg2->data, NAMEDATALEN) < 0);
  97. }
  98. bool
  99. namele(NameData *arg1, NameData *arg2)
  100. {
  101. if (arg1 == NULL || arg2 == NULL)
  102. return (bool) 0;
  103. return (bool) (strncmp(arg1->data, arg2->data, NAMEDATALEN) <= 0);
  104. }
  105. bool
  106. namegt(NameData *arg1, NameData *arg2)
  107. {
  108. if (arg1 == NULL || arg2 == NULL)
  109. return (bool) 0;
  110. return (bool) (strncmp(arg1->data, arg2->data, NAMEDATALEN) > 0);
  111. }
  112. bool
  113. namege(NameData *arg1, NameData *arg2)
  114. {
  115. if (arg1 == NULL || arg2 == NULL)
  116. return (bool) 0;
  117. return (bool) (strncmp(arg1->data, arg2->data, NAMEDATALEN) >= 0);
  118. }
  119. /* (see char.c for comparison/operation routines) */
  120. int
  121. namecpy(Name n1, Name n2)
  122. {
  123. if (!n1 || !n2)
  124. return -1;
  125. strncpy(n1->data, n2->data, NAMEDATALEN);
  126. return 0;
  127. }
  128. #ifdef NOT_USED
  129. int
  130. namecat(Name n1, Name n2)
  131. {
  132. return namestrcat(n1, n2->data); /* n2 can't be any longer than n1 */
  133. }
  134. #endif
  135. #ifdef NOT_USED
  136. int
  137. namecmp(Name n1, Name n2)
  138. {
  139. return strncmp(n1->data, n2->data, NAMEDATALEN);
  140. }
  141. #endif
  142. int
  143. namestrcpy(Name name, char *str)
  144. {
  145. if (!name || !str)
  146. return -1;
  147. StrNCpy(name->data, str, NAMEDATALEN);
  148. return 0;
  149. }
  150. #ifdef NOT_USED
  151. int
  152. namestrcat(Name name, char *str)
  153. {
  154. int i;
  155. char    *p,
  156.    *q;
  157. if (!name || !str)
  158. return -1;
  159. for (i = 0, p = name->data; i < NAMEDATALEN && *p; ++i, ++p)
  160. ;
  161. for (q = str; i < NAMEDATALEN; ++i, ++p, ++q)
  162. {
  163. *p = *q;
  164. if (!*q)
  165. break;
  166. }
  167. return 0;
  168. }
  169. #endif
  170. int
  171. namestrcmp(Name name, char *str)
  172. {
  173. if (!name && !str)
  174. return 0;
  175. if (!name)
  176. return -1; /* NULL < anything */
  177. if (!str)
  178. return 1; /* NULL < anything */
  179. return strncmp(name->data, str, NAMEDATALEN);
  180. }
  181. /*****************************************************************************
  182.  *  PRIVATE ROUTINES  *
  183.  *****************************************************************************/
  184. #ifdef NOT_USED
  185. uint32
  186. NameComputeLength(Name name)
  187. {
  188. char    *charP;
  189. int length;
  190. for (length = 0, charP = name->data;
  191.  length < NAMEDATALEN && *charP != '';
  192.  length++, charP++)
  193. ;
  194. return (uint32) length;
  195. }
  196. #endif