]>
git.saurik.com Git - cycript.git/blob - Highlight.cpp
1 /* Cycript - Optimizing JavaScript Compiler/Runtime
2 * Copyright (C) 2009-2012 Jay Freeman (saurik)
5 /* GNU Lesser General Public License, Version 3 {{{ */
7 * Cycript is free software: you can redistribute it and/or modify it under
8 * the terms of the GNU Lesser General Public License as published by the
9 * Free Software Foundation, either version 3 of the License, or (at your
10 * option) any later version.
12 * Cycript is distributed in the hope that it will be useful, but WITHOUT
13 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
15 * License for more details.
17 * You should have received a copy of the GNU Lesser 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
);
66 cy::location location
;
68 while (cylex(&value
, &location
, driver
.scanner_
) != 0) {
71 switch (value
.highlight_
) {
72 case hi::Comment
: color
= CYColor(true, 30); break;
73 case hi::Constant
: color
= CYColor(false, 31); break;
74 case hi::Control
: color
= CYColor(false, 33); break;
75 case hi::Escape
: color
= CYColor(true, 31); break;
76 case hi::Identifier
: color
= CYColor(false, 0); break;
77 case hi::Meta
: color
= CYColor(false, 32); break;
78 case hi::Nothing
: color
= CYColor(false, 0); break;
79 case hi::Operator
: color
= CYColor(false, 36); break;
80 case hi::Structure
: color
= CYColor(true, 34); break;
81 case hi::Type
: color
= CYColor(true, 34); break;
84 Skip(data
, size
, output
, offset
, current
, location
.begin
);
86 if (color
.code_
!= 0) {
88 output
<< CYIgnoreStart
;
89 output
<< "\e[" << (color
.bold_
? '1' : '0') << ";" << color
.code_
<< "m";
91 output
<< CYIgnoreEnd
;
94 Skip(data
, size
, output
, offset
, current
, location
.end
);
96 if (color
.code_
!= 0) {
98 output
<< CYIgnoreStart
;
101 output
<< CYIgnoreEnd
;
105 output
.write(data
+ offset
, size
- offset
);