blob: 67b0490ce276c689cacce26f3e536fb69dcc2057 [file] [log] [blame]
Eric Andersenaad1a882001-03-16 22:47:14 +00001/* vi: set sw=4 ts=4: */
2/*
3 * Utility routines.
4 *
Eric Andersene5dfced2001-04-09 22:48:12 +00005 * Copyright (C) Manuel Nova III <mnovoa3@bellsouth.net>
6 * and Vladimir Oleynik <vodz@usa.net>
Eric Andersenaad1a882001-03-16 22:47:14 +00007 *
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 *
Eric Andersene5dfced2001-04-09 22:48:12 +000022 *
Eric Andersenaad1a882001-03-16 22:47:14 +000023 */
24
25#include <stdio.h>
26#include <limits.h>
27#include "libbb.h"
28
29
30
Eric Andersene5dfced2001-04-09 22:48:12 +000031char process_escape_sequence(const char **ptr)
Eric Andersenaad1a882001-03-16 22:47:14 +000032{
Eric Andersene5dfced2001-04-09 22:48:12 +000033 static const char charmap[] = {
34 'a', 'b', 'f', 'n', 'r', 't', 'v', '\\', 0,
35 '\a', '\b', '\f', '\n', '\r', '\t', '\v', '\\', '\\' };
Eric Andersenaad1a882001-03-16 22:47:14 +000036
Eric Andersene5dfced2001-04-09 22:48:12 +000037 const char *p;
38 const char *q;
39 int num_digits;
40 unsigned int n;
41
42 n = 0;
43 q = *ptr;
Eric Andersenaad1a882001-03-16 22:47:14 +000044
Eric Andersene5dfced2001-04-09 22:48:12 +000045 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 }
Eric Andersenaad1a882001-03-16 22:47:14 +000051
Eric Andersene5dfced2001-04-09 22:48:12 +000052 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 }
Eric Andersenaad1a882001-03-16 22:47:14 +000061
62 /* doesn't hurt to fall through to here from mnemonic case */
Eric Andersene5dfced2001-04-09 22:48:12 +000063 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 }
Eric Andersenaad1a882001-03-16 22:47:14 +000067
Eric Andersene5dfced2001-04-09 22:48:12 +000068 *ptr = q;
69 return (char) n;
Eric Andersenaad1a882001-03-16 22:47:14 +000070}
71
72
73/* END CODE */
74/*
75Local Variables:
76c-file-style: "linux"
77c-basic-offset: 4
78tab-width: 4
79End:
80*/