static dsk_boolean dsk_whitespace_trimmer_process (DskSyncFilter *filter, DskBuffer *out, unsigned in_length, const uint8_t *in_data, DskError **error) { DskWhitespaceTrimmer *trimmer = (DskWhitespaceTrimmer *) filter; uint8_t in_space = trimmer->in_space; DSK_UNUSED (error); while (in_length > 0) { uint8_t c = *in_data++; if (dsk_ascii_isspace (c)) { in_space = DSK_TRUE; } else { if (in_space) { if (trimmer->in_initial_space) trimmer->in_initial_space = DSK_FALSE; else dsk_buffer_append_byte (out, ' '); } in_space = DSK_FALSE; dsk_buffer_append_byte (out, c); } in_length--; } trimmer->in_space = in_space; return DSK_TRUE; }
static void handle_fd (DskPattern *pattern, const char *prefix_filename, unsigned buffer_size, int fd) { DskBuffer in = DSK_BUFFER_INIT; DskBuffer out = DSK_BUFFER_INIT; for (;;) { int rv = dsk_buffer_readv (&in, fd); if (rv == 0) break; char *line; while ((line = dsk_buffer_read_line (&in)) != NULL) { if (dsk_pattern_match (pattern, line)) { if (prefix_filename) { dsk_buffer_append_string (&out, prefix_filename); dsk_buffer_append_string (&out, ": "); } dsk_buffer_append_string (&out, line); dsk_buffer_append_byte (&out, '\n'); while (out.size > buffer_size) dsk_buffer_writev (&out, STDOUT_FILENO); } dsk_free (line); } } while (out.size > 0) dsk_buffer_writev (&out, STDOUT_FILENO); }
static dsk_boolean dsk_hex_decoder_process (DskOctetFilter *filter, DskBuffer *out, unsigned in_length, const uint8_t *in_data, DskError **error) { DskHexDecoder *hexdec = (DskHexDecoder *) filter; DSK_UNUSED (error); while (in_length) { if (dsk_ascii_isxdigit (*in_data)) { if (hexdec->has_nibble) { dsk_buffer_append_byte (out, (hexdec->nibble << 4) | dsk_ascii_xdigit_value (*in_data)); hexdec->has_nibble = DSK_FALSE; } else { hexdec->nibble = dsk_ascii_xdigit_value (*in_data); hexdec->has_nibble = DSK_TRUE; } in_data++; in_length--; } else if (dsk_ascii_isspace (*in_data)) { in_data++; in_length--; } else { dsk_set_error (error, "bad character %s in hex-data", dsk_ascii_byte_name (*in_data)); return DSK_FALSE; } } return DSK_TRUE; }
int main(int argc, char** argv) { DskBuffer gskbuffer; char buf[1024]; char *str; dsk_cmdline_init ("test dsk-buffer code", "test DskBuffer", NULL, 0); dsk_cmdline_process_args (&argc, &argv); dsk_buffer_init (&gskbuffer); dsk_assert (gskbuffer.size == 0); dsk_buffer_append (&gskbuffer, 5, "hello"); dsk_assert (gskbuffer.size == 5); dsk_assert (dsk_buffer_read (&gskbuffer, sizeof (buf), buf) == 5); dsk_assert (memcmp (buf, "hello", 5) == 0); dsk_assert (gskbuffer.size == 0); dsk_buffer_clear (&gskbuffer); dsk_buffer_init (&gskbuffer); count (&gskbuffer, 1, 100000); decount (&gskbuffer, 1, 100000); dsk_assert (gskbuffer.size == 0); dsk_buffer_clear (&gskbuffer); dsk_buffer_init (&gskbuffer); dsk_buffer_append_string (&gskbuffer, "hello\na\nb"); str = dsk_buffer_read_line (&gskbuffer); dsk_assert (str); dsk_assert (strcmp (str, "hello") == 0); dsk_free (str); str = dsk_buffer_read_line (&gskbuffer); dsk_assert (str); dsk_assert (strcmp (str, "a") == 0); dsk_free (str); dsk_assert (gskbuffer.size == 1); dsk_assert (dsk_buffer_read_line (&gskbuffer) == NULL); dsk_buffer_append_byte (&gskbuffer, '\n'); str = dsk_buffer_read_line (&gskbuffer); dsk_assert (str); dsk_assert (strcmp (str, "b") == 0); dsk_free (str); dsk_assert (gskbuffer.size == 0); dsk_buffer_clear (&gskbuffer); dsk_buffer_init (&gskbuffer); dsk_buffer_append (&gskbuffer, 5, "hello"); dsk_buffer_append_foreign (&gskbuffer, 4, "test", NULL, NULL); dsk_buffer_append (&gskbuffer, 5, "hello"); dsk_assert (gskbuffer.size == 14); dsk_assert (dsk_buffer_read (&gskbuffer, sizeof (buf), buf) == 14); dsk_assert (memcmp (buf, "hellotesthello", 14) == 0); dsk_assert (gskbuffer.size == 0); /* Test that the foreign data really is not being stored in the DskBuffer */ { char test_str[5]; strcpy (test_str, "test"); dsk_buffer_init (&gskbuffer); dsk_buffer_append (&gskbuffer, 5, "hello"); dsk_buffer_append_foreign (&gskbuffer, 4, test_str, NULL, NULL); dsk_buffer_append (&gskbuffer, 5, "hello"); dsk_assert (gskbuffer.size == 14); dsk_assert (dsk_buffer_peek (&gskbuffer, sizeof (buf), buf) == 14); dsk_assert (memcmp (buf, "hellotesthello", 14) == 0); test_str[1] = '3'; dsk_assert (gskbuffer.size == 14); dsk_assert (dsk_buffer_read (&gskbuffer, sizeof (buf), buf) == 14); dsk_assert (memcmp (buf, "hellot3sthello", 14) == 0); dsk_buffer_clear (&gskbuffer); } /* Test str_index_of */ { DskBuffer buffer = DSK_BUFFER_INIT; dsk_buffer_append_foreign (&buffer, 3, "abc", NULL, NULL); dsk_buffer_append_foreign (&buffer, 3, "def", NULL, NULL); dsk_buffer_append_foreign (&buffer, 3, "gad", NULL, NULL); #if 0 dsk_assert (dsk_buffer_str_index_of (&buffer, "cdefg") == 2); dsk_assert (dsk_buffer_str_index_of (&buffer, "ad") == 7); dsk_assert (dsk_buffer_str_index_of (&buffer, "ab") == 0); dsk_assert (dsk_buffer_str_index_of (&buffer, "a") == 0); dsk_assert (dsk_buffer_str_index_of (&buffer, "g") == 6); #endif dsk_buffer_clear (&buffer); } static const char *before_strs[] = { "", "foo", NULL, NULL }; before_strs[2] = generate_str (100, 1000); before_strs[3] = generate_str (10000, 100000); static const char *placeholder_strs[] = { "", "bar", NULL, NULL, NULL }; placeholder_strs[2] = generate_str (100, 1000); placeholder_strs[3] = generate_str (10000, 100000); placeholder_strs[4] = generate_str (100000, 1000000); static const char *after_strs[] = { "", "foo", NULL, NULL }; after_strs[2] = generate_str (100, 1000); after_strs[3] = generate_str (10000, 100000); unsigned bi, pi, ai; for (bi = 0; bi < DSK_N_ELEMENTS (before_strs); bi++) for (pi = 0; pi < DSK_N_ELEMENTS (placeholder_strs); pi++) for (ai = 0; ai < DSK_N_ELEMENTS (after_strs); ai++) { DskBuffer buffer = DSK_BUFFER_INIT; const char *pi_str = placeholder_strs[pi]; DskBufferPlaceholder placeholder; dsk_buffer_append_string (&buffer, before_strs[bi]); dsk_buffer_append_placeholder (&buffer, strlen (pi_str), &placeholder); dsk_buffer_append_string (&buffer, after_strs[ai]); dsk_buffer_placeholder_set (&placeholder, pi_str); dsk_assert (try_initial_remove (&buffer, before_strs[bi])); dsk_assert (try_initial_remove (&buffer, pi_str)); dsk_assert (try_initial_remove (&buffer, after_strs[ai])); dsk_assert (buffer.size == 0); } return 0; }