]>
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
);
80 current_
+= CYCursor(0, 1);
81 if (current_
.imag() == width
)
83 current_
= CYCursor(current_
.real() + 1, 0);
92 void CYDisplayMove_(char *negative
, char *positive
, int offset
) {
94 putp(tparm(negative
, -offset
));
96 putp(tparm(positive
, offset
));
99 void CYDisplayMove(CYCursor target
) {
100 CYCursor
offset(target
- current_
);
102 CYDisplayMove_(parm_up_cursor
, parm_down_cursor
, offset
.real());
104 if (char *parm
= tparm(column_address
, target
.imag()))
107 CYDisplayMove_(parm_left_cursor
, parm_right_cursor
, offset
.imag());
112 void CYDisplayStart(int meta
) {
113 rl_prep_terminal(meta
);
114 current_
= CYCursor();
117 void CYDisplayUpdate() {
118 #if RL_READLINE_VERSION >= 0x0600
119 const char *prompt(rl_display_prompt
);
121 const char *prompt(rl_prompt
);
124 std::ostringstream stream
;
125 CYLexerHighlight(rl_line_buffer
, rl_end
, stream
, true);
126 std::string
string(stream
.str());
127 const char *buffer(string
.c_str());
129 int width(CYDisplayWidth());
130 if (width_
!= width
) {
131 current_
= CYCursor();
132 CYDisplayOutput(NULL
, width
, prompt
);
133 current_
= CYDisplayOutput(NULL
, width
, buffer
, point_
);
136 CYDisplayMove(CYCursor());
137 CYDisplayOutput(putchar
, width
, prompt
);
138 CYCursor
target(CYDisplayOutput(putchar
, width
, stream
.str().c_str(), rl_point
));
140 if (current_
.imag() == 0)
141 CYDisplayOutput(putchar
, width
, " ");
144 CYDisplayMove(target
);
151 void CYDisplayFinish() {
152 rl_deprep_terminal();