1 /** @file 2 Implementation of various string and line routines 3 4 Copyright (c) 2005 - 2011, Intel Corporation. All rights reserved. <BR> 5 This program and the accompanying materials 6 are licensed and made available under the terms and conditions of the BSD License 7 which accompanies this distribution. The full text of the license may be found at 8 http://opensource.org/licenses/bsd-license.php 9 10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 12 13 **/ 14 15 #include "HexEditor.h" 16 17 extern BOOLEAN HEditorMouseAction; 18 19 /** 20 Free a line and it's internal buffer. 21 22 @param[in] Src The line to be freed. 23 **/ 24 VOID 25 HLineFree ( 26 IN HEFI_EDITOR_LINE *Src 27 ) 28 { 29 if (Src == NULL) { 30 return ; 31 } 32 33 SHELL_FREE_NON_NULL (Src); 34 35 } 36 37 /** 38 Advance to the next Count lines. 39 40 @param[in] Count The line number to advance. 41 42 @retval NULL An error occured. 43 @return A pointer to the line after advance. 44 **/ 45 HEFI_EDITOR_LINE * 46 HLineAdvance ( 47 IN UINTN Count 48 ) 49 { 50 UINTN Index; 51 HEFI_EDITOR_LINE *Line; 52 53 Line = HMainEditor.BufferImage->CurrentLine; 54 if (Line == NULL) { 55 return NULL; 56 } 57 58 for (Index = 0; Index < Count; Index++) { 59 // 60 // if already last line 61 // 62 if (Line->Link.ForwardLink == HMainEditor.BufferImage->ListHead) { 63 return NULL; 64 } 65 66 Line = CR (Line->Link.ForwardLink, HEFI_EDITOR_LINE, Link, EFI_EDITOR_LINE_LIST); 67 } 68 69 return Line; 70 } 71 72 /** 73 Retreat to the previous Count lines. 74 75 @param[in] Count The line number to retreat. 76 77 @retval NULL An error occured. 78 @return A pointer to the line after retreat. 79 **/ 80 HEFI_EDITOR_LINE * 81 HLineRetreat ( 82 IN UINTN Count 83 ) 84 { 85 UINTN Index; 86 HEFI_EDITOR_LINE *Line; 87 88 Line = HMainEditor.BufferImage->CurrentLine; 89 if (Line == NULL) { 90 return NULL; 91 } 92 93 for (Index = 0; Index < Count; Index++) { 94 // 95 // already the first line 96 // 97 if (Line->Link.BackLink == HMainEditor.BufferImage->ListHead) { 98 return NULL; 99 } 100 101 Line = CR (Line->Link.BackLink, HEFI_EDITOR_LINE, Link, EFI_EDITOR_LINE_LIST); 102 } 103 104 return Line; 105 } 106 107 /** 108 Advance/Retreat lines. 109 110 @param[in] Count The line number to advance/retreat. 111 >0 : advance 112 <0: retreat 113 114 @retval NULL An error occured. 115 @return A pointer to the line after move. 116 **/ 117 HEFI_EDITOR_LINE * 118 HMoveLine ( 119 IN INTN Count 120 ) 121 { 122 HEFI_EDITOR_LINE *Line; 123 UINTN AbsCount; 124 125 // 126 // difference with MoveCurrentLine 127 // just return Line 128 // do not set currentline to Line 129 // 130 if (Count <= 0) { 131 AbsCount = (UINTN)ABS(Count); 132 Line = HLineRetreat (AbsCount); 133 } else { 134 Line = HLineAdvance ((UINTN)Count); 135 } 136 137 return Line; 138 } 139 140 /** 141 Advance/Retreat lines and set CurrentLine in BufferImage to it. 142 143 @param[in] Count The line number to advance/retreat. 144 >0 : advance 145 <0: retreat 146 147 @retval NULL An error occured. 148 @return A pointer to the line after move. 149 **/ 150 HEFI_EDITOR_LINE * 151 HMoveCurrentLine ( 152 IN INTN Count 153 ) 154 { 155 HEFI_EDITOR_LINE *Line; 156 UINTN AbsCount; 157 158 // 159 // <0: retreat 160 // >0: advance 161 // 162 if (Count <= 0) { 163 AbsCount = (UINTN)ABS(Count); 164 Line = HLineRetreat (AbsCount); 165 } else { 166 Line = HLineAdvance ((UINTN)Count); 167 } 168 169 if (Line == NULL) { 170 return NULL; 171 } 172 173 HMainEditor.BufferImage->CurrentLine = Line; 174 175 return Line; 176 } 177 178 179 /** 180 Free all the lines in HBufferImage. 181 Fields affected: 182 Lines 183 CurrentLine 184 NumLines 185 ListHead 186 187 @param[in] ListHead The list head. 188 @param[in] Lines The lines. 189 190 @retval EFI_SUCCESS The operation was successful. 191 **/ 192 EFI_STATUS 193 HFreeLines ( 194 IN LIST_ENTRY *ListHead, 195 IN HEFI_EDITOR_LINE *Lines 196 ) 197 { 198 LIST_ENTRY *Link; 199 HEFI_EDITOR_LINE *Line; 200 201 // 202 // release all the lines 203 // 204 if (Lines != NULL) { 205 206 Line = Lines; 207 Link = &(Line->Link); 208 do { 209 Line = CR (Link, HEFI_EDITOR_LINE, Link, EFI_EDITOR_LINE_LIST); 210 Link = Link->ForwardLink; 211 HLineFree (Line); 212 } while (Link != ListHead); 213 } 214 215 ListHead->ForwardLink = ListHead; 216 ListHead->BackLink = ListHead; 217 218 return EFI_SUCCESS; 219 } 220 221 /** 222 Get the X information for the mouse. 223 224 @param[in] GuidX The change. 225 226 @return the new information. 227 **/ 228 INT32 229 HGetTextX ( 230 IN INT32 GuidX 231 ) 232 { 233 INT32 Gap; 234 235 HMainEditor.MouseAccumulatorX += GuidX; 236 Gap = (HMainEditor.MouseAccumulatorX * (INT32) HMainEditor.ScreenSize.Column) / (INT32) (50 * (INT32) HMainEditor.MouseInterface->Mode->ResolutionX); 237 HMainEditor.MouseAccumulatorX = (HMainEditor.MouseAccumulatorX * (INT32) HMainEditor.ScreenSize.Column) % (INT32) (50 * (INT32) HMainEditor.MouseInterface->Mode->ResolutionX); 238 HMainEditor.MouseAccumulatorX = HMainEditor.MouseAccumulatorX / (INT32) HMainEditor.ScreenSize.Column; 239 return Gap; 240 } 241 242 /** 243 Get the Y information for the mouse. 244 245 @param[in] GuidY The change. 246 247 @return the new information. 248 **/ 249 INT32 250 HGetTextY ( 251 IN INT32 GuidY 252 ) 253 { 254 INT32 Gap; 255 256 HMainEditor.MouseAccumulatorY += GuidY; 257 Gap = (HMainEditor.MouseAccumulatorY * (INT32) HMainEditor.ScreenSize.Row) / (INT32) (50 * (INT32) HMainEditor.MouseInterface->Mode->ResolutionY); 258 HMainEditor.MouseAccumulatorY = (HMainEditor.MouseAccumulatorY * (INT32) HMainEditor.ScreenSize.Row) % (INT32) (50 * (INT32) HMainEditor.MouseInterface->Mode->ResolutionY); 259 HMainEditor.MouseAccumulatorY = HMainEditor.MouseAccumulatorY / (INT32) HMainEditor.ScreenSize.Row; 260 261 return Gap; 262 } 263