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