1/* vi: set sw=4 ts=4: */
2/*
3 * Utility routines.
4 *
5 * Copyright (C) Manuel Nova III <mnovoa3@bellsouth.net>
6 * and Vladimir Oleynik <vodz@usa.net>
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 *
22 *
23 */
24
25#include <stdio.h>
26#include <limits.h>
27#include "libbb.h"
28
29
30
31char process_escape_sequence(const char **ptr)
32{
33	static const char charmap[] = {
34		'a',  'b',  'f',  'n',  'r',  't',  'v',  '\\', 0,
35		'\a', '\b', '\f', '\n', '\r', '\t', '\v', '\\', '\\' };
36
37	const char *p;
38	const char *q;
39	int num_digits;
40	unsigned int n;
41
42	n = 0;
43	q = *ptr;
44
45	for ( num_digits = 0 ; num_digits < 3 ; ++num_digits) {
46		if ((*q < '0') || (*q > '7')) { /* not a digit? */
47			break;
48		}
49		n = n * 8 + (*q++ - '0');
50	}
51
52	if (num_digits == 0) {	/* mnemonic escape sequence? */
53		for (p=charmap ; *p ; p++) {
54			if (*p == *q) {
55				q++;
56				break;
57			}
58		}
59		n = *(p+(sizeof(charmap)/2));
60	}
61
62	   /* doesn't hurt to fall through to here from mnemonic case */
63	if (n > UCHAR_MAX) {	/* is octal code too big for a char? */
64		n /= 8;			/* adjust value and */
65		--q;				/* back up one char */
66	}
67
68	*ptr = q;
69	return (char) n;
70}
71
72
73/* END CODE */
74/*
75Local Variables:
76c-file-style: "linux"
77c-basic-offset: 4
78tab-width: 4
79End:
80*/
81