stringinfo.h 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. /*-------------------------------------------------------------------------
  2. *
  3. * stringinfo.h
  4. * Declarations/definitions for "StringInfo" functions.
  5. *
  6. * StringInfo provides an indefinitely-extensible string data type.
  7. * It can be used to buffer either ordinary C strings (null-terminated text)
  8. * or arbitrary binary data. All storage is allocated with palloc().
  9. *
  10. * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
  11. * Portions Copyright (c) 1994, Regents of the University of California
  12. *
  13. * src/include/lib/stringinfo.h
  14. *
  15. *-------------------------------------------------------------------------
  16. */
  17. #ifndef STRINGINFO_H
  18. #define STRINGINFO_H
  19. /*-------------------------
  20. * StringInfoData holds information about an extensible string.
  21. * data is the current buffer for the string (allocated with palloc).
  22. * len is the current string length. There is guaranteed to be
  23. * a terminating '\0' at data[len], although this is not very
  24. * useful when the string holds binary data rather than text.
  25. * maxlen is the allocated size in bytes of 'data', i.e. the maximum
  26. * string size (including the terminating '\0' char) that we can
  27. * currently store in 'data' without having to reallocate
  28. * more space. We must always have maxlen > len.
  29. * cursor is initialized to zero by makeStringInfo or initStringInfo,
  30. * but is not otherwise touched by the stringinfo.c routines.
  31. * Some routines use it to scan through a StringInfo.
  32. *-------------------------
  33. */
  34. typedef struct StringInfoData
  35. {
  36. char *data;
  37. int len;
  38. int maxlen;
  39. int cursor;
  40. } StringInfoData;
  41. typedef StringInfoData *StringInfo;
  42. /*------------------------
  43. * There are two ways to create a StringInfo object initially:
  44. *
  45. * StringInfo stringptr = makeStringInfo();
  46. * Both the StringInfoData and the data buffer are palloc'd.
  47. *
  48. * StringInfoData string;
  49. * initStringInfo(&string);
  50. * The data buffer is palloc'd but the StringInfoData is just local.
  51. * This is the easiest approach for a StringInfo object that will
  52. * only live as long as the current routine.
  53. *
  54. * To destroy a StringInfo, pfree() the data buffer, and then pfree() the
  55. * StringInfoData if it was palloc'd. There's no special support for this.
  56. *
  57. * NOTE: some routines build up a string using StringInfo, and then
  58. * release the StringInfoData but return the data string itself to their
  59. * caller. At that point the data string looks like a plain palloc'd
  60. * string.
  61. *-------------------------
  62. */
  63. /*------------------------
  64. * makeStringInfo
  65. * Create an empty 'StringInfoData' & return a pointer to it.
  66. */
  67. extern StringInfo makeStringInfo(void);
  68. /*------------------------
  69. * initStringInfo
  70. * Initialize a StringInfoData struct (with previously undefined contents)
  71. * to describe an empty string.
  72. */
  73. extern void initStringInfo(StringInfo str);
  74. /*------------------------
  75. * resetStringInfo
  76. * Clears the current content of the StringInfo, if any. The
  77. * StringInfo remains valid.
  78. */
  79. extern void resetStringInfo(StringInfo str);
  80. /*------------------------
  81. * appendStringInfo
  82. * Format text data under the control of fmt (an sprintf-style format string)
  83. * and append it to whatever is already in str. More space is allocated
  84. * to str if necessary. This is sort of like a combination of sprintf and
  85. * strcat.
  86. */
  87. extern void appendStringInfo(StringInfo str, const char *fmt,...) pg_attribute_printf(2, 3);
  88. /*------------------------
  89. * appendStringInfoVA
  90. * Attempt to format text data under the control of fmt (an sprintf-style
  91. * format string) and append it to whatever is already in str. If successful
  92. * return zero; if not (because there's not enough space), return an estimate
  93. * of the space needed, without modifying str. Typically the caller should
  94. * pass the return value to enlargeStringInfo() before trying again; see
  95. * appendStringInfo for standard usage pattern.
  96. */
  97. extern int appendStringInfoVA(StringInfo str, const char *fmt, va_list args) pg_attribute_printf(2, 0);
  98. /*------------------------
  99. * appendStringInfoString
  100. * Append a null-terminated string to str.
  101. * Like appendStringInfo(str, "%s", s) but faster.
  102. */
  103. extern void appendStringInfoString(StringInfo str, const char *s);
  104. /*------------------------
  105. * appendStringInfoChar
  106. * Append a single byte to str.
  107. * Like appendStringInfo(str, "%c", ch) but much faster.
  108. */
  109. extern void appendStringInfoChar(StringInfo str, char ch);
  110. /*------------------------
  111. * appendStringInfoCharMacro
  112. * As above, but a macro for even more speed where it matters.
  113. * Caution: str argument will be evaluated multiple times.
  114. */
  115. #define appendStringInfoCharMacro(str,ch) \
  116. (((str)->len + 1 >= (str)->maxlen) ? \
  117. appendStringInfoChar(str, ch) : \
  118. (void)((str)->data[(str)->len] = (ch), (str)->data[++(str)->len] = '\0'))
  119. /*------------------------
  120. * appendStringInfoSpaces
  121. * Append a given number of spaces to str.
  122. */
  123. extern void appendStringInfoSpaces(StringInfo str, int count);
  124. /*------------------------
  125. * appendBinaryStringInfo
  126. * Append arbitrary binary data to a StringInfo, allocating more space
  127. * if necessary.
  128. */
  129. extern void appendBinaryStringInfo(StringInfo str,
  130. const char *data, int datalen);
  131. /*------------------------
  132. * enlargeStringInfo
  133. * Make sure a StringInfo's buffer can hold at least 'needed' more bytes.
  134. */
  135. extern void enlargeStringInfo(StringInfo str, int needed);
  136. #endif /* STRINGINFO_H */