char *fallback = NULL;
char *gpr = NULL;
int isdollar = 0;
+ int firstchar = 0;
if (!src) return NULL;
while (*src && dst < bufnew + buflen - 1) {
if (*src == '$') {
isdollar = 1;
} else if (isdollar) {
- isdollar = 0;
- if (*src == '{')
- varname = src + 1;
- else {
- *dst++ = '$';
- *dst++ = *src;
+ if (*src == '0') {
+ firstchar = 1;
+ } else {
+ isdollar = 0;
+ if (*src == '{') {
+ varname = src + 1;
+ } else {
+ *dst++ = '$';
+ *dst++ = *src;
+ }
}
} else if (varname || fallback) {
if (*src == ':') {
fallback = src + 1;
} else if (*src == '}') {
*src = '\0';
- snprintf(dst, bufnew + buflen - dst - 1, "%s", gpr = getpref(varname, fallback));
- if (gpr) {
- free(gpr);
- gpr = NULL;
- }
+ gpr = getpref(varname, fallback);
+ if (firstchar) {
+ firstchar = 0;
+ snprintf(dst, bufnew + buflen - dst - 1, "%c", gpr[0]);
+ } else
+ snprintf(dst, bufnew + buflen - dst - 1, "%s", gpr);
+ if (gpr) free(gpr);
for (; *dst; dst++);
fallback = varname = NULL;
}
int ispercent = 0;
int isbackslash = 0;
int isdollar = 0;
+ int firstchar = 0; /* special case for returning
+ only the first char of a userpref */
if (!str) return NULL;
}
if (*f == '}') {
*f = '\0';
- snprintf(p, end + 1 - p, "%s", gpr = getpref(varname, fallback));
+ gpr = getpref(varname, fallback);
+ if (firstchar) {
+ snprintf(p, end + 1 - p, "%c", gpr[0]);
+ firstchar = 0;
+ } else
+ snprintf(p, end + 1 - p, "%s", gpr);
if (gpr) free(gpr);
for (; *p; p++);
varname = fallback = NULL;
varname = f+1;
fallback = NULL;
isdollar = 0;
+ } else if (isdollar && *f == '0') {
+ firstchar = 1; /* don't reset isdollar here */
} else if (*f == '$') {
isdollar = 1;
} else {