summaryrefslogtreecommitdiffstats
path: root/idl/inc
diff options
context:
space:
mode:
Diffstat (limited to 'idl/inc')
-rw-r--r--idl/inc/basobj.hxx129
-rw-r--r--idl/inc/bastype.hxx76
-rw-r--r--idl/inc/command.hxx47
-rw-r--r--idl/inc/database.hxx140
-rw-r--r--idl/inc/globals.hxx130
-rw-r--r--idl/inc/hash.hxx61
-rw-r--r--idl/inc/lex.hxx217
-rw-r--r--idl/inc/module.hxx38
-rw-r--r--idl/inc/object.hxx88
-rw-r--r--idl/inc/parser.hxx72
-rw-r--r--idl/inc/slot.hxx136
-rw-r--r--idl/inc/types.hxx119
12 files changed, 1253 insertions, 0 deletions
diff --git a/idl/inc/basobj.hxx b/idl/inc/basobj.hxx
new file mode 100644
index 000000000..12def9b70
--- /dev/null
+++ b/idl/inc/basobj.hxx
@@ -0,0 +1,129 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * 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 .
+ */
+
+#ifndef INCLUDED_IDL_INC_BASOBJ_HXX
+#define INCLUDED_IDL_INC_BASOBJ_HXX
+
+#include <tools/ref.hxx>
+#include "bastype.hxx"
+#include <functional>
+#include <vector>
+
+class SvTokenStream;
+class SvIdlDataBase;
+
+template<typename T>
+class SvRefMemberList : private std::vector<T>
+{
+private:
+ typedef typename std::vector<T> base_t;
+
+public:
+ using base_t::size;
+ using base_t::front;
+ using base_t::back;
+ using base_t::operator[];
+ using base_t::begin;
+ using base_t::end;
+ using typename base_t::iterator;
+ using typename base_t::const_iterator;
+ using base_t::rbegin;
+ using base_t::rend;
+ using typename base_t::reverse_iterator;
+ using base_t::empty;
+
+ ~SvRefMemberList() { clear(); }
+ void clear()
+ {
+ for( typename base_t::const_iterator it = base_t::begin(); it != base_t::end(); ++it )
+ {
+ T p = *it;
+ if( p )
+ p->ReleaseRef();
+ }
+ base_t::clear();
+ }
+
+ void push_back( T p )
+ {
+ base_t::push_back( p );
+ p->AddFirstRef();
+ }
+
+ void insert( typename base_t::iterator it, T p )
+ {
+ base_t::insert( it, p );
+ p->AddFirstRef();
+ }
+
+ void pop_back()
+ {
+ T p = base_t::back();
+ base_t::pop_back();
+ if( p )
+ p->ReleaseRef();
+ }
+};
+
+class SvMetaObject : public SvRefBase
+{
+ OString aName;
+
+protected:
+ bool ReadNameSvIdl( SvTokenStream & rInStm );
+ void DoReadContextSvIdl( SvIdlDataBase &, SvTokenStream & rInStm );
+ virtual void ReadContextSvIdl( SvIdlDataBase &, SvTokenStream & rInStm );
+ virtual void ReadAttributesSvIdl( SvIdlDataBase & rBase,
+ SvTokenStream & rInStm );
+public:
+ SvMetaObject();
+
+ static void WriteTab( SvStream & rOutStm, sal_uInt16 nTab );
+ static void Back2Delimiter( SvStream & );
+ static void WriteStars( SvStream & );
+
+ void SetName( const OString& rName );
+ virtual const OString & GetName() const { return aName; }
+
+ virtual bool ReadSvIdl( SvIdlDataBase &, SvTokenStream & rInStm );
+};
+
+class SvMetaReference : public SvMetaObject
+{
+ tools::SvRef<SvMetaReference> aRef;
+public:
+ SvMetaReference();
+
+ const OString & GetName() const override
+ {
+ return ( !aRef.is()
+ || !SvMetaObject::GetName().isEmpty() )
+ ? SvMetaObject::GetName()
+ : aRef->GetName();
+ }
+
+ SvMetaReference * GetRef() const { return aRef.get(); }
+ void SetRef( SvMetaReference * pRef )
+ { aRef = pRef; }
+};
+
+#endif // INCLUDED_IDL_INC_BASOBJ_HXX
+
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/idl/inc/bastype.hxx b/idl/inc/bastype.hxx
new file mode 100644
index 000000000..1c0d93765
--- /dev/null
+++ b/idl/inc/bastype.hxx
@@ -0,0 +1,76 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * 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 .
+ */
+
+#ifndef INCLUDED_IDL_INC_BASTYPE_HXX
+#define INCLUDED_IDL_INC_BASTYPE_HXX
+
+
+#include <sal/types.h>
+#include <tools/globname.hxx>
+
+class SvStringHashEntry;
+class SvIdlDataBase;
+class SvStream;
+class SvTokenStream;
+
+class SvBOOL
+{
+ bool bVal:1,
+ bSet:1;
+public:
+ SvBOOL() { bSet = bVal = false; }
+ SvBOOL( bool b ) : bVal( b ), bSet( false) {}
+ SvBOOL & operator = ( bool n ) { bVal = n; bSet = true; return *this; }
+
+ operator bool() const { return bVal; }
+ bool IsSet() const { return bSet; }
+
+ bool ReadSvIdl( SvStringHashEntry const * pName, SvTokenStream & rInStm );
+};
+
+
+class SvIdentifier
+{
+ OString m_aStr;
+ sal_uInt32 nValue;
+public:
+ SvIdentifier() : nValue( 0 ) {};
+ SvIdentifier(sal_uInt32 n) : nValue( n ) {};
+
+ void setString(const OString& rStr) { m_aStr = rStr; }
+ const OString& getString() const { return m_aStr; }
+
+ void ReadSvIdl( SvStringHashEntry const * pName, SvTokenStream & rInStm );
+ bool IsSet() const
+ {
+ return !m_aStr.isEmpty() || nValue != 0;
+ }
+ sal_uInt32 GetValue() const { return nValue; }
+ void SetValue( sal_uInt32 bVal ) { nValue = bVal; }
+
+ void ReadSvIdl( SvIdlDataBase &, SvTokenStream & rInStm );
+};
+
+
+bool ReadStringSvIdl( SvStringHashEntry const * pName, SvTokenStream & rInStm, OString& aString );
+
+
+#endif // INCLUDED_IDL_INC_BASTYPE_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/idl/inc/command.hxx b/idl/inc/command.hxx
new file mode 100644
index 000000000..ea5e0f446
--- /dev/null
+++ b/idl/inc/command.hxx
@@ -0,0 +1,47 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * 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 .
+ */
+
+#ifndef INCLUDED_IDL_INC_COMMAND_HXX
+#define INCLUDED_IDL_INC_COMMAND_HXX
+
+#include <rtl/ustring.hxx>
+#include <vector>
+
+class SvCommand
+{
+public:
+ std::vector<OUString> aInFileList;
+ OUString aSlotMapFile;
+ OUString aPath;
+ OUString aTargetFile;
+ OUString aExportFile;
+ OUString m_DepFile;
+ sal_uInt32 nVerbosity;
+
+ SvCommand( int argc, char ** argv );
+ ~SvCommand();
+};
+
+void Init();
+class SvIdlWorkingBase;
+bool ReadIdl( SvIdlWorkingBase * pDataBase, const SvCommand & rCommand );
+
+#endif // INCLUDED_IDL_INC_COMMAND_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/idl/inc/database.hxx b/idl/inc/database.hxx
new file mode 100644
index 000000000..caf3cf9ff
--- /dev/null
+++ b/idl/inc/database.hxx
@@ -0,0 +1,140 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * 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 .
+ */
+
+#ifndef INCLUDED_IDL_INC_DATABASE_HXX
+#define INCLUDED_IDL_INC_DATABASE_HXX
+
+#include "module.hxx"
+#include "hash.hxx"
+#include "lex.hxx"
+#include <rtl/string.hxx>
+
+#include <rtl/ustring.hxx>
+#include <set>
+#include <exception>
+
+class SvCommand;
+
+class SvIdlError
+{
+ OString aText;
+public:
+ sal_uInt32 nLine, nColumn;
+
+ SvIdlError() : nLine(0), nColumn(0) {}
+ SvIdlError( sal_uInt32 nL, sal_uInt32 nC )
+ : nLine(nL), nColumn(nC) {}
+
+ const OString& GetText() const { return aText; }
+ void SetText( const OString& rT ) { aText = rT; }
+ bool IsError() const { return nLine != 0; }
+};
+
+class SvParseException final : public std::exception
+{
+public:
+ SvIdlError aError;
+ SvParseException( SvTokenStream const & rInStm, const OString& rError );
+ SvParseException( const OString& rError, SvToken const & rTok );
+};
+
+
+
+class SvIdlDataBase
+{
+ bool bExport;
+ OUString aExportFile;
+ sal_uInt32 nUniqueId;
+ sal_uInt32 nVerbosity;
+ std::vector<OUString> aIdFileList;
+ std::unique_ptr<SvStringHashTable> pIdTable;
+
+ SvRefMemberList<SvMetaType *> aTypeList;
+ SvRefMemberList<SvMetaClass *> aClassList;
+ SvRefMemberList<SvMetaModule *> aModuleList;
+ SvRefMemberList<SvMetaSlot *> aSlotList;
+ SvRefMemberList<SvMetaObject *> aContextStack;
+
+protected:
+ ::std::set< OUString > m_DepFiles;
+ OUString aPath;
+ SvIdlError aError;
+ void WriteReset()
+ {
+ aUsedTypes.clear();
+ }
+public:
+ OUString sSlotMapFile;
+
+ explicit SvIdlDataBase( const SvCommand& rCmd );
+ ~SvIdlDataBase();
+
+ SvRefMemberList<SvMetaType *>& GetTypeList();
+ SvRefMemberList<SvMetaClass *>& GetClassList() { return aClassList; }
+ SvRefMemberList<SvMetaModule *>& GetModuleList() { return aModuleList; }
+
+ // list of used types while writing
+ SvRefMemberList<SvMetaType *> aUsedTypes;
+
+ void StartNewFile( const OUString& rName );
+ void SetExportFile( const OUString& rName )
+ { aExportFile = rName; }
+ void AppendSlot( SvMetaSlot *pSlot );
+ const SvIdlError & GetError() const { return aError; }
+ void SetError( const SvIdlError & r )
+ { aError = r; }
+
+ const OUString & GetPath() const { return aPath; }
+ void SetPath(const OUString &s) { aPath = s; }
+ SvRefMemberList<SvMetaObject *>& GetStack() { return aContextStack; }
+
+ void Write(const OString& rText) const;
+ void WriteError( SvTokenStream & rInStm );
+ void SetError( const OString& rError, SvToken const & rTok );
+ void SetAndWriteError( SvTokenStream & rInStm, const OString& rError );
+ void Push( SvMetaObject * pObj );
+ sal_uInt32 GetUniqueId() { return ++nUniqueId; }
+ bool FindId( const OString& rIdName, sal_uLong * pVal );
+ void InsertId( const OString& rIdName, sal_uLong nVal );
+ bool ReadIdFile( const OString& rFileName );
+
+ SvMetaType * FindType( const OString& rName );
+ static SvMetaType * FindType( const SvMetaType *, SvRefMemberList<SvMetaType *>& );
+
+ SvMetaType * ReadKnownType( SvTokenStream & rInStm );
+ SvMetaAttribute * ReadKnownAttr( SvTokenStream & rInStm,
+ SvMetaType * pType );
+ SvMetaAttribute * FindKnownAttr( const SvIdentifier& );
+ SvMetaClass * ReadKnownClass( SvTokenStream & rInStm );
+ SvMetaClass * FindKnownClass( const OString& aName );
+ void AddDepFile(OUString const& rFileName);
+ void WriteDepFile(SvFileStream & rStream, OUString const& rTarget);
+};
+
+class SvIdlWorkingBase : public SvIdlDataBase
+{
+public:
+ explicit SvIdlWorkingBase( const SvCommand& rCmd );
+
+ bool WriteSfx( SvStream & );
+};
+
+#endif // INCLUDED_IDL_INC_DATABASE_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/idl/inc/globals.hxx b/idl/inc/globals.hxx
new file mode 100644
index 000000000..033a8f270
--- /dev/null
+++ b/idl/inc/globals.hxx
@@ -0,0 +1,130 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * 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 .
+ */
+
+#ifndef INCLUDED_IDL_INC_GLOBALS_HXX
+#define INCLUDED_IDL_INC_GLOBALS_HXX
+
+#include "hash.hxx"
+#include <memory>
+
+struct SvGlobalHashNames
+{
+ SvStringHashEntry* MM_module;
+ SvStringHashEntry* MM_interface;
+ SvStringHashEntry* MM_shell;
+ SvStringHashEntry* MM_Toggle;
+ SvStringHashEntry* MM_AutoUpdate;
+ SvStringHashEntry* MM_Asynchron;
+ SvStringHashEntry* MM_RecordPerSet;
+ SvStringHashEntry* MM_RecordPerItem;
+ SvStringHashEntry* MM_NoRecord;
+ SvStringHashEntry* MM_RecordAbsolute;
+ SvStringHashEntry* MM_enum;
+ SvStringHashEntry* MM_UINT16;
+ SvStringHashEntry* MM_INT16;
+ SvStringHashEntry* MM_UINT32;
+ SvStringHashEntry* MM_INT32;
+ SvStringHashEntry* MM_BOOL;
+ SvStringHashEntry* MM_BYTE;
+ SvStringHashEntry* MM_float;
+ SvStringHashEntry* MM_double;
+ SvStringHashEntry* MM_item;
+ SvStringHashEntry* MM_import;
+ SvStringHashEntry* MM_SlotIdFile;
+ SvStringHashEntry* MM_include;
+ SvStringHashEntry* MM_ExecMethod;
+ SvStringHashEntry* MM_StateMethod;
+ SvStringHashEntry* MM_GroupId;
+ SvStringHashEntry* MM_Export;
+ SvStringHashEntry* MM_define;
+ SvStringHashEntry* MM_MenuConfig;
+ SvStringHashEntry* MM_ToolBoxConfig;
+ SvStringHashEntry* MM_AccelConfig;
+ SvStringHashEntry* MM_FastCall;
+ SvStringHashEntry* MM_SbxObject;
+ SvStringHashEntry* MM_Container;
+ SvStringHashEntry* MM_ReadOnlyDoc;
+ SvStringHashEntry* MM_struct;
+ SvStringHashEntry* MM_DisableFlags;
+
+ SvGlobalHashNames();
+};
+
+class IdlDll
+{
+public:
+ std::unique_ptr<SvStringHashTable> pHashTable;
+ std::unique_ptr<SvGlobalHashNames> pGlobalNames;
+
+ IdlDll();
+ ~IdlDll();
+};
+
+IdlDll & GetIdlApp();
+
+#define HASH_INLINE( Name ) \
+inline SvStringHashEntry * SvHash_##Name() \
+{ \
+ if( !GetIdlApp().pGlobalNames ) \
+ GetIdlApp().pGlobalNames.reset( new SvGlobalHashNames() ); \
+ return GetIdlApp().pGlobalNames->MM_##Name; \
+}
+
+HASH_INLINE(module)
+HASH_INLINE(interface)
+HASH_INLINE(shell)
+HASH_INLINE(Toggle)
+HASH_INLINE(AutoUpdate)
+HASH_INLINE(Asynchron)
+HASH_INLINE(RecordPerItem)
+HASH_INLINE(RecordPerSet)
+HASH_INLINE(NoRecord)
+HASH_INLINE(RecordAbsolute)
+HASH_INLINE(enum)
+HASH_INLINE(UINT16)
+HASH_INLINE(INT16)
+HASH_INLINE(UINT32)
+HASH_INLINE(INT32)
+HASH_INLINE(BOOL)
+HASH_INLINE(BYTE)
+HASH_INLINE(item)
+HASH_INLINE(import)
+HASH_INLINE(SlotIdFile)
+HASH_INLINE(include)
+HASH_INLINE(ExecMethod)
+HASH_INLINE(StateMethod)
+HASH_INLINE(GroupId)
+HASH_INLINE(float)
+HASH_INLINE(double)
+HASH_INLINE(Export)
+HASH_INLINE(define)
+HASH_INLINE(MenuConfig)
+HASH_INLINE(ToolBoxConfig)
+HASH_INLINE(AccelConfig)
+HASH_INLINE(FastCall)
+HASH_INLINE(SbxObject)
+HASH_INLINE(Container)
+HASH_INLINE(ReadOnlyDoc)
+HASH_INLINE(struct)
+HASH_INLINE(DisableFlags)
+
+
+#endif // INCLUDED_IDL_INC_GLOBALS_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/idl/inc/hash.hxx b/idl/inc/hash.hxx
new file mode 100644
index 000000000..fb3ba3227
--- /dev/null
+++ b/idl/inc/hash.hxx
@@ -0,0 +1,61 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * 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 .
+ */
+
+#ifndef INCLUDED_IDL_INC_HASH_HXX
+#define INCLUDED_IDL_INC_HASH_HXX
+
+#include <rtl/ustring.hxx>
+#include <tools/ref.hxx>
+#include <tools/solar.h>
+#include <unordered_map>
+#include <memory>
+
+class SvStringHashEntry
+{
+ OString aName;
+ sal_uLong nValue;
+public:
+ SvStringHashEntry( const OString& rName )
+ : aName(rName)
+ , nValue(0)
+ {
+ }
+
+ const OString& GetName() const { return aName; }
+
+ void SetValue( sal_uLong n ) { nValue = n; }
+ sal_uLong GetValue() const { return nValue; }
+};
+
+class SvStringHashTable
+{
+ std::unordered_map<sal_uInt32, std::unique_ptr<SvStringHashEntry>> maInt2EntryMap;
+ std::unordered_map<OString, sal_uInt32> maString2IntMap;
+ sal_uInt32 mnNextId = 0;
+
+public:
+ SvStringHashEntry * Insert( OString const & rElement, sal_uInt32 * pInsertPos );
+ bool Test( OString const & rElement, sal_uInt32 * pInsertPos );
+ SvStringHashEntry * Get( sal_uInt32 nInsertPos ) const;
+ OString GetNearString( const OString& rName ) const;
+};
+
+#endif // INCLUDED_IDL_INC_HASH_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/idl/inc/lex.hxx b/idl/inc/lex.hxx
new file mode 100644
index 000000000..b7aa9336d
--- /dev/null
+++ b/idl/inc/lex.hxx
@@ -0,0 +1,217 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * 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 .
+ */
+
+#ifndef INCLUDED_IDL_INC_LEX_HXX
+#define INCLUDED_IDL_INC_LEX_HXX
+
+#include <sal/types.h>
+#include "hash.hxx"
+#include <tools/stream.hxx>
+#include <vector>
+#include <memory>
+
+enum class SVTOKENTYPE { Empty, Comment,
+ Integer, String,
+ Bool, Identifier,
+ Char,
+ EndOfFile, HashId };
+
+class SvToken
+{
+friend class SvTokenStream;
+ sal_uInt64 nLine, nColumn;
+ SVTOKENTYPE nType;
+ OString aString;
+ union
+ {
+ sal_uInt64 nLong;
+ bool bBool;
+ char cChar;
+ SvStringHashEntry * pHash;
+ };
+public:
+ SvToken();
+ SvToken( const SvToken & rObj ) = delete;
+
+ SvToken & operator = ( const SvToken & rObj );
+
+ OString GetTokenAsString() const;
+
+ void SetLine( sal_uInt64 nLineP ) { nLine = nLineP; }
+ sal_uInt64 GetLine() const { return nLine; }
+
+ void SetColumn( sal_uInt64 nColumnP ) { nColumn = nColumnP; }
+ sal_uInt64 GetColumn() const { return nColumn; }
+
+ bool IsComment() const { return nType == SVTOKENTYPE::Comment; }
+ bool IsInteger() const { return nType == SVTOKENTYPE::Integer; }
+ bool IsString() const { return nType == SVTOKENTYPE::String; }
+ bool IsBool() const { return nType == SVTOKENTYPE::Bool; }
+ bool IsIdentifierHash() const
+ { return nType == SVTOKENTYPE::HashId; }
+ bool IsIdentifier() const
+ {
+ return nType == SVTOKENTYPE::Identifier
+ || nType == SVTOKENTYPE::HashId;
+ }
+ bool IsChar() const { return nType == SVTOKENTYPE::Char; }
+ bool IsEof() const { return nType == SVTOKENTYPE::EndOfFile; }
+
+ const OString& GetString() const
+ {
+ return IsIdentifierHash()
+ ? pHash->GetName()
+ : aString;
+ }
+ sal_uInt64 GetNumber() const { return nLong; }
+ bool GetBool() const { return bBool; }
+ char GetChar() const { return cChar; }
+
+ void SetHash( SvStringHashEntry * pHashP )
+ { pHash = pHashP; nType = SVTOKENTYPE::HashId; }
+ bool Is( SvStringHashEntry const * pEntry ) const
+ { return IsIdentifierHash() && pHash == pEntry; }
+};
+
+inline SvToken::SvToken()
+ : nLine(0)
+ , nColumn(0)
+ , nType( SVTOKENTYPE::Empty )
+{
+}
+
+class SvTokenStream
+{
+ sal_uInt64 nLine, nColumn;
+ sal_Int32 nBufPos;
+ char c; // next character
+ static const sal_uInt16 nTabSize = 4; // length of tabulator
+ OString aStrTrue;
+ OString aStrFalse;
+ sal_uInt32 nMaxPos;
+
+ std::unique_ptr<SvFileStream> pInStream;
+ OUString aFileName;
+ std::vector<std::unique_ptr<SvToken> > aTokList;
+ std::vector<std::unique_ptr<SvToken> >::iterator pCurToken;
+
+ OString aBufStr;
+
+ void InitCtor();
+
+ char GetNextChar();
+ char GetFastNextChar()
+ {
+ return (nBufPos < aBufStr.getLength())
+ ? aBufStr[nBufPos++]
+ : '\0';
+ }
+
+ void FillTokenList();
+ sal_uInt64 GetNumber();
+ bool MakeToken( SvToken & );
+ bool IsEof() const { return pInStream->eof(); }
+ void SetMax()
+ {
+ sal_uInt32 n = Tell();
+ if( n > nMaxPos )
+ nMaxPos = n;
+ }
+ void CalcColumn()
+ {
+ // if end of line spare calculation
+ if( 0 != c )
+ {
+ sal_Int32 n = 0;
+ nColumn = 0;
+ while( n < nBufPos )
+ nColumn += aBufStr[n++] == '\t' ? nTabSize : 1;
+ }
+ }
+public:
+ SvTokenStream( const OUString & rFileName );
+ ~SvTokenStream();
+
+ const OUString & GetFileName() const { return aFileName; }
+ SvStream & GetStream() { return *pInStream; }
+
+ SvToken& GetToken_PrevAll()
+ {
+ std::vector<std::unique_ptr<SvToken> >::iterator pRetToken = pCurToken;
+
+ // current iterator always valid
+ if(pCurToken != aTokList.begin())
+ --pCurToken;
+
+ return *(*pRetToken);
+ }
+
+ SvToken& GetToken_Next()
+ {
+ std::vector<std::unique_ptr<SvToken> >::iterator pRetToken = pCurToken++;
+
+ if (pCurToken == aTokList.end())
+ pCurToken = pRetToken;
+
+ SetMax();
+
+ return *(*pRetToken);
+ }
+
+ SvToken& GetToken() const { return *(*pCurToken); }
+
+ bool ReadIf( char cChar )
+ {
+ if( GetToken().IsChar() && cChar == GetToken().GetChar() )
+ {
+ GetToken_Next();
+ return true;
+ }
+ else
+ return false;
+ }
+
+ void ReadIfDelimiter()
+ {
+ if( GetToken().IsChar()
+ && (';' == GetToken().GetChar()
+ || ',' == GetToken().GetChar()) )
+ {
+ GetToken_Next();
+ }
+ }
+
+ sal_uInt32 Tell() const { return pCurToken-aTokList.begin(); }
+
+ void Seek( sal_uInt32 nPos )
+ {
+ pCurToken = aTokList.begin() + nPos;
+ SetMax();
+ }
+
+ void SeekToMax()
+ {
+ pCurToken = aTokList.begin()+nMaxPos;
+ }
+};
+
+
+#endif // INCLUDED_IDL_INC_LEX_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/idl/inc/module.hxx b/idl/inc/module.hxx
new file mode 100644
index 000000000..05587ee96
--- /dev/null
+++ b/idl/inc/module.hxx
@@ -0,0 +1,38 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * 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 .
+ */
+
+#ifndef INCLUDED_IDL_INC_MODULE_HXX
+#define INCLUDED_IDL_INC_MODULE_HXX
+
+#include "slot.hxx"
+#include "object.hxx"
+
+class SvMetaModule final : public SvMetaObject
+{
+public:
+ SvRefMemberList<SvMetaClass *> aClassList;
+
+ SvMetaModule();
+
+ void WriteSfx( SvIdlDataBase & rBase, SvStream & rOutStm );
+};
+
+#endif // INCLUDED_IDL_INC_MODULE_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/idl/inc/object.hxx b/idl/inc/object.hxx
new file mode 100644
index 000000000..822e562c2
--- /dev/null
+++ b/idl/inc/object.hxx
@@ -0,0 +1,88 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * 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 .
+ */
+
+#ifndef INCLUDED_IDL_INC_OBJECT_HXX
+#define INCLUDED_IDL_INC_OBJECT_HXX
+
+#include "types.hxx"
+#include "slot.hxx"
+#include <vector>
+
+class SvMetaClass;
+typedef ::std::vector< SvMetaClass* > SvMetaClassList;
+
+class SvClassElement
+{
+ OString aPrefix;
+ tools::SvRef<SvMetaClass> xClass;
+public:
+ SvClassElement();
+ SvClassElement(SvMetaClass* pClass) { xClass = pClass; }
+
+ void SetPrefix( const OString& rPrefix )
+ { aPrefix = rPrefix; }
+ const OString& GetPrefix() const
+ { return aPrefix; }
+
+ void SetClass( SvMetaClass * pClass )
+ { xClass = pClass; }
+ SvMetaClass * GetClass() const
+ { return xClass.get(); }
+};
+
+
+class SvMetaClass : public SvMetaType
+{
+public:
+ tools::SvRef<SvMetaClass> aSuperClass;
+ std::vector<SvClassElement> aClassElementList;
+ SvRefMemberList<SvMetaAttribute *> aAttrList;
+ bool TestAttribute( SvIdlDataBase & rBase, SvTokenStream & rInStm,
+ SvMetaAttribute & rAttr ) const;
+private:
+
+ static void WriteSlotStubs( const OString& rShellName,
+ SvSlotElementList & rSlotList,
+ std::vector<OString> & rList,
+ SvStream & rOutStm );
+ static sal_uInt16 WriteSlotParamArray( SvIdlDataBase & rBase,
+ SvSlotElementList & rSlotList,
+ SvStream & rOutStm );
+ static sal_uInt16 WriteSlots( const OString& rShellName,
+ SvSlotElementList & rSlotList,
+ SvIdlDataBase & rBase,
+ SvStream & rOutStm );
+
+ void InsertSlots( SvSlotElementList& rList, std::vector<sal_uLong>& rSuperList,
+ SvMetaClassList & rClassList,
+ const OString& rPrefix, SvIdlDataBase& rBase );
+
+public:
+ SvMetaClass();
+ virtual void ReadContextSvIdl( SvIdlDataBase &,
+ SvTokenStream & rInStm ) override;
+
+ void FillClasses( SvMetaClassList & rList );
+
+ virtual void WriteSfx( SvIdlDataBase & rBase, SvStream & rOutStm ) override;
+};
+
+#endif // INCLUDED_IDL_INC_OBJECT_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/idl/inc/parser.hxx b/idl/inc/parser.hxx
new file mode 100644
index 000000000..ae9db7105
--- /dev/null
+++ b/idl/inc/parser.hxx
@@ -0,0 +1,72 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * 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 .
+ */
+
+#ifndef INCLUDED_IDL_INC_PARSER_HXX
+#define INCLUDED_IDL_INC_PARSER_HXX
+
+#include <rtl/ustring.hxx>
+#include "types.hxx"
+
+class SvTokenStream;
+class SvIdlDataBase;
+class SvMetaModule;
+class SvMetaTypeEnum;
+class SvStringHashEntry;
+class SvMetaType;
+class SvMetaClass;
+class SvBOOL;
+
+class SvIdlParser
+{
+ SvIdlDataBase& rBase;
+ SvTokenStream & rInStm;
+public:
+ SvIdlParser( SvIdlDataBase& rBase_, SvTokenStream & rInStrm_) : rBase(rBase_), rInStm(rInStrm_) {}
+ void ReadSvIdl( const OUString & rPath );
+ void ReadModuleHeader(SvMetaModule& rModule);
+ void ReadModuleBody(SvMetaModule& rModule);
+ void ReadModuleElement( SvMetaModule& rModule );
+ void ReadInclude( SvMetaModule& rModule );
+ void ReadInterfaceOrShell( SvMetaModule& rModule, MetaTypeType aMetaTypeType );
+ void ReadInterfaceOrShellEntry( SvMetaClass& rClass );
+ bool ReadSlot( SvMetaSlot& rSlot );
+ void ReadInterfaceOrShellMethod( SvMetaAttribute& rAttr );
+ void ReadItem();
+ void ReadStruct();
+ void ReadEnum();
+ void ReadEnumValue( SvMetaTypeEnum& rEnum );
+ void ReadSlotId(SvIdentifier& rSlotId);
+ void ReadSlotAttribute( SvMetaSlot& rSlot );
+ SvMetaClass* ReadKnownClass();
+ SvMetaType* ReadKnownType();
+ void Read(char cChar);
+ bool ReadIfBoolAttribute( SvBOOL&, SvStringHashEntry const * pName);
+ void ReadIfIdAttribute( SvIdentifier& rIdentifier, SvStringHashEntry const * pName );
+ bool ReadIf(char cChar);
+ void ReadDelimiter();
+ bool ReadIfDelimiter();
+ OString ReadIdentifier();
+ OString ReadString();
+ void Read(SvStringHashEntry const *);
+ bool ReadIf(SvStringHashEntry const *);
+};
+
+#endif // INCLUDED_IDL_INC_PARSER_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/idl/inc/slot.hxx b/idl/inc/slot.hxx
new file mode 100644
index 000000000..34709bc86
--- /dev/null
+++ b/idl/inc/slot.hxx
@@ -0,0 +1,136 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * 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 .
+ */
+
+#ifndef INCLUDED_IDL_INC_SLOT_HXX
+#define INCLUDED_IDL_INC_SLOT_HXX
+
+#include "types.hxx"
+#include "command.hxx"
+
+class SvMetaSlot : public SvMetaAttribute
+{
+public:
+ SvIdentifier aGroupId;
+ SvIdentifier aExecMethod;
+ SvIdentifier aStateMethod;
+
+ SvBOOL aToggle;
+ SvBOOL aAutoUpdate;
+
+ SvBOOL aAsynchron;
+
+ SvBOOL aRecordPerItem;// exclusive
+ SvBOOL aRecordPerSet;
+ SvBOOL aNoRecord;
+ SvBOOL aRecordAbsolute;
+
+ SvBOOL aMenuConfig;
+ SvBOOL aToolBoxConfig;
+ SvBOOL aAccelConfig;
+ SvBOOL aFastCall;
+ SvBOOL aContainer;
+ OString aDisableFlags;
+ SvMetaSlot* pNextSlot;
+ sal_uLong nListPos;
+ SvBOOL aReadOnlyDoc;
+ SvBOOL aExport;
+
+ void WriteSlot( const OString& rShellName,
+ sal_uInt16 nCount, const OString& rSlotId,
+ SvSlotElementList &rList,
+ size_t nStart,
+ SvIdlDataBase & rBase, SvStream & rOutStm );
+
+ bool IsVariable() const;
+ bool IsMethod() const;
+
+ void SetRecordPerItem( bool bSet )
+ {
+ aRecordPerItem = bSet;
+ if( bSet )
+ aRecordPerSet = aNoRecord = false;
+ }
+ void SetRecordPerSet( bool bSet )
+ {
+ aRecordPerSet = bSet;
+ if( bSet )
+ aRecordPerItem = aNoRecord = false;
+ }
+ void SetNoRecord( bool bSet )
+ {
+ aNoRecord = bSet;
+ if( bSet )
+ aRecordPerItem = aRecordPerSet = false;
+ }
+
+public:
+ SvMetaSlot();
+ SvMetaSlot( SvMetaType * pType );
+
+ const OString& GetGroupId() const;
+ const OString& GetExecMethod() const;
+ const OString& GetStateMethod() const;
+ const OString& GetDisableFlags() const;
+ bool GetToggle() const;
+ bool GetAutoUpdate() const;
+
+ bool GetAsynchron() const;
+
+ bool GetRecordPerItem() const;
+ bool GetRecordPerSet() const;
+ bool GetNoRecord() const;
+ bool GetRecordAbsolute() const;
+
+ bool GetMenuConfig() const;
+ bool GetToolBoxConfig() const;
+ bool GetAccelConfig() const;
+ bool GetFastCall() const;
+ bool GetContainer() const;
+ bool GetReadOnlyDoc() const;
+ bool GetExport() const;
+ bool GetHidden() const;
+
+ sal_uLong GetListPos() const
+ { return nListPos; }
+ void SetListPos(sal_uLong n)
+ { nListPos = n; }
+ void ResetSlotPointer()
+ { pNextSlot = nullptr; }
+
+ virtual bool Test( SvTokenStream & rInStm ) override;
+ virtual void ReadAttributesSvIdl( SvIdlDataBase & rBase,
+ SvTokenStream & rInStm ) override;
+ virtual bool ReadSvIdl( SvIdlDataBase &, SvTokenStream & rInStm ) override;
+ virtual void Insert( SvSlotElementList& ) override;
+ void WriteSlotStubs( const OString& rShellName,
+ std::vector<OString> & rList,
+ SvStream & rOutStm ) const;
+ sal_uInt16 WriteSlotMap( const OString& rShellName,
+ sal_uInt16 nCount,
+ SvSlotElementList&,
+ size_t nStart,
+ SvIdlDataBase & rBase,
+ SvStream & rOutStm );
+ sal_uInt16 WriteSlotParamArray( SvIdlDataBase & rBase,
+ SvStream & rOutStm ) const;
+};
+
+#endif // INCLUDED_IDL_INC_SLOT_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/idl/inc/types.hxx b/idl/inc/types.hxx
new file mode 100644
index 000000000..97c353b36
--- /dev/null
+++ b/idl/inc/types.hxx
@@ -0,0 +1,119 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * 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 .
+ */
+
+#ifndef INCLUDED_IDL_INC_TYPES_HXX
+#define INCLUDED_IDL_INC_TYPES_HXX
+
+#include <rtl/strbuf.hxx>
+#include <tools/solar.h>
+#include <tools/ref.hxx>
+#include "basobj.hxx"
+
+class SvMetaType;
+class SvMetaSlot;
+typedef SvRefMemberList< SvMetaSlot* > SvSlotElementList;
+
+class SvMetaAttribute : public SvMetaReference
+{
+public:
+ tools::SvRef<SvMetaType> aType;
+ SvIdentifier aSlotId;
+ SvMetaAttribute();
+ SvMetaAttribute( SvMetaType * );
+
+ void SetSlotId( const SvIdentifier & rId )
+ { aSlotId = rId; }
+ const SvIdentifier& GetSlotId() const;
+ SvMetaType * GetType() const;
+
+ virtual bool Test( SvTokenStream & rInStm );
+ virtual bool ReadSvIdl( SvIdlDataBase &, SvTokenStream & rInStm ) override;
+ sal_uLong MakeSfx( OStringBuffer& rAtrrArray ) const;
+ virtual void Insert( SvSlotElementList& );
+};
+
+enum MetaTypeType { Method, Struct, Base, Enum, Interface, Shell };
+
+class SvMetaType : public SvMetaReference
+{
+ SvRefMemberList<SvMetaAttribute *> aAttrList;
+ MetaTypeType nType;
+ bool bIsItem;
+
+ void WriteSfxItem( const OString& rItemName, SvIdlDataBase const & rBase,
+ SvStream & rOutStm );
+protected:
+ bool ReadHeaderSvIdl( SvTokenStream & rInStm );
+public:
+ SvMetaType();
+ SvMetaType( const OString& rTypeName );
+
+ virtual ~SvMetaType() override;
+
+ virtual void ReadContextSvIdl( SvIdlDataBase &, SvTokenStream & rInStm ) override;
+
+ SvRefMemberList<SvMetaAttribute *>&
+ GetAttrList() { return aAttrList; }
+ sal_uLong GetAttrCount() const { return aAttrList.size(); }
+
+ void SetType( MetaTypeType nT );
+ MetaTypeType GetMetaTypeType() const { return nType; }
+ SvMetaType * GetBaseType() const;
+ SvMetaType * GetReturnType() const;
+ void SetItem(bool b) { bIsItem = b; }
+ bool IsItem() const { return bIsItem; }
+
+ virtual bool ReadSvIdl( SvIdlDataBase &, SvTokenStream & rInStm ) override;
+
+ sal_uLong MakeSfx( OStringBuffer& rAtrrArray );
+ virtual void WriteSfx( SvIdlDataBase & rBase, SvStream & rOutStm );
+ bool ReadMethodArgs( SvIdlDataBase & rBase,
+ SvTokenStream & rInStm );
+};
+
+class SvMetaTypeString final : public SvMetaType
+{
+public:
+ SvMetaTypeString();
+};
+
+class SvMetaEnumValue final : public SvMetaObject
+{
+public:
+ SvMetaEnumValue();
+};
+
+class SvMetaTypeEnum final : public SvMetaType
+{
+public:
+ SvRefMemberList<SvMetaEnumValue *> aEnumValueList;
+ OString aPrefix;
+ SvMetaTypeEnum();
+};
+
+class SvMetaTypevoid final : public SvMetaType
+{
+public:
+ SvMetaTypevoid();
+};
+
+
+#endif // INCLUDED_IDL_INC_TYPES_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */