]>
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 const char *CYDisplayPrompt() {
44 #if RL_READLINE_VERSION >= 0x0600
45 return rl_display_prompt
;
51 unsigned CYDisplayWidth() {
53 if (ioctl(1, TIOCGWINSZ
, &info
) != -1)
55 return tgetnum(const_cast<char *>("co"));
58 void CYDisplayOutput_(int (*put
)(int), const char *&data
) {
61 if (next
== '\0' || next
== CYIgnoreEnd
)
68 CYCursor
CYDisplayOutput(int (*put
)(int), int width
, const char *data
, ssize_t offset
= 0) {
69 CYCursor
point(current_
);
82 CYDisplayOutput_(put
, data
);
94 current_
+= CYCursor(0, 1);
95 if (current_
.imag() == width
)
96 current_
= CYCursor(current_
.real() + 1, 0);
104 void CYDisplayMove(CYCursor target
) {
105 int offset(target
.real() - current_
.real());
108 putp(tparm(parm_up_cursor
, -offset
));
110 putp(tparm(parm_down_cursor
, offset
));
112 putp(tparm(column_address
, target
.imag()));
116 void CYDisplayStart(int meta
) {
117 rl_prep_terminal(meta
);
118 current_
= CYCursor();
121 void CYDisplayUpdate() {
122 std::ostringstream stream
;
123 CYLexerHighlight(rl_line_buffer
, rl_end
, stream
, true);
124 std::string
string(stream
.str());
125 const char *buffer(string
.c_str());
127 int width(CYDisplayWidth());
128 if (width_
!= width
) {
129 current_
= CYCursor();
130 CYDisplayOutput(NULL
, width
, CYDisplayPrompt());
131 CYDisplayOutput(NULL
, width
, buffer
, point_
);
134 CYDisplayMove(CYCursor());
135 CYDisplayOutput(putchar
, width
, CYDisplayPrompt());
137 CYCursor
target(CYDisplayOutput(putchar
, width
, stream
.str().c_str(), rl_point
));
138 if (target
.imag() == 0)
142 CYDisplayMove(target
);
150 void CYDisplayFinish() {
151 rl_deprep_terminal();