Return to Index  

C-style code indenter

June 2 2008 at 11:21 AM
counting_pine  (no login)

'' C_INDENT.BAS - C-style code indenter
'' by Matthew Fearnley (counting_pine), 2008-06-02
'' Submitted without license restrictions or warranty

DIM indent AS INTEGER, minindent AS INTEGER
DIM i AS INTEGER, instring AS INTEGER, incomment AS INTEGER
DIM infile AS STRING, outfile AS STRING
DIM text AS STRING
DIM linenum AS LONG


LINE INPUT "Input file: ", infile
LINE INPUT "Output file: ", outfile
IF LEN(infile) = 0 OR LEN(outfile) = 0 THEN END

OPEN infile FOR INPUT AS #1
OPEN outfile FOR OUTPUT AS #2
DO UNTIL EOF(1)

linenum = linenum + 1
LOCATE , 1: PRINT linenum;
LINE INPUT #1, text
WHILE LEFT$(text, 1) = " " OR LEFT$(text, 1) = CHR$(9)
text = MID$(text, 2)
WEND
WHILE RIGHT$(text, 1) = " " OR LEFT$(text, 1) = CHR$(9)
text = LEFT$(text, LEN(text) - 1)
WEND

minindent = indent

i = 1
instring = 0: incomment = 0
WHILE i <= LEN(text)

IF instring THEN
IF MID$(text, i, 1) = CHR$(34) THEN
instring = 0
ELSEIF MID$(text, i, 1) = "\" THEN
i = i + 2
END IF

ELSEIF incomment THEN
IF MID$(text, i, 1) = "*" THEN
i = i + 1
IF MID$(text, i, 1) = "/" THEN
incomment = 0
END IF
END IF
ELSE

SELECT CASE MID$(text, i, 1)
CASE "{"
indent = indent + 1
CASE "}"
indent = indent - 1
IF indent < minindent THEN minindent = indent
CASE CHR$(34)
instring = 1
CASE "/"
IF MID$(text, i + 1, 1) = "*" THEN
i = i + 1
incomment = 1
ELSEIF MID$(text, i + 1, 1) = "/" THEN
i = i + 1
i = LEN(text) + 1
END IF
END SELECT
END IF

i = i + 1

WEND

PRINT #2, STRING$(minindent, CHR$(9));
PRINT #2, text

LOOP

PRINT
IF indent <> 0 THEN PRINT "Final indentation out by "; LTRIM$(STR$(indent)); "!"

CLOSE

 
 Respond to this message