void AsRemoveMacro ( char *Buffer, char *Keyword) { char *SubString; char *SubBuffer; int NestLevel; SubBuffer = Buffer; SubString = Buffer; while (SubString) { SubString = strstr (SubBuffer, Keyword); if (SubString) { SubBuffer = SubString; /* Find start of the macro parameters */ while (*SubString != '(') { SubString++; } SubString++; /* Remove the macro name and opening paren */ SubString = AsRemoveData (SubBuffer, SubString); NestLevel = 1; while (*SubString) { if (*SubString == '(') { NestLevel++; } else if (*SubString == ')') { NestLevel--; } SubString++; if (NestLevel == 0) { break; } } /* Remove the closing paren */ SubBuffer = AsRemoveData (SubString-1, SubString); } } }
void AsRemoveExtraLines ( char *FileBuffer, char *Filename) { char *FileEnd; int Length; /* Remove any extra lines at the start of the file */ while (*FileBuffer == '\n') { printf ("Removing extra line at start of file: %s\n", Filename); AsRemoveData (FileBuffer, FileBuffer + 1); } /* Remove any extra lines at the end of the file */ Length = strlen (FileBuffer); FileEnd = FileBuffer + (Length - 2); while (*FileEnd == '\n') { printf ("Removing extra line at end of file: %s\n", Filename); AsRemoveData (FileEnd, FileEnd + 1); FileEnd--; } }
void AsTrimLines ( char *Buffer, char *Filename) { char *SubBuffer = Buffer; char *StartWhiteSpace = NULL; UINT32 SpaceCount = 0; while (*SubBuffer) { while (*SubBuffer != '\n') { if (!*SubBuffer) { goto Exit; } if (*SubBuffer == ' ') { if (!StartWhiteSpace) { StartWhiteSpace = SubBuffer; } } else { StartWhiteSpace = NULL; } SubBuffer++; } if (StartWhiteSpace) { SpaceCount += (SubBuffer - StartWhiteSpace); /* Remove the spaces */ SubBuffer = AsRemoveData (StartWhiteSpace, SubBuffer); StartWhiteSpace = NULL; } SubBuffer++; } Exit: if (SpaceCount) { Gbl_MadeChanges = TRUE; AsPrint ("Extraneous spaces removed", SpaceCount, Filename); } }
void AsRemoveLine ( char *Buffer, char *Keyword) { char *SubString; char *SubBuffer; SubBuffer = Buffer; SubString = Buffer; while (SubString) { SubString = strstr (SubBuffer, Keyword); if (SubString) { SubBuffer = SubString; /* Find start of this line */ while (*SubString != '\n') { SubString--; } SubString++; /* Find end of this line */ SubBuffer = AsSkipPastChar (SubBuffer, '\n'); if (!SubBuffer) { return; } /* Remove the line */ SubBuffer = AsRemoveData (SubString, SubBuffer); } } }
void AsTabify8 ( char *Buffer) { char *SubBuffer = Buffer; char *NewSubBuffer; char *CommentEnd = NULL; UINT32 SpaceCount = 0; UINT32 Column = 0; UINT32 TabCount = 0; UINT32 LastLineTabCount = 0; UINT32 LastLineColumnStart = 0; UINT32 ThisColumnStart = 0; UINT32 ThisTabCount = 0; char *FirstNonBlank = NULL; while (*SubBuffer) { if (*SubBuffer == '\n') { /* This is a standalone blank line */ FirstNonBlank = NULL; Column = 0; SpaceCount = 0; TabCount = 0; SubBuffer++; continue; } if (!FirstNonBlank) { /* Find the first non-blank character on this line */ FirstNonBlank = SubBuffer; while (*FirstNonBlank == ' ') { FirstNonBlank++; } /* * This mechanism limits the difference in tab counts from * line to line. It helps avoid the situation where a second * continuation line (which was indented correctly for tabs=4) would * get indented off the screen if we just blindly converted to tabs. */ ThisColumnStart = FirstNonBlank - SubBuffer; if (LastLineTabCount == 0) { ThisTabCount = 0; } else if (ThisColumnStart == LastLineColumnStart) { ThisTabCount = LastLineTabCount -1; } else { ThisTabCount = LastLineTabCount + 1; } } Column++; /* Check if we are in a comment */ if ((SubBuffer[0] == '*') && (SubBuffer[1] == '/')) { SpaceCount = 0; SubBuffer += 2; if (*SubBuffer == '\n') { if (TabCount > 0) { LastLineTabCount = TabCount; TabCount = 0; } FirstNonBlank = NULL; LastLineColumnStart = ThisColumnStart; SubBuffer++; } continue; } /* Check for comment open */ if ((SubBuffer[0] == '/') && (SubBuffer[1] == '*')) { /* Find the end of the comment, it must exist */ CommentEnd = strstr (SubBuffer, "*/"); if (!CommentEnd) { return; } /* Toss the rest of this line or single-line comment */ while ((SubBuffer < CommentEnd) && (*SubBuffer != '\n')) { SubBuffer++; } if (*SubBuffer == '\n') { if (TabCount > 0) { LastLineTabCount = TabCount; TabCount = 0; } FirstNonBlank = NULL; LastLineColumnStart = ThisColumnStart; } SpaceCount = 0; continue; } /* Ignore quoted strings */ if ((!CommentEnd) && (*SubBuffer == '\"')) { SubBuffer++; SubBuffer = AsSkipPastChar (SubBuffer, '\"'); if (!SubBuffer) { return; } SpaceCount = 0; } if (*SubBuffer != ' ') { /* Not a space, skip to end of line */ SubBuffer = AsSkipUntilChar (SubBuffer, '\n'); if (!SubBuffer) { return; } if (TabCount > 0) { LastLineTabCount = TabCount; TabCount = 0; } FirstNonBlank = NULL; LastLineColumnStart = ThisColumnStart; Column = 0; SpaceCount = 0; } else { /* Another space */ SpaceCount++; if (SpaceCount >= 4) { /* Replace this group of spaces with a tab character */ SpaceCount = 0; NewSubBuffer = SubBuffer - 3; if (TabCount <= ThisTabCount ? (ThisTabCount +1) : 0) { *NewSubBuffer = '\t'; NewSubBuffer++; SubBuffer++; TabCount++; } /* Remove the spaces */ SubBuffer = AsRemoveData (NewSubBuffer, SubBuffer); continue; } } SubBuffer++; } }
void AsTabify4 ( char *Buffer) { char *SubBuffer = Buffer; char *NewSubBuffer; UINT32 SpaceCount = 0; UINT32 Column = 0; while (*SubBuffer) { if (*SubBuffer == '\n') { Column = 0; } else { Column++; } /* Ignore comments */ if ((SubBuffer[0] == '/') && (SubBuffer[1] == '*')) { SubBuffer = strstr (SubBuffer, "*/"); if (!SubBuffer) { return; } SubBuffer += 2; continue; } /* Ignore quoted strings */ if (*SubBuffer == '\"') { SubBuffer++; SubBuffer = AsSkipPastChar (SubBuffer, '\"'); if (!SubBuffer) { return; } SpaceCount = 0; } if (*SubBuffer == ' ') { SpaceCount++; if (SpaceCount >= 4) { SpaceCount = 0; NewSubBuffer = (SubBuffer + 1) - 4; *NewSubBuffer = '\t'; NewSubBuffer++; /* Remove the spaces */ SubBuffer = AsRemoveData (NewSubBuffer, SubBuffer + 1); } if ((Column % 4) == 0) { SpaceCount = 0; } } else { SpaceCount = 0; } SubBuffer++; } }
void AsRemoveEmptyBlocks ( char *Buffer, char *Filename) { char *SubBuffer; char *BlockStart; BOOLEAN EmptyBlock = TRUE; BOOLEAN AnotherPassRequired = TRUE; UINT32 BlockCount = 0; while (AnotherPassRequired) { SubBuffer = Buffer; AnotherPassRequired = FALSE; while (*SubBuffer) { if (*SubBuffer == '{') { BlockStart = SubBuffer; EmptyBlock = TRUE; SubBuffer++; while (*SubBuffer != '}') { if ((*SubBuffer != ' ') && (*SubBuffer != '\n')) { EmptyBlock = FALSE; break; } SubBuffer++; } if (EmptyBlock) { /* Find start of the first line of the block */ while (*BlockStart != '\n') { BlockStart--; } /* Find end of the last line of the block */ SubBuffer = AsSkipUntilChar (SubBuffer, '\n'); if (!SubBuffer) { break; } /* Remove the block */ SubBuffer = AsRemoveData (BlockStart, SubBuffer); BlockCount++; AnotherPassRequired = TRUE; continue; } } SubBuffer++; } } if (BlockCount) { Gbl_MadeChanges = TRUE; AsPrint ("Code blocks deleted", BlockCount, Filename); } }
void AsReduceTypedefs ( char *Buffer, char *Keyword) { char *SubString; char *SubBuffer; int NestLevel; SubBuffer = Buffer; SubString = Buffer; while (SubString) { SubString = strstr (SubBuffer, Keyword); if (SubString) { /* Remove the typedef itself */ SubBuffer = SubString + strlen ("typedef") + 1; SubBuffer = AsRemoveData (SubString, SubBuffer); /* Find the opening brace of the struct or union */ while (*SubString != '{') { SubString++; } SubString++; /* Find the closing brace. Handles nested braces */ NestLevel = 1; while (*SubString) { if (*SubString == '{') { NestLevel++; } else if (*SubString == '}') { NestLevel--; } SubString++; if (NestLevel == 0) { break; } } /* Remove an extra line feed if present */ if (!strncmp (SubString - 3, "\n\n", 2)) { *(SubString -2) = '}'; SubString--; } /* Find the end of the typedef name */ SubBuffer = AsSkipUntilChar (SubString, ';'); /* And remove the typedef name */ SubBuffer = AsRemoveData (SubString, SubBuffer); } } }
void AsRemoveConditionalCompile ( char *Buffer, char *Keyword) { char *SubString; char *SubBuffer; char *IfPtr; char *EndifPtr; char *ElsePtr; char *Comment; int KeywordLength; KeywordLength = strlen (Keyword); SubBuffer = Buffer; SubString = Buffer; while (SubString) { SubBuffer = strstr (SubString, Keyword); if (!SubBuffer) { return; } /* * Check for translation escape string -- means to ignore * blocks of code while replacing */ Comment = strstr (SubString, AS_START_IGNORE); if ((Comment) && (Comment < SubBuffer)) { SubString = strstr (Comment, AS_STOP_IGNORE); if (!SubString) { return; } SubString += 3; continue; } /* Check for ordinary comment */ Comment = strstr (SubString, "/*"); if ((Comment) && (Comment < SubBuffer)) { SubString = strstr (Comment, "*/"); if (!SubString) { return; } SubString += 2; continue; } SubString = SubBuffer; if (!AsMatchExactWord (SubString, KeywordLength)) { SubString++; continue; } /* Find start of this line */ while (*SubString != '\n' && (SubString > Buffer)) { SubString--; } SubString++; /* Find the "#ifxxxx" */ IfPtr = strstr (SubString, "#if"); if (!IfPtr) { return; } if (IfPtr > SubBuffer) { /* Not the right #if */ SubString = SubBuffer + strlen (Keyword); continue; } /* Find closing #endif or #else */ EndifPtr = strstr (SubBuffer, "#endif"); if (!EndifPtr) { /* There has to be an #endif */ return; } ElsePtr = strstr (SubBuffer, "#else"); if ((ElsePtr) && (EndifPtr > ElsePtr)) { /* This #ifdef contains an #else clause */ /* Find end of this line */ SubBuffer = AsSkipPastChar (ElsePtr, '\n'); if (!SubBuffer) { return; } /* Remove the #ifdef .... #else code */ AsRemoveData (SubString, SubBuffer); /* Next, we will remove the #endif statement */ EndifPtr = strstr (SubString, "#endif"); if (!EndifPtr) { /* There has to be an #endif */ return; } SubString = EndifPtr; } /* Remove the ... #endif part */ /* Find end of this line */ SubBuffer = AsSkipPastChar (EndifPtr, '\n'); if (!SubBuffer) { return; } /* Remove the lines */ SubBuffer = AsRemoveData (SubString, SubBuffer); } }
void AsRemoveStatement ( char *Buffer, char *Keyword, UINT32 Type) { char *SubString; char *SubBuffer; int KeywordLength; KeywordLength = strlen (Keyword); SubBuffer = Buffer; SubString = Buffer; while (SubString) { SubString = strstr (SubBuffer, Keyword); if (SubString) { SubBuffer = SubString; if ((Type == REPLACE_WHOLE_WORD) && (!AsMatchExactWord (SubString, KeywordLength))) { SubBuffer++; continue; } /* Find start of this line */ while (*SubString != '\n') { SubString--; } SubString++; /* Find end of this statement */ SubBuffer = AsSkipPastChar (SubBuffer, ';'); if (!SubBuffer) { return; } /* Find end of this line */ SubBuffer = AsSkipPastChar (SubBuffer, '\n'); if (!SubBuffer) { return; } /* If next line is blank, remove it too */ if (*SubBuffer == '\n') { SubBuffer++; } /* Remove the lines */ SubBuffer = AsRemoveData (SubString, SubBuffer); } } }