#include "prompt.h"
#include "xmalloc.h"
#include <string.h>
#include <stdlib.h>
char *local_prompt_prefix;
char *local_prompt;
int prompt_visible_length;
static int expand(const char *s, size_t n, char *buf)
{
int visible_length;
char *p;
int visible;
char c;
visible_length = 0;
p = buf;
visible = 1;
while (n--) {
c = *s++;
if (visible) {
if (c == '\001') {
visible = 0;
continue;
}
}
else
if (c == '\002') {
visible = 1;
continue;
}
*p++ = c;
if (visible)
visible_length++;
}
*p = '\0';
return visible_length;
}
static void expand_prompt(const char *prompt)
{
char *p;
int len;
if ((p = strrchr(prompt, '\n'))) {
p++;
len = p - prompt;
local_prompt_prefix = xmalloc(len + 1);
expand(prompt, len, local_prompt_prefix);
prompt = p;
}
else
local_prompt_prefix = NULL;
len = strlen(prompt);
local_prompt = xmalloc(len + 1);
prompt_visible_length = expand(prompt, len, local_prompt);
}
void set_prompt(const char *prompt)
{
if (prompt)
expand_prompt(prompt);
else {
local_prompt_prefix = NULL;
local_prompt = NULL;
prompt_visible_length = 0;
}
}
void free_prompt()
{
if (local_prompt_prefix)
free(local_prompt_prefix);
if (local_prompt)
free(local_prompt);
}