asremove.c revision 1.1.1.8 1 /******************************************************************************
2 *
3 * Module Name: asremove - Source conversion - removal functions
4 *
5 *****************************************************************************/
6
7 /*
8 * Copyright (C) 2000 - 2016, 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 "acpisrc.h"
45
46 /* Local prototypes */
47
48 void
49 AsRemoveStatement (
50 char *Buffer,
51 char *Keyword,
52 UINT32 Type);
53
54
55 /******************************************************************************
56 *
57 * FUNCTION: AsRemoveStatement
58 *
59 * DESCRIPTION: Remove all statements that contain the given keyword.
60 * Limitations: Removes text from the start of the line that
61 * contains the keyword to the next semicolon. Currently
62 * doesn't ignore comments.
63 *
64 ******************************************************************************/
65
66 void
67 AsRemoveStatement (
68 char *Buffer,
69 char *Keyword,
70 UINT32 Type)
71 {
72 char *SubString;
73 char *SubBuffer;
74 int KeywordLength;
75
76
77 KeywordLength = strlen (Keyword);
78 SubBuffer = Buffer;
79 SubString = Buffer;
80
81 while (SubString)
82 {
83 SubString = strstr (SubBuffer, Keyword);
84
85 if (SubString)
86 {
87 SubBuffer = SubString;
88
89 if ((Type == REPLACE_WHOLE_WORD) &&
90 (!AsMatchExactWord (SubString, KeywordLength)))
91 {
92 SubBuffer++;
93 continue;
94 }
95
96 /* Find start of this line */
97
98 while (*SubString != '\n')
99 {
100 SubString--;
101 }
102 SubString++;
103
104 /* Find end of this statement */
105
106 SubBuffer = AsSkipPastChar (SubBuffer, ';');
107 if (!SubBuffer)
108 {
109 return;
110 }
111
112 /* Find end of this line */
113
114 SubBuffer = AsSkipPastChar (SubBuffer, '\n');
115 if (!SubBuffer)
116 {
117 return;
118 }
119
120 /* If next line is blank, remove it too */
121
122 if (*SubBuffer == '\n')
123 {
124 SubBuffer++;
125 }
126
127 /* Remove the lines */
128
129 SubBuffer = AsRemoveData (SubString, SubBuffer);
130 }
131 }
132 }
133
134
135 /******************************************************************************
136 *
137 * FUNCTION: AsRemoveConditionalCompile
138 *
139 * DESCRIPTION: Remove a "#ifdef" statement, and all text that it encompasses.
140 * Limitations: cannot handle nested ifdefs.
141 *
142 ******************************************************************************/
143
144 void
145 AsRemoveConditionalCompile (
146 char *Buffer,
147 char *Keyword)
148 {
149 char *SubString;
150 char *SubBuffer;
151 char *IfPtr;
152 char *EndifPtr;
153 char *ElsePtr;
154 char *Comment;
155 int KeywordLength;
156
157
158 KeywordLength = strlen (Keyword);
159 SubBuffer = Buffer;
160 SubString = Buffer;
161
162 while (SubString)
163 {
164 SubBuffer = strstr (SubString, Keyword);
165 if (!SubBuffer)
166 {
167 return;
168 }
169
170 /*
171 * Check for translation escape string -- means to ignore
172 * blocks of code while replacing
173 */
174 if (Gbl_IgnoreTranslationEscapes)
175 {
176 Comment = NULL;
177 }
178 else
179 {
180 Comment = strstr (SubString, AS_START_IGNORE);
181 }
182
183 if ((Comment) &&
184 (Comment < SubBuffer))
185 {
186 SubString = strstr (Comment, AS_STOP_IGNORE);
187 if (!SubString)
188 {
189 return;
190 }
191
192 SubString += 3;
193 continue;
194 }
195
196 /* Check for ordinary comment */
197
198 Comment = strstr (SubString, "/*");
199
200 if ((Comment) &&
201 (Comment < SubBuffer))
202 {
203 SubString = strstr (Comment, "*/");
204 if (!SubString)
205 {
206 return;
207 }
208
209 SubString += 2;
210 continue;
211 }
212
213 SubString = SubBuffer;
214 if (!AsMatchExactWord (SubString, KeywordLength))
215 {
216 SubString++;
217 continue;
218 }
219
220 /* Find start of this line */
221
222 while (*SubString != '\n' && (SubString > Buffer))
223 {
224 SubString--;
225 }
226
227 SubString++;
228
229 /* Find the "#ifxxxx" */
230
231 IfPtr = strstr (SubString, "#if");
232 if (!IfPtr)
233 {
234 return;
235 }
236
237 if (IfPtr > SubBuffer)
238 {
239 /* Not the right #if */
240
241 SubString = SubBuffer + strlen (Keyword);
242 continue;
243 }
244
245 /* Find closing #endif or #else */
246
247 EndifPtr = strstr (SubBuffer, "#endif");
248 if (!EndifPtr)
249 {
250 /* There has to be an #endif */
251
252 return;
253 }
254
255 ElsePtr = strstr (SubBuffer, "#else");
256 if ((ElsePtr) &&
257 (EndifPtr > ElsePtr))
258 {
259 /* This #ifdef contains an #else clause */
260 /* Find end of this line */
261
262 SubBuffer = AsSkipPastChar (ElsePtr, '\n');
263 if (!SubBuffer)
264 {
265 return;
266 }
267
268 /* Remove the #ifdef .... #else code */
269
270 AsRemoveData (SubString, SubBuffer);
271
272 /* Next, we will remove the #endif statement */
273
274 EndifPtr = strstr (SubString, "#endif");
275 if (!EndifPtr)
276 {
277 /* There has to be an #endif */
278
279 return;
280 }
281
282 SubString = EndifPtr;
283 }
284
285 /* Remove the ... #endif part */
286 /* Find end of this line */
287
288 SubBuffer = AsSkipPastChar (EndifPtr, '\n');
289 if (!SubBuffer)
290 {
291 return;
292 }
293
294 /* Remove the lines */
295
296 SubBuffer = AsRemoveData (SubString, SubBuffer);
297 }
298 }
299
300
301 #ifdef _OBSOLETE_FUNCTIONS
302 /******************************************************************************
303 *
304 * FUNCTION: AsRemoveMacro
305 *
306 * DESCRIPTION: Remove every line that contains the keyword. Does not
307 * skip comments.
308 *
309 ******************************************************************************/
310
311 NOTE: This function is no longer used and is commented out for now.
312
313 Also, it appears to have one or more bugs in it. It can incorrectly remove
314 lines of code, producing some garbage.
315
316 void
317 AsRemoveMacro (
318 char *Buffer,
319 char *Keyword)
320 {
321 char *SubString;
322 char *SubBuffer;
323 int NestLevel;
324
325
326 SubBuffer = Buffer;
327 SubString = Buffer;
328
329 while (SubString)
330 {
331 SubString = strstr (SubBuffer, Keyword);
332
333 if (SubString)
334 {
335 SubBuffer = SubString;
336
337 /* Find start of the macro parameters */
338
339 while (*SubString != '(')
340 {
341 SubString++;
342 }
343 SubString++;
344
345 /* Remove the macro name and opening paren */
346
347 SubString = AsRemoveData (SubBuffer, SubString);
348
349 NestLevel = 1;
350 while (*SubString)
351 {
352 if (*SubString == '(')
353 {
354 NestLevel++;
355 }
356 else if (*SubString == ')')
357 {
358 NestLevel--;
359 }
360
361 SubString++;
362
363 if (NestLevel == 0)
364 {
365 break;
366 }
367 }
368
369 /* Remove the closing paren */
370
371 SubBuffer = AsRemoveData (SubString-1, SubString);
372 }
373 }
374 }
375 #endif
376
377 /******************************************************************************
378 *
379 * FUNCTION: AsRemoveLine
380 *
381 * DESCRIPTION: Remove every line that contains the keyword. Does not
382 * skip comments.
383 *
384 ******************************************************************************/
385
386 void
387 AsRemoveLine (
388 char *Buffer,
389 char *Keyword)
390 {
391 char *SubString;
392 char *SubBuffer;
393
394
395 SubBuffer = Buffer;
396 SubString = Buffer;
397
398 while (SubString)
399 {
400 SubString = strstr (SubBuffer, Keyword);
401
402 if (SubString)
403 {
404 SubBuffer = SubString;
405
406 /* Find start of this line */
407
408 while (*SubString != '\n')
409 {
410 SubString--;
411 }
412 SubString++;
413
414 /* Find end of this line */
415
416 SubBuffer = AsSkipPastChar (SubBuffer, '\n');
417 if (!SubBuffer)
418 {
419 return;
420 }
421
422 /* Remove the line */
423
424 SubBuffer = AsRemoveData (SubString, SubBuffer);
425 }
426 }
427 }
428
429
430 /******************************************************************************
431 *
432 * FUNCTION: AsReduceTypedefs
433 *
434 * DESCRIPTION: Eliminate certain typedefs
435 *
436 ******************************************************************************/
437
438 void
439 AsReduceTypedefs (
440 char *Buffer,
441 char *Keyword)
442 {
443 char *SubString;
444 char *SubBuffer;
445 int NestLevel;
446
447
448 SubBuffer = Buffer;
449 SubString = Buffer;
450
451 while (SubString)
452 {
453 SubString = strstr (SubBuffer, Keyword);
454
455 if (SubString)
456 {
457 /* Remove the typedef itself */
458
459 SubBuffer = SubString + strlen ("typedef") + 1;
460 SubBuffer = AsRemoveData (SubString, SubBuffer);
461
462 /* Find the opening brace of the struct or union */
463
464 while (*SubString != '{')
465 {
466 SubString++;
467 }
468 SubString++;
469
470 /* Find the closing brace. Handles nested braces */
471
472 NestLevel = 1;
473 while (*SubString)
474 {
475 if (*SubString == '{')
476 {
477 NestLevel++;
478 }
479 else if (*SubString == '}')
480 {
481 NestLevel--;
482 }
483
484 SubString++;
485
486 if (NestLevel == 0)
487 {
488 break;
489 }
490 }
491
492 /* Remove an extra line feed if present */
493
494 if (!strncmp (SubString - 3, "\n\n", 2))
495 {
496 *(SubString -2) = '}';
497 SubString--;
498 }
499
500 /* Find the end of the typedef name */
501
502 SubBuffer = AsSkipUntilChar (SubString, ';');
503
504 /* And remove the typedef name */
505
506 SubBuffer = AsRemoveData (SubString, SubBuffer);
507 }
508 }
509 }
510
511
512 /******************************************************************************
513 *
514 * FUNCTION: AsRemoveEmptyBlocks
515 *
516 * DESCRIPTION: Remove any C blocks (e.g., if {}) that contain no code. This
517 * can happen as a result of removing lines such as DEBUG_PRINT.
518 *
519 ******************************************************************************/
520
521 void
522 AsRemoveEmptyBlocks (
523 char *Buffer,
524 char *Filename)
525 {
526 char *SubBuffer;
527 char *BlockStart;
528 BOOLEAN EmptyBlock = TRUE;
529 BOOLEAN AnotherPassRequired = TRUE;
530 UINT32 BlockCount = 0;
531
532
533 while (AnotherPassRequired)
534 {
535 SubBuffer = Buffer;
536 AnotherPassRequired = FALSE;
537
538 while (*SubBuffer)
539 {
540 if (*SubBuffer == '{')
541 {
542 BlockStart = SubBuffer;
543 EmptyBlock = TRUE;
544
545 SubBuffer++;
546 while (*SubBuffer != '}')
547 {
548 if ((*SubBuffer != ' ') &&
549 (*SubBuffer != '\n'))
550 {
551 EmptyBlock = FALSE;
552 break;
553 }
554
555 SubBuffer++;
556 }
557
558 if (EmptyBlock)
559 {
560 /* Find start of the first line of the block */
561
562 while (*BlockStart != '\n')
563 {
564 BlockStart--;
565 }
566
567 /* Find end of the last line of the block */
568
569 SubBuffer = AsSkipUntilChar (SubBuffer, '\n');
570 if (!SubBuffer)
571 {
572 break;
573 }
574
575 /* Remove the block */
576
577 SubBuffer = AsRemoveData (BlockStart, SubBuffer);
578 BlockCount++;
579 AnotherPassRequired = TRUE;
580 continue;
581 }
582 }
583
584 SubBuffer++;
585 }
586 }
587
588 if (BlockCount)
589 {
590 Gbl_MadeChanges = TRUE;
591 AsPrint ("Code blocks deleted", BlockCount, Filename);
592 }
593 }
594
595
596 /******************************************************************************
597 *
598 * FUNCTION: AsRemoveDebugMacros
599 *
600 * DESCRIPTION: Remove all "Debug" macros -- macros that produce debug output.
601 *
602 ******************************************************************************/
603
604 void
605 AsRemoveDebugMacros (
606 char *Buffer)
607 {
608 AsRemoveConditionalCompile (Buffer, "ACPI_DEBUG_OUTPUT");
609
610 AsRemoveStatement (Buffer, "ACPI_DEBUG_PRINT", REPLACE_WHOLE_WORD);
611 AsRemoveStatement (Buffer, "ACPI_DEBUG_PRINT_RAW", REPLACE_WHOLE_WORD);
612 AsRemoveStatement (Buffer, "DEBUG_EXEC", REPLACE_WHOLE_WORD);
613 AsRemoveStatement (Buffer, "FUNCTION_ENTRY", REPLACE_WHOLE_WORD);
614 AsRemoveStatement (Buffer, "PROC_NAME", REPLACE_WHOLE_WORD);
615 AsRemoveStatement (Buffer, "FUNCTION_TRACE", REPLACE_SUBSTRINGS);
616 AsRemoveStatement (Buffer, "DUMP_", REPLACE_SUBSTRINGS);
617
618 AsReplaceString ("return_VOID", "return", REPLACE_WHOLE_WORD, Buffer);
619 AsReplaceString ("return_PTR", "return", REPLACE_WHOLE_WORD, Buffer);
620 AsReplaceString ("return_STR", "return", REPLACE_WHOLE_WORD, Buffer);
621 AsReplaceString ("return_ACPI_STATUS", "return", REPLACE_WHOLE_WORD, Buffer);
622 AsReplaceString ("return_acpi_status", "return", REPLACE_WHOLE_WORD, Buffer);
623 AsReplaceString ("return_VALUE", "return", REPLACE_WHOLE_WORD, Buffer);
624 }
625
626
627 /******************************************************************************
628 *
629 * FUNCTION: AsCleanupSpecialMacro
630 *
631 * DESCRIPTION: For special macro invocations (invoked without ";" at the end
632 * of the lines), do the following:
633 * 1. Remove spaces appended by indent at the beginning of lines.
634 * 2. Add an empty line between two special macro invocations.
635 *
636 ******************************************************************************/
637
638 void
639 AsCleanupSpecialMacro (
640 char *Buffer,
641 char *Keyword)
642 {
643 char *SubString;
644 char *SubBuffer;
645 char *CommentEnd;
646 int NewLine;
647 int NestLevel;
648
649
650 SubBuffer = Buffer;
651 SubString = Buffer;
652
653 while (SubString)
654 {
655 SubString = strstr (SubBuffer, Keyword);
656
657 if (SubString)
658 {
659 /* Find start of the macro parameters */
660
661 while (*SubString != '(')
662 {
663 SubString++;
664 }
665
666 SubString++;
667
668 NestLevel = 1;
669 while (*SubString)
670 {
671 if (*SubString == '(')
672 {
673 NestLevel++;
674 }
675 else if (*SubString == ')')
676 {
677 NestLevel--;
678 }
679
680 SubString++;
681
682 if (NestLevel == 0)
683 {
684 break;
685 }
686 }
687
688 SkipLine:
689
690 /* Find end of the line */
691
692 NewLine = FALSE;
693 while (!NewLine && *SubString)
694 {
695 if (*SubString == '\n' && *(SubString - 1) != '\\')
696 {
697 NewLine = TRUE;
698 }
699
700 SubString++;
701 }
702
703 /* Find end of the line */
704
705 if (*SubString == '#' || *SubString == '\n')
706 {
707 goto SkipLine;
708 }
709
710 SubBuffer = SubString;
711
712 /* Find start of the non-space */
713
714 while (*SubString == ' ')
715 {
716 SubString++;
717 }
718
719 /* Find end of the line */
720
721 if (*SubString == '#' || *SubString == '\n')
722 {
723 goto SkipLine;
724 }
725
726 /* Find end of the line */
727
728 if (*SubString == '/' || *SubString == '*')
729 {
730 CommentEnd = strstr (SubString, "*/");
731 if (CommentEnd)
732 {
733 SubString = CommentEnd + 2;
734 goto SkipLine;
735 }
736 }
737
738 SubString = AsRemoveData (SubBuffer, SubString);
739 }
740 }
741 }
742