summaryrefslogtreecommitdiff
path: root/lib/process_escape_sequence.c
blob: 2a3b2d928e34f020751f277346f116db89f1f784 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
/*
 * process_esacpe_sequence.c
 *
 * Copyright (c) 2010 Sascha Hauer <s.hauer@pengutronix.de>, Pengutronix
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2
 * as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 */
#include <common.h>
#include <fs.h>
#include <globalvar.h>
#include <libbb.h>
#include <shell.h>

int process_escape_sequence(const char *source, char *dest, int destlen)
{
	int i = 0;

	while (*source) {
		if (*source == '\\') {
			switch (*(source + 1)) {
			case 0:
				return 0;
			case '\\':
				dest[i++] = '\\';
				break;
			case 'a':
				dest[i++] = '\a';
				break;
			case 'b':
				dest[i++] = '\b';
				break;
			case 'n':
				dest[i++] = '\n';
				break;
			case 'r':
				dest[i++] = '\r';
				break;
			case 't':
				dest[i++] = '\t';
				break;
			case 'f':
				dest[i++] = '\f';
				break;
			case 'e':
				dest[i++] = 0x1b;
				break;
			case 'h':
				i += snprintf(dest + i, destlen - i, "%s", barebox_get_model());
				break;
			case 'u':
				if (IS_ENABLED(CONFIG_GLOBALVAR))
					i += snprintf(dest + i, destlen - i, "%s",
						      dev_get_param(&global_device, "user"));
				break;
			case 'w':
				i += snprintf(dest + i, destlen - i, "%s", getcwd());
				break;
			case '$':
				if (*(source + 2) == '?') {
					i += snprintf(dest + i, destlen - i, "%d", shell_get_last_return_code());
					source++;
					break;
				}
			default:
				dest[i++] = '\\';
				dest[i++] = *(source + 1);
			}
			source++;
		} else
			dest[i++] = *source;
		source++;
		if (!(destlen - i))
			break;
	}
	dest[i] = 0;
	return 0;
}