-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathStaticBuffer.cc
More file actions
112 lines (83 loc) · 1.63 KB
/
StaticBuffer.cc
File metadata and controls
112 lines (83 loc) · 1.63 KB
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
#include "StaticBuffer.h"
#include "misc.h"
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// Static buffer code originally by Oliver Jowett
char *getstatic(int len);
void shrinkstatic(char *buf);
StaticBuffer::StaticBuffer (int sz) {
s = getstatic((len = sz));
}
StaticBuffer::StaticBuffer (const char *buf) {
s = getstatic((len = strlen(buf+1)));
strcpy(s,buf);
}
StaticBuffer::~StaticBuffer() {
shrinkstatic(s);
}
char * StaticBuffer::sprintf(const char *fmt, ...) {
va_list va;
StaticBuffer s;
va_start(va, fmt);
vsnprintf(s, s.size(), fmt, va);
va_end(va);
return s;
}
const char* Sprintf(const char *fmt, ...) {
va_list va;
StaticBuffer s;
va_start(va, fmt);
vsnprintf(s, s.size(), fmt, va);
va_end(va);
return s;
}
/* Static string buffer allocation */
#define STATIC_SIZE (2 << 16)
static char s_buf[STATIC_SIZE];
static int s_offset;
static char *s_last;
int s_gets;
int s_shrinks;
int s_fails;
int s_size;
char *getstatic(int len)
{
char *buf;
if (len > STATIC_SIZE)
error("getstatic: len > STATIC_SIZE\n");
if (s_offset + len >= STATIC_SIZE)
s_offset = 0;
buf=&s_buf[s_offset];
buf[0]=0;
s_last=buf;
s_offset += len;
s_size += len;
s_gets++;
return buf;
}
void shrinkstatic(char *buf)
{
int len;
if (!buf)
return;
s_shrinks++;
if (buf != s_last)
{
s_fails++;
return;
}
len=strlen(buf)+1;
s_size -= s_last - s_buf - len;
s_offset = (s_last - s_buf) + len;
}
void resetstatic(void)
{
s_offset = 0;
s_last = NULL;
s_size = 0;
s_gets = 0;
s_shrinks = 0;
s_fails = 0;
}