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