1 /* Cycript - Optimizing JavaScript Compiler/Runtime
2 * Copyright (C) 2009-2013 Jay Freeman (saurik)
5 /* GNU General Public License, Version 3 {{{ */
7 * Cycript is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published
9 * by the Free Software Foundation, either version 3 of the License,
10 * or (at your option) any later version.
12 * Cycript is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with Cycript. If not, see <http://www.gnu.org/licenses/>.
22 #include "Highlight.hpp"
24 #include "Cycript.tab.hh"
27 static void Skip(const char *data
, size_t size
, std::ostream
&output
, size_t &offset
, cy::position
¤t
, cy::position target
) {
28 while (current
.line
!= target
.line
|| current
.column
!= target
.column
) {
29 _assert(offset
!= size
);
30 char next(data
[offset
++]);
34 _assert(current
.line
< target
.line
|| current
.line
== target
.line
&& current
.column
< target
.column
);
49 CYColor(bool bold
, unsigned code
) :
56 void CYLexerHighlight(const char *data
, size_t size
, std::ostream
&output
, bool ignore
) {
57 CYStream
stream(data
, data
+ size
);
58 CYDriver
driver(stream
);
59 driver
.commented_
= true;
67 cy::location location
;
69 while (cylex(&value
, &location
, driver
.scanner_
) != 0) {
72 switch (value
.highlight_
) {
73 case hi::Comment
: color
= CYColor(true, 30); break;
74 case hi::Constant
: color
= CYColor(false, 31); break;
75 case hi::Control
: color
= CYColor(false, 33); break;
76 case hi::Escape
: color
= CYColor(true, 31); break;
77 case hi::Identifier
: color
= CYColor(false, 0); break;
78 case hi::Meta
: color
= CYColor(false, 32); break;
79 case hi::Nothing
: color
= CYColor(false, 0); break;
80 case hi::Operator
: color
= CYColor(false, 36); break;
81 case hi::Structure
: color
= CYColor(true, 34); break;
82 case hi::Type
: color
= CYColor(true, 34); break;
84 // XXX: maybe I should use nodefault here?
85 default: color
= CYColor(true, 0); break;
88 Skip(data
, size
, output
, offset
, current
, location
.begin
);
90 if (color
.code_
!= 0) {
92 output
<< CYIgnoreStart
;
93 output
<< "\e[" << (color
.bold_
? '1' : '0') << ";" << color
.code_
<< "m";
95 output
<< CYIgnoreEnd
;
98 Skip(data
, size
, output
, offset
, current
, location
.end
);
100 if (color
.code_
!= 0) {
102 output
<< CYIgnoreStart
;
105 output
<< CYIgnoreEnd
;
109 output
.write(data
+ offset
, size
- offset
);