static UINT32 AsCountLines ( char *Buffer, char *Filename) { char *SubBuffer = Buffer; char *EndOfLine; UINT32 LineCount = 0; UINT32 LongLineCount = 0; while (*SubBuffer) { EndOfLine = AsSkipUntilChar (SubBuffer, '\n'); if (!EndOfLine) { Gbl_TotalLines += LineCount; return (LineCount); } if ((EndOfLine - SubBuffer) > 80) { LongLineCount++; VERBOSE_PRINT (("long: %.80s\n", SubBuffer)); } LineCount++; SubBuffer = EndOfLine + 1; } if (LongLineCount) { VERBOSE_PRINT (("%u Lines longer than 80 found in %s\n", LongLineCount, Filename)); Gbl_LongLines += LongLineCount; } Gbl_TotalLines += LineCount; return (LineCount); }
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 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 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); } } }