| .TH QUOTE 3 |
| .SH NAME |
| quotestrdup, quoterunestrdup, unquotestrdup, unquoterunestrdup, quotestrfmt, quoterunestrfmt, quotefmtinstall, doquote, needsrcquote \- quoted character strings |
| .SH SYNOPSIS |
| .B #include <u.h> |
| .br |
| .B #include <libc.h> |
| .PP |
| .B |
| char *quotestrdup(char *s) |
| .PP |
| .B |
| Rune *quoterunestrdup(Rune *s) |
| .PP |
| .B |
| char *unquotestrdup(char *s) |
| .PP |
| .B |
| Rune *unquoterunestrdup(Rune *s) |
| .PP |
| .B |
| int quotestrfmt(Fmt*) |
| .PP |
| .B |
| int quoterunestrfmt(Fmt*) |
| .PP |
| .B |
| void quotefmtinstall(void) |
| .PP |
| .B |
| int (*doquote)(int c) |
| .PP |
| .B |
| int needsrcquote(int c) |
| .PP |
| .SH DESCRIPTION |
| These routines manipulate character strings, either adding or removing |
| quotes as necessary. |
| In the quoted form, the strings are in the style of |
| .IR rc (1) , |
| with single quotes surrounding the string. |
| Embedded single quotes are indicated by a doubled single quote. |
| For instance, |
| .IP |
| .EX |
| Don't worry! |
| .EE |
| .PP |
| when quoted becomes |
| .IP |
| .EX |
| \&'Don''t worry!' |
| .EE |
| .PP |
| The empty string is represented by two quotes, |
| .BR '' . |
| .PP |
| The first four functions act as variants of |
| .B strdup |
| (see |
| .IR strcat (3)). |
| Each returns a |
| freshly allocated copy of the string, created using |
| .IR malloc (3). |
| .I Quotestrdup |
| returns a quoted copy of |
| .IR s , |
| while |
| .I unquotestrdup |
| returns a copy of |
| .IR s |
| with the quotes evaluated. |
| The |
| .I rune |
| versions of these functions do the same for |
| .CW Rune |
| strings (see |
| .IR runestrcat (3)). |
| .PP |
| The string returned by |
| .I quotestrdup |
| or |
| .I quoterunestrdup |
| has the following properties: |
| .TP |
| 1. |
| If the original string |
| .IR s |
| is empty, the returned string is |
| .BR '' . |
| .TP |
| 2. |
| If |
| .I s |
| contains no quotes, blanks, or control characters, |
| the returned string is identical to |
| .IR s . |
| .TP |
| 3. |
| If |
| .I s |
| needs quotes to be added, the first character of the returned |
| string will be a quote. |
| For example, |
| .B hello\ world |
| becomes |
| .B \&'hello\ world' |
| not |
| .BR hello'\ 'world . |
| .PP |
| The function pointer |
| .I doquote |
| is |
| .B nil |
| by default. |
| If it is non-nil, characters are passed to that function to see if they should |
| be quoted. |
| This mechanism allows programs to specify that |
| characters other than blanks, control characters, or quotes be quoted. |
| Regardless of the return value of |
| .IR *doquote , |
| blanks, control characters, and quotes are always quoted. |
| .I Needsrcquote |
| is provided as a |
| .I doquote |
| function that flags any character special to |
| .IR rc (1). |
| .PP |
| .I Quotestrfmt |
| and |
| .I quoterunestrfmt |
| are |
| .IR print (3) |
| formatting routines that produce quoted strings as output. |
| They may be installed by hand, but |
| .I quotefmtinstall |
| installs them under the standard format characters |
| .B q |
| and |
| .BR Q . |
| (They are not installed automatically.) |
| If the format string includes the alternate format character |
| .BR # , |
| for example |
| .BR %#q , |
| the printed string will always be quoted; otherwise quotes will only be provided if necessary |
| to avoid ambiguity. |
| In |
| .B <libc.h> |
| there are |
| .B #pragma |
| statements so the compiler can type-check uses of |
| .B %q |
| and |
| .B %Q |
| in |
| .IR print (3) |
| format strings. |
| .SH SOURCE |
| .B \*9/src/lib9/quote.c |
| .br |
| .B \*9/src/lib9/fmt/fmtquote.c |
| .SH "SEE ALSO |
| .IR rc (1), |
| .IR malloc (3), |
| .IR print (3), |
| .IR strcat (3) |
| .SH BUGS |
| Because it is provided by the format library, |
| .I doquote |
| is a preprocessor macro defined as |
| .IR fmtdoquote ; |
| see |
| .IR intro (3). |