cvcompiler.c revision 1.1 1 /******************************************************************************
2 *
3 * Module Name: cvcompiler - ASL-/ASL+ converter functions
4 *
5 *****************************************************************************/
6
7 /*
8 * Copyright (C) 2000 - 2017, 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 MERCHANTIBILITY 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 approperiate global buffer.
64 *
65 ******************************************************************************/
66
67 void
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 (Gbl_CaptureComments && CurrentState.CaptureComments)
82 {
83 *StringBuffer = (char) c1;
84 ++StringBuffer;
85 *StringBuffer = 0;
86 CvDbgPrint ("Multi-line comment\n");
87 CommentString = UtStringCacheCalloc (strlen (MsgBuffer) + 1);
88 strcpy (CommentString, MsgBuffer);
89
90 CvDbgPrint ("CommentString: %s\n", CommentString);
91
92 /*
93 * Determine whether if this comment spans multiple lines.
94 * If so, break apart the comment by line so that it can be
95 * properly indented.
96 */
97 if (strchr (CommentString, '\n') != NULL)
98 {
99 /*
100 * Get the first token. The for loop pads subsequent lines
101 * for comments similar to the style of this comment.
102 */
103 LineToken = strtok (CommentString, "\n");
104 FinalLineToken = UtStringCacheCalloc (strlen (LineToken) + 1);
105 strcpy (FinalLineToken, LineToken);
106
107 /* Get rid of any carriage returns */
108
109 if (FinalLineToken[strlen (FinalLineToken) - 1] == 0x0D)
110 {
111 FinalLineToken[strlen(FinalLineToken)-1] = 0;
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 is not
120 * 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 FinalLineToken = UtStringCacheCalloc (strlen (LineToken) + 1);
133 strcat (FinalLineToken, LineToken);
134
135 /* Get rid of any carriage returns */
136
137 if (FinalLineToken[strlen (FinalLineToken) - 1] == 0x0D)
138 {
139 FinalLineToken[strlen(FinalLineToken) - 1] = 0;
140 }
141 CvAddToCommentList (FinalLineToken);
142 LineToken = strtok (NULL,"\n");
143 }
144 }
145
146 /*
147 * If this only spans a single line, check to see whether if this comment
148 * appears on the same line as a line of code. If does, retain it's
149 * position for stylistic reasons. If it doesn't, add it to the comment
150 * List so that it can be associated with the next node that's created.
151 */
152 else
153 {
154 /*
155 * if this is not a regular comment, pad with extra spaces that appeared
156 * in the original source input to retain the original spacing.
157 */
158 FinalCommentString = UtStringCacheCalloc (strlen (CommentString) + CurrentState.SpacesBefore + 1);
159 for (i=0; (CurrentState.CommentType != ASL_COMMENT_STANDARD) &&
160 (i < CurrentState.SpacesBefore); ++i)
161 {
162 FinalCommentString[i] = ' ';
163 }
164 strcat (FinalCommentString, CommentString);
165 CvPlaceComment (CurrentState.CommentType, FinalCommentString);
166 }
167 }
168 }
169
170
171 /*******************************************************************************
172 *
173 * FUNCTION: CvProcessCommentType2
174 *
175 * PARAMETERS: CurrentState Current comment parse state
176 * StringBuffer Buffer containing the comment being processed
177 *
178 * RETURN: none
179 *
180 * DESCRIPTION: Process a single line comment. This function captures a comment
181 * in a char* and places the comment in the approperiate global
182 * buffer through CvPlaceComment
183 *
184 ******************************************************************************/
185
186 void
187 CvProcessCommentType2 (
188 ASL_COMMENT_STATE CurrentState,
189 char *StringBuffer)
190 {
191 UINT32 i;
192 char *CommentString;
193 char *FinalCommentString;
194
195
196 if (Gbl_CaptureComments && CurrentState.CaptureComments)
197 {
198 *StringBuffer = 0; /* null terminate */
199 CvDbgPrint ("Single-line comment\n");
200 CommentString = UtStringCacheCalloc (strlen (MsgBuffer) + 1);
201 strcpy (CommentString, MsgBuffer);
202
203 /* If this comment lies on the same line as the latest parse node,
204 * assign it to that node's CommentAfter field. Saving in this field
205 * will allow us to support comments that come after code on the same
206 * line as the code itself. For example,
207 * Name(A,"") //comment
208 *
209 * will be retained rather than transformed into
210 *
211 * Name(A,"")
212 * //comment
213 *
214 * For this case, we only need to add one comment since
215 *
216 * Name(A,"") //comment1 //comment2 ... more comments here.
217 *
218 * would be lexically analyzed as a single comment.
219 *
220 * Create a new string with the approperiate spaces. Since we need
221 * to account for the proper spacing, the actual comment,
222 * extra 2 spaces so that this comment can be converted to the "/ *"
223 * style and the null terminator, the string would look something like
224 *
225 * [ (spaces) (comment) ( * /) ('\0') ]
226 *
227 */
228 FinalCommentString = UtStringCacheCalloc (CurrentState.SpacesBefore + strlen (CommentString) + 3 + 1);
229 for (i=0; (CurrentState.CommentType!=1) && (i<CurrentState.SpacesBefore); ++i)
230 {
231 FinalCommentString[i] = ' ';
232 }
233 strcat (FinalCommentString, CommentString);
234
235 /* convert to a "/ *" style comment */
236
237 strcat (FinalCommentString, " */");
238 FinalCommentString [CurrentState.SpacesBefore + strlen (CommentString) + 3] = 0;
239
240 /* get rid of the carriage return */
241
242 if (FinalCommentString[strlen (FinalCommentString) - 1] == 0x0D)
243 {
244 FinalCommentString[strlen(FinalCommentString)-1] = 0;
245 }
246 CvPlaceComment (CurrentState.CommentType, FinalCommentString);
247 }
248 }
249
250
251 /*******************************************************************************
252 *
253 * FUNCTION: CgCalculateCommentLengths
254 *
255 * PARAMETERS: Op - Calculate all comments of this Op
256 *
257 * RETURN: TotalCommentLength - Length of all comments within this node.
258 *
259 * DESCRIPTION: calculate the length that the each comment takes up within Op.
260 * Comments look like the follwoing: [0xA9 OptionBtye comment 0x00]
261 * therefore, we add 1 + 1 + strlen (comment) + 1 to get the actual
262 * length of this comment.
263 *
264 ******************************************************************************/
265
266 UINT32
267 CvCalculateCommentLengths(
268 ACPI_PARSE_OBJECT *Op)
269 {
270 UINT32 CommentLength = 0;
271 UINT32 TotalCommentLength = 0;
272 ACPI_COMMENT_NODE *Current = NULL;
273
274
275 if (!Gbl_CaptureComments)
276 {
277 return (0);
278 }
279
280 CvDbgPrint ("==Calculating comment lengths for %s\n", Op->Asl.ParseOpName);
281 if (Op->Asl.FileChanged)
282 {
283 TotalCommentLength += strlen (Op->Asl.Filename) + 3;
284
285 if (Op->Asl.ParentFilename &&
286 AcpiUtStricmp (Op->Asl.Filename, Op->Asl.ParentFilename))
287 {
288 TotalCommentLength += strlen (Op->Asl.ParentFilename) + 3;
289 }
290 }
291 if (Op->Asl.CommentList)
292 {
293 Current = Op->Asl.CommentList;
294 while (Current)
295 {
296 CommentLength = strlen (Current->Comment)+3;
297 CvDbgPrint ("Length of standard comment: %d\n", CommentLength);
298 CvDbgPrint (" Comment string: %s\n\n", Current->Comment);
299 TotalCommentLength += CommentLength;
300 Current = Current->Next;
301 }
302 }
303 if (Op->Asl.EndBlkComment)
304 {
305 Current = Op->Asl.EndBlkComment;
306 while (Current)
307 {
308 CommentLength = strlen (Current->Comment)+3;
309 CvDbgPrint ("Length of endblkcomment: %d\n", CommentLength);
310 CvDbgPrint (" Comment string: %s\n\n", Current->Comment);
311 TotalCommentLength += CommentLength;
312 Current = Current->Next;
313 }
314 }
315 if (Op->Asl.InlineComment)
316 {
317 CommentLength = strlen (Op->Asl.InlineComment)+3;
318 CvDbgPrint ("Length of inline comment: %d\n", CommentLength);
319 CvDbgPrint (" Comment string: %s\n\n", Op->Asl.InlineComment);
320 TotalCommentLength += CommentLength;
321 }
322 if (Op->Asl.EndNodeComment)
323 {
324 CommentLength = strlen(Op->Asl.EndNodeComment)+3;
325 CvDbgPrint ("Length of end node comment +3: %d\n", CommentLength);
326 CvDbgPrint (" Comment string: %s\n\n", Op->Asl.EndNodeComment);
327 TotalCommentLength += CommentLength;
328 }
329
330 if (Op->Asl.CloseBraceComment)
331 {
332 CommentLength = strlen (Op->Asl.CloseBraceComment)+3;
333 CvDbgPrint ("Length of close brace comment: %d\n", CommentLength);
334 CvDbgPrint (" Comment string: %s\n\n", Op->Asl.CloseBraceComment);
335 TotalCommentLength += CommentLength;
336 }
337
338 CvDbgPrint("\n\n");
339
340 return TotalCommentLength;
341
342 }
343
344
345 /*******************************************************************************
346 *
347 * FUNCTION: CgWriteAmlDefBlockComment
348 *
349 * PARAMETERS: Op - Current parse op
350 *
351 * RETURN: None
352 *
353 * DESCRIPTION: Write all comments for a particular definition block.
354 * For definition blocks, the comments need to come after the
355 * definition block header. The regular comments above the
356 * definition block would be categorized as
357 * STD_DEFBLK_COMMENT and comments after the closing brace
358 * is categorized as END_DEFBLK_COMMENT.
359 *
360 ******************************************************************************/
361
362 void
363 CgWriteAmlDefBlockComment(
364 ACPI_PARSE_OBJECT *Op)
365 {
366 UINT8 CommentOption;
367 ACPI_COMMENT_NODE *Current;
368 char *NewFilename;
369 char *Position;
370 char *DirectoryPosition;
371
372
373 if (!Gbl_CaptureComments ||
374 (Op->Asl.ParseOpcode != PARSEOP_DEFINITION_BLOCK))
375 {
376 return;
377 }
378
379 CvDbgPrint ("Printing comments for a definition block..\n");
380
381 /* first, print the file name comment after changing .asl to .dsl */
382
383 NewFilename = UtStringCacheCalloc (strlen (Op->Asl.Filename));
384 strcpy (NewFilename, Op->Asl.Filename);
385 DirectoryPosition = strrchr (NewFilename, '/');
386 Position = strrchr (NewFilename, '.');
387
388 if (Position && (Position > DirectoryPosition))
389 {
390 /* Tack on the new suffix */
391
392 Position++;
393 *Position = 0;
394 strcat (Position, FILE_SUFFIX_DISASSEMBLY);
395 }
396 else
397 {
398 /* No dot, add one and then the suffix */
399
400 strcat (NewFilename, ".");
401 strcat (NewFilename, FILE_SUFFIX_DISASSEMBLY);
402 }
403
404 CommentOption = FILENAME_COMMENT;
405 CgWriteOneAmlComment(Op, NewFilename, CommentOption);
406
407 Current = Op->Asl.CommentList;
408 CommentOption = STD_DEFBLK_COMMENT;
409 while (Current)
410 {
411 CgWriteOneAmlComment(Op, Current->Comment, CommentOption);
412 CvDbgPrint ("Printing comment: %s\n", Current->Comment);
413 Current = Current->Next;
414 }
415 Op->Asl.CommentList = NULL;
416
417 /* print any Inline comments associated with this node */
418
419 if (Op->Asl.CloseBraceComment)
420 {
421 CommentOption = END_DEFBLK_COMMENT;
422 CgWriteOneAmlComment(Op, Op->Asl.CloseBraceComment, CommentOption);
423 Op->Asl.CloseBraceComment = NULL;
424 }
425 }
426
427
428 /*******************************************************************************
429 *
430 * FUNCTION: CgWriteOneAmlComment
431 *
432 * PARAMETERS: Op - Current parse op
433 * CommentToPrint - Comment that's printed
434 * InputOption - Denotes the comment option.
435 *
436 * RETURN: None
437 *
438 * DESCRIPTION: write a single comment.
439 *
440 ******************************************************************************/
441
442 void
443 CgWriteOneAmlComment(
444 ACPI_PARSE_OBJECT *Op,
445 char* CommentToPrint,
446 UINT8 InputOption)
447 {
448 UINT8 CommentOption = InputOption;
449 UINT8 CommentOpcode = (UINT8)AML_COMMENT_OP;
450
451 CgLocalWriteAmlData (Op, &CommentOpcode, 1);
452 CgLocalWriteAmlData (Op, &CommentOption, 1);
453
454 /* The strlen (..) + 1 is to include the null terminator */
455
456 CgLocalWriteAmlData (Op, CommentToPrint, strlen (CommentToPrint) + 1);
457 }
458
459
460 /*******************************************************************************
461 *
462 * FUNCTION: CgWriteAmlComment
463 *
464 * PARAMETERS: Op - Current parse op
465 *
466 * RETURN: None
467 *
468 * DESCRIPTION: write all comments pertaining to the
469 * current parse op
470 *
471 ******************************************************************************/
472
473 void
474 CgWriteAmlComment(
475 ACPI_PARSE_OBJECT *Op)
476 {
477 ACPI_COMMENT_NODE *Current;
478 UINT8 CommentOption;
479 char *NewFilename;
480 char *ParentFilename;
481
482
483 if ((Op->Asl.ParseOpcode == PARSEOP_DEFINITION_BLOCK) ||
484 !Gbl_CaptureComments)
485 {
486 return;
487 }
488
489 /* Print out the filename comment if needed */
490
491 if (Op->Asl.FileChanged)
492 {
493
494 /* first, print the file name comment after changing .asl to .dsl */
495
496 NewFilename =
497 FlGenerateFilename (Op->Asl.Filename, FILE_SUFFIX_DISASSEMBLY);
498 CvDbgPrint ("Writing file comment, \"%s\" for %s\n",
499 NewFilename, Op->Asl.ParseOpName);
500 CgWriteOneAmlComment(Op, NewFilename, FILENAME_COMMENT);
501
502 if (Op->Asl.ParentFilename &&
503 AcpiUtStricmp (Op->Asl.ParentFilename, Op->Asl.Filename))
504 {
505 ParentFilename = FlGenerateFilename (Op->Asl.ParentFilename,
506 FILE_SUFFIX_DISASSEMBLY);
507 CgWriteOneAmlComment(Op, ParentFilename, PARENTFILENAME_COMMENT);
508 }
509
510 /* prevent multiple writes of the same comment */
511
512 Op->Asl.FileChanged = FALSE;
513 }
514
515 /*
516 * Regular comments are stored in a list of comments within an Op.
517 * If there is a such list in this node, print out the comment
518 * as byte code.
519 */
520 Current = Op->Asl.CommentList;
521 if (Op->Asl.ParseOpcode == PARSEOP_INCLUDE)
522 {
523 CommentOption = INCLUDE_COMMENT;
524 }
525 else
526 {
527 CommentOption = STANDARD_COMMENT;
528 }
529
530 while (Current)
531 {
532 CgWriteOneAmlComment(Op, Current->Comment, CommentOption);
533 Current = Current->Next;
534 }
535 Op->Asl.CommentList = NULL;
536
537 Current = Op->Asl.EndBlkComment;
538 CommentOption = ENDBLK_COMMENT;
539 while (Current)
540 {
541 CgWriteOneAmlComment(Op, Current->Comment, CommentOption);
542 Current = Current->Next;
543 }
544 Op->Asl.EndBlkComment = NULL;
545
546 /* print any Inline comments associated with this node */
547
548 if (Op->Asl.InlineComment)
549 {
550 CommentOption = INLINE_COMMENT;
551 CgWriteOneAmlComment(Op, Op->Asl.InlineComment, CommentOption);
552 Op->Asl.InlineComment = NULL;
553 }
554
555 if (Op->Asl.EndNodeComment)
556 {
557 CommentOption = ENDNODE_COMMENT;
558 CgWriteOneAmlComment(Op, Op->Asl.EndNodeComment, CommentOption);
559 Op->Asl.EndNodeComment = NULL;
560 }
561
562 if (Op->Asl.CloseBraceComment)
563 {
564 CommentOption = CLOSE_BRACE_COMMENT;
565 CgWriteOneAmlComment(Op, Op->Asl.CloseBraceComment, CommentOption);
566 Op->Asl.CloseBraceComment = NULL;
567 }
568 }
569
570
571 /*******************************************************************************
572 *
573 * FUNCTION: CvCommentNodeCalloc
574 *
575 * PARAMETERS: none
576 *
577 * RETURN: Pointer to the comment node. Aborts on allocation failure
578 *
579 * DESCRIPTION: Allocate a string node buffer.
580 *
581 ******************************************************************************/
582
583 ACPI_COMMENT_NODE*
584 CvCommentNodeCalloc (
585 void)
586 {
587 ACPI_COMMENT_NODE *NewCommentNode;
588
589
590 NewCommentNode =
591 (ACPI_COMMENT_NODE*) UtLocalCalloc (sizeof(ACPI_COMMENT_NODE));
592 NewCommentNode->Next = NULL;
593 return NewCommentNode;
594 }
595
596
597 /*******************************************************************************
598 *
599 * FUNCTION: CvParseOpBlockType
600 *
601 * PARAMETERS: Op - Object to be examined
602 *
603 * RETURN: BlockType - not a block, parens, braces, or even both.
604 *
605 * DESCRIPTION: Type of block for this ASL parseop (parens or braces)
606 * keep this in sync with aslprimaries.y, aslresources.y and
607 * aslrules.y
608 *
609 ******************************************************************************/
610
611 UINT32
612 CvParseOpBlockType (
613 ACPI_PARSE_OBJECT *Op)
614 {
615 if (!Op)
616 {
617 return (BLOCK_NONE);
618 }
619
620 switch (Op->Asl.ParseOpcode)
621 {
622
623 /* from aslprimaries.y */
624
625 case PARSEOP_VAR_PACKAGE:
626 case PARSEOP_BANKFIELD:
627 case PARSEOP_BUFFER:
628 case PARSEOP_CASE:
629 case PARSEOP_DEVICE:
630 case PARSEOP_FIELD:
631 case PARSEOP_FOR:
632 case PARSEOP_FUNCTION:
633 case PARSEOP_IF:
634 case PARSEOP_ELSEIF:
635 case PARSEOP_INDEXFIELD:
636 case PARSEOP_METHOD:
637 case PARSEOP_POWERRESOURCE:
638 case PARSEOP_PROCESSOR:
639 case PARSEOP_DATABUFFER:
640 case PARSEOP_SCOPE:
641 case PARSEOP_SWITCH:
642 case PARSEOP_THERMALZONE:
643 case PARSEOP_WHILE:
644
645 /* from aslresources.y */
646
647 case PARSEOP_RESOURCETEMPLATE: /* optional parens */
648 case PARSEOP_VENDORLONG:
649 case PARSEOP_VENDORSHORT:
650 case PARSEOP_INTERRUPT:
651 case PARSEOP_IRQNOFLAGS:
652 case PARSEOP_IRQ:
653 case PARSEOP_GPIO_INT:
654 case PARSEOP_GPIO_IO:
655 case PARSEOP_DMA:
656
657 /*from aslrules.y */
658
659 case PARSEOP_DEFINITION_BLOCK:
660 return (BLOCK_PAREN | BLOCK_BRACE);
661
662 default:
663
664 return (BLOCK_NONE);
665 }
666 }
667
668
669 /*******************************************************************************
670 *
671 * FUNCTION: CvProcessCommentState
672 *
673 * PARAMETERS: char
674 *
675 * RETURN: None
676 *
677 * DESCRIPTION: Take the given input. If this character is
678 * defined as a comment table entry, then update the state
679 * accordingly.
680 *
681 ******************************************************************************/
682
683 void
684 CvProcessCommentState (
685 char input)
686 {
687
688 if (input != ' ')
689 {
690 Gbl_CommentState.SpacesBefore = 0;
691 }
692
693 switch (input)
694 {
695 case '\n':
696
697 Gbl_CommentState.CommentType = ASL_COMMENT_STANDARD;
698 break;
699
700 case ' ':
701
702 /* Keep the CommentType the same */
703
704 Gbl_CommentState.SpacesBefore++;
705 break;
706
707 case '(':
708
709 Gbl_CommentState.CommentType = ASL_COMMENT_OPEN_PAREN;
710 break;
711
712 case ')':
713
714 Gbl_CommentState.CommentType = ASL_COMMENT_CLOSE_PAREN;
715 break;
716
717 case '{':
718
719 Gbl_CommentState.CommentType = ASL_COMMENT_STANDARD;
720 Gbl_CommentState.ParsingParenBraceNode = NULL;
721 CvDbgPrint ("End Parsing paren/Brace node!\n");
722 break;
723
724 case '}':
725
726 Gbl_CommentState.CommentType = ASL_COMMENT_CLOSE_BRACE;
727 break;
728
729 case ',':
730
731 Gbl_CommentState.CommentType = ASLCOMMENT_INLINE;
732 break;
733
734 default:
735
736 Gbl_CommentState.CommentType = ASLCOMMENT_INLINE;
737 break;
738
739 }
740 }
741
742
743 /*******************************************************************************
744 *
745 * FUNCTION: CvAddToCommentList
746 *
747 * PARAMETERS: toAdd - Contains the comment to be inserted
748 *
749 * RETURN: None
750 *
751 * DESCRIPTION: Add the given char* to a list of comments in the global list
752 * of comments.
753 *
754 ******************************************************************************/
755
756 void
757 CvAddToCommentList (
758 char* ToAdd)
759 {
760 if (Gbl_Comment_List_Head)
761 {
762 Gbl_Comment_List_Tail->Next = CvCommentNodeCalloc ();
763 Gbl_Comment_List_Tail = Gbl_Comment_List_Tail->Next;
764 }
765 else
766 {
767 Gbl_Comment_List_Head = CvCommentNodeCalloc ();
768 Gbl_Comment_List_Tail = Gbl_Comment_List_Head;
769 }
770
771 Gbl_Comment_List_Tail->Comment = ToAdd;
772
773 return;
774 }
775
776 /*******************************************************************************
777 *
778 * FUNCTION: CvAppendInlineComment
779 *
780 * PARAMETERS: InlineComment - Append to the end of this string.
781 * toAdd - Contains the comment to be inserted
782 *
783 * RETURN: Str - toAdd appended to InlineComment
784 *
785 * DESCRIPTION: Concatenate ToAdd to InlineComment
786 *
787 ******************************************************************************/
788
789 char*
790 CvAppendInlineComment (
791 char *InlineComment,
792 char *ToAdd)
793 {
794 char* Str;
795 UINT32 Size = 0;
796
797
798 if (!InlineComment)
799 {
800 return ToAdd;
801 }
802 if (ToAdd)
803 {
804 Size = strlen (ToAdd);
805 }
806 Size += strlen (InlineComment);
807 Str = UtStringCacheCalloc (Size+1);
808 strcpy (Str, InlineComment);
809 strcat (Str, ToAdd);
810 Str[Size+1] = 0;
811
812 return Str;
813 }
814
815
816 /*******************************************************************************
817 *
818 * FUNCTION: CvPlaceComment
819 *
820 * PARAMETERS: Int - Type
821 * char* - CommentString
822 *
823 * RETURN: None
824 *
825 * DESCRIPTION: Given type and CommentString, this function places the
826 * CommentString in the approperiate global comment list or char*
827 *
828 ******************************************************************************/
829
830 void
831 CvPlaceComment(
832 UINT8 Type,
833 char *CommentString)
834 {
835 ACPI_PARSE_OBJECT *LatestParseNode;
836 ACPI_PARSE_OBJECT *ParenBraceNode;
837
838
839 LatestParseNode = Gbl_CommentState.Latest_Parse_Node;
840 ParenBraceNode = Gbl_CommentState.ParsingParenBraceNode;
841 CvDbgPrint ("Placing comment %s for type %d\n", CommentString, Type);
842
843 switch (Type)
844 {
845 case ASL_COMMENT_STANDARD:
846
847 CvAddToCommentList (CommentString);
848 break;
849
850 case ASLCOMMENT_INLINE:
851
852 LatestParseNode->Asl.InlineComment =
853 CvAppendInlineComment (LatestParseNode->Asl.InlineComment,
854 CommentString);
855 break;
856
857 case ASL_COMMENT_OPEN_PAREN:
858
859 Gbl_Inline_Comment_Buffer =
860 CvAppendInlineComment(Gbl_Inline_Comment_Buffer,
861 CommentString);
862 break;
863
864 case ASL_COMMENT_CLOSE_PAREN:
865
866 if (ParenBraceNode)
867 {
868 ParenBraceNode->Asl.EndNodeComment =
869 CvAppendInlineComment (ParenBraceNode->Asl.EndNodeComment,
870 CommentString);
871 }
872 else
873 {
874 LatestParseNode->Asl.EndNodeComment =
875 CvAppendInlineComment (LatestParseNode->Asl.EndNodeComment,
876 CommentString);
877 }
878 break;
879
880 case ASL_COMMENT_CLOSE_BRACE:
881
882 LatestParseNode->Asl.CloseBraceComment = CommentString;
883 break;
884
885 default:
886
887 break;
888
889 }
890 }
891