mirror of
https://github.com/netwide-assembler/nasm.git
synced 2025-04-12 18:40:23 +08:00
176 lines
4.6 KiB
QBasic
176 lines
4.6 KiB
QBasic
' INFO_1: Converter for STANDARD.MAC to MACRO.C
|
||
'
|
||
' INFO_2: Written by Mark Junker in 1997
|
||
' InterNet: mjs@prg.hannover.sgh-net.de
|
||
' FIDO: Mark Junker@2:2437/47.21
|
||
'
|
||
' COMMENT: To start the program press SHIFT+F5 within the QBasic IDE
|
||
' or start it from the command-line with QBASIC /RUN MACROS
|
||
'
|
||
|
||
DEFINT A-Z
|
||
|
||
DECLARE FUNCTION StrTrimLeft$ (a$, b$)
|
||
DECLARE FUNCTION StrTrimRight$ (a$, b$)
|
||
DECLARE FUNCTION StrTrim$ (a$, b$)
|
||
DECLARE SUB StrSplitString (SplitString$, SplitChars$, SplitField$(), SplitCount%)
|
||
DECLARE FUNCTION Min% (a%, b%)
|
||
DECLARE FUNCTION StrInstrLeft% (SearchStart%, SearchIn$, SearchFor$)
|
||
DECLARE FUNCTION StrAscii% (a$)
|
||
|
||
|
||
CLS
|
||
DIM LineData$(1 TO 2)
|
||
|
||
OPEN "I", 1, "STANDARD.MAC"
|
||
OPEN "O", 2, "macros.c"
|
||
|
||
PRINT #2, "/* This file auto-generated from standard.mac by macros.bas - don't edit it */"
|
||
PRINT #2, ""
|
||
PRINT #2, "static char *stdmac[] = {"
|
||
|
||
WHILE NOT EOF(1)
|
||
LINE INPUT #1, l$
|
||
CALL StrSplitString(l$, ";", LineData$(), SplitCount)
|
||
IF SplitCount THEN
|
||
LineData$(1) = StrTrim$(LineData$(1), CHR$(9) + " ")
|
||
IF LEN(LineData$(1)) THEN
|
||
PRINT #2, " " + CHR$(34) + LineData$(1) + CHR$(34) + ","
|
||
END IF
|
||
END IF
|
||
WEND
|
||
PRINT #2, " NULL"
|
||
PRINT #2, "};"
|
||
|
||
CLOSE 2
|
||
CLOSE 1
|
||
SYSTEM
|
||
|
||
FUNCTION Min% (a%, b%)
|
||
IF a% < b% THEN Min% = a% ELSE Min% = b%
|
||
END FUNCTION
|
||
|
||
FUNCTION StrAscii (a$)
|
||
IF LEN(a$) = 0 THEN
|
||
StrAscii = -1
|
||
ELSE
|
||
StrAscii = ASC(a$)
|
||
END IF
|
||
END FUNCTION
|
||
|
||
' same as =INSTR(SearchStart, SearchIn, ANY SearchFor$) in PowerBASIC(tm)
|
||
'
|
||
FUNCTION StrInstrLeft (SearchStart, SearchIn$, SearchFor$)
|
||
ValuesCount = LEN(SearchFor$)
|
||
MaxValue = LEN(SearchIn$) + 1
|
||
MinValue = MaxValue
|
||
FOR Counter1 = 1 TO ValuesCount
|
||
SearchChar$ = MID$(SearchFor$, Counter1, 1)
|
||
hVal2 = INSTR(SearchStart, SearchIn$, SearchChar$)
|
||
IF hVal2 > 0 THEN MinValue = Min%(hVal2, MinValue)
|
||
NEXT
|
||
IF MinValue = MaxValue THEN MinValue = 0
|
||
StrInstrLeft = MinValue
|
||
END FUNCTION
|
||
|
||
'
|
||
' This is a very damn fuckin' shit version of this splitting routine.
|
||
' At this time, it's not very useful :]
|
||
'
|
||
SUB StrSplitString (SplitString$, SplitChars$, SplitField$(), SplitCount)
|
||
StartIndex = LBOUND(SplitField$)
|
||
LastIndex = UBOUND(SplitField$)
|
||
ActualIndex& = StartIndex
|
||
SplitCount = 0
|
||
|
||
LastPos = 1
|
||
FoundPos = StrInstrLeft(LastPos, SplitString$, SplitChars$ + CHR$(34))
|
||
GetDirect = 0
|
||
EndLoop = 0
|
||
TempString$ = ""
|
||
DO WHILE FoundPos > 0
|
||
FoundCharVal = StrAscii(MID$(SplitString$, FoundPos, 1))
|
||
PosDiff = (FoundPos - LastPos) + 1
|
||
SELECT CASE FoundCharVal
|
||
CASE 34
|
||
TempString$ = TempString$ + MID$(SplitString$, LastPos, PosDiff - 1)
|
||
SELECT CASE EndLoop
|
||
CASE 0
|
||
EndLoop = 2
|
||
CASE 3
|
||
EndLoop = 0
|
||
END SELECT
|
||
CASE ELSE
|
||
TempString$ = TempString$ + MID$(SplitString$, LastPos, PosDiff - 1)
|
||
SplitField$(ActualIndex&) = TempString$
|
||
TempString$ = ""
|
||
ActualIndex& = ActualIndex& + 1
|
||
IF ActualIndex& > LastIndex THEN
|
||
ActualIndex& = LastIndex
|
||
EndLoop = 1
|
||
END IF
|
||
END SELECT
|
||
SELECT CASE EndLoop
|
||
CASE 0
|
||
DO
|
||
LastPos = FoundPos + 1
|
||
FoundPos = StrInstrLeft(LastPos, SplitString$, SplitChars$)
|
||
LOOP WHILE LastPos = FoundPos
|
||
FoundPos = StrInstrLeft(LastPos, SplitString$, SplitChars$ + CHR$(34))
|
||
CASE 1
|
||
FoundPos = 0
|
||
LastPos = LEN(SplitString$) + 1
|
||
CASE 2
|
||
EndLoop = 3
|
||
LastPos = FoundPos + 1
|
||
FoundPos = StrInstrLeft(LastPos, SplitString$, CHR$(34))
|
||
IF FoundPos = 0 THEN
|
||
SplitString$ = SplitString$ + CHR$(34)
|
||
FoundPos = LEN(SplitString$)
|
||
END IF
|
||
END SELECT
|
||
LOOP
|
||
IF EndLoop = 0 THEN
|
||
IF LEN(TempString$) > 0 THEN
|
||
SplitField$(ActualIndex&) = TempString$
|
||
ELSEIF LastPos <= LEN(SplitString$) THEN
|
||
SplitField$(ActualIndex&) = MID$(SplitString$, LastPos)
|
||
ELSE
|
||
ActualIndex& = ActualIndex& - 1
|
||
END IF
|
||
END IF
|
||
FOR a = ActualIndex& + 1 TO LastIndex
|
||
SplitField$(a) = ""
|
||
NEXT
|
||
SplitCount = (ActualIndex& - StartIndex) + 1
|
||
END SUB
|
||
|
||
FUNCTION StrTrim$ (a$, b$)
|
||
StrTrim$ = StrTrimRight$(StrTrimLeft$(a$, b$), b$)
|
||
END FUNCTION
|
||
|
||
FUNCTION StrTrimLeft$ (a$, b$) 'public
|
||
p = 0
|
||
l = LEN(a$)
|
||
DO
|
||
p = p + 1
|
||
t$ = MID$(a$, p, 1)
|
||
LOOP WHILE (p < l) AND (INSTR(b$, t$) > 0)
|
||
StrTrimLeft$ = MID$(a$, p)
|
||
END FUNCTION
|
||
|
||
FUNCTION StrTrimRight$ (a$, b$) 'public
|
||
l = LEN(a$)
|
||
p = l + 1
|
||
DO
|
||
p = p - 1
|
||
IF p > 0 THEN
|
||
t$ = MID$(a$, p, 1)
|
||
ELSE
|
||
t$ = ""
|
||
END IF
|
||
LOOP WHILE (p > 0) AND (INSTR(b$, t$) > 0)
|
||
StrTrimRight$ = LEFT$(a$, p)
|
||
END FUNCTION
|
||
|
||
|