|
25 Years of Programming
An open source source for C, C++, OWL, BASIC, MDB, XLS, DOT, and more... |
Home Projects Up Sitemap Search Blog Forum+Chat About Us Privacy Terms of Use Feedback FAQ Images Services Payments Humor Music |
Microsoft Word 6.0 WordBasic macros to reformat and beautify C, C++, and ASM source code filesThe CPROGRAM.DOT Microsoft Word 6.0 template contains several WordBasic macros that fix up, reformat, and beautify C, C++, and ASM source files. If you download the project here (cprogramdot60.zip, 18 KB), the code is already in the template. The main purpose of this template is its reformatting capabilities. You would normally:
There is also a Word 2003 version of CPROGRAM.DOT. |
Changes the case of comments in an assembly language program (comments marked with ;)
Sub MAIN
REM Macro ASMChangeCase
REM CHANGES CASE OF COMMENTS IN AN ASSEMBLY LANGUAGE PROGRAM SO THEY STAND OUT FROM THE CODE.
REM WHERE COMMENTS ARE MARKED WITH A SEMI-COLON (;) (SUCH AS MASM)
REM Copyright (C)1996, 1998, 2006 Steven Whitney.
REM Initially published by http://25yearsofprogramming.com.
REM Published under GNU GPL (General Public License) Version 3, with ABSOLUTELY NO WARRANTY.
REM 2-18-96, changes 10-1-98 to allow sentence case.
REM USER INPUT
Let casetype = 5
While ((casetype < 0) Or (casetype > 2))
casetype = Val(InputBox$("0=Sentence 1=lower 2=UPPER: ", "Change case of comments to...", "2"))
Wend
REM TEMPORARILY CHANGE THE DOCUMENT TO A TINY FONT, SO NONE OF THE DOCUMENT'S
REM LINES ARE WRAPPED TO A FOLLOWING LINE. IF THAT HAPPENS, THE WRAPPED
REM PORTION OF A COMMENT WOULD NOT BE CAUGHT AND CHANGED.
StartOfDocument
REM SAVE CURRENT SETTINGS:
oldfontname$ = Font$()
oldfontsize = FontSize()
REM CHANGE FONT TO ARIAL 8
EditSelectAll
Font "Arial", 8
REM SEARCH FOR ASM COMMENTS: ;
StartOfDocument
EditFindClearFormatting
EditFind .Find = ";", .Direction = 0, .MatchCase = 0, .WholeWord = 0, .PatternMatch = 0, .SoundsLike = 0, .Format = 0, .Wrap = 0
While EditFindFound()
EndOfLine 1
FormatChangeCase .Type = casetype
CharRight
RepeatFind
Wend
StartOfDocument
EditSelectAll
Font oldfontname$, oldfontsize
StartOfDocument
End Sub
C-style autoindenting when user types Ctrl+Enter.
Sub MAIN
REM 1-7-99 macro AUTOINDENT.
REM Copyright (C)1999, 2006 Steven Whitney.
REM Initially published by http://25yearsofprogramming.com.
REM Published under GNU GPL (General Public License) Version 3, with ABSOLUTELY NO WARRANTY.
REM WHEN USER TYPES CTRL+ENTER, MAINTAINS CURRENT INDENT
REM LEVEL FOR THE NEXT LINE, USING TABS, PLUS 1 IF THE LINE JUST FINISHED CONTAINED
REM AN OPENING { BUT NO CLOSING }.
REM YOU CAN'T ASSIGN A MACRO TO THE ENTER KEY.
REM *HOWEVER*, YOU CAN REMAP YOUR KEYBOARD (or assign macros) SO THAT
REM <ENTER> AND <CTRL>+<ENTER> ARE INTERCHANGED.
REM FOR NOW, I HAVE THIS ASSIGNED TO CTRL-ENTER.
REM not completely tested, but seems ok so far.
REM //////////////////////////////////////////////////////////////////////////////
REM IF THERE IS A SELECTION, JUST INSERT THE CR, SINCE USER WANTED TO REPLACE
REM THE SELECTION WITH A CR.
B = GetSelStartPos()
E = GetSelEndPos()
If B <> E Then
InsertPara
Goto bye
EndIf
CPMoved = StartOfLine(1)
A$ = Selection$()
REM IF ALREADY AT THE START OF THE LINE (& nothing was selected), DON'T CHAR RIGHT,
If CPMoved <> 0 Then CharRight
InsertPara
TabCount = CountLeadingTabs(A$) + OneMore(A$)
For I = 1 To TabCount
Insert Chr$(9)
Next I
bye:
End Sub
REM //////////////////////////////////////////////////////////////////////////////
Function CountLeadingTabs(A$)
Count = 0
I = 1
While I <= Len(A$)
If Mid$(A$, I, 1) = Chr$(9) Then
Count = Count + 1
Else REM first nontab ends search
I = Len(A$) REM force loop end next pass
EndIf
I = I + 1
Wend
CountLeadingTabs = Count
End Function
REM //////////////////////////////////////////////////////////////////////////////
Function OneMore(A$)
If InStr(A$, "{") > 0 And InStr(A$, "}") = 0 Then
OneMore = 1
Else
OneMore = 0
EndIf
End Function
This catches both /* */ and // styles of comments.
Sub MAIN
REM 2-18-96, changes 10-1-98 to allow sentence case.
REM Copyright (C)1996, 1998, 2006 Steven Whitney.
REM Initially published by http://25yearsofprogramming.com.
REM Published under GNU GPL (General Public License) Version 3, with ABSOLUTELY NO WARRANTY.
REM CHANGES CASE OF COMMENTS IN A C OR C++ PROGRAM.
REM LOWER OR SENTENCE CASE IS BEST WHILE WORKING ON A PROGRAM.
REM UPPER CASE SEPARATES COMMENTS FROM CODE WELL ON PRINTOUTS.
REM USER INPUT
Let casetype = 5
While ((casetype < 0) Or (casetype > 2))
casetype = Val(InputBox$("0=Sentence 1=lower 2=UPPER: ", "Change case of comments to...", "1"))
Wend
REM TEMPORARILY CHANGE THE DOCUMENT TO A TINY FONT, SO NONE OF THE DOCUMENT'S
REM LINES ARE WRAPPED TO A FOLLOWING LINE. IF THAT HAPPENS, THE WRAPPED
REM PORTION OF A // COMMENT WOULD NOT BE CAUGHT AND CHANGED.
StartOfDocument
REM SAVE CURRENT SETTINGS:
oldfontname$ = Font$()
oldfontsize = FontSize()
REM CHANGE FONT TO SMALL ARIAL
EditSelectAll
Font "Arial", 8
REM SEARCH FOR C STYLE COMMENTS: /* */
StartOfDocument
EditFindClearFormatting
EditFind .Find = "(/\*)*(\*/)", .Direction = 0, .MatchCase = 0, .WholeWord = 0, .PatternMatch = 1, .SoundsLike = 0, .Format = 0, .Wrap = 0
While EditFindFound()
FormatChangeCase .Type = casetype
RepeatFind
Wend
REM SEARCH FOR C++ STYLE COMMENTS: //
StartOfDocument
EditFindClearFormatting
EditFind .Find = "//", .Direction = 0, .MatchCase = 0, .WholeWord = 0, .PatternMatch = 0, .SoundsLike = 0, .Format = 0, .Wrap = 0
While EditFindFound()
EndOfLine 1
FormatChangeCase .Type = casetype
CharRight
RepeatFind
Wend
StartOfDocument
EditSelectAll
Font oldfontname$, oldfontsize
StartOfDocument
End Sub
Reformats the indenting, spacing, etc. into the style I prefer, which seems to be known as Allman or ANSI style.
Sub MAIN
REM MACRO FormatCPP
REM Copyright (C)1998, 1999, 2006 Steven Whitney.
REM Initially published by http://25yearsofprogramming.com.
REM This program is free software; you can redistribute it and/or
REM modify it under the terms of the GNU General Public License
REM Version 3 as published by the Free Software Foundation.
REM This program is distributed in the hope that it will be useful,
REM but WITHOUT ANY WARRANTY; without even the implied warranty of
REM MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
REM GNU General Public License for more details.
REM You should have received a copy of the GNU General Public License
REM along with this program; if not, write to the Free Software
REM Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
REM
REM I mainly used this to reformat the Borland example CPP files to the style I prefer,
REM to make them easier to study without being distracted by unfamiliar formatting.
REM started 12/3/98
REM LAST 1-30-99
REM 6-8-99 one file in Borland DIAGXPRT project caused endless loop, in declaration of a
REM bunch of static strings in nested braces (?)
REM Tested: attaching cprogram.dot, running this macro, and saving as text
REM results in a fully compilable source file. No extraneous garbage.
REM No additional editing required in Borland IDE.
REM THE VARIOUS STEPS IN THIS MACRO MUST BE DONE IN EXACTLY THE ORDER THEY ARE IN.
REM ----------------------------------------------------------------------------
REM ENSURE EXTEND MODE IS OFF WHEN STARTING.
REM IF THERE IS A SELECTION, THE FIRST STARTOFDOCUMENT CANCELS IT.
Cancel
TRUE = (1 = 1)
FALSE = Not TRUE
REM TRUE IF EVERYTHING COMPLETED WITHOUT ERROR OR ABORT
Completed = FALSE
REM ----------------------------------------------------------------------------
REM The string used for CR$ must not appear in the file.
REM if macro aborts, change it to something else here.
REM CR$ = "~~" 'for reference if CR$ is temporarily changed
Let CR$ = "~~"
REM ----------------------------------------------------------------------------
REM TEMPORARILY CHANGE THE DOCUMENT TO A TINY FONT, SO NONE OF THE DOCUMENT'S
REM LINES ARE WRAPPED TO A FOLLOWING LINE. IF THAT HAPPENS, SOME SEARCHES MAY FAIL.
REM SAVE CURRENT SETTINGS:
StartOfDocument 'ASSUMES WHOLE DOCUMENT IS SAME FONT
OldFontName$ = Font$()
OldFontSize = FontSize()
REM CHANGE FONT TO ARIAL 8
EditSelectAll
Font "Arial", 8
StartOfDocument 'THIS DOES CANCEL THE SELECTION
REM ----------------------------------------------------------------------------
REM 1. IF FILE ALREADY CONTAINS OUR SUBSTITUTE PARAGRAPH MARK, QUIT
StartOfDocument
EditFind .Find = CR$, .Direction = 0, .MatchCase = 1, .WholeWord = 0, .PatternMatch = 0, .SoundsLike = 0, .Format = 0, .Wrap = 1
If EditFindFound() Then
MsgBox("This file already contains the string that this macro temporarily substitutes for paragraph marks. You must modify the macro for use with this file.", "Cannot Run Macro", 64)
Goto bye
EndIf
REM ----------------------------------------------------------------------------
REM 2. CHANGE ALL TABS TO SPACES (so whitespace searches need only deal with spaces)
StartOfDocument
EditReplace .Find = "^t", .Replace = " ", .Direction = 0, .MatchCase = 1, .WholeWord = 0, .PatternMatch = 0, .SoundsLike = 0, .ReplaceAll, .Format = 0, .Wrap = 1
REM ----------------------------------------------------------------------------
REM 3. CHANGE ALL PARAGRAPH MARKS TO CR$ SO YOU CAN USE PATTERN MATCHING IN SEARCHES
StartOfDocument
EditReplace .Find = "^p", .Replace = CR$, .Direction = 0, .MatchCase = 1, .WholeWord = 0, .PatternMatch = 0, .SoundsLike = 0, .ReplaceAll, .Format = 0, .Wrap = 1
REM ----------------------------------------------------------------------------
REM 4. remove leading spaces in lines (indenting), by stripping spaces that follow CRs.
StripAllLeadingSpaces(CR$)
REM ----------------------------------------------------------------------------
REM ANY OF THESE THAT *SHOULD* BE ON THE SAME LINE ARE RESTORED LATER.
REM 5. MOVE ALL SAME-LINE { THAT IMMEDIATELY FOLLOW ( TO THE NEXT LINE DOWN
StartOfDocument
EditReplace .Find = "){", .Replace = ")" + CR$ + "{", .Direction = 0, .MatchCase = 1, .WholeWord = 0, .PatternMatch = 0, .SoundsLike = 0, .ReplaceAll, .Format = 0, .Wrap = 1
REM MOVE ALL SAME-LINE { CHARS THAT FOLLOW SPACES TO THE NEXT LINE DOWN
StartOfDocument
EditReplace .Find = " {1,}\{", .Replace = CR$ + "{", .Direction = 0, .MatchCase = 1, .WholeWord = 0, .PatternMatch = 1, .SoundsLike = 0, .ReplaceAll, .Format = 0, .Wrap = 1
REM ----------------------------------------------------------------------------
REM 6. SEPARATE }ELSE TO SEPARATE LINES
StartOfDocument
EditReplace .Find = "}else", .Replace = "}" + CR$ + "else", .Direction = 0, .MatchCase = 1, .WholeWord = 0, .PatternMatch = 0, .SoundsLike = 0, .ReplaceAll, .Format = 0, .Wrap = 1
REM SEPARATE } ELSE TO SEPARATE LINES
StartOfDocument
EditReplace .Find = "\} {1,}else", .Replace = "}" + CR$ + "else", .Direction = 0, .MatchCase = 1, .WholeWord = 0, .PatternMatch = 1, .SoundsLike = 0, .ReplaceAll, .Format = 0, .Wrap = 1
REM ----------------------------------------------------------------------------
REM SEPARATE ALL ELSE IF LINES TO SEPARATE ELSE, IF LINES
REM THIS CAN BREAK APART COMMENTS, BUT AN OBVIOUS ERROR WILL RESULT.
StartOfDocument
EditReplace .Find = "else {1,}if", .Replace = "else" + CR$ + "if", .Direction = 0, .MatchCase = 1, .WholeWord = 0, .PatternMatch = 1, .SoundsLike = 0, .ReplaceAll, .Format = 0, .Wrap = 1
REM ----------------------------------------------------------------------------
REM 8. again remove leading spaces in lines, by stripping spaces that follow CRs.
StripAllLeadingSpaces(CR$)
REM ----------------------------------------------------------------------------
REM 9. remove extra trailing spaces at line ends, by stripping spaces that precede each CR.
StripAllTrailingSpaces(CR$)
REM ----------------------------------------------------------------------------
REM 10. REMOVE EXTRA INTERNAL SPACES FROM IF, FOR, WHILE, SWITCH STMTS
REM REMOVE EXTRA SPACES FROM IF () STMTS
StartOfDocument
EditReplace .Find = CR$ + "if {1,}\(", .Replace = CR$ + "if(", .Direction = 0, .MatchCase = 1, .WholeWord = 0, .PatternMatch = 1, .SoundsLike = 0, .ReplaceAll, .Format = 0, .Wrap = 1
REM REMOVE EXTRA SPACES FROM FOR () STMTS
StartOfDocument
EditReplace .Find = CR$ + "for {1,}\(", .Replace = CR$ + "for(", .Direction = 0, .MatchCase = 1, .WholeWord = 0, .PatternMatch = 1, .SoundsLike = 0, .ReplaceAll, .Format = 0, .Wrap = 1
REM REMOVE EXTRA SPACES FROM WHILE () STMTS
StartOfDocument
EditReplace .Find = CR$ + "while {1,}\(", .Replace = CR$ + "while(", .Direction = 0, .MatchCase = 1, .WholeWord = 0, .PatternMatch = 1, .SoundsLike = 0, .ReplaceAll, .Format = 0, .Wrap = 1
REM REMOVE EXTRA SPACES FROM SWITCH () STMTS
StartOfDocument
EditReplace .Find = CR$ + "switch {1,}\(", .Replace = CR$ + "switch(", .Direction = 0, .MatchCase = 1, .WholeWord = 0, .PatternMatch = 1, .SoundsLike = 0, .ReplaceAll, .Format = 0, .Wrap = 1
REM ----------------------------------------------------------------------------
REM RECOMBINE FN RETURN TYPES THAT APPEAR A LINE ABOVE THE FUNCTIONS THEY DESCRIBE
REM AND INSERT A DASHED LINE SEPARATOR.
REM 1 PASS FOR EACH TYPE
Dashes$ = "//----------------------------------------------------------------------------"
REM VOID
StartOfDocument
EditReplace .Find = CR$ + "void" + CR$, .Replace = CR$ + Dashes$ + CR$ + "void ", .Direction = 0, .MatchCase = 1, .WholeWord = 0, .PatternMatch = 0, .SoundsLike = 0, .ReplaceAll, .Format = 0, .Wrap = 1
REM VOID*
StartOfDocument
EditReplace .Find = CR$ + "void*" + CR$, .Replace = CR$ + Dashes$ + CR$ + "void* ", .Direction = 0, .MatchCase = 1, .WholeWord = 0, .PatternMatch = 0, .SoundsLike = 0, .ReplaceAll, .Format = 0, .Wrap = 1
REM TWindow*
StartOfDocument
EditReplace .Find = CR$ + "TWindow*" + CR$, .Replace = CR$ + Dashes$ + CR$ + "TWindow* ", .Direction = 0, .MatchCase = 1, .WholeWord = 0, .PatternMatch = 0, .SoundsLike = 0, .ReplaceAll, .Format = 0, .Wrap = 1
REM const char*
StartOfDocument
EditReplace .Find = CR$ + "const char*" + CR$, .Replace = CR$ + Dashes$ + CR$ + "const char* ", .Direction = 0, .MatchCase = 1, .WholeWord = 0, .PatternMatch = 0, .SoundsLike = 0, .ReplaceAll, .Format = 0, .Wrap = 1
REM BOOL
StartOfDocument
EditReplace .Find = CR$ + "BOOL" + CR$, .Replace = CR$ + Dashes$ + CR$ + "BOOL ", .Direction = 0, .MatchCase = 1, .WholeWord = 0, .PatternMatch = 0, .SoundsLike = 0, .ReplaceAll, .Format = 0, .Wrap = 1
REM INT
StartOfDocument
EditReplace .Find = CR$ + "int" + CR$, .Replace = CR$ + Dashes$ + CR$ + "int ", .Direction = 0, .MatchCase = 1, .WholeWord = 0, .PatternMatch = 0, .SoundsLike = 0, .ReplaceAll, .Format = 0, .Wrap = 1
REM DOUBLE
StartOfDocument
EditReplace .Find = CR$ + "double" + CR$, .Replace = CR$ + Dashes$ + CR$ + "double ", .Direction = 0, .MatchCase = 1, .WholeWord = 0, .PatternMatch = 0, .SoundsLike = 0, .ReplaceAll, .Format = 0, .Wrap = 1
REM UINT
StartOfDocument
EditReplace .Find = CR$ + "UINT" + CR$, .Replace = CR$ + Dashes$ + CR$ + "UINT ", .Direction = 0, .MatchCase = 1, .WholeWord = 0, .PatternMatch = 0, .SoundsLike = 0, .ReplaceAll, .Format = 0, .Wrap = 1
REM LRESULT
StartOfDocument
EditReplace .Find = CR$ + "LRESULT" + CR$, .Replace = CR$ + Dashes$ + CR$ + "LRESULT ", .Direction = 0, .MatchCase = 1, .WholeWord = 0, .PatternMatch = 0, .SoundsLike = 0, .ReplaceAll, .Format = 0, .Wrap = 1
REM ----------------------------------------------------------------------------
REM 12. ADD CLASS SEPARATOR LINES
Slashes$ = "//////////////////////////////////////////////////////////////////////////////"
StartOfDocument
EditReplace .Find = CR$ + "class {1,}", .Replace = CR$ + Slashes$ + CR$ + "class ", .Direction = 0, .MatchCase = 1, .WholeWord = 0, .PatternMatch = 1, .SoundsLike = 0, .ReplaceAll, .Format = 0, .Wrap = 1
REM ----------------------------------------------------------------------------
REM THE STEP AFTER RESTORING PARAGRAPH MARKS (BELOW) (restoring same-line {} )
REM REQUIRES THAT THERE BE NO TRAILING SPACES.
REM PROBABLY UNNECESSARY WITH CURRENT STEP ORDER, BUT DO IT JUST IN CASE.
StripAllTrailingSpaces(CR$)
REM ----------------------------------------------------------------------------
REM RESTORE CR PARAGRAPH MARKS
StartOfDocument
EditReplace .Find = CR$, .Replace = "^p", .Direction = 0, .MatchCase = 1, .WholeWord = 0, .PatternMatch = 0, .SoundsLike = 0, .ReplaceAll, .Format = 0, .Wrap = 1
REM ----------------------------------------------------------------------------
REM 1-30-99
REM RESTORE SAME-LINE { whatever } TO THE PREVIOUS LINES THEY WERE SEPARATED FROM.
REM E.G. SHORT INLINES IN A CLASS DECLARATION or char* s = {'1','2','3'};
StartOfDocument
While Not AtEndOfDocument()
LineDown 1
REM SELECT ENTIRE LINE WITHOUT THE PARAGRAPH MARK, AND MAKE COPY.
EndOfLine
StartOfLine 1
T$ = Selection$()
REM IF IT STARTS WITH AN OPENING { AND ALSO CONTAINS A CLOSING },
If Left$(T$, 1) = "{" And InStr(T$, "}") > 0 Then
REM SELECT PREVIOUS LINE (WITH PARA MARK)SO EDITREPLACES OCCUR WITHIN IT.
LineUp 1
StartOfLine
EndOfLine 1
REM REPLACE THE PARAGRAPH MARK WITH A SPACE, TO REJOIN THE 2 LINES.
EditReplace .Find = "^p", .Replace = " ", .Direction = 0, .MatchCase = 0, .WholeWord = 0, .PatternMatch = 0, .SoundsLike = 0, .ReplaceAll, .Format = 0, .Wrap = 0
REM RE-EXTEND THE SELECTION TO THE NEW END OF THE LENGTHENED LINE.
EndOfLine 1
REM REMOVE ANY EXTRA SPACES BEFORE THE {
EditReplace .Find = " {1,}\{", .Replace = " {", .Direction = 0, .MatchCase = 0, .WholeWord = 0, .PatternMatch = 1, .SoundsLike = 0, .ReplaceAll, .Format = 0, .Wrap = 0
REM REMOVE ANY EXTRA SPACES AFTER THE CLOSING }.
REM CAN'T SPECIFY BETWEEN { AND PARAMARK BECAUSE IT'S A PATTERN MATCH SEARCH.
REM IT CAN ACCIDENTALLY CLOSE UP DESIRABLE GAP TO A TRAILING COMMENT.
REM UNNECESSARY, ANYWAY, SINCE TRAILING SPACES WERE REMOVED ABOVE.
REM EditReplace .Find = "\} {1,}", .Replace = "}", .Direction = 0, .MatchCase = 0, .WholeWord = 0, .PatternMatch = 1, .SoundsLike = 0, .ReplaceAll, .Format = 0, .Wrap = 0
REM CANCEL SELECTION
EndOfLine
EndIf 'IF LINE CONTAINED {...}
Wend 'WHILE NOT AT END OF DOCUMENT
REM =======================================================================
REM INDENTING
REM -----------------------------------------------------------------------
REM SINGLE-LINE INDENTS, I.E. THOSE NOT CONTAINED WITHIN AN INDENTED {} BLOCK.
REM YOU MUST DO THESE BEFORE THE BLOCK INDENTS.
IndentLevel = 0
Increase = FALSE
StartOfDocument
While Not AtEndOfDocument()
REM SELECT ENTIRE LINE WITHOUT THE PARAGRAPH MARK
EndOfLine
StartOfLine 1
T$ = Selection$()
REM FIRST TAB IN THIS LINE TO THE EXISTING INDENT LEVEL.
REM UNLESS IT'S AN OPENING {, WHICH STAYS ONE LEVEL LESS THAN CURRENT.
REM E.G. IF PREVIOUS LINE IF() INCREASED IT, IT DOESN'T AFFECT THE NEXT {.
If Left$(T$, 1) <> "{" Then TabLineIn(IndentLevel)
REM NOW DECIDE WHETHER SUCCEEDING LINES SHOULD BE FURTHER INDENTED.
Increase = FALSE
If Left$(T$, 3) = "if(" And Right$(T$, 1) <> ";" Then Increase = TRUE
If Left$(T$, 4) = "for(" And Right$(T$, 1) <> ";" Then Increase = TRUE
If Left$(T$, 6) = "while(" And Right$(T$, 1) <> ";" Then Increase = TRUE
If Left$(T$, 4) = "else" And Right$(T$, 1) <> ";" Then Increase = TRUE
If Increase = TRUE Then
IndentLevel = IndentLevel + 1
Else
IndentLevel = 0 'IF CHAIN OF INDENTS IS BROKEN, RESTART AT MARGIN
EndIf
REM HERE, YOU CAN DO SOME MISC SINGLE-LINE INDENTING UNRELATED TO Increase,
REM SUCH AS:
REM IF LINE STARTS WITH ": " TO INTRODUCE A CONSTRUCTOR INITIALIZER LIST,
REM TAB IT IN BY 1. THE SPACE DISTINGUISHES IT FROM A ::GLOBAL FUNCTION CALL.
If Len(T$) > 1 Then
If Mid$(T$, 1, 2) = ": " Then TabLineIn(1)
EndIf
LineDown
Wend
REM ----------------------------------------------------------------------------
REM 15. NOW DO BLOCK INDENTS
REM STARTING LEVEL IS -1 SO FUNCTION BODIES START OUT ALIGNED AT MARGIN.
IndentLevel = - 1
REM THE FIRST CASE IN A SWITCH STMT MUST BE HANDLED SPECIALLY
REM MUST ALSO KNOW WHEN WE ARE WITHIN A SWITCH BLOCK
FirstCase = TRUE
InASwitch = FALSE
StartOfDocument
While Not AtEndOfDocument()
REM SELECT ENTIRE LINE WITHOUT THE PARAGRAPH MARK
EndOfLine
StartOfLine 1
T$ = Selection$()
Increase = 0
Decrease = 0
If Left$(T$, 7) = "switch(" Then
FirstCase = TRUE
InASwitch = TRUE
EndIf
REM DETERMINE IF THE CURRENT LINE CHANGES THE INDENT LEVEL EITHER WAY (OR BOTH)
REM THE BASIC BLOCK INDENT AND UNINDENTS
REM ONLY CHANGE IF { AND } ARE NOT ON THE SAME LINE.
If Left$(T$, 1) = "{" And InStr(T$, "}") = 0 Then Increase = 1
If Left$(T$, 1) = "}" Then
Decrease = 1
REM IF WE ARE ENDING A SWITCH BLOCK, IT'S A DOUBLE-DECREASE.
REM A NESTED SWITCH, OR OTHER ENCLOSED {}, WILL STILL THROW IT OFF.
If InASwitch = TRUE Then Decrease = 2
InASwitch = FALSE '(PROBABLY) NOT IN A SWITCH ANYMORE
EndIf
REM EACH CASE OF A SWITCH UN-INDENTS FROM THE PREVIOUS CASE, THEN
REM RE-INDENTS FOR THE REST OF THE CASE CODE.
If Left$(T$, 4) = "case" Or Left$(T$, 7) = "default" Then
Increase = 1
Decrease = 1
REM BUT THE FIRST CASE DOES NOT UN-INDENT
If FirstCase = TRUE Then Decrease = 0
FirstCase = FALSE 'NOT THE FIRST CASE ANYMORE
EndIf
REM ANY DECREASE IS DONE NOW (STARTING WITH THE CURRENT LINE)
IndentLevel = IndentLevel - Decrease
REM RESPONSE TABLE MUST OVERRIDE WITH EXPLICIT VALUE BECAUSE AS A LEVEL 1 INDENT
REM LIKE A FUNCTION BODY, IT WOULD OTHERWISE NOT GET INDENTED AT ALL.
REM WHEN IT ENDS, MUST RESTORE NORMAL INDENTLEVEL.
If Left$(T$, 18) = "END_RESPONSE_TABLE" Then IndentLevel = - 1
TabLineIn(IndentLevel)
REM ANY INCREASE STARTS WITH NEXT LINE
IndentLevel = IndentLevel + Increase
REM RESPONSE TABLE EXPLICIT OVERRIDE
If Left$(T$, 21) = "DEFINE_RESPONSE_TABLE" Then IndentLevel = 1
LineDown
Wend
Completed = TRUE
REM ----------------------------------------------------------------------------
bye:
REM ----------------------------------------------------------------------------
REM RESTORE CR PARAGRAPH MARKS
StartOfDocument
EditReplace .Find = CR$, .Replace = "^p", .Direction = 0, .MatchCase = 1, .WholeWord = 0, .PatternMatch = 0, .SoundsLike = 0, .ReplaceAll, .Format = 0, .Wrap = 1
REM ----------------------------------------------------------------------------
REM RESTORE ORIGINAL FONT
EditSelectAll
Font OldFontName$, OldFontSize
StartOfDocument 'THIS DOES CANCEL THE SELECTION
REM SET TAB STOPS TO EVERY 4 CHARS AT 12CPI = 1/3"
FormatTabs .Position = "", .DefTabs = "0.33" + Chr$(34), .Align = 0, .Leader = 0
If Completed = TRUE Then MsgBox "There are some other macros that can make further changes: IndentClass, and maybe others.", "Done.", 64
End Sub REM MAIN
REM //////////////////////////////////////////////////////////////////////////////
REM 11/3/98 Inserts the given number of TABS at start of current line.
Sub TabLineIn(HowMany)
StartOfLine 'ALSO CANCELS SELECTION, IF ANY
For I = 1 To HowMany
Insert Chr$(9)
Next I
End Sub
REM //////////////////////////////////////////////////////////////////////////////
REM 1/30/99 STRIPS LEADING SPACES FROM ALL LINES IN FILE
REM ALL PARAGRAPH MARKS IN FILE MUST ALREADY HAVE BEEN CONVERTED TO CR$
Sub StripAllLeadingSpaces(CR$)
StartOfDocument
EditReplace .Find = CR$ + " {1,}", .Replace = CR$, .Direction = 0, .MatchCase = 1, .WholeWord = 0, .PatternMatch = 1, .SoundsLike = 0, .ReplaceAll, .Format = 0, .Wrap = 1
End Sub
REM //////////////////////////////////////////////////////////////////////////////
REM 1/30/99 STRIPS TRAILING SPACES FROM ALL LINES IN FILE
REM ALL PARAGRAPH MARKS IN FILE MUST ALREADY HAVE BEEN CONVERTED TO CR$
Sub StripAllTrailingSpaces(CR$)
StartOfDocument
EditReplace .Find = " {1,}" + CR$, .Replace = CR$, .Direction = 0, .MatchCase = 1, .WholeWord = 0, .PatternMatch = 1, .SoundsLike = 0, .ReplaceAll, .Format = 0, .Wrap = 1
End Sub
Sub MAIN REM MACRO IndentClass REM Copyright (C)1998, 1999, 2006 Steven Whitney. REM Initially published by http://25yearsofprogramming.com. REM Published under GNU GPL (General Public License) Version 3, with ABSOLUTELY NO WARRANTY. REM 1-31-99 INDENTS A CLASS DECLARATION REM BEFORE CALLING, SELECT THE BODY OF THE CLASS DECLARATION, REM EXCLUDING THE DECLARATION LINE AND EXCLUDING THE FINAL BRACE. REM ---------------------------------------------------------------------------- REM YOU DON'T WANT TO DO THE WHOLE FILE. (just one class) IF YOU DO, SELECT ALL FIRST. If Len(Selection$()) = 1 Then MsgBox "Select class before calling macro.", "Cannot Continue", 48 Goto bye EndIf REM TAB IN ENTIRE BLOCK TabIn EditReplace .Find = "^tpublic:", .Replace = "public:", .Direction = 0, .MatchCase = 1, .WholeWord = 0, .PatternMatch = 0, .SoundsLike = 0, .ReplaceAll, .Format = 0, .Wrap = 0 EditReplace .Find = "^tprotected:", .Replace = "protected:", .Direction = 0, .MatchCase = 1, .WholeWord = 0, .PatternMatch = 0, .SoundsLike = 0, .ReplaceAll, .Format = 0, .Wrap = 0 EditReplace .Find = "^tprivate:", .Replace = "private:", .Direction = 0, .MatchCase = 1, .WholeWord = 0, .PatternMatch = 0, .SoundsLike = 0, .ReplaceAll, .Format = 0, .Wrap = 0 bye: End Sub
|
|
|
|
|
|
Copyright ©2010 Steven Whitney. Last modified Thu 10/21/2010 02:08:02 -0700. |
||