/**************************************************************
 *
 * 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
