source: git/src/str.c @ aa2aff6

faster-cavernloglog-selectstereo-2025walls-datawalls-data-hanging-as-warningwarn-only-for-hanging-survey
Last change on this file since aa2aff6 was 0532954, checked in by Olly Betts <olly@…>, 16 months ago

Rework str.h

The previous implementation was O(n²) for a loop appending n characters
to the string. In practice the strings are typically very short for
.svx format, but for other formats they may be longer so it seems silly
to have this known inefficiency.

  • Property mode set to 100644
File size: 1.9 KB
Line 
1/* append a string */
2/* Copyright (c) Olly Betts 1999, 2014, 2024
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
17 */
18
19#include <config.h>
20
21#include "str.h"
22
23#include <string.h>
24
25#include "osalloc.h"
26
27void s_expand_(string *pstr, int addition) {
28    int new_size = (pstr->len + addition + 33) & ~7;
29    pstr->s = osrealloc(pstr->s, new_size);
30    pstr->capacity = new_size - 1;
31}
32
33void
34s_catlen(string* pstr, const char *s, int s_len)
35{
36   if (pstr->capacity - pstr->len < s_len)
37       s_expand_(pstr, s_len);
38   memcpy(pstr->s + pstr->len, s, s_len);
39   pstr->len += s_len;
40   pstr->s[pstr->len] = '\0';
41}
42
43extern inline void s_cat(string *pstr, const char *s);
44
45extern inline void s_catchar(string *pstr, char c);
46
47extern inline void s_clear(string *pstr);
48
49extern inline void s_truncate(string *pstr, int new_len);
50
51extern inline void s_free(string *pstr);
52
53extern inline char *s_steal(string *pstr);
54
55extern inline void s_donate(string *pstr, char *s);
56
57extern inline int s_len(const string *pstr);
58
59extern inline bool s_empty(const string *pstr);
60
61extern inline const char *s_str(string *pstr);
62
63extern inline bool s_eqlen(const string *pstr, const char *s, int s_len);
64
65extern inline bool s_eq(const string *pstr, const char *s);
Note: See TracBrowser for help on using the repository browser.