/* Expand keys in a template. */ char * format_expand(struct format_tree *ft, const char *fmt) { char *buf, *ptr; const char *s; size_t off, len, n; int ch; len = 64; buf = xmalloc(len); off = 0; while (*fmt != '\0') { if (*fmt != '#') { while (len - off < 2) { buf = xrealloc(buf, 2, len); len *= 2; } buf[off++] = *fmt++; continue; } fmt++; ch = (u_char) *fmt++; switch (ch) { case '{': ptr = strchr(fmt, '}'); if (ptr == NULL) break; n = ptr - fmt; if (format_replace(ft, fmt, n, &buf, &len, &off) != 0) break; fmt += n + 1; continue; default: if (ch >= 'A' && ch <= 'Z') { s = format_aliases[ch - 'A']; if (s != NULL) { n = strlen(s); if (format_replace ( ft, s, n, &buf, &len, &off) != 0) break; continue; } } while (len - off < 2) { buf = xrealloc(buf, 2, len); len *= 2; } buf[off++] = ch; continue; } break; } buf[off] = '\0'; return (buf); }
/* Expand keys in a template. */ char * format_expand(struct format_tree *ft, const char *fmt) { char *buf; const char *ptr, *s; size_t off, len, n; int ch, brackets; len = 64; buf = xmalloc(len); off = 0; while (*fmt != '\0') { if (*fmt != '#') { while (len - off < 2) { buf = xrealloc(buf, 2, len); len *= 2; } buf[off++] = *fmt++; continue; } fmt++; ch = (u_char) *fmt++; switch (ch) { case '{': brackets = 1; for (ptr = fmt; *ptr != '\0'; ptr++) { if (*ptr == '{') brackets++; if (*ptr == '}' && --brackets == 0) break; } if (*ptr != '}' || brackets != 0) break; n = ptr - fmt; if (format_replace(ft, fmt, n, &buf, &len, &off) != 0) break; fmt += n + 1; continue; case '#': while (len - off < 2) { buf = xrealloc(buf, 2, len); len *= 2; } buf[off++] = '#'; continue; default: s = NULL; if (ch >= 'A' && ch <= 'Z') s = format_upper[ch - 'A']; else if (ch >= 'a' && ch <= 'z') s = format_lower[ch - 'a']; if (s == NULL) { while (len - off < 3) { buf = xrealloc(buf, 2, len); len *= 2; } buf[off++] = '#'; buf[off++] = ch; continue; } n = strlen(s); if (format_replace(ft, s, n, &buf, &len, &off) != 0) break; continue; } break; } buf[off] = '\0'; return (buf); }