-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathwcsbuf.c
120 lines (108 loc) · 2.75 KB
/
wcsbuf.c
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
118
119
120
/* wcsbuf.c - Wide string buffer
*
* Copyright (C) 2012 Oskar Liljeblad
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Library General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include <string.h>
#include <stdio.h>
#include "rdpvnclaunch.h"
/* wcsbuf_assure:
* Assure that line will hold at least assurelen characters.
* assurelen need not include the terminating null character.
*/
void
wcsbuf_assure(wcsbuf_t *buf, size_t assurelen)
{
if (assurelen >= buf->size) {
buf->size = assurelen + 1;
buf->data = xrealloc(buf->data, buf->size * sizeof(wchar_t));
}
}
void
wcsbuf_free(wcsbuf_t *buf)
{
free(buf->data);
free(buf);
}
wchar_t *
wcsbuf_free_to_wcs(wcsbuf_t *buf)
{
wchar_t *data = buf->data;
free(buf);
return data;
}
void
wcsbuf_set_wcs(wcsbuf_t *buf, wchar_t *source)
{
buf->len = wcslen(source);
wcsbuf_assure(buf, buf->len);
memcpy(buf->data, source, (buf->len+1) * sizeof(wchar_t));
}
wcsbuf_t *
wcsbuf_new(void)
{
wcsbuf_t *buf = xmalloc(sizeof(wcsbuf_t));
buf->data = NULL;
buf->size = 0;
buf->len = 0;
return buf;
}
wchar_t *
xwcsdup(const wchar_t *str)
{
wchar_t *out = wcsdup(str);
if (out == NULL)
xalloc_die();
return out;
}
void
wcsbuf_append_wcsbuf(wcsbuf_t *buf, wcsbuf_t *sourcebuf)
{
wcsbuf_assure(buf, buf->len + sourcebuf->len);
memcpy(buf->data + buf->len, sourcebuf->data, (sourcebuf->len + 1) * sizeof(wchar_t));
buf->len += sourcebuf->len;
}
void
wcsbuf_append_wchar(wcsbuf_t *buf, wchar_t chr)
{
wcsbuf_assure(buf, buf->len + 1);
buf->data[buf->len++] = chr;
buf->data[buf->len] = '\0';
}
void
wcsbuf_append_wcs(wcsbuf_t *buf, const wchar_t *str)
{
size_t len = wcslen(str);
wcsbuf_assure(buf, buf->len + len);
memcpy(buf->data + buf->len, str, (len + 1) * sizeof(wchar_t));
buf->len += len;
}
wcsbuf_t *
wcsbuf_clone(wcsbuf_t *sourcebuf)
{
wcsbuf_t *buf = wcsbuf_new();
buf->data = xmalloc((sourcebuf->len + 1) * sizeof(wchar_t));
memcpy(buf->data, sourcebuf->data, (sourcebuf->len + 1) * sizeof(wchar_t));
return buf;
}
wchar_t *
wcsbuf_clone_buf(wcsbuf_t *buf)
{
wchar_t *str;
str = xmalloc((buf->len + 1) * sizeof(wchar_t));
memcpy(str, buf->data, (buf->len + 1) * sizeof(wchar_t));
return str;
}