ring buffer

Committer:
est2fe
Date:
Thu Jun 23 20:21:41 2011 +0000
Revision:
2:d1095a112328
Parent:
0:eae8cffdd121
Child:
3:c9c7c8e20336
V 0.92

Who changed what in which revision?

UserRevisionLine numberNew contents of line
est2fe 0:eae8cffdd121 1 #ifndef __charbuf_c_
est2fe 0:eae8cffdd121 2 #define __charbuf_c_
est2fe 0:eae8cffdd121 3
est2fe 0:eae8cffdd121 4 #include "mbed.h"
est2fe 0:eae8cffdd121 5
est2fe 0:eae8cffdd121 6 #include "globals.h" // Wegen g_display_error
est2fe 0:eae8cffdd121 7 #include "rbuf.h"
est2fe 0:eae8cffdd121 8 #include "eprintf.h"
est2fe 0:eae8cffdd121 9
est2fe 0:eae8cffdd121 10 // int debug_create_charbuffer = 0;
est2fe 0:eae8cffdd121 11 int display_receive_io = 0;
est2fe 0:eae8cffdd121 12 int display_send_io = 0;
est2fe 0:eae8cffdd121 13 //int debug_add_pointer_Klartext = 0;
est2fe 0:eae8cffdd121 14 int debug_display_charbuffer_header = 0;
est2fe 0:eae8cffdd121 15
est2fe 0:eae8cffdd121 16 void init_header (buffer_header_t *h, void *buf, uint16_t objektanzahl, uint16_t Schwelle, uint16_t objektgroesse)
est2fe 0:eae8cffdd121 17 {
est2fe 0:eae8cffdd121 18 if (g_display_Funktion) {eprintf ("In init_header: \r\n"); }
est2fe 0:eae8cffdd121 19 h->buflen = objektanzahl;
est2fe 0:eae8cffdd121 20 h->bufcnt = 0;
est2fe 0:eae8cffdd121 21 h->in = buf;
est2fe 0:eae8cffdd121 22 h->out = buf;
est2fe 0:eae8cffdd121 23 h->buf = buf;
est2fe 0:eae8cffdd121 24 h->anzahl = 0;
est2fe 0:eae8cffdd121 25 h->fehleranzahl = 0;
est2fe 0:eae8cffdd121 26 h->Schwelle = Schwelle;
est2fe 0:eae8cffdd121 27 h->flags = 0;
est2fe 0:eae8cffdd121 28 h->peak_max = 0;
est2fe 0:eae8cffdd121 29 h->blockgroesse = objektgroesse;
est2fe 0:eae8cffdd121 30 }
est2fe 0:eae8cffdd121 31
est2fe 0:eae8cffdd121 32 buffer_header_t *charbuffer_init (uint16_t b_size, uint16_t b_schwelle, uint16_t blockgroesse)
est2fe 0:eae8cffdd121 33 {
est2fe 0:eae8cffdd121 34 void *buffer_p;
est2fe 0:eae8cffdd121 35 buffer_header_t *kopf_p;
est2fe 0:eae8cffdd121 36
est2fe 0:eae8cffdd121 37 if (g_display_Funktion) {eprintf ("In create_charbuffer: \r\n"); }
est2fe 0:eae8cffdd121 38
est2fe 0:eae8cffdd121 39 // Zuerst mal Speicher fuer die Verwaltungsstruktur holen
est2fe 0:eae8cffdd121 40 kopf_p = (buffer_header_t *) calloc (1, (sizeof(buffer_header_t)));
est2fe 0:eae8cffdd121 41 if (kopf_p > 0x00)
est2fe 0:eae8cffdd121 42 {
est2fe 0:eae8cffdd121 43 memset (kopf_p, 0x00, (sizeof(buffer_header_t)));
est2fe 0:eae8cffdd121 44 }
est2fe 0:eae8cffdd121 45 else
est2fe 0:eae8cffdd121 46 {
est2fe 0:eae8cffdd121 47 // Fehler!
est2fe 0:eae8cffdd121 48 eprintf ("Error: Kein Speicher mehr bei create_charbuffer-Verwaltungs-Strukt -> stop\n\r");
est2fe 0:eae8cffdd121 49 stop++;
est2fe 0:eae8cffdd121 50 return 0x00;
est2fe 0:eae8cffdd121 51 }
est2fe 0:eae8cffdd121 52
est2fe 0:eae8cffdd121 53 // Jetzt noch die eigentlichen Receive- und send-char-Speicher
est2fe 0:eae8cffdd121 54 size_t blen = b_size * blockgroesse;
est2fe 0:eae8cffdd121 55 buffer_p = calloc (1, blen);
est2fe 0:eae8cffdd121 56 if (buffer_p > 0x00)
est2fe 0:eae8cffdd121 57 {
est2fe 0:eae8cffdd121 58 memset (buffer_p, 0x00, blen);
est2fe 0:eae8cffdd121 59 }
est2fe 0:eae8cffdd121 60 else
est2fe 0:eae8cffdd121 61 {
est2fe 0:eae8cffdd121 62 // gibt es noch nichts! -> evtl. Fehlemeldung, dass nciht mehr genuegend Speicher vorhanden ist.
est2fe 0:eae8cffdd121 63 eprintf ("Error: Kein Speicher mehr bei create_charbuffer, r_buffer -> stop\n\r");
est2fe 0:eae8cffdd121 64 stop++;
est2fe 0:eae8cffdd121 65 return 0x00;
est2fe 0:eae8cffdd121 66 }
est2fe 0:eae8cffdd121 67
est2fe 0:eae8cffdd121 68 // Und die Buffer-Verwaltung noch initialisieren
est2fe 0:eae8cffdd121 69
est2fe 0:eae8cffdd121 70 init_header (kopf_p, buffer_p, b_size, b_schwelle, blockgroesse);
est2fe 0:eae8cffdd121 71 return kopf_p;
est2fe 0:eae8cffdd121 72 }
est2fe 0:eae8cffdd121 73
est2fe 0:eae8cffdd121 74 io_buf_s *create_charbuffer_io (uint16_t r_size, uint16_t s_size, uint16_t r_schwelle, uint16_t s_schwelle, uint16_t blockgroesse)
est2fe 0:eae8cffdd121 75 {
est2fe 0:eae8cffdd121 76 io_buf_s *rbio; // Ring-Bufferpaar I/O
est2fe 0:eae8cffdd121 77 void *r_buffer_p;
est2fe 0:eae8cffdd121 78 void *s_buffer_p;
est2fe 0:eae8cffdd121 79 if (g_display_Funktion) {eprintf ("In create_charbuffer: \r\n"); }
est2fe 0:eae8cffdd121 80
est2fe 0:eae8cffdd121 81 // Zuerst mal Speicher fuer die 2 I/O-Verwaltungsstrukturen holen
est2fe 0:eae8cffdd121 82
est2fe 0:eae8cffdd121 83 rbio = (io_buf_s *) calloc (1, (sizeof(io_buf_s)));
est2fe 0:eae8cffdd121 84 if (rbio > 0x00)
est2fe 0:eae8cffdd121 85 {
est2fe 0:eae8cffdd121 86 memset (rbio, 0x00, (sizeof(io_buf_s)));
est2fe 0:eae8cffdd121 87 }
est2fe 0:eae8cffdd121 88 else
est2fe 0:eae8cffdd121 89 {
est2fe 0:eae8cffdd121 90 // Fehler!
est2fe 0:eae8cffdd121 91 eprintf ("Error: Kein Speicher mehr bei create_charbuffer-Verwaltungs-Strukt -> stop\n\r");
est2fe 0:eae8cffdd121 92 stop++;
est2fe 0:eae8cffdd121 93 return 0x00;
est2fe 0:eae8cffdd121 94 }
est2fe 0:eae8cffdd121 95 // Jetzt noch die eigentlichen Receive- und send-char-Speicher
est2fe 0:eae8cffdd121 96 size_t blen = r_size * blockgroesse;
est2fe 0:eae8cffdd121 97 r_buffer_p = calloc (1, blen);
est2fe 0:eae8cffdd121 98 if (r_buffer_p > 0x00)
est2fe 0:eae8cffdd121 99 {
est2fe 0:eae8cffdd121 100 memset (r_buffer_p, 0x00, blen);
est2fe 0:eae8cffdd121 101 }
est2fe 0:eae8cffdd121 102 else
est2fe 0:eae8cffdd121 103 {
est2fe 0:eae8cffdd121 104 // gibt es noch nichts! -> evtl. Fehlemeldung, dass nciht mehr genuegend Speicher vorhanden ist.
est2fe 0:eae8cffdd121 105 eprintf ("Error: Kein Speicher mehr bei create_charbuffer, r_buffer -> stop\n\r");
est2fe 0:eae8cffdd121 106 stop++;
est2fe 0:eae8cffdd121 107 return 0x00;
est2fe 0:eae8cffdd121 108 }
est2fe 0:eae8cffdd121 109
est2fe 0:eae8cffdd121 110 // pointer_add_check_null (r_buffer, "create_charbuffer receive_buffer");
est2fe 0:eae8cffdd121 111 size_t slen = s_size * blockgroesse;
est2fe 0:eae8cffdd121 112 s_buffer_p = (char *) calloc (1, blockgroesse);
est2fe 0:eae8cffdd121 113 if (s_buffer_p > 0x00)
est2fe 0:eae8cffdd121 114 {
est2fe 0:eae8cffdd121 115 memset (s_buffer_p, 0x00, slen);
est2fe 0:eae8cffdd121 116 }
est2fe 0:eae8cffdd121 117 else
est2fe 0:eae8cffdd121 118 {
est2fe 0:eae8cffdd121 119 // evtl. Fehlermeldung, dass nicht genuegend Speicher vorhanden ist.
est2fe 0:eae8cffdd121 120 eprintf ("Error: Kein Speicher mehr bei create_charbuffer, s_buffer -> stop\n\r");
est2fe 0:eae8cffdd121 121 stop++;
est2fe 0:eae8cffdd121 122 return 0x00;
est2fe 0:eae8cffdd121 123 }
est2fe 0:eae8cffdd121 124 // Jetzt noch die Bufferzeiger in die Verwaltungsstrukturen eintragen
est2fe 0:eae8cffdd121 125 // Und die Buffer-Verwaltung noch initialisieren
est2fe 0:eae8cffdd121 126
est2fe 0:eae8cffdd121 127 init_header (&(rbio->in), r_buffer_p, r_size, r_schwelle, blockgroesse);
est2fe 0:eae8cffdd121 128 init_header (&(rbio->out), s_buffer_p, s_size, s_schwelle, blockgroesse);
est2fe 0:eae8cffdd121 129 return rbio;
est2fe 0:eae8cffdd121 130 }
est2fe 0:eae8cffdd121 131
est2fe 2:d1095a112328 132 void *charbuffer_readable (buffer_header_t * r) // Nur schauen, ob im Buffer neue Ojekte drin sind.
est2fe 0:eae8cffdd121 133 {
est2fe 2:d1095a112328 134 return r->bufcnt;
est2fe 2:d1095a112328 135 /*
est2fe 0:eae8cffdd121 136 if (r->bufcnt == 0)
est2fe 0:eae8cffdd121 137 {
est2fe 0:eae8cffdd121 138 return 0;
est2fe 0:eae8cffdd121 139 }
est2fe 0:eae8cffdd121 140 else
est2fe 0:eae8cffdd121 141 {
est2fe 0:eae8cffdd121 142 return r->out; // ?!?
est2fe 0:eae8cffdd121 143 }
est2fe 2:d1095a112328 144 */
est2fe 0:eae8cffdd121 145 }
est2fe 0:eae8cffdd121 146
est2fe 0:eae8cffdd121 147 void *charbuffer_get (buffer_header_t *r, void *target) // Einen char/Block rausholen mit Readzeiger++
est2fe 0:eae8cffdd121 148 {
est2fe 0:eae8cffdd121 149 void *p_b; // Pointer block
est2fe 0:eae8cffdd121 150 if (g_display_Funktion) {eprintf ("In charbuffer_get: \r\n"); }
est2fe 0:eae8cffdd121 151 if (r->bufcnt == 0)
est2fe 0:eae8cffdd121 152 {
est2fe 0:eae8cffdd121 153 r->flags = r->flags & ((uint8_t) (~NOT_EMPTY));
est2fe 0:eae8cffdd121 154 return 0;
est2fe 0:eae8cffdd121 155 }
est2fe 0:eae8cffdd121 156 // else
est2fe 0:eae8cffdd121 157 // p_b = r->out++; // ?!? // zuerst rausholen, dann Read-Zeiger versetzen
est2fe 0:eae8cffdd121 158 p_b = r->out;
est2fe 0:eae8cffdd121 159 r->out = (void *) (((char *) r->out) + r->blockgroesse );
est2fe 0:eae8cffdd121 160 r->bufcnt--; // Ein char weniger im Buffer
est2fe 0:eae8cffdd121 161 if (r->bufcnt >= r->Schwelle)
est2fe 0:eae8cffdd121 162 {
est2fe 0:eae8cffdd121 163 r->flags = r->flags | ((uint8_t) (FAST_VOLL));
est2fe 0:eae8cffdd121 164 }
est2fe 0:eae8cffdd121 165 else
est2fe 0:eae8cffdd121 166 {
est2fe 0:eae8cffdd121 167 r->flags = r->flags & ((uint8_t) (~FAST_VOLL));
est2fe 0:eae8cffdd121 168 }
est2fe 0:eae8cffdd121 169 if (r->bufcnt == 0)
est2fe 0:eae8cffdd121 170 {
est2fe 0:eae8cffdd121 171 r->flags = r->flags & ((uint8_t) (~NOT_EMPTY));
est2fe 0:eae8cffdd121 172 }
est2fe 0:eae8cffdd121 173 memcpy (target, p_b, r->blockgroesse);
est2fe 0:eae8cffdd121 174
est2fe 0:eae8cffdd121 175 // (1 - 8)
est2fe 0:eae8cffdd121 176 // if (r->out >= r->buf + (r->buflen)) // ?? Hier ist die Zeigerarithmetik noch unklar!
est2fe 0:eae8cffdd121 177 if (r->out >= (void *)(((char *)(r->buf)) + (r->buflen * r->blockgroesse))) // ?? Hier ist die Zeigerarithmetik noch unklar!
est2fe 0:eae8cffdd121 178 {
est2fe 0:eae8cffdd121 179 // wrap around to beginning
est2fe 0:eae8cffdd121 180 r->out = r->buf;
est2fe 0:eae8cffdd121 181 }
est2fe 0:eae8cffdd121 182 return p_b; // ?!?
est2fe 0:eae8cffdd121 183 }
est2fe 0:eae8cffdd121 184
est2fe 0:eae8cffdd121 185 void charbuffer_copy (void *qf, void *zf, uint16_t groesse) // Quelle -> Ziel kopieren // ?!? noch ben�tigt?
est2fe 0:eae8cffdd121 186 {
est2fe 0:eae8cffdd121 187 //
est2fe 0:eae8cffdd121 188 if (g_display_Funktion) {eprintf ("In charbuffer_copy: \r\n"); }
est2fe 0:eae8cffdd121 189 memcpy (zf, qf, groesse);
est2fe 0:eae8cffdd121 190 return;
est2fe 0:eae8cffdd121 191 }
est2fe 0:eae8cffdd121 192
est2fe 0:eae8cffdd121 193 void charbuffer_move (void *qf, void *zf, uint16_t groesse) // Quelle -> Ziel (Move char mit anschliessendem loeschen der Quelle)
est2fe 0:eae8cffdd121 194 {
est2fe 0:eae8cffdd121 195 if (g_display_Funktion) {eprintf ("In charbuffer_move: \r\n"); }
est2fe 0:eae8cffdd121 196 charbuffer_copy (qf, zf, groesse);
est2fe 0:eae8cffdd121 197 memset (qf, 0x00, groesse);
est2fe 0:eae8cffdd121 198 //?!? evtl. noch get machen?
est2fe 0:eae8cffdd121 199 }
est2fe 0:eae8cffdd121 200
est2fe 0:eae8cffdd121 201 char *charbuffer_put (buffer_header_t *r, void *b_p) // Ein Zeichen/Block einstellen
est2fe 0:eae8cffdd121 202 {
est2fe 0:eae8cffdd121 203 // b_p = Block-Pointer
est2fe 0:eae8cffdd121 204 void *target;
est2fe 0:eae8cffdd121 205 if (g_display_Funktion) {eprintf ("In charbuffer_put: \r\n"); }
est2fe 0:eae8cffdd121 206 if (r->bufcnt >= r->buflen)
est2fe 0:eae8cffdd121 207 {
est2fe 0:eae8cffdd121 208 r->fehleranzahl++;
est2fe 0:eae8cffdd121 209 r->flags = r->flags | ((uint8_t) (FEHLER));
est2fe 0:eae8cffdd121 210 return 0; // Wenn Buffer voll dann mit Nullpointer zurueck
est2fe 0:eae8cffdd121 211 }
est2fe 0:eae8cffdd121 212 target = r->in;
est2fe 0:eae8cffdd121 213 memcpy (r->in, b_p, r->blockgroesse);
est2fe 0:eae8cffdd121 214 r->bufcnt++; if (r->bufcnt > r->peak_max) {r->peak_max = r->bufcnt;}
est2fe 0:eae8cffdd121 215 if (r->bufcnt >= r->Schwelle)
est2fe 0:eae8cffdd121 216 {
est2fe 0:eae8cffdd121 217 r->flags = r->flags | ((uint8_t) (FAST_VOLL));
est2fe 0:eae8cffdd121 218 }
est2fe 0:eae8cffdd121 219 else
est2fe 0:eae8cffdd121 220 {
est2fe 0:eae8cffdd121 221 r->flags = r->flags & ((uint8_t) (~FAST_VOLL));
est2fe 0:eae8cffdd121 222 }
est2fe 0:eae8cffdd121 223 r->anzahl++; // Anzahl aller Zeichen/Bloecke aufsummiert
est2fe 0:eae8cffdd121 224 r->flags = r->flags | ((uint8_t) (NOT_EMPTY));
est2fe 0:eae8cffdd121 225
est2fe 0:eae8cffdd121 226 // r->in++; // Falls er das zuerst machen sollte!
est2fe 0:eae8cffdd121 227 r->in = (void *) (((char *) r->in) + r->blockgroesse );
est2fe 0:eae8cffdd121 228 //if (r->in >= r->buf + r->buflen)
est2fe 0:eae8cffdd121 229 if (r->in >= (void *) (((char *)r->buf) + (r->buflen * r->blockgroesse)))
est2fe 0:eae8cffdd121 230 {
est2fe 0:eae8cffdd121 231 // Bei Zeiger > Buffer, Zeiger wieder an Anfang vom Buffer
est2fe 0:eae8cffdd121 232 r->in = r->buf;
est2fe 0:eae8cffdd121 233 }
est2fe 0:eae8cffdd121 234 return (char *)target;
est2fe 0:eae8cffdd121 235 }
est2fe 0:eae8cffdd121 236
est2fe 0:eae8cffdd121 237 void print_verwaltung (buffer_header_t *rbk_p)
est2fe 0:eae8cffdd121 238 {
est2fe 0:eae8cffdd121 239 if (rbk_p > 0x00)
est2fe 0:eae8cffdd121 240 {
est2fe 0:eae8cffdd121 241 eprintf (" charbufferverwaltung Zeiger = 0x%08X\r\n", rbk_p);
est2fe 0:eae8cffdd121 242 eprintf (" buflen = %d\r\n", rbk_p->buflen);
est2fe 0:eae8cffdd121 243 eprintf (" bufcnt = %d\r\n", rbk_p->bufcnt);
est2fe 0:eae8cffdd121 244 eprintf (" Zeiger *in = 0x%08X\r\n", rbk_p->in);
est2fe 0:eae8cffdd121 245 eprintf (" Zeiger *out = 0x%08X\r\n", rbk_p->out);
est2fe 0:eae8cffdd121 246 eprintf (" Zeiger *buf = 0x%08X\r\n", rbk_p->buf);
est2fe 0:eae8cffdd121 247 eprintf (" charanzahl = %d\r\n", rbk_p->anzahl);
est2fe 0:eae8cffdd121 248 eprintf (" Fehleranzahl = %d\r\n", rbk_p->fehleranzahl);
est2fe 0:eae8cffdd121 249 eprintf (" Schwelle = %d\r\n", rbk_p->Schwelle);
est2fe 0:eae8cffdd121 250 eprintf (" Flags = 0x%08X\r\n", rbk_p->flags);
est2fe 0:eae8cffdd121 251 eprintf (" Max.Fuellst. = %d\r\n", rbk_p->peak_max);
est2fe 0:eae8cffdd121 252 eprintf (" Blockgroesse = %d\r\n", rbk_p->blockgroesse);
est2fe 0:eae8cffdd121 253 }
est2fe 0:eae8cffdd121 254 else
est2fe 0:eae8cffdd121 255 {
est2fe 0:eae8cffdd121 256 if (g_display_error)
est2fe 0:eae8cffdd121 257 {
est2fe 0:eae8cffdd121 258 eprintf ("Error: In print_verwaltung: Zeiger rbk_p ist ungueltig! \r\n");
est2fe 0:eae8cffdd121 259 }
est2fe 0:eae8cffdd121 260 }
est2fe 0:eae8cffdd121 261 return;
est2fe 0:eae8cffdd121 262 }
est2fe 0:eae8cffdd121 263
est2fe 0:eae8cffdd121 264 void display_rbuffer_header (io_buf_s *rb)
est2fe 0:eae8cffdd121 265 {
est2fe 0:eae8cffdd121 266 buffer_header_t *rbk_p;
est2fe 0:eae8cffdd121 267 if (g_display_Funktion) {eprintf ("In print_verwaltung: \r\n"); }
est2fe 0:eae8cffdd121 268 if (rb > 0x00)
est2fe 0:eae8cffdd121 269 {
est2fe 0:eae8cffdd121 270 if (debug_display_charbuffer_header)
est2fe 0:eae8cffdd121 271 {
est2fe 0:eae8cffdd121 272 eprintf ("In display charbuffer charbufferspeicherzeiger = 0x%08X\r\n", rb);
est2fe 0:eae8cffdd121 273 }
est2fe 0:eae8cffdd121 274 if (display_receive_io)
est2fe 0:eae8cffdd121 275 {
est2fe 0:eae8cffdd121 276 rbk_p = &rb->in;
est2fe 0:eae8cffdd121 277 if (rbk_p > 0x00)
est2fe 0:eae8cffdd121 278 {
est2fe 0:eae8cffdd121 279 eprintf (" Receive Struktur: rbk_p = 0x%08X\r\n", rbk_p);
est2fe 0:eae8cffdd121 280 print_verwaltung (rbk_p);
est2fe 0:eae8cffdd121 281 }
est2fe 0:eae8cffdd121 282 else
est2fe 0:eae8cffdd121 283 {
est2fe 0:eae8cffdd121 284 if (g_display_error)
est2fe 0:eae8cffdd121 285 {
est2fe 0:eae8cffdd121 286 eprintf ("Error: In display_charbuffer_verwaltung: *rbk_p ist ungueltig! \r\n");
est2fe 0:eae8cffdd121 287 }
est2fe 0:eae8cffdd121 288 }
est2fe 0:eae8cffdd121 289 }
est2fe 0:eae8cffdd121 290 if (display_send_io)
est2fe 0:eae8cffdd121 291 {
est2fe 0:eae8cffdd121 292 rbk_p = &rb->out;
est2fe 0:eae8cffdd121 293 if (rbk_p > 0x00)
est2fe 0:eae8cffdd121 294 {
est2fe 0:eae8cffdd121 295 eprintf (" Send Struktur: rbk_p = 0x%08X\r\n", rbk_p);
est2fe 0:eae8cffdd121 296 print_verwaltung (rbk_p);
est2fe 0:eae8cffdd121 297 }
est2fe 0:eae8cffdd121 298 else
est2fe 0:eae8cffdd121 299 {
est2fe 0:eae8cffdd121 300 if (g_display_error)
est2fe 0:eae8cffdd121 301 {
est2fe 0:eae8cffdd121 302 eprintf ("Error: In display_charbuffer_verwaltung display_send: *rbk_p ist ungueltig! \r\n");
est2fe 0:eae8cffdd121 303 }
est2fe 0:eae8cffdd121 304 }
est2fe 0:eae8cffdd121 305 }
est2fe 0:eae8cffdd121 306 }
est2fe 0:eae8cffdd121 307 else
est2fe 0:eae8cffdd121 308 {
est2fe 0:eae8cffdd121 309 if (g_display_error)
est2fe 0:eae8cffdd121 310 {
est2fe 0:eae8cffdd121 311 eprintf ("Eror: In display_charbuffer_verwaltung: *rb ist ungueltig! \r\n");
est2fe 0:eae8cffdd121 312 }
est2fe 0:eae8cffdd121 313 }
est2fe 0:eae8cffdd121 314 return;
est2fe 0:eae8cffdd121 315 }
est2fe 0:eae8cffdd121 316
est2fe 0:eae8cffdd121 317 #endif // von __charbuf_c_