MCPcopy Create free account
hub / github.com/bendudson/EuraliOS / write_string

Method write_string

vga_driver/src/main.rs:142–405  ·  view source on GitHub ↗

Write a string to the buffer and (if active) video memory Interprets a subset of the ANSI escape codes List of Xterm control sequences

(&mut self, s: &[u8])

Source from the content-addressed store, hash-verified

140 /// List of Xterm control sequences
141 /// <https://www.xfree86.org/current/ctlseqs.html>
142 pub fn write_string(&mut self, s: &[u8]) {
143 {
144 // Contains a lock on the buffer, and a pointer to the data
145 let lock_buffer = if self.active {
146 Some(self.screen.get_frame_buffer())
147 } else { None };
148
149 let mut bytes = s.iter(); // Iterator over bytes
150 loop {
151 match bytes.next() {
152 Some(byte) => {
153 match byte {
154 0x20..=0x7e => {
155 // printable ASCII byte
156 let screen_character = ScreenCharacter::new(*byte, self.color);
157 let offset = S::WIDTH * self.row + self.column;
158 // Modify this writer's buffer (in host memory)
159 self.buffer[offset] = screen_character;
160 if let Some((_, frame_buffer)) = lock_buffer {
161 // Write to VGA memory
162 unsafe {
163 frame_buffer.add(offset).write_volatile(screen_character);
164 }
165 }
166 self.column += 1;
167 if self.column == S::WIDTH {
168 self.column = 0;
169 self.row += 1;
170 if self.row == S::HEIGHT {
171 // Shift upwards
172 let mut_buffer = self.buffer.as_mut_ptr();
173 self.scroll_up(mut_buffer);
174 if let Some((_, frame_buffer)) = lock_buffer {
175 self.scroll_up(frame_buffer);
176 }
177 self.row = S::HEIGHT - 1;
178 }
179 }
180 }
181 //////////////////////////////////////////
182 // C0 control codes
183 0x8 => { // Backspace
184 if self.column != 0 {
185 self.column -= 1;
186 }
187 }
188 b'\t' => { // Tab
189 // Move to next multiple of 8
190 self.column += 8 - (self.column % 8);
191 if self.column >= S::WIDTH {
192 // Next line
193 self.row += 1;
194 if self.row == S::HEIGHT {
195 // Shift upwards
196 let mut_buffer = self.buffer.as_mut_ptr();
197 self.scroll_up(mut_buffer);
198 if let Some((_, frame_buffer)) = lock_buffer {
199 self.scroll_up(frame_buffer);

Callers 1

writer_handlerFunction · 0.45

Calls 6

iterMethod · 0.80
as_mut_ptrMethod · 0.80
scroll_upMethod · 0.80
as_strMethod · 0.80
nextMethod · 0.45
pushMethod · 0.45

Tested by

no test coverage detected