source: cfg_itronx+oil_gcc/toppers/cpp.cpp@ 54

Last change on this file since 54 was 54, checked in by ertl-ishikawa, 12 years ago

cfg+oil対応コンフィギュレータを追加

File size: 5.4 KB
RevLine 
[54]1/*
2 * TOPPERS Software
3 * Toyohashi Open Platform for Embedded Real-Time Systems
4 *
5 * Copyright (C) 2007-2011 by TAKAGI Nobuhisa
6 *
7 * 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
8 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
9 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
10 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
11 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
12 * スコード中に含まれていること.
13 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
14 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
15 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
16 * の無保証規定を掲載すること.
17 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
18 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
19 * と.
20 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
21 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
22 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
23 * 報告すること.
24 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
25 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
26 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
27 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
28 * 免責すること.
29 *
30 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
31 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
32 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
33 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
34 * の責任を負わない.
35 *
36 */
37#include <cctype>
38#include <cstring>
39#include <cstdio>
40#include <stdexcept>
41#include <iostream>
42#include "toppers/cpp.hpp"
43
44namespace toppers
45{
46
47 /*!
48 * \brief 二重引用符で囲まれた文字列を展開する。
49 */
50 std::string expand_quote( std::string const& str )
51 {
52 // boost-1.35.x以上対策
53 std::string::size_type n = str.find_first_not_of( " \t\r\n" );
54 std::string quoted( str, n );
55
56 if ( quoted.size() < 2 || quoted[0] != '"' || quoted[quoted.size() - 1] != '"' )
57 {
58 throw std::invalid_argument( "argument is not quoted" );
59 }
60 std::string result;
61 for ( std::string::const_iterator iter( quoted.begin() + 1 ), last( quoted.end() - 1 );
62 iter != last;
63 ++iter )
64 {
65 if ( *iter == '\\' )
66 {
67 if ( ++iter == last )
68 {
69 throw std::invalid_argument( "argument is not quoted" );
70 }
71 char c = *iter;
72 switch ( c )
73 {
74 case 'a':
75 c = '\a';
76 break;
77 case 'b':
78 c = '\b';
79 break;
80 case 'f':
81 c = '\f';
82 break;
83 case 'n':
84 c = '\n';
85 break;
86 case 'r':
87 c = '\r';
88 break;
89 case 't':
90 c = '\t';
91 break;
92 case 'v':
93 c = '\v';
94 break;
95 case 'x':
96 if ( std::isxdigit( static_cast< unsigned char >( *iter ) ) )
97 {
98 c = 0;
99 for ( std::string::const_iterator bound( iter + 2 );
100 iter != bound && std::isxdigit( static_cast< unsigned char >( *iter ) );
101 ++iter )
102 {
103 c <<= 4;
104 int t = std::tolower( static_cast< unsigned char >( *iter ) );
105 static char const xdigits[] = "0123456789abcdef";
106 c += std::strchr( xdigits, t ) - xdigits;
107 }
108 }
109 break;
110 default:
111 if ( '0' <= c && c <= '7' ) // '\ooo'
112 {
113 c = 0;
114 for ( std::string::const_iterator bound( iter + 3 );
115 iter != bound && ( '0' <= *iter && *iter <= '7' );
116 ++iter )
117 {
118 c = ( c << 3 ) + *iter - '0';
119 }
120 }
121 // 国際文字名(\uhhhh, \Uhhhhhhhh)未対応
122 // 二文字表記(<:等)未対応
123 // 三文字表記(??/等)未対応
124 break;
125 }
126 result.push_back( c );
127 }
128 else
129 {
130 result.push_back( *iter );
131 }
132 }
133 return result;
134 }
135
136 /*!
137 * \brief 文字列で二重引用符で囲む
138 */
139 std::string quote_string( std::string const& str )
140 {
141 std::string result;
142 result.reserve( str.size() + 2 );
143
144 result.push_back( '"' ); // open
145
146 for ( std::string::const_iterator iter( str.begin() ), last( str.end() );
147 iter != last;
148 ++iter )
149 {
150 switch ( char c = *iter )
151 {
152 case '\'':
153 result += "\\\'";
154 break;
155 case '\"':
156 result += "\\\"";
157 break;
158 case '\0':
159 result += "\\0";
160 break;
161 case '\a':
162 result += "\\a";
163 break;
164 case '\b':
165 result += "\\b";
166 break;
167 case '\f':
168 result += "\\f";
169 break;
170 case '\n':
171 result += "\\n";
172 break;
173 case '\r':
174 result += "\\r";
175 break;
176 case '\t':
177 result += "\\t";
178 break;
179 case '\v':
180 result += "\\v";
181 break;
182 case '\\':
183 // SJIS未対応
184 result.push_back( c );
185 result.push_back( c );
186 break;
187 default:
188 result.push_back( c );
189 break;
190 }
191 }
192
193 result.push_back( '"' ); // close
194
195 return result;
196 }
197
198}
Note: See TracBrowser for help on using the repository browser.