2021-06-30 19:56:31 +01:00
|
|
|
#include <ctype.h>
|
2020-07-31 21:31:03 +01:00
|
|
|
#include "common/buf.h"
|
2020-06-09 21:40:46 +01:00
|
|
|
|
2021-06-30 19:56:31 +01:00
|
|
|
void
|
|
|
|
|
buf_expand_shell_variables(struct buf *s)
|
|
|
|
|
{
|
|
|
|
|
struct buf new;
|
|
|
|
|
struct buf environment_variable;
|
|
|
|
|
buf_init(&new);
|
|
|
|
|
buf_init(&environment_variable);
|
|
|
|
|
|
|
|
|
|
for (int i = 0 ; i < s->len ; i++) {
|
|
|
|
|
if (s->buf[i] == '$') {
|
|
|
|
|
/* expand environment variable */
|
|
|
|
|
environment_variable.len = 0;
|
|
|
|
|
buf_add(&environment_variable, s->buf + i + 1);
|
|
|
|
|
char *p = environment_variable.buf;
|
|
|
|
|
while (isalnum(*p)) {
|
|
|
|
|
++p;
|
|
|
|
|
}
|
|
|
|
|
*p = '\0';
|
|
|
|
|
p = getenv(environment_variable.buf);
|
|
|
|
|
if (!p) {
|
|
|
|
|
goto out;
|
|
|
|
|
}
|
|
|
|
|
buf_add(&new, p);
|
|
|
|
|
i += strlen(environment_variable.buf);
|
|
|
|
|
} else if (s->buf[i] == '~') {
|
|
|
|
|
/* expand tilde */
|
|
|
|
|
buf_add(&new, getenv("HOME"));
|
|
|
|
|
} else {
|
|
|
|
|
/* just add one character at a time */
|
|
|
|
|
if (new.alloc <= new.len + 1) {
|
|
|
|
|
new.alloc = new.alloc * 3/2 + 16;
|
|
|
|
|
new.buf = realloc(new.buf, new.alloc);
|
|
|
|
|
}
|
|
|
|
|
new.buf[new.len++] = s->buf[i];
|
|
|
|
|
new.buf[new.len] = '\0';
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
out:
|
|
|
|
|
free(environment_variable.buf);
|
|
|
|
|
free(s->buf);
|
|
|
|
|
s->buf = new.buf;
|
|
|
|
|
}
|
|
|
|
|
|
2020-09-28 20:41:41 +01:00
|
|
|
void
|
|
|
|
|
buf_init(struct buf *s)
|
2020-06-09 21:40:46 +01:00
|
|
|
{
|
|
|
|
|
s->alloc = 256;
|
|
|
|
|
s->buf = malloc(s->alloc);
|
|
|
|
|
s->buf[0] = '\0';
|
|
|
|
|
s->len = 0;
|
|
|
|
|
}
|
|
|
|
|
|
2020-09-28 20:41:41 +01:00
|
|
|
void
|
|
|
|
|
buf_add(struct buf *s, const char *data)
|
2020-06-09 21:40:46 +01:00
|
|
|
{
|
2020-09-28 20:41:41 +01:00
|
|
|
if (!data || data[0] == '\0') {
|
2020-06-09 21:40:46 +01:00
|
|
|
return;
|
2020-09-28 20:41:41 +01:00
|
|
|
}
|
2020-06-09 21:40:46 +01:00
|
|
|
int len = strlen(data);
|
|
|
|
|
if (s->alloc <= s->len + len + 1) {
|
|
|
|
|
s->alloc = s->alloc + len;
|
|
|
|
|
s->buf = realloc(s->buf, s->alloc);
|
|
|
|
|
}
|
|
|
|
|
memcpy(s->buf + s->len, data, len);
|
|
|
|
|
s->len += len;
|
|
|
|
|
s->buf[s->len] = 0;
|
|
|
|
|
}
|