Line number - mkilgore/QB64pe GitHub Wiki

Line numbers or line labels are used in QBasic as references to code lines. Numbers are required with GOTO and numbers or label names are required with GOSUB. Although not required in QBasic, other older programming languages such as GW Basic often required them. Line labels require a colon after them to differentiate them from keywords and variable names.

Microsoft's REMLINE.BAS program removes unnecessary line numbers

The following program can remove line numbers where they are not required by IF...THEN, GOTO, GOSUB, ERL, RUN or RESUME:

OPEN filename$ FOR (file statement) INPUT (file mode) AS #1
DO...LOOP UNTIL EOF(1)
LINE INPUT (file statement) #1, a$
REM Get rid of quotes and REM statements.
DO
IF...THEN INSTR(a$, CHR$(34)) <> 0 THEN
IF...THEN INSTR(INSTR(a$, CHR$(34)) + 1, a$, CHR$(34)) = 0 THEN EXIT DO: REM Mismatched quotes. Illegal code.
a$ = MID$(a$, 1, INSTR(a$, CHR$(34)) - 1) + MID$(a$, INSTR(INSTR(a$, CHR$(34)) + 1, a$, CHR$(34)) + 1)
ELSE
EXIT DO
END IF
LOOP

IF...THEN INSTR(UCASE$(a$), "REM ") <> 0 THEN a$ = MID$(a$, 1, INSTR(UCASE$(a$), "REM "))
IF...THEN INSTR(UCASE$(a$), "' ") <> 0 THEN a$ = MID$(a$, 1, INSTR(a$, "' "))

DO
flag = 0
REM Break down compound statements and get line numbers.
IF...THEN INSTR(a$, "GOTO ") <> 0 THEN flag = 1: n = INSTR(a$, "GOTO ") + 5: GOSUB tracknumber
IF...THEN INSTR(a$, "GOSUB ") <> 0 THEN flag = 1: n = INSTR(a$, "GOSUB ") + 6: GOSUB tracknumber
IF...THEN INSTR(a$, "THEN ") <> 0 THEN flag = 1: n = INSTR(a$, "THEN ") + 5: GOSUB tracknumber
IF...THEN INSTR(a$, "ELSE ") <> 0 THEN flag = 1: n = INSTR(a$, "ELSE ") + 5: GOSUB tracknumber
IF...THEN INSTR(a$, "RUN ") <> 0 THEN flag = 1: n = INSTR(a$, "RUN ") + 4: GOSUB tracknumber
IF...THEN INSTR(a$, "RESUME ") <> 0 THEN flag = 1: n = INSTR(a$, "RESUME ") + 7: GOSUB tracknumber
IF...THEN INSTR(a$, "RETURN ") <> 0 THEN flag = 1: n = INSTR(a$, "RETURN ") + 7: GOSUB tracknumber
IF...THEN flag = 0 THEN EXIT DO ELSE a$ = MID$(a$, n)
LOOP
LOOP
PRINT "Number of line-numbered statements kept:"; count
CLOSE #1

OPEN filename$ FOR (file statement) INPUT (file mode) AS #1
OPEN "filename.tmp" FOR...NEXT OUTPUT AS #2
DO...LOOP UNTIL EOF(1)
LINE INPUT (file statement) #1, a$
flag = 0
IF...THEN VAL(MID$(a$, 1, 1)) <> 0 THEN
FOR...NEXT i = 1 TO count
IF...THEN VAL(a$) = linenumber(i) THEN flag = 1: EXIT FOR...NEXT
NEXT
IF...THEN flag = 0 THEN a$ = MID$(a$, INSTR(a$, " ") + 1)
END IF
PRINT (file statement) #2, a$
LOOP
CLOSE #1, #2
SHELL _DONTWAIT "notepad filename.tmp"
PRINT
PRINT "Back up original file as .org and give edited file original file name? [Y/N]"
DO
b$ = UCASE$(INKEY$)
SELECT CASE b$
CASE CHR$(27): SYSTEM
CASE "N"
ON ERROR GOTO RESNXT
KILL "filename.tmp"
ON ERROR GOTO 0
PRINT
PRINT "Temporary "+ CHR$(34) + "filename.tmp" + CHR$(34) + " was removed and no changes were made to original file."
PRINT
PRINT "Press any key to end."
EXIT DO

CASE "Y"
ON ERROR GOTO resnxt
KILL MID$(filename$, 1, INSTR(filename$, ".") - 1) + ".org"
ON ERROR GOTO 0
NAME filename$ AS MID$(filename$, 1, INSTR(filename$, ".") - 1) + ".org"
NAME "filename.tmp" AS filename$
PRINT : PRINT "File conversion completed. Press any key to end."
EXIT DO
END SELECT
LOOP
SLEEP
SYSTEM

tracknumber:
DO
count = count + 1
linenumber(count) = VAL(MID$(a$, n))
IF...THEN INSTR(a$, "ON") <> 0 AND (boolean) INSTR(a$, "GOSUB") <> 0 OR (boolean) INSTR(a$, "ON") <> 0 AND (boolean) INSTR(a$, "GOTO") <> 0 THEN
FOR...NEXT i = n TO LEN(a$)
IF...THEN VAL(MID$(a$, i, 1)) = 0 AND (boolean) MID$(a$, i, 1) <> "0" AND (boolean) MID$(a$, i, 1) <> "," AND (boolean) MID$(a$, i, 1) <> " " THEN EXIT FOR...NEXT
IF...THEN MID$(a$, i, 2) = ", " THEN n = i + 1: EXIT FOR...NEXT
NEXT
IF...THEN n <> i + 1 THEN EXIT DO
ELSE
EXIT DO
END IF
LOOP
RETURN

resnxt:
RESUME '' ''
Code courtesy of Pete from the Network 54 Qbasic Forum

See also:


Navigation:
Go to Keyword Reference - Alphabetical
Go to Keyword Reference - By usage
Go to Main WIKI Page
⚠️ **GitHub.com Fallback** ⚠️