]>
git.saurik.com Git - cycript.git/blob - Highlight.cpp
   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
);