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
HLineFree(IN HEFI_EDITOR_LINE * Src)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 *
HLineAdvance(IN UINTN Count)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 *
HLineRetreat(IN UINTN Count)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 *
HMoveLine(IN INTN Count)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 *
HMoveCurrentLine(IN INTN Count)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
HFreeLines(IN LIST_ENTRY * ListHead,IN HEFI_EDITOR_LINE * Lines)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
HGetTextX(IN INT32 GuidX)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
HGetTextY(IN INT32 GuidY)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