---
name: "buffer_get_token_sa_pred"
section: "3"
platform: "linux"
package: "libowfat-dev"
version: "0.32-5"
release: "Debian 13 (Trixie)"
platforms: ["linux"]
url: "https://new.carta.tech/buffer_get_token_sa_pred"
---

# buffer\_get\_token\_sa\_pred(3)

read token from buffer

## NAME

buffer\_get\_token\_sa\_pred - read token from buffer

## SYNTAX

```
#include <libowfat/stralloc.h>
#include <libowfat/buffer.h>
int buffer_get_token_sa_pred(buffer* b,stralloc* sa,
                 int (*predicate)(stralloc* * sa));
```

## DESCRIPTION

buffer\_get\_token\_sa\_pred appends data from *b* to *sa* until *predicate*(*sa*) returns 1 or -1.

If *predicate* returns 1 once a '\\n' was read, that new-line character is still appended to *sa* -- use stralloc\_chop or stralloc\_chomp to get rid of it.  *predicate* can also return 0 (indicating further input is required to complete the token) or -1 (abort and return -1; use this if *predicate* wants to enfore a maximum message size or does timeout handling or detects a malformed message).

If reading from the buffer or allocating memory fails, buffer\_get\_token\_sa\_pred returns -1 and sets *errno* appropriately.  At that point *sa* may already contain a partial token.

On success, buffer\_get\_token\_sa\_pred returns 0.

## RATIONALE

buffer\_get\_token\_sa\_pred appends instead of overwriting so it can be used on non-blocking sockets (these signal error and set *errno* to EAGAIN; in this case you can simply call buffer\_get\_token\_sa again when **select** or **poll** indicate more data is available).

## SEE ALSO

[buffer\_getline\_sa(3)](/buffer_getline_sa/3.md), [buffer\_get\_token(3)](/buffer_get_token/3.md), [buffer(3)](/buffer/3.md)
