]>
git.saurik.com Git - cycript.git/blob - Display.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/>.
25 #ifdef HAVE_READLINE_H
28 #include <readline/readline.h>
31 #include <sys/ioctl.h>
33 #include "Highlight.hpp"
37 typedef std::complex<int> CYCursor
;
43 unsigned CYDisplayWidth() {
45 if (ioctl(1, TIOCGWINSZ
, &info
) != -1)
47 return tgetnum(const_cast<char *>("co"));
50 void CYDisplayOutput_(int (*put
)(int), const char *&data
) {
53 if (next
== '\0' || next
== CYIgnoreEnd
)
60 CYCursor
CYDisplayOutput(int (*put
)(int), int width
, const char *data
, ssize_t offset
= 0) {
61 CYCursor
point(current_
);
74 CYDisplayOutput_(put
, data
);
83 current_
+= CYCursor(0, 1);
84 if (current_
.imag() == width
)
86 current_
= CYCursor(current_
.real() + 1, 0);
97 void CYDisplayMove(CYCursor target
) {
98 int offset(target
.real() - current_
.real());
101 putp(tparm(parm_up_cursor
, -offset
));
103 putp(tparm(parm_down_cursor
, offset
));
105 putp(tparm(column_address
, target
.imag()));
109 void CYDisplayStart(int meta
) {
110 rl_prep_terminal(meta
);
111 current_
= CYCursor();
114 void CYDisplayUpdate() {
115 #if RL_READLINE_VERSION >= 0x0600
116 const char *prompt(rl_display_prompt
);
118 const char *prompt(rl_prompt
);
121 std::ostringstream stream
;
122 CYLexerHighlight(rl_line_buffer
, rl_end
, stream
, true);
123 std::string
string(stream
.str());
124 const char *buffer(string
.c_str());
126 int width(CYDisplayWidth());
127 if (width_
!= width
) {
128 current_
= CYCursor();
129 CYDisplayOutput(NULL
, width
, prompt
);
130 current_
= CYDisplayOutput(NULL
, width
, buffer
, point_
);
133 CYDisplayMove(CYCursor());
134 CYDisplayOutput(putchar
, width
, prompt
);
136 CYCursor
target(CYDisplayOutput(putchar
, width
, stream
.str().c_str(), rl_point
));
137 if (target
.imag() == 0)
141 CYDisplayMove(target
);
149 void CYDisplayFinish() {
150 rl_deprep_terminal();