1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 * This file incorporates work covered by the following license notice:
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
22 // Version 2: data type of the return value for publics
23 // Version 3: new opcodes
24 // Version 4: new opcodes
25 // Version 5: bug (entry of STATIC-variables in the init code)
26 // Version 6: new opcodes and bug (construct globals, without ending the BASIC)
27 // Version 7: correction concerning the WITH-Parsing
28 // Version 8: correction concerning the IF-Parsing
29 // Version 9: end init code with LEAVE, too, if no SUB/FUNCTION follows
30 // Version A: #36374 at DIM AS NEW... construct variable too
31 // Version B: #40689 reorganized static
32 // Version C: #41606 bug at static
33 // Version D: #42678 bug at RTL-function spc
34 // Version E: #56204 DCREATE, to also construct arrays at DIM AS NEW
35 // Version F: #57844 introduction of SvNumberformat::StringToDouble
36 // Version 10: #29955 generate for-loop-level in Statement-PCodes
37 // Version 11: #29955 force anew compilation because of build-inconsistences
38 // Version 12: aoo#64377 increase code size that basic can handle
39 // tdf#75973 support user defined types B_USERTYPES in password protected macros
40 // Version 13: tdf#94617 store methods nStart information greater than sal_Int16 limit
41 // tdf#57113 store UTF-16 strings after legacy 1-byte-encoded strings in pool (no
42 // version number bump for backward compatibility; relies on magic number)
43 // tdf#142460: properly handle boolean values in string pool (no
44 // version number bump for backward compatibility; relies on
45 // new integer type suffix 'b')
48 #define B_LEGACYVERSION 0x00000011
49 #define B_EXT_IMG_VERSION 0x00000012
50 #define B_CURVERSION 0x00000013
52 // The file contains either a module- or a library-record.
53 // Those records contain further records. Every record's got
54 // the following header:
56 // sal_uInt16 identifier
57 // sal_uInt32 the record's length without the header
58 // sal_uInt16 number of sub-elements
60 // all the file-offsets in records are relative to the module's start!
62 enum class FileOffset
{
63 Library
= 0x4C42, // BL Library Record
64 Module
= 0x4D42, // BM Module Record
65 Name
= 0x4E4D, // MN module name
66 Comment
= 0x434D, // MC comment
67 Source
= 0x4353, // SC source code
68 PCode
= 0x4350, // PC p-code
69 OldPublics
= 0x7550, // Pu publics
70 Publics
= 0x5550, // PU publics
71 PoolDir
= 0x4450, // PD symbol pool directory
72 SymPool
= 0x5953, // SY symbol pool
73 StringPool
= 0x5453, // ST symbol pool
74 LineRanges
= 0x524C, // LR line ranges for publics
75 ModEnd
= 0x454D, // ME module end
76 SbxObjects
= 0x5853, // SX SBX objects
77 ExtSource
= 0x5345, // ES extended source
78 UserTypes
= 0x4369, // UT user defined types
84 // A library record contains only module records
85 // sal_uInt16 identifier BL
86 // sal_uInt32 the record's length
87 // sal_uInt16 number of modules
89 // A module-record contains all the other record types
90 // sal_uInt16 identifier BM
91 // sal_uInt32 the record's length
94 // sal_uInt32 version number
95 // sal_uInt32 character set
96 // sal_uInt32 starting address initialisation code
97 // sal_uInt32 starting address sub main
98 // sal_uInt32 reserved
99 // sal_uInt32 reserved
101 // module name, comment and source code:
102 // sal_uInt16 identifier MN, MC or SC
103 // sal_uInt32 the record's length
109 // sal_uInt16 identifier PC
110 // sal_uInt32 the record's length
113 // the P-Code as bytesack
115 // All symbols and strings are kept in a string-pool.
116 // References to these strings are in this pool in the form of an index.
118 // List of all publics:
119 // sal_uInt16 identifier PU or Pu
120 // sal_uInt32 the record's length
121 // sal_uInt16 number of publics
122 // Data for every public-entry:
123 // sal_uInt16 string index
124 // sal_uInt32 starting address in the p-code-image (sal_uInt16 for old publics)
125 // sal_uInt16 data type of the return value (from version 2)
127 // Register of the symbol tables:
128 // sal_uInt16 identifier SP
129 // sal_uInt32 the record's length
130 // sal_uInt16 number of symbol tables
131 // Data for every symbol table:
132 // sal_uInt16 stringindex of the name
133 // sal_uInt16 number of symbols
134 // sal_uInt16 scope identifier
137 // sal_uInt16 identifier SY
138 // sal_uInt32 the record's length
139 // sal_uInt16 number of symbols
141 // sal_uInt16 stringindex of the name
142 // sal_uInt16 number of symbols
143 // Data for every symbol:
144 // sal_uInt16 stringindex of the name
145 // sal_uInt16 data type
146 // sal_uInt16 length for STRING*n-symbols (0x8000: STATIC variable)
149 // sal_uInt16 identifier ST
150 // sal_uInt32 the record's length
151 // sal_uInt16 number of strings
152 // Data for every string:
153 // sal_uInt32 Offset in the block of all strings
154 // the block of all strings (ASCIIZ) follows then
157 // sal_uInt16 identifier LR
158 // sal_uInt32 the record's length
159 // sal_uInt16 number of strings
160 // Data for every public:
161 // sal_uInt16 1st line (Sub XXX)
162 // sal_uInt16 2nd line (End Sub)
165 // sal_uInt16 number of objects
168 // user defined types B_USERTYPES :
169 // sal_uInt16 identifier UT
170 // sal_uInt32 the record's length
171 // sal_uInt16 number of types
172 // Data for every user defined type:
173 // string instance type name
174 // sal_Int16 number of type members
175 // Data for every type member:
179 // sal_Int16 hasObjects (0/1)
181 // If member type is nested type
182 // string nested type name
183 // Else (array declaration)
184 // sal_Int16 isFixedSize (0/1)
185 // sal_Int32 number of dimensions
186 // Data for every dimension:
187 // sal_Int32 lower bound
188 // sal_Int32 upper bound
190 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */