---
name: "ds"
section: "3"
platform: "linux"
package: "dacs"
version: "1.4.40-2"
release: "Debian 10 (Buster)"
platforms: ["linux"]
url: "https://new.carta.tech/ds"
---

# ds(3)

Dynamic strings and vectors

## NAME

ds - Dynamic strings and vectors

## SYNOPSIS

```
#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);
```

## DESCRIPTION

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.

**Initialization**

**Manipulation**

**Formatting**

### Vectors
