File: strbuf.c

package info (click to toggle)
librra 0.9.0-2
  • links: PTS
  • area: main
  • in suites: sarge
  • size: 2,032 kB
  • ctags: 1,045
  • sloc: ansic: 9,914; sh: 8,954; makefile: 125
file content (117 lines) | stat: -rw-r--r-- 2,532 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
/* $Id: strbuf.c,v 1.5 2003/05/13 06:16:54 twogood Exp $ */
#include "strbuf.h"
#include <stdlib.h>
#include <string.h>

static void strbuf_enlarge(StrBuf *strbuf, size_t size)
{
  if (strbuf->buffer_size < size)
  {
    size_t new_size = strbuf->buffer_size ? strbuf->buffer_size : 2;
    
    while (new_size < size)
      new_size <<= 1;

    strbuf->buffer = realloc(strbuf->buffer, new_size);
    strbuf->buffer_size = new_size;
  }
}

StrBuf* strbuf_new (const char *init)
{
  StrBuf* result = (StrBuf*)malloc(sizeof(StrBuf));
	memset(result, 0, sizeof(StrBuf));
  strbuf_append(result, init);
  return result;
}
  
void strbuf_destroy(StrBuf *strbuf, bool free_contents)
{
  if (free_contents)
    free(strbuf->buffer);

  free(strbuf);
}

StrBuf* strbuf_append (StrBuf *strbuf, const char* str)
{
  int length;

  if (!str)
    return strbuf;
 
  length = strlen(str);
  strbuf_enlarge(strbuf, strbuf->length + length + 1);
  memcpy(strbuf->buffer + strbuf->length, str, length + 1);
  strbuf->length += length;
  return strbuf;
}

StrBuf* strbuf_append_wstr(StrBuf* strbuf, WCHAR* wstr)
{
	if (wstr)
	{
		char* ascii_str = wstr_to_ascii(wstr);
		strbuf_append(strbuf, ascii_str);
		wstr_free_string(ascii_str);
	}

	return strbuf;
}

StrBuf* strbuf_append_c (StrBuf *strbuf, int c)
{
  strbuf_enlarge(strbuf, strbuf->length + 2);
  strbuf->buffer[strbuf->length++] = c;
  strbuf->buffer[strbuf->length] = '\0';
  return strbuf;
}

StrBuf* strbuf_append_crlf (StrBuf *strbuf)
{
  strbuf_enlarge(strbuf, strbuf->length + 3);
  strbuf->buffer[strbuf->length++] = '\r';
  strbuf->buffer[strbuf->length++] = '\n';
  strbuf->buffer[strbuf->length] = '\0';
  return strbuf;
}

#if 0
StrBuf* strbuf_printf(StrBuf *strbuf, const char* format, ...)
{
  va_list ap;
  
  va_start(ap, format);
  strbuf_vprintf(strbuf, format, ap);
  va_end(ap);
}

StrBuf* strbuf_vprintf(StrBuf *strbuf, const char* format, va_list ap);
{
  size_t bytes_left = 0;
  size_t increase = 64;
  int bytes_used = 0;
  
  for (;;)
  {
    strbuf_enlarge(strbuf, strbuf->length + increase);
    bytes_left = strbuf->buffer_size - strbuf->length;

    bytes_used = vsnprintf(strbuf->buffer + strbuf->length,
        bytes_left, format, ap);

    if (bytes_used > -1 && bytes_used < size)
      break;

    /* see the printf man page */
    if (bytes_used > -1)            /* glibc 2.1 */
      increase = bytes_used + 1;
    else                            /* glibc 2.0 */
      increase *= 2;
  };
  
  bytes->length += bytes_used;

  return strbuf;
}
#endif