1/*
2  File: unquote.c
3
4  Copyright (C) 2003 Andreas Gruenbacher <a.gruenbacher@computer.org>
5
6  This program is free software; you can redistribute it and/or
7  modify it under the terms of the GNU Library General Public
8  License as published by the Free Software Foundation; either
9  version 2 of the License, or (at your option) any later version.
10
11  This program is distributed in the hope that it will be useful,
12  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  Library General Public License for more details.
15
16  You should have received a copy of the GNU Library General Public
17  License along with this library; if not, write to the Free Software
18  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19*/
20
21#include <stdio.h>
22#include <stdlib.h>
23#include <ctype.h>
24#include "misc.h"
25
26char *unquote(char *str)
27{
28	unsigned char *s, *t;
29
30	if (!str)
31		return str;
32
33	for (s = (unsigned char *)str; *s != '\0'; s++)
34		if (*s == '\\')
35			break;
36	if (*s == '\0')
37		return str;
38
39#define isoctal(c) \
40	((c) >= '0' && (c) <= '7')
41
42	t = s;
43	do {
44		if (*s == '\\' &&
45		    isoctal(*(s+1)) && isoctal(*(s+2)) && isoctal(*(s+3))) {
46			*t++ = ((*(s+1) - '0') << 6) +
47			       ((*(s+2) - '0') << 3) +
48			       ((*(s+3) - '0')     );
49			s += 3;
50		} else
51			*t++ = *s;
52	} while (*s++ != '\0');
53
54	return str;
55}
56