blob: 17efaba222ba2ea81e975d3fc1a5f6e2e37621e0 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
#ifndef _SB_FILEFMT_HXX
#define _SB_FILEFMT_HXX
#include <tools/solar.h>
class SvStream;
// Version 2: Datentyp des Returnwerts fuer Publics
// Version 3: neue Opcodes
// Version 4: neue Opcodes
// Version 5: Bug (Ansprung von STATIC-Variablen im Init-Code)
// Version 6: Neue Opcodes und Bug (Globals anlegen, ohne BASIC zu beenden)
// Version 7: Korrektur im WITH-Parsing
// Version 8: Korrektur im IF-Parsing
// Version 9: Init-Code auch mit LEAVE beenden, wenn keine SUB/FUNCTION folgt
// Version A: #36374 Bei DIM AS NEW... auch Variablen anlegen
// Version B: #40689 Static umgestellt
// Version C: #41606 Bug bei Static
// Version D: #42678 Bug bei RTL-Function spc
// Version E: #56204 DCREATE, um auch bei DIM AS NEW Arrays anzulegen
// Version F: #57844 Einfuehrung von SvNumberformat::StringToDouble
// Version 10: #29955 For-Schleifen-Level in Statement-PCodes generieren
// Version 11: #29955 Wegen Build-Inkonsistenzen Neu-Compilieren erzwingen
#define B_LEGACYVERSION 0x00000011L
#define B_CURVERSION 0x00000012L
#define B_EXT_IMG_VERSION 0x00000012L
// Eine Datei enthaelt entweder einen Modul- oder einen Library-Record.
// Diese Records enthalten wiederum weitere Records. Jeder Record hat
// den folgenden Header:
// sal_uInt16 Kennung
// sal_uInt32 Laenge des Records ohne Header
// sal_uInt16 Anzahl Unterelemente
// Alle Datei-Offsets in Records sind relativ zum Start des Moduls!
#define B_LIBRARY 0x4C42 // BL Library Record
#define B_MODULE 0x4D42 // BM Module Record
#define B_NAME 0x4E4D // MN module name
#define B_COMMENT 0x434D // MC comment
#define B_SOURCE 0x4353 // SC source code
#define B_PCODE 0x4350 // PC p-code
#define B_OLDPUBLICS 0x7550 // Pu publics
#define B_PUBLICS 0x5550 // PU publics
#define B_POOLDIR 0x4450 // PD symbol pool directory
#define B_SYMPOOL 0x5953 // SY symbol pool
#define B_STRINGPOOL 0x5453 // ST symbol pool
#define B_LINERANGES 0x524C // LR line ranges for publics
#define B_MODEND 0x454D // ME module end
#define B_SBXOBJECTS 0x5853 // SX SBX objects
#define EXTENDED_BINARY_MODULES
#ifdef EXTENDED_BINARY_MODULES
#define B_EXTSOURCE 0x5345 // ES extended source
#endif
// Ein Library Record enthaelt nur Module Records
// sal_uInt16 Kennung BL
// sal_uInt32 Laenge des Records
// sal_uInt16 Anzahl Module
// Ein Modul-Record enthaelt alle anderen Recordtypen
// sal_uInt16 Kennung BM
// sal_uInt32 Laenge des Records
// sal_uInt16 1
// Daten:
// sal_uInt32 Versionsnummer
// sal_uInt32 Zeichensatz
// sal_uInt32 Startadresse Initialisierungscode
// sal_uInt32 Startadresse Sub Main
// sal_uInt32 Reserviert
// sal_uInt32 Reserviert
// Modulname, Kommentar und Quellcode:
// sal_uInt16 Kennung MN, MC oder SC
// sal_uInt32 Laenge des Records
// sal_uInt16 1
// Daten:
// String-Instanz
// P-Code:
// sal_uInt16 Kennung PC
// sal_uInt32 Laenge des Records
// sal_uInt16 1
// Daten:
// Der P-Code als Bytesack
// Alle Symbole und Strings werden in einem String-Pool gehalten.
// Verweise auf diese Strings sind in Form eines Indexes in diesen Pool.
// Liste aller Publics:
// sal_uInt16 Kennung PU oder Pu
// sal_uInt32 Laenge des Records
// sal_uInt16 Anzahl der Publics
// Daten fuer jeden Public-Eintrag:
// sal_uInt16 String-Index
// sal_uInt32 Startadresse im P-Code-Image (sal_uInt16 fuer alte Publics)
// sal_uInt16 Datentyp des Returnwertes (ab Version 2)
// Verzeichnis der Symbol-Tabellen:
// sal_uInt16 Kennung SP
// sal_uInt32 Laenge des Records
// sal_uInt16 Anzahl der Symboltabellen
// Daten fuer jede Symboltabelle:
// sal_uInt16 Stringindex des Namens
// sal_uInt16 Anzahl Symbole
// sal_uInt16 Scope-Kennung
// Symboltabelle:
// sal_uInt16 Kennung SY
// sal_uInt32 Laenge des Records
// sal_uInt16 Anzahl der Symbole
// Daten:
// sal_uInt16 Stringindex des Namens
// sal_uInt16 Anzahl Symbole
// Daten fuer jedes Symbol:
// sal_uInt16 Stringindex des Namens
// sal_uInt16 Datentyp
// sal_uInt16 Laenge bei STRING*n-Symbolen (0x8000: STATIC-Variable)
// Stringpool:
// sal_uInt16 Kennung ST
// sal_uInt32 Laenge des Records
// sal_uInt16 Anzahl der Strings
// Daten fuer jeden String:
// sal_uInt32 Offset in den Block aller Strings
// Danach folgt der Block aller Strings, die dort als ASCIIZ-Strings liegen.
// Line Ranges:
// sal_uInt16 Kennung LR
// sal_uInt32 Laenge des Records
// sal_uInt16 Anzahl der Strings
// Daten fuer jedes Public:
// sal_uInt16 1. Zeile (Sub XXX)
// sal_uInt16 2. Zeile (End Sub)
// SBX-Objekte:
// sal_uInt16 Anzahl Objekte
// .... Objektdaten
////////////////////////////////////////////////////////////////////////////
// Service-Routinen (in IMAGE.CXX)
sal_Bool SbGood( SvStream& r );
sal_uIntPtr SbOpenRecord( SvStream&, sal_uInt16 nSignature, sal_uInt16 nElem );
void SbCloseRecord( SvStream&, sal_uIntPtr );
#endif