---
name: "stropt"
section: "3"
platform: "linux"
package: "libstropt-dev"
version: "0.1.2-1"
release: "Debian 13 (Trixie)"
platforms: ["linux", "macos"]
url: "https://new.carta.tech/stropt"
---

# stropt(3)

Parse options from a string (it supports quotation, option arguments)

## NAME

stropt, stroptx, stropt2buf, stropt2str - Parse options from a string (it supports quotation, option arguments)

## SYNOPSIS

**#include \<stropt.h\>**

**int stropt(const char \****input***, char \*\****tags***, char \*\****args***, char \****buf***);**

**int stroptx(const char \****input***, char \****features***, char \****sep***, int** *flags***, char \*\****tags***, char \*\****args***, char \****buf***);**

**char \*stropt2buf(void \****buf***, size\_t** *size***, char \*\****tags***, char \*\****args***, char** *sep***, char** *eq***);**

**char \*stropt2str(char \*\****tags***, char \*\****args***, char** *sep***, char** *eq***);**

## DESCRIPTION

This small library parses a list of options from a string. Options can be separated by spaces, commas, semicolons, tabs or new line. (e.g. *uppercase,bold,underlined* ). Options may have arguments (e.g. *ro,noatime,uid=0,gid=0* ). It is possible to protect symbols and spaces using quote, double quote and backslash (e.g. *values='1,2,3,4',equal==* )

- **stropt**

  This function parses a list of options from the string *input*. Options can be separated by commas, semicolons, tabs oe new lines. Options may have arguments in the form *keyword=value*. *buf* is a temporary buffer, it must have the same size of the *input* string (including the NULL terminator). *tags* and *args* are the resulting arrays of options and arguments respectively. Both *tags* and *args* have one NULL terminator element at the end. When an option has not an argument the corresponding *args* element is NULL. For example if *input* is "font=12,typeface=bodoni,italic", *tags\[0\]*="font", *tags\[1\]*="typeface", *tags\[2\]*="italic", *tags\[4\]*=NULL, *args\[0\]*="12", *args\[1\]*="bodoni", *args\[0\]*=NULL, *args\[4\]*=NULL.

-

  When **stropt** is called with *tags*, *args*, and *buf* all NULL, it parses the input, counting the options. The return value can be used to allocate suitable arrays for *tags* and *args*.

-

  It is possible to use the same variable as *input* and *buffer*. In this case the original value of *input* is overwritten.

- **stroptx**

  This is a more configurable extension of **stropt**. Arguments having the same names as in **stropt** have the same meaning as explained above.

-

  The string *features* permits one to enable/disable some of the standard features. Each feature corresponds to a mnemonic character, when the character is in the *features* string the feature is enabled:

-

  **'**: single quoting,

-

  **"**: double quoting,

-

  **\\**: character escape,

-

  **\\n**:input in several lines,

-

  **=**: allow arguments,

-

  **#**: support comments.

-

  If *features* is NULL all the features are enabled, when *features* is an empty string all features are disabled.

-

  All the characters included in *sep* are considered as option separators. If *sep* is NULL, the default value is " \\t;,".

-

  The *flag* argument may include the bitwise OR of any of the following flag values:

-

  **STROPTX\_KEEP\_QUOTATION\_MARKS\_IN\_TAGS**: preserve the quotation marks in tags,

-

  **STROPTX\_KEEP\_QUOTATION\_MARKS\_IN\_ARGS**: preserve the quotation marks in args,

-

  **STROPTX\_KEEP\_QUOTATION\_MARKS**: shortcut for **STROPTX\_KEEP\_QUOTATION\_MARKS\_IN\_TAGS \| STROPTX\_KEEP\_QUOTATION\_MARKS\_IN\_ARGS**

-

  **STROPTX\_ALLOW\_MULTIPLE\_SEP**: when it is not set, a sequence of separators is processed as a single separator, when it is set each sequence of two separators means an empty field in between.

-

  **STROPTX\_NEWLINE\_TAGS**: when set each new line is encoded as a tag "\\n".

- **stropt2buf**

  This function re-encodes an array of options (and an array of arguments) in a string. It is the inverse function of of **stropt**. Given a buffer *buf* of size *size*, the array of options *tags* with their corresponding values in the array *args* is encoded using the separator character *sep* and the assignment character *eq*.

-

  Elements whose option tag (element of *tags*) value is **STROPTX\_DELETED\_TAG** are omitted in output.

- **stropt2str**

  This is the sibling function of **stropt2buf**. It uses dynamically allocated memory instead of a buffer provided by the caller. The resulting string must be deallocated using [free(3)](/free/3.md).

## RETURN VALUE

- •

  **stropt** and **stroptx** return the number of options + 1.

- •

  **stropt2buf** and **stropt2str** return the resulting string.

-

  ## EXAMPLES

The following function lists the option tags and arguments (without modyfying the input string).

-

  ```
  void parse_args(char *input) {
    int tagc = stropt(input, NULL, NULL, NULL);
    if(tagc > 0) {
      char buf[strlen(input)+1];
      char *tags[tagc];
      char *args[tagc];
      stropt(input, tags, args, buf);
      for (int i=0; i<tagc; i++)
        printf("%s = %s\n",tags[i], args[i]);
    }
  }
  ```

-

  it is possible to use the same input string as the buffer for parsing (the value of the input string gets lost in this way).

-

  ```
  void parse_args(char *input) {
    int tagc = stropt(input, NULL, NULL, NULL);
    if(tagc > 0) {
      char *tags[tagc];
      char *args[tagc];
      stropt(input, tags, args, input);
      for (int i=0; i<tagc; i++)
        printf("%s = %s\n",tags[i], args[i]);
    }
  }
  ```

-

  when options to parse have no arguments, args can be set to NULL.

-

  ```
  void parse_args(char *input) {
    int tagc = stropt(input, NULL, NULL, NULL);
    if(tagc > 0) {
      char buf[strlen(input)+1];
      char *tags[tagc];
      stropt(input, tags, NULL, buf);
      for (int i=0; i<tagc; i++)
        printf("%s \n",tags[i]);
    }
  }
  ```

-

  The following complete program parses and re-encode a string of comma separated arguments deleting those which begin by an uppercase letter.

-

  ```
  #include <stdio.h>
  #include <ctype.h>
  #include <stdlib.h>
  #include <string.h>
  #include <stropt.h>
  char *delete_uppercase_options(const char *input) {
    int tagc = stroptx(input, "", ",",STROPTX_ALLOW_MULTIPLE_SEP, NULL, NULL, NULL);
    if(tagc > 0) {
      char buf[strlen(input)+1];
      char *tags[tagc];
      int i;
      stroptx(input, "", ",",STROPTX_ALLOW_MULTIPLE_SEP, tags, NULL, buf);
      for (i = 0; i < tagc; i++)
        if (tags[i] && isupper(tags[i][0]))
          tags[i] = STROPTX_DELETED_TAG;
      return stropt2str(tags, NULL, ',', '=');
    } else
      return NULL;
  }
  int main(int argc, char *argv[]) {
    if (argc > 1) {
      char *result = delete_uppercase_options(argv[1]);
      printf("%s\n", result);
      free(result);
    }
    return 0;
  }
  ```

-

  ## AUTHOR

VirtualSquare. Project leader: Renzo Davoli.
