CLS PRINT PRINT " -- minbas.bas ----------------------------------------------------->>fst'01<<" PRINT " Minimierung von QBasic-Quelltexten durch Entfernen von ..." PRINT " - ueberfluessigen Leerzeichen" PRINT " - Leerzeilen" PRINT " - Kommentaren" PRINT " - Ascii Zeichen Nr. 13 (Carriage Return)" PRINT " - PRINT (Ersatz durch ?)" PRINT " -- V 010714 ----------------------------------- http://home.arcor.de/steini63" PRINT INPUT " Quelldatei (bleibt unveraendert!) ohne Endung .bas eingeben: > ", DateiIn$ '-------------------------------------------------------------------------- 'Dateinamen erzeugen DateiIn$ = LEFT$(DateiIn$, 8) DateiOut$ = LEFT$(DateiIn$, 7) + "-.bas" DateiIn$ = DateiIn$ + ".bas" ON ERROR GOTO Fehler 'einfache Fehlerbehandlung OPEN DateiIn$ FOR INPUT AS #1 'Dateien oeffnen OPEN DateiOut$ FOR OUTPUT AS #2 DL1& = LOF(1) LOCATE 11, 1 PRINT SPACE$(80); LOCATE 11, 1 PRINT " Quelldatei: > "; DateiIn$ PRINT " Zieldatei: > "; DateiOut$ '-------------------------------------------------------------------------- 'Spezialzeichen definieren SpezialZ$ = "?%&!#$<>=+-*/\^,;:()" + CHR$(34) '-------------------------------------------------------------------------- 'HAUPTSCHLEIFE 'Datei zeilenweise einlesen DO WHILE NOT EOF(1) LINE INPUT #1, Zeile$ 'Zeile einlesen '-------------------------------------------------------------------------- 'Leerzeilen und Kommentarzeilen entfernen Zeile$ = LTRIM$(Zeile$) 'fuehrende Leerzeichen entfernen 'Metabefehle muessen natuerlich bleiben: Meta$ = "" IF INSTR(Zeile$, "$DYNAMIC") THEN Meta$ = "'$DYNAMIC" IF INSTR(Zeile$, "$STATIC") THEN Meta$ = "'$STATIC" IF LEFT$(Zeile$, 4) = "REM " THEN Zeile$ = "" 'Kommentarzeilen loeschen IF LEFT$(Zeile$, 1) = "'" THEN Zeile$ = "" '-------------------------------------------------------------------------- 'Zeilen mit Text behandeln IF Zeile$ <> "" OR Meta$ <> "" THEN '......................................................................... 'Variablen vorbelegen tabu% = 1 'Kennzeichnung fuer Worte innerhalb (-1) und ausserhalb (1) 'von Anfuehrungszeichen WortNr% = 1 'Anzahl der Worte in der Zeile '......................................................................... 'leeren String-Array erzeugen REDIM Wort$(127) '......................................................................... 'Zeile in Worte trennen FOR i% = 1 TO LEN(Zeile$) Z$ = MID$(Zeile$, i%, 1) 'Zeile zeichenweise lesen IF Z$ = CHR$(34) THEN 'Zeichen in Anfuehrungszeichen sind tabu tabu% = tabu% * -1 END IF IF tabu% = -1 THEN 'innerhalb von Anfuehrungszeichen Wort$(WortNr%) = Wort$(WortNr%) + Z$ '... Wort zusammenfuegen END IF IF tabu% = 1 THEN 'ausserhalb von Anfuehrungszeichen ... SELECT CASE Z$ CASE "'" 'bei Kommentarzeichen ... EXIT FOR 'Zeile nicht weiter einlesen CASE " " 'bei Leerzeichen ... WortNr% = WortNr% + 1 'neues Wort beginnen CASE CHR$(34) 'bei Anfuehrungsz. am Ende des Worts ... Wort$(WortNr%) = Wort$(WortNr%) + Z$ 'Zeichen anhaengen und ... WortNr% = WortNr% + 1 'neues Wort beginnen CASE ELSE 'sonst ... Wort$(WortNr%) = Wort$(WortNr%) + Z$ 'Zeichen ans Wort anhaengen END SELECT END IF NEXT 'naechstes Zeichen der Zeile einlesen '.......................................................................... 'Zeile neu bilden Zeile$ = "" 'Inhalt der alten Zeile loeschen FOR i% = 1 TO WortNr% '....................................................................... 'Festlegen, ob Leerzeichen noetig. 'Leerzeichen an Operatoren und Trennzeichen werden von Basic nicht 'benoetigt; Zeichen innerhalb von Anfuehrungszeichen bleiben tabu: IF tabu% = 1 THEN IF Wort$(i%) = "PRINT" THEN Wort$(i%) = "?" 'PRINT durch ? ersetzen links$ = RIGHT$(Zeile$, 1) rechts$ = LEFT$(Wort$(i%), 1) IF INSTR(SpezialZ$, links$) OR INSTR(SpezialZ$, rechts$) THEN LeerZ$ = "" ELSE LeerZ$ = " " END IF END IF '....................................................................... 'Neue Zeile zusammenbauen Zeile$ = Zeile$ + LeerZ$ + Wort$(i%) '......................................................................... ' naechstes Wort einlesen NEXT '-------------------------------------------------------------------------- 'Neue Zeile in Datei schreiben PRINT #2, Zeile$ + Meta$ + CHR$(10); '-------------------------------------------------------------------------- 'Ende Abfrage, ob Leerzeile END IF DZ1& = LOC(1) * 128 DL2& = LOF(2) P1& = DZ1& / DL1& * 100 P2& = DL2& / DL1& * 100 LOCATE 11, 30 PRINT USING "######## Byte gelesen (### %)"; DZ1&; P1&; LOCATE 12, 30 PRINT USING "######## Byte geschrieben (### %)"; DL2&; P2&; '-------------------------------------------------------------------------- 'Neue Zeile einlesen, wenn weitere Daten vorhanden LOOP '-------------------------------------------------------------------------- 'Abschluss P1& = 100 LOCATE 11, 30 PRINT USING "######## Byte gelesen (### %)"; DL1&; P1& LOCATE 13, 2 PRINT "F E R T I G :"; LOCATE , 30 PRINT USING "######## Byte gespart (### %)"; DL1& - DL2&; P1& - P2& CLOSE #1 CLOSE #2 PRINT END '-------------------------------------------------------------------------- 'Fehlerbehandlung Fehler: CLOSE #1 CLOSE #2 PRINT PRINT " *** FEHLER; Abbruch ***" PRINT END RESUME