ascase.c revision 1.1.1.3 1 /******************************************************************************
2 *
3 * Module Name: ascase - Source conversion - lower/upper case utilities
4 *
5 *****************************************************************************/
6
7 /*
8 * Copyright (C) 2000 - 2013, 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 AsUppercaseTokens (
50 char *Buffer,
51 char *PrefixString);
52
53
54 /******************************************************************************
55 *
56 * FUNCTION: AsLowerCaseString
57 *
58 * DESCRIPTION: LowerCase all instances of a target string with a replacement
59 * string. Returns count of the strings replaced.
60 *
61 ******************************************************************************/
62
63 int
64 AsLowerCaseString (
65 char *Target,
66 char *Buffer)
67 {
68 char *SubString1;
69 char *SubString2;
70 char *SubBuffer;
71 int TargetLength;
72 int LowerCaseCount = 0;
73 int i;
74
75
76 TargetLength = strlen (Target);
77
78 SubBuffer = Buffer;
79 SubString1 = Buffer;
80
81 while (SubString1)
82 {
83 /* Find the target string */
84
85 SubString1 = strstr (SubBuffer, Target);
86 if (!SubString1)
87 {
88 return (LowerCaseCount);
89 }
90
91 /*
92 * Check for translation escape string -- means to ignore
93 * blocks of code while replacing
94 */
95 if (Gbl_IgnoreTranslationEscapes)
96 {
97 SubString2 = NULL;
98 }
99 else
100 {
101 SubString2 = strstr (SubBuffer, AS_START_IGNORE);
102 }
103
104 if ((SubString2) &&
105 (SubString2 < SubString1))
106 {
107 /* Find end of the escape block starting at "Substring2" */
108
109 SubString2 = strstr (SubString2, AS_STOP_IGNORE);
110 if (!SubString2)
111 {
112 /* Didn't find terminator */
113
114 return (LowerCaseCount);
115 }
116
117 /* Move buffer to end of escape block and continue */
118
119 SubBuffer = SubString2;
120 }
121
122 /* Do the actual replace if the target was found */
123
124 else
125 {
126 if (!AsMatchExactWord (SubString1, TargetLength))
127 {
128 SubBuffer = SubString1 + 1;
129 continue;
130 }
131
132 for (i = 0; i < TargetLength; i++)
133 {
134 SubString1[i] = (char) tolower ((int) SubString1[i]);
135 }
136
137 SubBuffer = SubString1 + TargetLength;
138
139 if ((Gbl_WidenDeclarations) && (!Gbl_StructDefs))
140 {
141 if ((SubBuffer[0] == ' ') && (SubBuffer[1] == ' '))
142 {
143 AsInsertData (SubBuffer, " ", 8);
144 }
145 }
146
147 LowerCaseCount++;
148 }
149 }
150
151 return (LowerCaseCount);
152 }
153
154
155 /******************************************************************************
156 *
157 * FUNCTION: AsMixedCaseToUnderscores
158 *
159 * DESCRIPTION: Converts mixed case identifiers to underscored identifiers.
160 * for example,
161 *
162 * ThisUsefullyNamedIdentifier becomes:
163 *
164 * this_usefully_named_identifier
165 *
166 ******************************************************************************/
167
168 void
169 AsMixedCaseToUnderscores (
170 char *Buffer,
171 char *Filename)
172 {
173 UINT32 Length;
174 char *SubBuffer = Buffer;
175 char *TokenEnd;
176 char *TokenStart = NULL;
177 char *SubString;
178 UINT32 LineNumber = 1;
179 UINT32 Count;
180
181
182 /*
183 * Examine the entire buffer (contains the entire file)
184 * We are only interested in these tokens:
185 * Escape sequences - ignore entire sequence
186 * Single-quoted constants - ignore
187 * Quoted strings - ignore entire string
188 * Translation escape - starts with /,*,!
189 * Decimal and hex numeric constants - ignore entire token
190 * Entire uppercase token - ignore, it is a macro or define
191 * Starts with underscore, then a lowercase or digit: convert
192 */
193 while (*SubBuffer)
194 {
195 if (*SubBuffer == '\n')
196 {
197 LineNumber++;
198 SubBuffer++;
199 continue;
200 }
201
202 /* Ignore standard escape sequences (\n, \r, etc.) Not Hex or Octal escapes */
203
204 if (*SubBuffer == '\\')
205 {
206 SubBuffer += 2;
207 continue;
208 }
209
210 /* Ignore single-quoted characters */
211
212 if (*SubBuffer == '\'')
213 {
214 SubBuffer += 3;
215 continue;
216 }
217
218 /* Ignore standard double-quoted strings */
219
220 if (*SubBuffer == '"')
221 {
222 SubBuffer++;
223 Count = 0;
224 while (*SubBuffer != '"')
225 {
226 Count++;
227 if ((!*SubBuffer) ||
228 (Count > 8192))
229 {
230 printf ("Found an unterminated quoted string!, line %u: %s\n",
231 LineNumber, Filename);
232 return;
233 }
234
235 /* Handle escape sequences */
236
237 if (*SubBuffer == '\\')
238 {
239 SubBuffer++;
240 }
241
242 SubBuffer++;
243 }
244 SubBuffer++;
245 continue;
246 }
247
248 /*
249 * Check for translation escape string. It means to ignore
250 * blocks of code during this code conversion.
251 */
252 if ((SubBuffer[0] == '/') &&
253 (SubBuffer[1] == '*') &&
254 (SubBuffer[2] == '!'))
255 {
256 SubBuffer = strstr (SubBuffer, "!*/");
257 if (!SubBuffer)
258 {
259 printf ("Found an unterminated translation escape!, line %u: %s\n",
260 LineNumber, Filename);
261 return;
262 }
263 continue;
264 }
265
266 /* Ignore anything that starts with a number (0-9) */
267
268 if (isdigit ((int) *SubBuffer))
269 {
270 /* Ignore hex constants */
271
272 if ((SubBuffer[0] == '0') &&
273 ((SubBuffer[1] == 'x') || (SubBuffer[1] == 'X')))
274 {
275 SubBuffer += 2;
276 }
277
278 /* Skip over all digits, both decimal and hex */
279
280 while (isxdigit ((int) *SubBuffer))
281 {
282 SubBuffer++;
283 }
284 TokenStart = NULL;
285 continue;
286 }
287
288 /*
289 * Check for fully upper case identifiers. These are usually macros
290 * or defines. Allow decimal digits and embedded underscores.
291 */
292 if (isupper ((int) *SubBuffer))
293 {
294 SubString = SubBuffer + 1;
295 while ((isupper ((int) *SubString)) ||
296 (isdigit ((int) *SubString)) ||
297 (*SubString == '_'))
298 {
299 SubString++;
300 }
301
302 /*
303 * For the next character, anything other than a lower case
304 * means that the identifier has terminated, and contains
305 * exclusively Uppers/Digits/Underscores. Ignore the entire
306 * identifier.
307 */
308 if (!islower ((int) *SubString))
309 {
310 SubBuffer = SubString + 1;
311 continue;
312 }
313 }
314
315 /*
316 * These forms may indicate an identifier that can be converted:
317 * <UpperCase><LowerCase> (Ax)
318 * <UpperCase><Number> (An)
319 */
320 if (isupper ((int) SubBuffer[0]) &&
321 ((islower ((int) SubBuffer[1])) || isdigit ((int) SubBuffer[1])))
322 {
323 TokenStart = SubBuffer;
324 SubBuffer++;
325
326 while (1)
327 {
328 /* Walk over the lower case letters and decimal digits */
329
330 while (islower ((int) *SubBuffer) ||
331 isdigit ((int) *SubBuffer))
332 {
333 SubBuffer++;
334 }
335
336 /* Check for end of line or end of token */
337
338 if (*SubBuffer == '\n')
339 {
340 LineNumber++;
341 break;
342 }
343
344 if (*SubBuffer == ' ')
345 {
346 /* Check for form "Axx - " in a parameter header description */
347
348 while (*SubBuffer == ' ')
349 {
350 SubBuffer++;
351 }
352
353 SubBuffer--;
354 if ((SubBuffer[1] == '-') &&
355 (SubBuffer[2] == ' '))
356 {
357 if (TokenStart)
358 {
359 *TokenStart = (char) tolower ((int) *TokenStart);
360 }
361 }
362 break;
363 }
364
365 /*
366 * Ignore these combinations:
367 * <Letter><Digit><UpperCase>
368 * <Digit><Digit><UpperCase>
369 * <Underscore><Digit><UpperCase>
370 */
371 if (isdigit ((int) *SubBuffer))
372 {
373 if (isalnum ((int) *(SubBuffer-1)) ||
374 *(SubBuffer-1) == '_')
375 {
376 break;
377 }
378 }
379
380 /* Ignore token if next character is not uppercase or digit */
381
382 if (!isupper ((int) *SubBuffer) &&
383 !isdigit ((int) *SubBuffer))
384 {
385 break;
386 }
387
388 /*
389 * Form <UpperCase><LowerCaseLetters><UpperCase> (AxxB):
390 * Convert leading character of the token to lower case
391 */
392 if (TokenStart)
393 {
394 *TokenStart = (char) tolower ((int) *TokenStart);
395 TokenStart = NULL;
396 }
397
398 /* Find the end of this identifier (token) */
399
400 TokenEnd = SubBuffer - 1;
401 while ((isalnum ((int) *TokenEnd)) ||
402 (*TokenEnd == '_'))
403 {
404 TokenEnd++;
405 }
406
407 SubString = TokenEnd;
408 Length = 0;
409
410 while (*SubString != '\n')
411 {
412 /*
413 * If we have at least two trailing spaces, we can get rid of
414 * one to make up for the newly inserted underscore. This will
415 * help preserve the alignment of the text
416 */
417 if ((SubString[0] == ' ') &&
418 (SubString[1] == ' '))
419 {
420 Length = SubString - SubBuffer - 1;
421 break;
422 }
423
424 SubString++;
425 }
426
427 if (!Length)
428 {
429 Length = strlen (&SubBuffer[0]);
430 }
431
432 /*
433 * Within this identifier, convert this pair of letters that
434 * matches the form:
435 *
436 * <LowerCase><UpperCase>
437 * to
438 * <LowerCase><Underscore><LowerCase>
439 */
440 Gbl_MadeChanges = TRUE;
441
442 /* Insert the underscore */
443
444 memmove (&SubBuffer[1], &SubBuffer[0], Length + 1);
445 SubBuffer[0] = '_';
446
447 /*
448 * If we have <UpperCase><UpperCase>, leave them as-is
449 * Enables transforms like:
450 * LocalFADT -> local_FADT
451 */
452 if (isupper ((int) SubBuffer[2]))
453 {
454 SubBuffer += 1;
455 break;
456 }
457
458 /* Lower case the original upper case letter */
459
460 SubBuffer[1] = (char) tolower ((int) SubBuffer[1]);
461 SubBuffer += 2;
462 }
463 }
464
465 SubBuffer++;
466 }
467 }
468
469
470 /******************************************************************************
471 *
472 * FUNCTION: AsLowerCaseIdentifiers
473 *
474 * DESCRIPTION: Converts mixed case identifiers to lower case. Leaves comments,
475 * quoted strings, and all-upper-case macros alone.
476 *
477 ******************************************************************************/
478
479 void
480 AsLowerCaseIdentifiers (
481 char *Buffer)
482 {
483 char *SubBuffer = Buffer;
484
485
486 while (*SubBuffer)
487 {
488 /*
489 * Check for translation escape string -- means to ignore
490 * blocks of code while replacing
491 */
492 if ((SubBuffer[0] == '/') &&
493 (SubBuffer[1] == '*') &&
494 (SubBuffer[2] == '!'))
495 {
496 SubBuffer = strstr (SubBuffer, "!*/");
497 if (!SubBuffer)
498 {
499 return;
500 }
501 }
502
503 /* Ignore comments */
504
505 if ((SubBuffer[0] == '/') &&
506 (SubBuffer[1] == '*'))
507 {
508 SubBuffer = strstr (SubBuffer, "*/");
509 if (!SubBuffer)
510 {
511 return;
512 }
513
514 SubBuffer += 2;
515 }
516
517 /* Ignore quoted strings */
518
519 if ((SubBuffer[0] == '\"') && (SubBuffer[1] != '\''))
520 {
521 SubBuffer++;
522
523 /* Find the closing quote */
524
525 while (SubBuffer[0])
526 {
527 /* Ignore escaped quote characters */
528
529 if (SubBuffer[0] == '\\')
530 {
531 SubBuffer++;
532 }
533 else if (SubBuffer[0] == '\"')
534 {
535 SubBuffer++;
536 break;
537 }
538 SubBuffer++;
539 }
540 }
541
542 if (!SubBuffer[0])
543 {
544 return;
545 }
546
547 /*
548 * Only lower case if we have an upper followed by a lower
549 * This leaves the all-uppercase things (macros, etc.) intact
550 */
551 if ((isupper ((int) SubBuffer[0])) &&
552 (islower ((int) SubBuffer[1])))
553 {
554 Gbl_MadeChanges = TRUE;
555 *SubBuffer = (char) tolower ((int) *SubBuffer);
556 }
557
558 SubBuffer++;
559 }
560 }
561
562
563 /******************************************************************************
564 *
565 * FUNCTION: AsUppercaseTokens
566 *
567 * DESCRIPTION: Force to uppercase all tokens that begin with the prefix string.
568 * used to convert mixed-case macros and constants to uppercase.
569 *
570 ******************************************************************************/
571
572 void
573 AsUppercaseTokens (
574 char *Buffer,
575 char *PrefixString)
576 {
577 char *SubBuffer;
578 char *TokenEnd;
579 char *SubString;
580 int i;
581 UINT32 Length;
582
583
584 SubBuffer = Buffer;
585
586 while (SubBuffer)
587 {
588 SubBuffer = strstr (SubBuffer, PrefixString);
589 if (SubBuffer)
590 {
591 TokenEnd = SubBuffer;
592 while ((isalnum ((int) *TokenEnd)) || (*TokenEnd == '_'))
593 {
594 TokenEnd++;
595 }
596
597 for (i = 0; i < (TokenEnd - SubBuffer); i++)
598 {
599 if ((islower ((int) SubBuffer[i])) &&
600 (isupper ((int) SubBuffer[i+1])))
601 {
602
603 SubString = TokenEnd;
604 Length = 0;
605
606 while (*SubString != '\n')
607 {
608 if ((SubString[0] == ' ') &&
609 (SubString[1] == ' '))
610 {
611 Length = SubString - &SubBuffer[i] - 2;
612 break;
613 }
614
615 SubString++;
616 }
617
618 if (!Length)
619 {
620 Length = strlen (&SubBuffer[i+1]);
621 }
622
623 memmove (&SubBuffer[i+2], &SubBuffer[i+1], (Length+1));
624 SubBuffer[i+1] = '_';
625 i +=2;
626 TokenEnd++;
627 }
628 }
629
630 for (i = 0; i < (TokenEnd - SubBuffer); i++)
631 {
632 SubBuffer[i] = (char) toupper ((int) SubBuffer[i]);
633 }
634
635 SubBuffer = TokenEnd;
636 }
637 }
638 }
639