00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #include "el.h"
00013 #include <stack>
00014 #include <set>
00015 #include <string>
00016
00017 #include "TROOT.h"
00018 #include "TInterpreter.h"
00019
00020 using namespace std;
00021
00022 void setKeywordColors(const char* colorTab, const char* colorBracket, const char* colorBadBracket);
00023 int selectColor(const char* str);
00024 void highlightKeywords(EditLine_t* el);
00025 int matchParentheses(EditLine_t* el);
00026 void colorWord(EditLine_t* el, int first, int num, int color);
00027 void colorBrackets(EditLine_t* el, int open, int close, int color);
00028 char** rl_complete2ROOT(const char*, int, int);
00029
00030
00031 int color_class = 4;
00032 int color_type = 4;
00033 int color_bracket = 2;
00034 int color_badbracket = 1;
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044 void
00045 setKeywordColors(int colorType, int colorBracket, int colorBadBracket) {
00046 color_class = colorType;
00047 color_type = colorType;
00048 color_bracket = colorBracket;
00049 color_badbracket = colorBadBracket;
00050 }
00051
00052
00053
00054
00055
00056
00057 void
00058 highlightKeywords(EditLine_t* el) {
00059 typedef std::set<int> HashSet_t;
00060 static HashSet_t sHashedKnownTypes;
00061
00062 TString sBuffer(el->fLine.fBuffer, el->fLine.fLastChar - el->fLine.fBuffer);
00063
00064 TString keyword;
00065 Ssiz_t posNextTok = 0;
00066 Ssiz_t posPrevTok = 0;
00067
00068
00069 while (sBuffer.Tokenize(keyword, posNextTok, "[^a-zA-Z0-9_]")) {
00070 Ssiz_t toklen = posNextTok - posPrevTok;
00071
00072 if (posNextTok == -1) {
00073 toklen = sBuffer.Length() - posPrevTok;
00074 }
00075 TString tok = sBuffer(posPrevTok, toklen);
00076 Ssiz_t pos = posPrevTok + tok.Index(keyword);
00077 int color = -1;
00078
00079 if (gROOT->GetListOfTypes()->FindObject(keyword)) {
00080 color = color_type;
00081 } else if (gInterpreter->CheckClassInfo(keyword, kFALSE)) {
00082 color = color_class;
00083 }
00084 colorWord(el, pos, keyword.Length(), color);
00085 posPrevTok = posNextTok;
00086 }
00087 }
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098 int
00099 matchParentheses(EditLine_t* el) {
00100 static const int amtBrackets = 3;
00101 int bracketPos = -1;
00102 int foundParenIdx = -1;
00103 char bTypes[amtBrackets][2];
00104
00105 bTypes[0][0] = '(';
00106 bTypes[0][1] = ')';
00107 bTypes[1][0] = '{';
00108 bTypes[1][1] = '}';
00109 bTypes[2][0] = '[';
00110 bTypes[2][1] = ']';
00111
00112
00113
00114
00115 std::string sBuffer = "";
00116
00117 for (char* c = el->fLine.fBuffer; c < el->fLine.fLastChar; c++) {
00118 sBuffer += *c;
00119 }
00120
00121
00122 for (int i = 0; i < (el->fLine.fLastChar - el->fLine.fBuffer); i++) {
00123 if (el->fLine.fBufColor[i].fForeColor == color_bracket || el->fLine.fBufColor[i].fForeColor == color_badbracket) {
00124 el->fLine.fBufColor[i] = -1;
00125 term__repaint(el, i);
00126 }
00127 }
00128
00129
00130 stack<int> locBrackets;
00131
00132 if (!sBuffer.empty()) {
00133 int cursorPos = el->fLine.fCursor - el->fLine.fBuffer;
00134 bracketPos = cursorPos;
00135
00136
00137 int bIndex = 0;
00138
00139 for (bIndex = 0; bIndex < amtBrackets; bIndex++) {
00140
00141 if (sBuffer[bracketPos] == bTypes[bIndex][0]) {
00142 locBrackets.push(bracketPos);
00143 foundParenIdx = 0;
00144 break;
00145 } else if (sBuffer[bracketPos] == bTypes[bIndex][1]) {
00146 locBrackets.push(bracketPos);
00147 foundParenIdx = 1;
00148 break;
00149 }
00150 }
00151
00152
00153 if (foundParenIdx == -1 && bracketPos > 0) {
00154
00155 bracketPos--;
00156
00157 bIndex = 0;
00158
00159 for (bIndex = 0; bIndex < amtBrackets; bIndex++) {
00160
00161 if (sBuffer[bracketPos] == bTypes[bIndex][1]) {
00162 locBrackets.push(bracketPos);
00163 foundParenIdx = 1;
00164 break;
00165 }
00166 }
00167 }
00168
00169
00170 if (foundParenIdx == -1) {
00171 return foundParenIdx;
00172 }
00173
00174
00175
00176
00177 int step = 1;
00178
00179 if (foundParenIdx == 1) {
00180 step = -1;
00181 }
00182
00183 for (int i = bracketPos + step; i >= 0 && i < (int)sBuffer.size(); i += step) {
00184
00185 if (sBuffer[i] == bTypes[bIndex][foundParenIdx]) {
00186
00187 locBrackets.push(i);
00188 }
00189
00190 else if (sBuffer[i] == bTypes[bIndex][1 - foundParenIdx]) {
00191
00192 locBrackets.pop();
00193
00194
00195 if (locBrackets.empty()) {
00196 colorBrackets(el, bracketPos, i, color_bracket);
00197 break;
00198 }
00199 }
00200 }
00201
00202 if (!locBrackets.empty()) {
00203 colorBrackets(el, bracketPos, bracketPos, color_badbracket);
00204 }
00205 }
00206
00207 return foundParenIdx;
00208 }
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218 void
00219 colorWord(EditLine_t* el, int first, int num, int textColor) {
00220 int bgColor = -1;
00221 bool anyChange = false;
00222
00223
00224 for (int index = first; index < first + num; ++index) {
00225 bool changed = el->fLine.fBufColor[index].fForeColor != textColor;
00226 anyChange |= changed;
00227 el->fLine.fBufColor[index].fForeColor = textColor;
00228 el->fLine.fBufColor[index].fBackColor = bgColor;
00229
00230 if (changed) {
00231 term__repaint(el, index);
00232 }
00233 }
00234
00235 if (anyChange) {
00236 term__setcolor(-1);
00237 }
00238 }
00239
00240
00241
00242
00243
00244
00245 void
00246 colorBrackets(EditLine_t* el, int open, int close, int textColor) {
00247 int bgColor = -1;
00248
00249 el->fLine.fBufColor[open].fForeColor = textColor;
00250 el->fLine.fBufColor[open].fBackColor = bgColor;
00251 term__repaint(el, open);
00252
00253 el->fLine.fBufColor[close].fForeColor = textColor;
00254 el->fLine.fBufColor[close].fBackColor = bgColor;
00255 term__repaint(el, close);
00256
00257 term__setcolor(-1);
00258 }