ds(3) Dynamic strings and vectors


#include "dsslib.h"

Ds *ds_init(Ds *ods);
Ds *ds_init_size(Ds *ods, size_t nbytes);
Ds *ds_alloc(void);
Ds *ds_alloc_size(size_t nbytes);
Ds *ds_reinit(Ds *ds);
Ds *ds_reinit_size(Ds *ods, size_t nbytes);
Ds *ds_reset(Ds *ds);
Ds *ds_reset_buf(Ds *ds);
Ds *ds_trim(Ds *ds);
Ds *ds_grow(Ds *ds);
void ds_free(Ds *ds);
int ds_appendc(Ds *ds, int ch);
int ds_copyb(Ds *ds, void *src, size_t len, unsigned int offset);
int ds_insertb(Ds *ds, void *src, size_t len, unsigned int offset);
int ds_append(Ds *ds, char *str);
int ds_concat(Ds *ds, char *str);
int ds_concatc(Ds *ds, int ch);
int ds_concatn(Ds *ds, char *str, size_t len);
Ds *ds_set(Ds *ds, char *str);
Ds *ds_setn(Ds *ds, unsigned char *s, size_t slen);
Ds *ds_range(Ds *ds, char *str, char *range_spec, Range_syntax *ors);
int ds_getc(Ds *ds, FILE *fp, int *ch_ptr);
Dsio *dsio_set(Ds *ds, FILE *fp, char *buf, unsigned long len, int have_length);
int dsio_free(Ds *ds);
int dsio_eof(Ds *ds);
int dsio_nextc(Ds *ds, int *ch_ptr);
int dsio_peekc(Ds *ds, int *ch_ptr);
char *dsio_agets(Ds *ds);
char *dsio_gets(Ds *ds);
int dsio_load(Ds *ds);
char *dsio_load_str(Ds *ds);
char *ds_gets(Ds *ds, FILE *fp);
char *ds_agets(Ds *ds, FILE *fp);
char *ds_agets_buf(Ds *ds, char *buf);
char *ds_prompt(Ds *ds, char *prompt, unsigned int flag);
char *ds_readline(Ds *ds, char *prompt, char *cprompt);
Ds *ds_load_file(Ds *ds, char *pathname);
Ds *ds_agetf(Ds *ds, FILE *fp);
Ds *ds_getf(FILE *fp);
int ds_sprintf(Ds *ds, unsigned int offset, char *fmt, ...);
int ds_asprintf(Ds *ds, char *fmt, ...);
int ds_vasprintf(Ds *ds, char *fmt, va_list ap);
char *ds_xprintf(char *fmt, ...);
char *ds_vxprintf(char *fmt, va_list ap);
FILE *ds_fopen_secure(const char *path, const char *mode, size_t size);
int ds_fclose(FILE *fp);
int ds_fclean(FILE *fp);
Dsvec *dsvec_init(Dsvec *dsv, size_t size);
Dsvec *dsvec_alloc(size_t size);
Dsvec *dsvec_init_size(Dsvec *dsv, size_t size, int n);
Dsvec *dsvec_alloc_size(size_t size, int n);
void dsvec_free(Dsvec *dsv);
Dsvec *dsvec_grow(Dsvec *dsv, unsigned int new_nelements);
Dsvec *dsvec_subset(Dsvec *dsv, Dsvec *old_dsv, unsigned int start, int len);
Dsvec *dsvec_copy(Dsvec *dsv, Dsvec *old_dsv);
void *dsvec_ptr_index(Dsvec *dsv, unsigned int ind);
int dsvec_delete_ptr_index(Dsvec *dsv, unsigned int ind);
int dsvec_delete_ptr(Dsvec *dsv, void *ptr);
int dsvec_replace_ptr(Dsvec *dsv, void *ptr, unsigned int ind);
int dsvec_streq(Dsvec *dsv1, Dsvec *dsv2);
int dsvec_strneq(Dsvec *dsv1, Dsvec *dsv2, size_t len);
int dsvec_rotate(Dsvec *dsv, int npos);
Dsvec *dsvec_strlist(Dsvec *dsv, char *str_spec);
Dsvec *dsvec_slice(Dsvec *dsv, Dsvec *primary, unsigned int ind, unsigned int len);
Dsvec *dsvec_range(Dsvec *dsv, Dsvec *primary, char *range_spec, Range_syntax *ors);
int dsvec_replace(Dsvec *primary, unsigned int ind, unsigned int delete_len, Dsvec *secondary);
int dsvec_append(Dsvec *primary, Dsvec *secondary);
int dsvec_insert_ptr(Dsvec *dsv, unsigned int ind, void *ptr);
int dsvec_add_ptr(Dsvec *dsv, void *ptr);
int dsvec_insert(Dsvec *primary, unsigned int ind, Dsvec *secondary);
int dsvec_delete(Dsvec *dsv, unsigned int ind, unsigned int ndelete);
int dsvec_add_obj(Dsvec *dsv);
void dsvec_sort(Dsvec *dsv, int (*compar)(const void *, const void *));
Dsvec *dsvec_load(Ds *ds, Dsvec *dsv);
Dsvec *ds_mkargv_add(Dsvec *dsv, char *el);
Dsvec *ds_mkargv_addv(Dsvec *dsv, int argc, char **argv);

typedef struct Mkargv { int keepq; int keepws; char *ifs; char *startq; char *endq; } Mkargv;
Dsvec *ds_mkargv(Dsvec *dsv, char *str, Mkargv *conf);
char *ds_buf(Ds *ds);
size_t ds_len(Ds *ds);
size_t ds_size(Ds *ds);
int ds_eq(Ds *ds1, Ds *ds2);
(TYPE) dsvec_ptr(Ds *DSV, unsigned int IND, TYPE);
(TYPE) dsvec_obj(Ds *DSV, unsigned int IND, TYPE);
(TYPE) dsvec_new_obj(Ds *DSV, TYPE);
(TYPE) dsvec_base_type(Ds *DSV, TYPE);
void **dsvec_base(Dsvec *dsv);
unsigned int dsvec_len(Dsvec *dsv);

extern int ds_default_clear_flag;
extern int ds_default_delnl_flag;
extern size_t ds_default_len_limit;
extern void *(*ds_default_malloc_func)(size_t size);
extern void *(*ds_default_free_func)(void *ptr);


The DS library is a collection of functions for creating, manipulating, and formatting strings of bytes. The memory used by these strings is dynamically allocated and released as necessary. When used correctly, bugs caused by buffer overruns and other programming errors can be avoided. There are also functions for creating and manipulating dynamic vectors of pointers and objects.

Byte Strings

A Ds data structure represents a dynamic string. It must be initialized before it can be used. A Ds variable contains several fields that may be set after initialization but before it is first used. Default values for some of these fields are copied from global variables exported by the library.