source: trunk/CORE/arb_strbuf.cxx

Last change on this file was 19407, checked in by westram, 17 months ago
  • reintegrates 'ali' into 'trunk'
    • use bond settings from EDIT4 in SECEDIT
    • fix refresh logic
    • refactor underlying code
  • adds: log:branches/ali@19393:19406
File size: 3.5 KB
Line 
1// ============================================================= //
2//                                                               //
3//   File      : arb_strbuf.cxx                                  //
4//   Purpose   : "unlimited" output buffer                       //
5//                                                               //
6//   Institute of Microbiology (Technical University Munich)     //
7//   http://www.arb-home.de/                                     //
8//                                                               //
9// ============================================================= //
10
11#include "arb_strbuf.h"
12
13void GBS_strstruct::vnprintf(size_t maxlen, const char *templat, va_list& parg) {
14    ensure_mem(maxlen+1);
15
16    char *buffer = data+pos;
17    int   printed;
18
19#ifdef LINUX
20    printed = vsnprintf(buffer, maxlen+1, templat, parg);
21#else
22    printed = vsprintf(buffer, templat, parg);
23#endif
24
25    assert_or_exit(printed >= 0 && (size_t)printed <= maxlen);
26    inc_pos(printed);
27}
28
29void GBS_strstruct::nprintf(size_t maxlen, const char *templat, ...) {
30    va_list parg;
31    va_start(parg, templat);
32    vnprintf(maxlen, templat, parg);
33}
34
35// --------------------------------------------------------------------------------
36
37#ifdef UNIT_TESTS
38#ifndef TEST_UNIT_H
39#include <test_unit.h>
40#endif
41
42#define EXPECT_CONTENT(expected)             TEST_EXPECT_EQUAL(buf.get_data(), expected)
43#define EXPECT_CONTENT__BROKEN(expected,got) TEST_EXPECT_EQUAL__BROKEN(buf.get_data(), expected, got)
44
45void TEST_GBS_strstruct() {
46    { GBS_strstruct buf; buf.put ('c');      EXPECT_CONTENT("c");   }
47    { GBS_strstruct buf; buf.cat ("abc");    EXPECT_CONTENT("abc"); }
48    { GBS_strstruct buf; buf.nput('x', 0);   EXPECT_CONTENT("");    }
49
50    { GBS_strstruct buf; buf.ncat("abc", 0); EXPECT_CONTENT(""); }
51    { GBS_strstruct buf; buf.cat ("");       EXPECT_CONTENT("");  }
52    { GBS_strstruct buf;                     EXPECT_CONTENT(""); }
53
54    // test multiple consecutive write commands:
55    {
56        GBS_strstruct buf(1000); EXPECT_CONTENT("");
57
58        buf.nput('b', 3);        EXPECT_CONTENT("bbb");
59        buf.putlong(17);         EXPECT_CONTENT("bbb17");
60        buf.put('_');            EXPECT_CONTENT("bbb17_");
61        buf.putfloat(3.5);       EXPECT_CONTENT("bbb17_3.500000");
62
63        TEST_EXPECT_EQUAL(buf.get_position(), 14);
64
65        buf.cut_tail(13);        EXPECT_CONTENT("b");
66        buf.cat("utter");        EXPECT_CONTENT("butter");
67        buf.ncat("flying", 3);   EXPECT_CONTENT("butterfly");
68
69        buf.cut(4, 2);           EXPECT_CONTENT("buttfly");
70
71        buf.cat("er");           EXPECT_CONTENT("buttflyer");
72
73        buf.cut(99, 99);         EXPECT_CONTENT("buttflyer");
74        buf.cut(0, 0);           EXPECT_CONTENT("buttflyer");
75        buf.cut(4, 0);           EXPECT_CONTENT("buttflyer");
76        buf.cut(0, 4);           EXPECT_CONTENT("flyer");
77        buf.cut(3, 2);           EXPECT_CONTENT("fly");
78        buf.cut(3, 99);          EXPECT_CONTENT("fly");
79        buf.cut(4, 99);          EXPECT_CONTENT("fly");
80        buf.cut(2, 1);           EXPECT_CONTENT("fl");
81        buf.cut(1, 99);          EXPECT_CONTENT("f");
82    }
83
84    // test reallocation works:
85    {
86        GBS_strstruct buf(10);
87        size_t        oldbufsize = buf.get_buffer_size();
88        buf.nput('x', 20); // trigger reallocation of buffer
89
90        TEST_EXPECT_DIFFERENT(oldbufsize, buf.get_buffer_size()); // did we reallocate?
91        EXPECT_CONTENT("xxxxxxxxxxxxxxxxxxxx");
92    }
93}
94
95#endif // UNIT_TESTS
96
97// --------------------------------------------------------------------------------
98
Note: See TracBrowser for help on using the repository browser.