]> git.wincent.com - wikitext.git/blob - ext/str.c
Let the compiler decide when to inline
[wikitext.git] / ext / str.c
1 // Copyright 2008 Wincent Colaiuta
2 // This program is free software: you can redistribute it and/or modify
3 // it under the terms of the GNU General Public License as published by
4 // the Free Software Foundation, either version 3 of the License, or
5 // (at your option) any later version.
6 //
7 // This program is distributed in the hope that it will be useful,
8 // but WITHOUT ANY WARRANTY; without even the implied warranty of
9 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10 // GNU General Public License for more details.
11 //
12 // You should have received a copy of the GNU General Public License
13 // along with this program.  If not, see <http://www.gnu.org/licenses/>.
14
15 #include "str.h"
16
17 str_t *str_new(void)
18 {
19     str_t *str      = ALLOC_N(str_t, 1);
20     str->ptr        = NULL;
21     str->len        = 0;
22     str->capacity   = 0;
23     return str;
24 }
25
26 str_t *str_new_size(long len)
27 {
28     str_t *str      = ALLOC_N(str_t, 1);
29     str->ptr        = ALLOC_N(char, len);
30     str->len        = 0;
31     str->capacity   = len;
32     return str;
33 }
34
35 str_t *str_new_copy(char *src, long len)
36 {
37     str_t *str      = ALLOC_N(str_t, 1);
38     str->ptr        = ALLOC_N(char, len);
39     memcpy(str->ptr, src, len);
40     str->len        = len;
41     str->capacity   = len;
42     return str;
43 }
44
45 str_t *str_new_no_copy(char *src, long len)
46 {
47     str_t *str      = ALLOC_N(str_t, 1);
48     str->ptr        = src;
49     str->len        = len;
50     str->capacity   = len;
51     return str;
52 }
53
54 str_t *str_new_from_string(VALUE string)
55 {
56     string = StringValue(string);
57     return str_new_copy(RSTRING_PTR(string), RSTRING_LEN(string));
58 }
59
60 VALUE string_from_str(str_t *str)
61 {
62     return rb_str_new(str->ptr, str->len);
63 }
64
65 void str_grow(str_t *str, long len)
66 {
67     if (str->capacity < len)
68     {
69         if (str->ptr)
70             REALLOC_N(str->ptr, char, len);
71         else
72             str->ptr = ALLOC_N(char, len);
73         str->capacity = len;
74     }
75 }
76
77 void str_append(str_t *str, char *src, long len)
78 {
79     long new_len = str->len + len;
80     if (str->capacity < new_len)
81     {
82         if (str->ptr)
83             REALLOC_N(str->ptr, char, new_len);
84         else
85             str->ptr = ALLOC_N(char, new_len);
86         str->capacity = new_len;
87     }
88     memcpy(str->ptr + str->len, src, len);
89     str->len = new_len;
90 }
91
92 void str_append_str(str_t *str, str_t *other)
93 {
94     str_append(str, other->ptr, other->len);
95 }
96
97 void str_swap(str_t **a, str_t **b)
98 {
99     str_t *c;
100     c = *a;
101     *a = *b;
102     *b = c;
103 }
104
105 void str_clear(str_t *str)
106 {
107     str->len = 0;
108 }
109
110 void str_free(str_t *str)
111 {
112     if (str->ptr)
113         free(str->ptr);
114     free(str);
115 }