X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Fdynamic-string.h;h=098caafe72e713b4acddb9a0366a1167634b4045;hb=refs%2Fheads%2Fmanual;hp=1d006ff049683414b4e61be2e673059d0ad2d1e3;hpb=34e63086edddcae06d7c1a4fa84fec0861e50758;p=openvswitch diff --git a/lib/dynamic-string.h b/lib/dynamic-string.h index 1d006ff0..098caafe 100644 --- a/lib/dynamic-string.h +++ b/lib/dynamic-string.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008 Nicira Networks. + * Copyright (c) 2008, 2009, 2010, 2011, 2012 Nicira, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -26,6 +26,13 @@ struct tm; +/* A "dynamic string", that is, a buffer that can be used to construct a + * string across a series of operations that extend or modify it. + * + * The 'string' member does not always point to a null-terminated string. + * Initially it is NULL, and even when it is nonnull, some operations do not + * ensure that it is null-terminated. Use ds_cstr() to ensure that memory is + * allocated for the string and that it is null-terminated. */ struct ds { char *string; /* Null-terminated string. */ size_t length; /* Bytes used, not including null terminator. */ @@ -39,24 +46,46 @@ void ds_clear(struct ds *); void ds_truncate(struct ds *, size_t new_length); void ds_reserve(struct ds *, size_t min_length); char *ds_put_uninit(struct ds *, size_t n); -void ds_put_char(struct ds *, char); +static inline void ds_put_char(struct ds *, char); +void ds_put_utf8(struct ds *, int uc); void ds_put_char_multiple(struct ds *, char, size_t n); void ds_put_buffer(struct ds *, const char *, size_t n); void ds_put_cstr(struct ds *, const char *); +void ds_put_and_free_cstr(struct ds *, char *); void ds_put_format(struct ds *, const char *, ...) PRINTF_FORMAT(2, 3); void ds_put_format_valist(struct ds *, const char *, va_list) PRINTF_FORMAT(2, 0); void ds_put_printable(struct ds *, const char *, size_t); -void ds_put_strftime(struct ds *, const char *, const struct tm *) +void ds_put_strftime(struct ds *, const char *, bool utc) STRFTIME_FORMAT(2); void ds_put_hex_dump(struct ds *ds, const void *buf_, size_t size, uintptr_t ofs, bool ascii); int ds_get_line(struct ds *, FILE *); +int ds_get_preprocessed_line(struct ds *, FILE *); +int ds_get_test_line(struct ds *, FILE *); char *ds_cstr(struct ds *); +const char *ds_cstr_ro(const struct ds *); +char *ds_steal_cstr(struct ds *); void ds_destroy(struct ds *); +void ds_swap(struct ds *, struct ds *); int ds_last(const struct ds *); void ds_chomp(struct ds *, int c); + +/* Inline functions. */ + +void ds_put_char__(struct ds *, char); + +static inline void +ds_put_char(struct ds *ds, char c) +{ + if (ds->length < ds->allocated) { + ds->string[ds->length++] = c; + ds->string[ds->length] = '\0'; + } else { + ds_put_char__(ds, c); + } +} #endif /* dynamic-string.h */