view buf.h @ 151:cedd831d02ff

Fix failure in asprintf
author David Demelier <markand@malikania.fr>
date Fri, 22 Jun 2012 22:59:46 +0200
parents 2563b3e71859
children 7f214f26a4c0
line wrap: on
line source

/*
 * buf.h -- easy way to manipulate strings
 *
 * Copyright (c) 2011, 2012, David Demelier <markand@malikania.fr>
 *
 * Permission to use, copy, modify, and/or distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */

#ifndef _BUF_H_
#define _BUF_H_

#include <stdarg.h>

#ifdef __cplusplus
extern "C" {
#endif

#ifndef BUF_DEFAULT_BSIZE
#define BUF_DEFAULT_BSIZE	128
#endif

#ifdef __GNUC__
#  define _buf_at_printf(i1, i2)	__attribute__ ((format (printf, i1, i2)))
#else
#  define _buf_at_printf(i1, i2)
#endif

enum buf_flags {
	BUF_AUTO	= 0,		/* string grows automatically */
	BUF_FIXED	= (1 << 0),	/* fixed size string */
	BUF_UNSAFE	= (1 << 1),	/* string may be truncated */
};

struct buf {
	enum buf_flags	flags;		/* (ro) string flags */
	char		*text;		/* (ro) string text */
	size_t		length;		/* (ro) string length */
	size_t		alsize;		/* (ro) allocated size */
	int		bsize;		/* (ro) block size (used when growing) */

	/* Own allocation functions */
	void * (*malloc)(size_t);
	void * (*realloc)(void *, size_t);
};

int
buf_init(struct buf *);

void
buf_set(struct buf *, const char *, ...);

int
buf_ncat(struct buf *, const char *, size_t);

int
buf_cat(struct buf *, const char *);

int
buf_putc(struct buf *, int);

int
buf_vprintf(struct buf *, const char *, va_list);

int
buf_printf(struct buf *, const char *, ...)	_buf_at_printf(2, 3);

int
buf_trim(struct buf *);

void
buf_cut(struct buf *, int);

void
buf_clear(struct buf *);

void
buf_free(struct buf *);

#ifdef __cplusplus
}
#endif

#endif /* _BUF_H_ */