nasm/macros.bas
H. Peter Anvin 87bc61964c NASM 0.97
2002-04-30 20:53:16 +00:00

176 lines
4.6 KiB
QBasic
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

' 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