Make 'grep -l' work
[oweals/busybox.git] / libbb / process_escape_sequence.c
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
31 char 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 /*
75 Local Variables:
76 c-file-style: "linux"
77 c-basic-offset: 4
78 tab-width: 4
79 End:
80 */