Fix mismatched new/delete
[SCSI2SD-V6.git] / src / scsi2sd-util6 / TerminalWx / src / GTerm / gterm.cpp
1 /*
2 TerminalWx - A wxWidgets terminal widget
3 Copyright (C) 1999  Timothy Miller
4               2004  Mark Erikson
5               2012-2013 Jeremy Salwen
6
7 License: wxWindows License Version 3.1 (See the file license3.txt)
8
9 */
10
11 #ifdef __GNUG__
12     #pragma implementation "gterm.hpp"
13 #endif
14
15 #include "gterm.hpp"
16 #include <algorithm>
17
18 using namespace std;
19
20 void GTerm::Update()
21 {
22         update_changes();
23 }
24
25 void GTerm::ProcessInput(int len, unsigned char *data)
26 {
27 //printf("ProcessInput called...\n");
28         int i;
29         StateOption *last_state;
30
31         data_len = len;
32         input_data = data;
33
34         while (data_len) {
35 //printf("ProcessInput() processing %d...\n", *input_data);
36                 i = 0;
37                 while (current_state[i].byte != -1 &&
38                        current_state[i].byte != *input_data) i++;
39
40                 // action must be allowed to redirect state change
41                 last_state = current_state+i;
42                 current_state = last_state->next_state;
43                 if (last_state->action)
44                         (this->*(last_state->action))();
45                 input_data++;
46                 data_len--;
47         }
48
49         if (!(mode_flags & DEFERUPDATE) ||
50             (pending_scroll > scroll_bot-scroll_top)) update_changes();
51 }
52
53 void GTerm::Reset()
54 {
55         reset();
56 }
57
58 void GTerm::ExposeArea(int x, int y, int w, int h)
59 {
60         int i;
61         for (i=0; i<h; i++) changed_line(i+y, x, x+w-1);
62         if (!(mode_flags & DEFERUPDATE)) update_changes();
63 }
64
65 void GTerm::ResizeTerminal(int w, int h)
66 {
67         int cx, cy;
68         clear_area(min(width,w), 0, MAXWIDTH-1, MAXHEIGHT-1);
69         clear_area(0, min(height,h), min(width,w)-1, MAXHEIGHT-1);
70         width = w;
71         height = h;
72         scroll_bot = height-1;
73         if (scroll_top >= height) scroll_top = 0;
74         cx = min(width-1, cursor_x);
75         cy = min(height-1, cursor_y);
76         move_cursor(cx, cy);
77 }
78
79 GTerm::GTerm(int w, int h) : width(w), height(h)
80 {
81         int i;
82
83         doing_update = 0;
84
85         // could make this dynamic
86         text = new unsigned char[MAXWIDTH*MAXHEIGHT+1];
87         color = new unsigned short[MAXWIDTH*MAXHEIGHT];
88
89         for (i=0; i<MAXHEIGHT; i++) {
90                 // make it draw whole terminal to start
91                 dirty_startx[i] = 0;
92                 dirty_endx[i] = MAXWIDTH-1;
93         }
94
95 #ifdef GTERM_PC
96         pc_machinename = new char[7];
97         strcpy(pc_machinename, "pcterm");
98 #endif
99         cursor_x = 0;
100         cursor_y = 0;
101         save_x = 0;
102         save_y = 0;
103         mode_flags = 0;
104         reset();
105 }
106
107 GTerm::~GTerm()
108 {
109         delete[] text;
110         delete[] color;
111 #ifdef GTERM_PC
112         if(pc_machinename)
113           delete[] pc_machinename;
114 #endif // GTERM_PC
115 }
116
117 #ifdef GTERM_PC
118 void
119 GTerm::SetMachineName(char *machinename)
120 {
121   if(pc_machinename)
122     delete pc_machinename;
123
124   pc_machinename = new char[strlen(machinename) + 1];
125   strcpy(pc_machinename, machinename);
126 }
127 #endif // GTERM_PC
128
129 int
130 GTerm::IsSelected(int x, int y)
131 {
132   if(color && x >= 0 && x < Width() && y >= 0 && y < Height())
133     return color[(linenumbers[y] * MAXWIDTH) + x] & SELECTED;
134   return 0;
135 }
136
137 void
138 GTerm::Select(int x, int y, int select)
139 {
140   if(color && x >= 0 && x < Width() && y >= 0 && y < Height())
141   {
142     if(select)
143       color[(linenumbers[y] * MAXWIDTH) + x] |= SELECTED;
144     else
145       color[(linenumbers[y] * MAXWIDTH) + x] &= ~SELECTED;
146     changed_line(y, x, x);
147 //    update_changes();
148   }
149 }
150
151 unsigned char
152 GTerm::GetChar(int x, int y)
153 {
154   if(text && x >= 0 && x < Width() && y >= 0 && y < Height())
155     return text[(linenumbers[y] * MAXWIDTH) + x];
156
157   return 0;
158 }
159
160
161