static int get_any_string (int idx, sb *in, sb *out) { sb_reset (out); idx = sb_skip_white (idx, in); if (idx < in->len) { if (in->len > idx + 2 && in->ptr[idx + 1] == '\'' && ISBASE (in->ptr[idx])) { while (!ISSEP (in->ptr[idx])) sb_add_char (out, in->ptr[idx++]); } else if (in->ptr[idx] == '%' && macro_alternate) { int val; char buf[20]; /* Turns the next expression into a string. */ /* xgettext: no-c-format */ idx = (*macro_expr) (_("% operator needs absolute expression"), idx + 1, in, &val); sprintf (buf, "%d", val); sb_add_string (out, buf); } else if (in->ptr[idx] == '"' || (in->ptr[idx] == '<' && (macro_alternate || macro_mri)) || (macro_alternate && in->ptr[idx] == '\'')) { if (macro_alternate && ! macro_strip_at && in->ptr[idx] != '<') { /* Keep the quotes. */ sb_add_char (out, '"'); idx = getstring (idx, in, out); sb_add_char (out, '"'); } else { idx = getstring (idx, in, out); } } else { char *br_buf = xmalloc(1); char *in_br = br_buf; *in_br = '\0'; while (idx < in->len && (*in_br || (in->ptr[idx] != ' ' && in->ptr[idx] != '\t')) && in->ptr[idx] != ',' && (in->ptr[idx] != '<' || (! macro_alternate && ! macro_mri))) { char tchar = in->ptr[idx]; switch (tchar) { case '"': case '\'': sb_add_char (out, in->ptr[idx++]); while (idx < in->len && in->ptr[idx] != tchar) sb_add_char (out, in->ptr[idx++]); if (idx == in->len) return idx; break; case '(': case '[': if (in_br > br_buf) --in_br; else { br_buf = xmalloc(strlen(in_br) + 2); strcpy(br_buf + 1, in_br); free(in_br); in_br = br_buf; } *in_br = tchar; break; case ')': if (*in_br == '(') ++in_br; break; case ']': if (*in_br == '[') ++in_br; break; } sb_add_char (out, tchar); ++idx; } free(br_buf); } } return idx; }
static int get_any_string (int idx, sb *in, sb *out, int expand, int pretend_quoted) { sb_reset (out); idx = sb_skip_white (idx, in); if (idx < in->len) { if (in->len > idx + 2 && in->ptr[idx + 1] == '\'' && ISBASE (in->ptr[idx])) { while (!ISSEP (in->ptr[idx])) sb_add_char (out, in->ptr[idx++]); } else if (in->ptr[idx] == '%' && macro_alternate && expand) { int val; char buf[20]; /* Turns the next expression into a string. */ /* xgettext: no-c-format */ idx = (*macro_expr) (_("% operator needs absolute expression"), idx + 1, in, &val); sprintf (buf, "%d", val); sb_add_string (out, buf); } else if (in->ptr[idx] == '"' || (in->ptr[idx] == '<' && (macro_alternate || macro_mri)) || (macro_alternate && in->ptr[idx] == '\'')) { if (macro_alternate && ! macro_strip_at && expand) { /* Keep the quotes. */ sb_add_char (out, '\"'); idx = getstring (idx, in, out); sb_add_char (out, '\"'); } else { idx = getstring (idx, in, out); } } else { while (idx < in->len && (in->ptr[idx] == '"' || in->ptr[idx] == '\'' || pretend_quoted || (in->ptr[idx] != ' ' && in->ptr[idx] != '\t' && in->ptr[idx] != ',' && (in->ptr[idx] != '<' || (! macro_alternate && ! macro_mri))))) { if (in->ptr[idx] == '"' || in->ptr[idx] == '\'') { char tchar = in->ptr[idx]; sb_add_char (out, in->ptr[idx++]); while (idx < in->len && in->ptr[idx] != tchar) sb_add_char (out, in->ptr[idx++]); if (idx == in->len) return idx; } sb_add_char (out, in->ptr[idx++]); } } } return idx; }