1 /******************************************************************************
2 *
3 * Module Name: cvcompiler - ASL-/ASL+ converter functions
4 *
5 *****************************************************************************/
6
7 /*
8 * Copyright (C) 2000 - 2023, Intel Corp.
9 * All rights reserved.
10 *
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
13 * are met:
14 * 1. Redistributions of source code must retain the above copyright
15 * notice, this list of conditions, and the following disclaimer,
16 * without modification.
17 * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18 * substantially similar to the "NO WARRANTY" disclaimer below
19 * ("Disclaimer") and any redistribution must be conditioned upon
20 * including a substantially similar Disclaimer requirement for further
21 * binary redistribution.
22 * 3. Neither the names of the above-listed copyright holders nor the names
23 * of any contributors may be used to endorse or promote products derived
24 * from this software without specific prior written permission.
25 *
26 * Alternatively, this software may be distributed under the terms of the
27 * GNU General Public License ("GPL") version 2 as published by the Free
28 * Software Foundation.
29 *
30 * NO WARRANTY
31 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
34 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41 * POSSIBILITY OF SUCH DAMAGES.
42 */
43
44 #include "aslcompiler.h"
45 #include "aslcompiler.y.h"
46 #include "amlcode.h"
47 #include "acapps.h"
48 #include "acconvert.h"
49
50
51 /*******************************************************************************
52 *
53 * FUNCTION: CvProcessComment
54 *
55 * PARAMETERS: CurrentState Current comment parse state
56 * StringBuffer Buffer containing the comment being processed
57 * c1 Current input
58 *
59 * RETURN: None
60 *
61 * DESCRIPTION: Process a single line comment of a c Style comment. This
62 * function captures a line of a c style comment in a char* and
63 * places the comment in the appropriate global buffer.
64 *
65 ******************************************************************************/
66
67 void
CvProcessComment(ASL_COMMENT_STATE CurrentState,char * StringBuffer,int c1)68 CvProcessComment (
69 ASL_COMMENT_STATE CurrentState,
70 char *StringBuffer,
71 int c1)
72 {
73 UINT64 i;
74 char *LineToken;
75 char *FinalLineToken;
76 BOOLEAN CharStart;
77 char *CommentString;
78 char *FinalCommentString;
79
80
81 if (AcpiGbl_CaptureComments && CurrentState.CaptureComments)
82 {
83 *StringBuffer = (char) c1;
84 ++StringBuffer;
85 *StringBuffer = 0;
86
87 CvDbgPrint ("Multi-line comment\n");
88 CommentString = UtLocalCacheCalloc (strlen (AslGbl_MsgBuffer) + 1);
89 strcpy (CommentString, AslGbl_MsgBuffer);
90
91 CvDbgPrint ("CommentString: %s\n", CommentString);
92
93 /*
94 * Determine whether if this comment spans multiple lines. If so,
95 * break apart the comment by storing each line in a different node
96 * within the comment list. This allows the disassembler to
97 * properly indent a multi-line comment.
98 */
99 LineToken = strtok (CommentString, "\n");
100
101 if (LineToken)
102 {
103 FinalLineToken = UtLocalCacheCalloc (strlen (LineToken) + 1);
104 strcpy (FinalLineToken, LineToken);
105
106 /* Get rid of any carriage returns */
107
108 if (FinalLineToken[strlen (FinalLineToken) - 1] == 0x0D)
109 {
110 FinalLineToken[strlen(FinalLineToken)-1] = 0;
111 }
112
113 CvAddToCommentList (FinalLineToken);
114 LineToken = strtok (NULL, "\n");
115 while (LineToken != NULL)
116 {
117 /*
118 * It is assumed that each line has some sort of indentation.
119 * This means that we need to find the first character that
120 * is not a white space within each line.
121 */
122 CharStart = FALSE;
123 for (i = 0; (i < (strlen (LineToken) + 1)) && !CharStart; i++)
124 {
125 if (LineToken[i] != ' ' && LineToken[i] != '\t')
126 {
127 CharStart = TRUE;
128 LineToken += i-1;
129 LineToken [0] = ' '; /* Pad for Formatting */
130 }
131 }
132
133 FinalLineToken = UtLocalCacheCalloc (strlen (LineToken) + 1);
134 strcat (FinalLineToken, LineToken);
135
136 /* Get rid of any carriage returns */
137
138 if (FinalLineToken[strlen (FinalLineToken) - 1] == 0x0D)
139 {
140 FinalLineToken[strlen(FinalLineToken) - 1] = 0;
141 }
142
143 CvAddToCommentList (FinalLineToken);
144 LineToken = strtok (NULL,"\n");
145 }
146 }
147
148 /*
149 * If this only spans a single line, check to see whether if this
150 * comment appears on the same line as a line of code. If does,
151 * retain it's position for stylistic reasons. If it doesn't,
152 * add it to the comment list so that it can be associated with
153 * the next node that's created.
154 */
155 else
156 {
157 /*
158 * If this is not a regular comment, pad with extra spaces that
159 * appeared in the original source input to retain the original
160 * spacing.
161 */
162 FinalCommentString =
163 UtLocalCacheCalloc (strlen (CommentString) +
164 CurrentState.SpacesBefore + 1);
165
166 for (i = 0; (CurrentState.CommentType != ASL_COMMENT_STANDARD) &&
167 (i < CurrentState.SpacesBefore); i++)
168 {
169 FinalCommentString[i] = ' ';
170 }
171
172 strcat (FinalCommentString, CommentString);
173 CvPlaceComment (CurrentState.CommentType, FinalCommentString);
174 }
175 }
176 }
177
178
179 /*******************************************************************************
180 *
181 * FUNCTION: CvProcessCommentType2
182 *
183 * PARAMETERS: CurrentState Current comment parse state
184 * StringBuffer Buffer containing the comment being processed
185 *
186 * RETURN: none
187 *
188 * DESCRIPTION: Process a single line comment. This function captures a comment
189 * in a char* and places the comment in the appropriate global
190 * buffer through CvPlaceComment
191 *
192 ******************************************************************************/
193
194 void
CvProcessCommentType2(ASL_COMMENT_STATE CurrentState,char * StringBuffer)195 CvProcessCommentType2 (
196 ASL_COMMENT_STATE CurrentState,
197 char *StringBuffer)
198 {
199 UINT32 i;
200 char *CommentString;
201 char *FinalCommentString;
202
203
204 if (AcpiGbl_CaptureComments && CurrentState.CaptureComments)
205 {
206 *StringBuffer = 0; /* null terminate */
207 CvDbgPrint ("Single-line comment\n");
208 CommentString = UtLocalCacheCalloc (strlen (AslGbl_MsgBuffer) + 1);
209 strcpy (CommentString, AslGbl_MsgBuffer);
210
211 /* If this comment lies on the same line as the latest parse op,
212 * assign it to that op's CommentAfter field. Saving in this field
213 * will allow us to support comments that come after code on the
214 * same line as the code itself. For example,
215 * Name(A,"") //comment
216 *
217 * will be retained rather than transformed into
218 *
219 * Name(A,"")
220 * //comment
221 *
222 * For this case, we only need to add one comment since
223 *
224 * Name(A,"") //comment1 //comment2 ... more comments here.
225 *
226 * would be lexically analyzed as a single comment.
227 *
228 * Create a new string with the appropriate spaces. Since we need
229 * to account for the proper spacing, the actual comment,
230 * extra 2 spaces so that this comment can be converted to the "/ *"
231 * style and the null terminator, the string would look something
232 * like:
233 *
234 * [ (spaces) (comment) ( * /) ('\0') ]
235 *
236 */
237 FinalCommentString = UtLocalCacheCalloc (CurrentState.SpacesBefore +
238 strlen (CommentString) + 3 + 1);
239
240 for (i = 0; (CurrentState.CommentType != 1) &&
241 (i < CurrentState.SpacesBefore); i++)
242 {
243 FinalCommentString[i] = ' ';
244 }
245
246 strcat (FinalCommentString, CommentString);
247
248 /* convert to a "/ *" style comment */
249
250 strcat (FinalCommentString, " */");
251 FinalCommentString [CurrentState.SpacesBefore +
252 strlen (CommentString) + 3] = 0;
253
254 /* get rid of the carriage return */
255
256 if (FinalCommentString[strlen (FinalCommentString) - 1] == 0x0D)
257 {
258 FinalCommentString[strlen(FinalCommentString) - 1] = 0;
259 }
260
261 CvPlaceComment (CurrentState.CommentType, FinalCommentString);
262 }
263 }
264
265
266 /*******************************************************************************
267 *
268 * FUNCTION: CgCalculateCommentLengths
269 *
270 * PARAMETERS: Op - Calculate all comments of this Op
271 *
272 * RETURN: TotalCommentLength - Length of all comments within this op.
273 *
274 * DESCRIPTION: Calculate the length that the each comment takes up within Op.
275 * Comments look like the following: [0xA9 OptionBtye comment 0x00]
276 * therefore, we add 1 + 1 + strlen (comment) + 1 to get the actual
277 * length of this comment.
278 *
279 ******************************************************************************/
280
281 UINT32
CvCalculateCommentLengths(ACPI_PARSE_OBJECT * Op)282 CvCalculateCommentLengths(
283 ACPI_PARSE_OBJECT *Op)
284 {
285 UINT32 CommentLength = 0;
286 UINT32 TotalCommentLength = 0;
287 ACPI_COMMENT_NODE *Current = NULL;
288
289
290 if (!AcpiGbl_CaptureComments)
291 {
292 return (0);
293 }
294
295 CvDbgPrint ("==Calculating comment lengths for %s\n",
296 Op->Asl.ParseOpName);
297
298 if (Op->Asl.FileChanged)
299 {
300 TotalCommentLength += strlen (Op->Asl.Filename) + 3;
301
302 if (Op->Asl.ParentFilename &&
303 AcpiUtStricmp (Op->Asl.Filename, Op->Asl.ParentFilename))
304 {
305 TotalCommentLength += strlen (Op->Asl.ParentFilename) + 3;
306 }
307 }
308
309 if (Op->Asl.CommentList)
310 {
311 Current = Op->Asl.CommentList;
312 while (Current)
313 {
314 CommentLength = strlen (Current->Comment)+3;
315 CvDbgPrint ("Length of standard comment: %d\n", CommentLength);
316 CvDbgPrint (" Comment string: %s\n\n", Current->Comment);
317 TotalCommentLength += CommentLength;
318 Current = Current->Next;
319 }
320 }
321
322 if (Op->Asl.EndBlkComment)
323 {
324 Current = Op->Asl.EndBlkComment;
325 while (Current)
326 {
327 CommentLength = strlen (Current->Comment)+3;
328 CvDbgPrint ("Length of endblkcomment: %d\n", CommentLength);
329 CvDbgPrint (" Comment string: %s\n\n", Current->Comment);
330 TotalCommentLength += CommentLength;
331 Current = Current->Next;
332 }
333 }
334
335 if (Op->Asl.InlineComment)
336 {
337 CommentLength = strlen (Op->Asl.InlineComment)+3;
338 CvDbgPrint ("Length of inline comment: %d\n", CommentLength);
339 CvDbgPrint (" Comment string: %s\n\n", Op->Asl.InlineComment);
340 TotalCommentLength += CommentLength;
341 }
342
343 if (Op->Asl.EndNodeComment)
344 {
345 CommentLength = strlen(Op->Asl.EndNodeComment)+3;
346 CvDbgPrint ("Length of end node comment +3: %d\n", CommentLength);
347 CvDbgPrint (" Comment string: %s\n\n", Op->Asl.EndNodeComment);
348 TotalCommentLength += CommentLength;
349 }
350
351 if (Op->Asl.CloseBraceComment)
352 {
353 CommentLength = strlen (Op->Asl.CloseBraceComment)+3;
354 CvDbgPrint ("Length of close brace comment: %d\n", CommentLength);
355 CvDbgPrint (" Comment string: %s\n\n", Op->Asl.CloseBraceComment);
356 TotalCommentLength += CommentLength;
357 }
358
359 CvDbgPrint("\n\n");
360 return (TotalCommentLength);
361 }
362
363
364 /*******************************************************************************
365 *
366 * FUNCTION: CgWriteAmlDefBlockComment
367 *
368 * PARAMETERS: Op - Current parse op
369 *
370 * RETURN: None
371 *
372 * DESCRIPTION: Write all comments for a particular definition block.
373 * For definition blocks, the comments need to come after the
374 * definition block header. The regular comments above the
375 * definition block would be categorized as
376 * STD_DEFBLK_COMMENT and comments after the closing brace
377 * is categorized as END_DEFBLK_COMMENT.
378 *
379 ******************************************************************************/
380
381 void
CgWriteAmlDefBlockComment(ACPI_PARSE_OBJECT * Op)382 CgWriteAmlDefBlockComment(
383 ACPI_PARSE_OBJECT *Op)
384 {
385 UINT8 CommentOption;
386 ACPI_COMMENT_NODE *Current;
387 char *NewFilename;
388 char *Position;
389 char *DirectoryPosition;
390
391
392 if (!AcpiGbl_CaptureComments ||
393 (Op->Asl.ParseOpcode != PARSEOP_DEFINITION_BLOCK))
394 {
395 return;
396 }
397
398 CvDbgPrint ("Printing comments for a definition block..\n");
399
400 /* First, print the file name comment after changing .asl to .dsl */
401
402 NewFilename = UtLocalCacheCalloc (strlen (Op->Asl.Filename));
403 strcpy (NewFilename, Op->Asl.Filename);
404 DirectoryPosition = strrchr (NewFilename, '/');
405 Position = strrchr (NewFilename, '.');
406
407 if (Position && (Position > DirectoryPosition))
408 {
409 /* Tack on the new suffix */
410
411 Position++;
412 *Position = 0;
413 strcat (Position, FILE_SUFFIX_DISASSEMBLY);
414 }
415 else
416 {
417 /* No dot, add one and then the suffix */
418
419 strcat (NewFilename, ".");
420 strcat (NewFilename, FILE_SUFFIX_DISASSEMBLY);
421 }
422
423 CommentOption = FILENAME_COMMENT;
424 CgWriteOneAmlComment(Op, NewFilename, CommentOption);
425
426 Current = Op->Asl.CommentList;
427 CommentOption = STD_DEFBLK_COMMENT;
428
429 while (Current)
430 {
431 CgWriteOneAmlComment(Op, Current->Comment, CommentOption);
432 CvDbgPrint ("Printing comment: %s\n", Current->Comment);
433 Current = Current->Next;
434 }
435
436 Op->Asl.CommentList = NULL;
437
438 /* Print any Inline comments associated with this node */
439
440 if (Op->Asl.CloseBraceComment)
441 {
442 CommentOption = END_DEFBLK_COMMENT;
443 CgWriteOneAmlComment(Op, Op->Asl.CloseBraceComment, CommentOption);
444 Op->Asl.CloseBraceComment = NULL;
445 }
446 }
447
448
449 /*******************************************************************************
450 *
451 * FUNCTION: CgWriteOneAmlComment
452 *
453 * PARAMETERS: Op - Current parse op
454 * CommentToPrint - Comment that's printed
455 * InputOption - Denotes the comment option.
456 *
457 * RETURN: None
458 *
459 * DESCRIPTION: write a single comment.
460 *
461 ******************************************************************************/
462
463 void
CgWriteOneAmlComment(ACPI_PARSE_OBJECT * Op,char * CommentToPrint,UINT8 InputOption)464 CgWriteOneAmlComment(
465 ACPI_PARSE_OBJECT *Op,
466 char* CommentToPrint,
467 UINT8 InputOption)
468 {
469 UINT8 CommentOption = InputOption;
470 UINT8 CommentOpcode = (UINT8) AML_COMMENT_OP;
471
472
473 if (!CommentToPrint)
474 {
475 return;
476 }
477
478 CgLocalWriteAmlData (Op, &CommentOpcode, 1);
479 CgLocalWriteAmlData (Op, &CommentOption, 1);
480
481 /* The strlen (..) + 1 is to include the null terminator */
482
483 CgLocalWriteAmlData (Op, CommentToPrint, strlen (CommentToPrint) + 1);
484 }
485
486
487 /*******************************************************************************
488 *
489 * FUNCTION: CgWriteAmlComment
490 *
491 * PARAMETERS: Op - Current parse op
492 *
493 * RETURN: None
494 *
495 * DESCRIPTION: Write all comments pertaining to the current parse op
496 *
497 ******************************************************************************/
498
499 void
CgWriteAmlComment(ACPI_PARSE_OBJECT * Op)500 CgWriteAmlComment(
501 ACPI_PARSE_OBJECT *Op)
502 {
503 ACPI_COMMENT_NODE *Current;
504 UINT8 CommentOption;
505 char *NewFilename;
506 char *ParentFilename;
507
508
509 if ((Op->Asl.ParseOpcode == PARSEOP_DEFINITION_BLOCK) ||
510 !AcpiGbl_CaptureComments)
511 {
512 return;
513 }
514
515 /* Print out the filename comment if needed */
516
517 if (Op->Asl.FileChanged)
518 {
519
520 /* First, print the file name comment after changing .asl to .dsl */
521
522 NewFilename =
523 FlGenerateFilename (Op->Asl.Filename, FILE_SUFFIX_DISASSEMBLY);
524 if (NewFilename)
525 {
526 CvDbgPrint ("Writing file comment, \"%s\" for %s\n",
527 NewFilename, Op->Asl.ParseOpName);
528 }
529
530 CgWriteOneAmlComment(Op, NewFilename, FILENAME_COMMENT);
531
532 if (Op->Asl.ParentFilename &&
533 AcpiUtStricmp (Op->Asl.ParentFilename, Op->Asl.Filename))
534 {
535 ParentFilename = FlGenerateFilename (Op->Asl.ParentFilename,
536 FILE_SUFFIX_DISASSEMBLY);
537 CgWriteOneAmlComment(Op, ParentFilename, PARENTFILENAME_COMMENT);
538 }
539
540 /* Prevent multiple writes of the same comment */
541
542 Op->Asl.FileChanged = FALSE;
543 }
544
545 /*
546 * Regular comments are stored in a list of comments within an Op.
547 * If there is a such list in this node, print out the comment
548 * as byte code.
549 */
550 Current = Op->Asl.CommentList;
551 if (Op->Asl.ParseOpcode == PARSEOP_INCLUDE)
552 {
553 CommentOption = INCLUDE_COMMENT;
554 }
555 else
556 {
557 CommentOption = STANDARD_COMMENT;
558 }
559
560 while (Current)
561 {
562 CgWriteOneAmlComment(Op, Current->Comment, CommentOption);
563 Current = Current->Next;
564 }
565
566 Op->Asl.CommentList = NULL;
567
568 Current = Op->Asl.EndBlkComment;
569 CommentOption = ENDBLK_COMMENT;
570 while (Current)
571 {
572 CgWriteOneAmlComment(Op, Current->Comment, CommentOption);
573 Current = Current->Next;
574 }
575
576 Op->Asl.EndBlkComment = NULL;
577
578 /* Print any Inline comments associated with this node */
579
580 if (Op->Asl.InlineComment)
581 {
582 CommentOption = INLINE_COMMENT;
583 CgWriteOneAmlComment(Op, Op->Asl.InlineComment, CommentOption);
584 Op->Asl.InlineComment = NULL;
585 }
586
587 if (Op->Asl.EndNodeComment)
588 {
589 CommentOption = ENDNODE_COMMENT;
590 CgWriteOneAmlComment(Op, Op->Asl.EndNodeComment, CommentOption);
591 Op->Asl.EndNodeComment = NULL;
592 }
593
594 if (Op->Asl.CloseBraceComment)
595 {
596 CommentOption = CLOSE_BRACE_COMMENT;
597 CgWriteOneAmlComment(Op, Op->Asl.CloseBraceComment, CommentOption);
598 Op->Asl.CloseBraceComment = NULL;
599 }
600 }
601
602
603 /*******************************************************************************
604 *
605 * FUNCTION: CvCommentNodeCalloc
606 *
607 * PARAMETERS: None
608 *
609 * RETURN: Pointer to the comment node. Aborts on allocation failure
610 *
611 * DESCRIPTION: Allocate a string node buffer.
612 *
613 ******************************************************************************/
614
615 ACPI_COMMENT_NODE *
CvCommentNodeCalloc(void)616 CvCommentNodeCalloc (
617 void)
618 {
619 ACPI_COMMENT_NODE *NewCommentNode;
620
621
622 NewCommentNode = UtLocalCalloc (sizeof (ACPI_COMMENT_NODE));
623 NewCommentNode->Next = NULL;
624 return (NewCommentNode);
625 }
626
627
628 /*******************************************************************************
629 *
630 * FUNCTION: CvParseOpBlockType
631 *
632 * PARAMETERS: Op - Object to be examined
633 *
634 * RETURN: BlockType - not a block, parens, braces, or even both.
635 *
636 * DESCRIPTION: Type of block for this ASL parseop (parens or braces)
637 * keep this in sync with aslprimaries.y, aslresources.y and
638 * aslrules.y
639 *
640 ******************************************************************************/
641
642 UINT32
CvParseOpBlockType(ACPI_PARSE_OBJECT * Op)643 CvParseOpBlockType (
644 ACPI_PARSE_OBJECT *Op)
645 {
646
647 if (!Op)
648 {
649 return (BLOCK_NONE);
650 }
651
652 switch (Op->Asl.ParseOpcode)
653 {
654 /* From aslprimaries.y */
655
656 case PARSEOP_VAR_PACKAGE:
657 case PARSEOP_BANKFIELD:
658 case PARSEOP_BUFFER:
659 case PARSEOP_CASE:
660 case PARSEOP_DEVICE:
661 case PARSEOP_FIELD:
662 case PARSEOP_FOR:
663 case PARSEOP_FUNCTION:
664 case PARSEOP_IF:
665 case PARSEOP_ELSEIF:
666 case PARSEOP_INDEXFIELD:
667 case PARSEOP_METHOD:
668 case PARSEOP_POWERRESOURCE:
669 case PARSEOP_PROCESSOR:
670 case PARSEOP_DATABUFFER:
671 case PARSEOP_SCOPE:
672 case PARSEOP_SWITCH:
673 case PARSEOP_THERMALZONE:
674 case PARSEOP_WHILE:
675
676 /* From aslresources.y */
677
678 case PARSEOP_RESOURCETEMPLATE: /* optional parens */
679 case PARSEOP_VENDORLONG:
680 case PARSEOP_VENDORSHORT:
681 case PARSEOP_INTERRUPT:
682 case PARSEOP_IRQNOFLAGS:
683 case PARSEOP_IRQ:
684 case PARSEOP_GPIO_INT:
685 case PARSEOP_GPIO_IO:
686 case PARSEOP_DMA:
687
688 /* From aslrules.y */
689
690 case PARSEOP_DEFINITION_BLOCK:
691 return (BLOCK_PAREN | BLOCK_BRACE);
692
693 default:
694 return (BLOCK_NONE);
695 }
696 }
697
698
699 /*******************************************************************************
700 *
701 * FUNCTION: CvProcessCommentState
702 *
703 * PARAMETERS: Input - Input character
704 *
705 * RETURN: None
706 *
707 * DESCRIPTION: Take the given input. If this character is
708 * defined as a comment table entry, then update the state
709 * accordingly.
710 *
711 ******************************************************************************/
712
713 void
CvProcessCommentState(char Input)714 CvProcessCommentState (
715 char Input)
716 {
717
718 if (Input != ' ')
719 {
720 AslGbl_CommentState.SpacesBefore = 0;
721 }
722
723 switch (Input)
724 {
725 case '\n':
726
727 AslGbl_CommentState.CommentType = ASL_COMMENT_STANDARD;
728 break;
729
730 case ' ':
731
732 /* Keep the CommentType the same */
733
734 AslGbl_CommentState.SpacesBefore++;
735 break;
736
737 case '(':
738
739 AslGbl_CommentState.CommentType = ASL_COMMENT_OPEN_PAREN;
740 break;
741
742 case ')':
743
744 AslGbl_CommentState.CommentType = ASL_COMMENT_CLOSE_PAREN;
745 break;
746
747 case '{':
748
749 AslGbl_CommentState.CommentType = ASL_COMMENT_STANDARD;
750 AslGbl_CommentState.ParsingParenBraceNode = NULL;
751 CvDbgPrint ("End Parsing paren/Brace node!\n");
752 break;
753
754 case '}':
755
756 AslGbl_CommentState.CommentType = ASL_COMMENT_CLOSE_BRACE;
757 break;
758
759 case ',':
760
761 AslGbl_CommentState.CommentType = ASLCOMMENT_INLINE;
762 break;
763
764 default:
765
766 AslGbl_CommentState.CommentType = ASLCOMMENT_INLINE;
767 break;
768 }
769 }
770
771
772 /*******************************************************************************
773 *
774 * FUNCTION: CvAddToCommentList
775 *
776 * PARAMETERS: ToAdd - Contains the comment to be inserted
777 *
778 * RETURN: None
779 *
780 * DESCRIPTION: Add the given char* to a list of comments in the global list
781 * of comments.
782 *
783 ******************************************************************************/
784
785 void
CvAddToCommentList(char * ToAdd)786 CvAddToCommentList (
787 char *ToAdd)
788 {
789
790 if (AslGbl_CommentListHead)
791 {
792 AslGbl_CommentListTail->Next = CvCommentNodeCalloc ();
793 AslGbl_CommentListTail = AslGbl_CommentListTail->Next;
794 }
795 else
796 {
797 AslGbl_CommentListHead = CvCommentNodeCalloc ();
798 AslGbl_CommentListTail = AslGbl_CommentListHead;
799 }
800
801 AslGbl_CommentListTail->Comment = ToAdd;
802 }
803
804
805 /*******************************************************************************
806 *
807 * FUNCTION: CvAppendInlineComment
808 *
809 * PARAMETERS: InlineComment - Append to the end of this string.
810 * toAdd - Contains the comment to be inserted
811 *
812 * RETURN: Str - toAdd appended to InlineComment
813 *
814 * DESCRIPTION: Concatenate ToAdd to InlineComment
815 *
816 ******************************************************************************/
817
818 char *
CvAppendInlineComment(char * InlineComment,char * ToAdd)819 CvAppendInlineComment (
820 char *InlineComment,
821 char *ToAdd)
822 {
823 char* Str;
824 UINT32 Size = 0;
825
826
827 if (!InlineComment)
828 {
829 return (ToAdd);
830 }
831
832 if (!ToAdd)
833 {
834 return (InlineComment);
835 }
836
837 Size = strlen (ToAdd);
838 Size += strlen (InlineComment);
839 Str = UtLocalCacheCalloc (Size + 1);
840
841 strcpy (Str, InlineComment);
842 strcat (Str, ToAdd);
843 Str[Size +1] = 0;
844 return (Str);
845 }
846
847
848 /*******************************************************************************
849 *
850 * FUNCTION: CvPlaceComment
851 *
852 * PARAMETERS: UINT8 - Type
853 * char * - CommentString
854 *
855 * RETURN: None
856 *
857 * DESCRIPTION: Given type and CommentString, this function places the
858 * CommentString in the appropriate global comment list or char*
859 *
860 ******************************************************************************/
861
862 void
CvPlaceComment(UINT8 Type,char * CommentString)863 CvPlaceComment(
864 UINT8 Type,
865 char *CommentString)
866 {
867 ACPI_PARSE_OBJECT *LatestParseNode;
868 ACPI_PARSE_OBJECT *ParenBraceNode;
869
870
871 LatestParseNode = AslGbl_CommentState.LatestParseOp;
872 ParenBraceNode = AslGbl_CommentState.ParsingParenBraceNode;
873 CvDbgPrint ("Placing comment %s for type %d\n", CommentString, Type);
874
875 switch (Type)
876 {
877 case ASL_COMMENT_STANDARD:
878
879 CvAddToCommentList (CommentString);
880 break;
881
882 case ASLCOMMENT_INLINE:
883
884 LatestParseNode->Asl.InlineComment =
885 CvAppendInlineComment (LatestParseNode->Asl.InlineComment,
886 CommentString);
887 break;
888
889 case ASL_COMMENT_OPEN_PAREN:
890
891 AslGbl_InlineCommentBuffer =
892 CvAppendInlineComment(AslGbl_InlineCommentBuffer,
893 CommentString);
894 break;
895
896 case ASL_COMMENT_CLOSE_PAREN:
897
898 if (ParenBraceNode)
899 {
900 ParenBraceNode->Asl.EndNodeComment =
901 CvAppendInlineComment (ParenBraceNode->Asl.EndNodeComment,
902 CommentString);
903 }
904 else
905 {
906 LatestParseNode->Asl.EndNodeComment =
907 CvAppendInlineComment (LatestParseNode->Asl.EndNodeComment,
908 CommentString);
909 }
910 break;
911
912 case ASL_COMMENT_CLOSE_BRACE:
913
914 LatestParseNode->Asl.CloseBraceComment = CommentString;
915 break;
916
917 default:
918
919 break;
920 }
921 }
922