| /************************************************************** |
| * |
| * 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. |
| * |
| *************************************************************/ |
| |
| |
| |
| // MARKER(update_precomp.py): autogen include statement, do not remove |
| #include "precompiled_idl.hxx" |
| |
| #include <stdlib.h> |
| #include <stdio.h> |
| #include <string.h> |
| #include <ctype.h> |
| |
| #include <command.hxx> |
| #include <globals.hxx> |
| #include <database.hxx> |
| #include <tools/fsys.hxx> |
| |
| /************************************************************************* |
| |* |
| |* Syntaxbeschreibung |
| |* |
| *************************************************************************/ |
| char const * SyntaxStrings[] = { |
| "basic-type:", |
| "\tvoid| char| int| float| double|", |
| "\tUINT16| INT16| UINT32| INT32| BOOL|", |
| "\tBYTE| String| SbxObject", |
| "", |
| "{ import \"filename\" }\n", |
| "module definition:", |
| "module", |
| "\tunique id range (ask MM)", |
| "modul-name", |
| "'['", |
| "\tSlotIdFile( \"filename\" )", |
| "']'", |
| "'{'", |
| "\t{ include \"filename\" }\n", |
| |
| "\titem definition:", |
| "\titem type item-name;\n", |
| |
| "\ttype definition:", |
| "\tstruct | union identifier", |
| "\t'{'", |
| "\t\t{ type idetifier }", |
| "\t'}'", |
| "\t|", |
| "\tenum identifier", |
| "\t'{'", |
| "\t\t{ identifier, }", |
| "\t'}'", |
| "\t|", |
| "\ttypedef type identifier\n", |
| |
| "\titem-method:", |
| "\titem identifier item-method-args\n", |
| |
| "\titem-method-args:", |
| "\t( { item parameter-name SLOT_ID } )\n", |
| |
| "\tslot definition:", |
| "\titem identifier SLOT_ID [ item-method-args ]", |
| "\t'['\n", |
| |
| "\t\titem-method-args", |
| "\t\tAccelConfig, MenuConfig, StatusBarConfig, ToolbarConfig", |
| "\t\tAutomation*", |
| "\t\tAutoUpdate", |
| // "\t\tCachable*, Volatile", |
| "\t\tContainer", |
| "\t\tDefault = Identifier", |
| "\t\tExecMethod = Identifier", |
| "\t\tExport*", |
| "\t\tFastCall", |
| "\t\tGet, Set", |
| "\t\tGroupId = Identifier", |
| "\t\tHasCoreId", |
| "\t\tHasDialog", |
| "\t\tIsCollection", |
| "\t\tImageRotation", |
| "\t\tImageReflection", |
| "\t\tPseudoPrefix = Identifier", |
| "\t\tPseudoSlots", |
| "\t\tReadOnly", |
| "\t\tReadOnlyDoc*", |
| "\t\tRecordPerSet*, RecordPerItem, RecordManual, NoRecord", |
| "\t\tRecordAbsolute", |
| "\t\tStateMethod = Identifier", |
| "\t\tSynchron*, Asynchron", |
| "\t\tToggle", |
| "\t']'\n", |
| |
| "\tinterface definition:", |
| "\tshell | interface identifier ':' interface", |
| "\t'{'", |
| "\t\t{ slot }", |
| "\t'}'\n", |
| "---syntax example is sfx.idl---\n", |
| NULL }; |
| |
| char CommandLineSyntax[] = |
| "-fs<slotmap file> -fl<listing file>\n" |
| "-fo<odl file> -fd<data base file>\n" |
| "-fi<item implementation> -ft<type library file> (not OLE)\n" |
| "-fr<ressource file> -fm<makefile target file>\n" |
| "-fC<c++ source file> -fH<c++ header file>\n" |
| "-fc<c source file> -fh<c header file>\n" |
| "-rsc <*.srs header line>\n" |
| "-help, ? @<file> response file\n" |
| " <filenames>\n"; |
| |
| /************************************************************************* |
| |* |
| |* Init() |
| |* |
| |* Beschreibung |
| |* Ersterstellung MM 15.12.94 |
| |* Letzte Aenderung MM 15.12.94 |
| |* |
| *************************************************************************/ |
| void Init() |
| { |
| if( !IDLAPP->pHashTable ) |
| IDLAPP->pHashTable = new SvStringHashTable( 2801 ); |
| if( !IDLAPP->pGlobalNames ) |
| IDLAPP->pGlobalNames = new SvGlobalHashNames(); |
| } |
| |
| /************************************************************************* |
| |* |
| |* DeInit() |
| |* |
| |* Beschreibung |
| |* |
| *************************************************************************/ |
| void DeInit() |
| { |
| delete IDLAPP; |
| } |
| |
| /************************************************************************* |
| |* |
| |* DeInit() |
| |* |
| |* Beschreibung |
| |* |
| *************************************************************************/ |
| sal_Bool ReadIdl( SvIdlWorkingBase * pDataBase, const SvCommand & rCommand ) |
| { |
| for( sal_uInt16 n = 0; n < rCommand.aInFileList.Count(); n++ ) |
| { |
| String aFileName ( *rCommand.aInFileList.GetObject( n ) ); |
| SvFileStream aStm( aFileName, STREAM_STD_READ | STREAM_NOCREATE ); |
| if( aStm.GetError() == SVSTREAM_OK ) |
| { |
| if( pDataBase->IsBinaryFormat( aStm ) ) |
| { |
| pDataBase->Load( aStm ); |
| if( aStm.GetError() != SVSTREAM_OK ) |
| { |
| ByteString aStr; |
| if( aStm.GetError() == SVSTREAM_FILEFORMAT_ERROR ) |
| aStr = "error: incompatible format, file "; |
| else if( aStm.GetError() == SVSTREAM_WRONGVERSION ) |
| aStr = "error: wrong version, file "; |
| else |
| aStr = "error during load, file "; |
| aStr += ByteString( aFileName, RTL_TEXTENCODING_UTF8 ); |
| fprintf( stderr, "%s\n", aStr.GetBuffer() ); |
| return sal_False; |
| } |
| } |
| else |
| { |
| SvTokenStream aTokStm( aStm, aFileName ); |
| if( !pDataBase->ReadSvIdl( aTokStm, sal_False, rCommand.aPath ) ) |
| return sal_False; |
| } |
| } |
| else |
| { |
| const ByteString aStr( aFileName, RTL_TEXTENCODING_UTF8 ); |
| fprintf( stderr, "unable to read input file: %s\n", aStr.GetBuffer() ); |
| return sal_False; |
| } |
| } |
| return sal_True; |
| } |
| |
| /************************************************************************* |
| |* |
| |* SvCommand::SvCommand() |
| |* |
| |* Beschreibung |
| |* |
| *************************************************************************/ |
| static sal_Bool ResponseFile( StringList * pList, int argc, char ** argv ) |
| { |
| // Programmname |
| pList->Insert( new String( String::CreateFromAscii(*argv) ), LIST_APPEND ); |
| for( int i = 1; i < argc; i++ ) |
| { |
| if( '@' == **(argv +i) ) |
| { // wenn @, dann Response-Datei |
| SvFileStream aStm( String::CreateFromAscii((*(argv +i)) +1), STREAM_STD_READ | STREAM_NOCREATE ); |
| if( aStm.GetError() != SVSTREAM_OK ) |
| return sal_False; |
| |
| ByteString aStr; |
| while( aStm.ReadLine( aStr ) ) |
| { |
| sal_uInt16 n = 0; |
| sal_uInt16 nPos = 1; |
| while( n != nPos ) |
| { |
| while( aStr.GetChar(n) && isspace( aStr.GetChar(n) ) ) |
| n++; |
| nPos = n; |
| while( aStr.GetChar(n) && !isspace( aStr.GetChar(n) ) ) |
| n++; |
| if( n != nPos ) |
| pList->Insert( new String( String::CreateFromAscii( aStr.Copy( nPos, n - nPos ).GetBuffer() ) ), LIST_APPEND ); |
| } |
| } |
| } |
| else if( argv[ i ] ) |
| pList->Insert( new String( String::CreateFromAscii( argv[ i ] ) ), LIST_APPEND ); |
| } |
| return sal_True; |
| } |
| |
| /************************************************************************* |
| |* SvCommand::SvCommand() |
| |* |
| |* Beschreibung |
| *************************************************************************/ |
| SvCommand::SvCommand( int argc, char ** argv ) |
| : nVerbosity(1), nFlags( 0 ) |
| { |
| StringList aList; |
| |
| if( ResponseFile( &aList, argc, argv ) ) |
| for( sal_uLong i = 1; i < aList.Count(); i++ ) |
| { |
| String aParam( *aList.GetObject( i ) ); |
| sal_Unicode aFirstChar( aParam.GetChar(0) ); |
| if( '-' == aFirstChar ) |
| { |
| aParam.Erase( 0, 1 ); |
| aFirstChar = aParam.GetChar(0); |
| if( aFirstChar == 'F' || aFirstChar == 'f' ) |
| { |
| aParam.Erase( 0, 1 ); |
| aFirstChar = aParam.GetChar(0); |
| String aName( aParam.Copy( 1 ) ); |
| if( 's' == aFirstChar ) |
| { // Name der Slot-Ausgabe |
| aSlotMapFile = aName; |
| } |
| else if( 'l' == aFirstChar ) |
| { // Name der Listing |
| aListFile = aName; |
| } |
| else if( 'i' == aFirstChar ) |
| { // Name der Item-Datei |
| // aSfxItemFile = aName; |
| } |
| else if( 'o' == aFirstChar ) |
| { // Name der ODL-Datei |
| // aODLFile = aName; |
| } |
| else if( 'd' == aFirstChar ) |
| { // Name der Datenbasis-Datei |
| aDataBaseFile = aName; |
| } |
| else if( 'D' == aFirstChar ) |
| { // Name der Docu-Datei f"ur das API |
| // aDocuFile = aName; |
| } |
| else if( 'C' == aFirstChar ) |
| { // Name der cxx-Datei |
| // aCxxFile = aName; |
| } |
| else if( 'H' == aFirstChar ) |
| { // Name der hxx-Datei |
| // aHxxFile = aName; |
| } |
| else if( 'c' == aFirstChar ) |
| { // Name der C-Header-Datei |
| // aCSourceFile = aName; |
| } |
| else if( 'h' == aFirstChar ) |
| { // Name der C-Header-Datei |
| // aCHeaderFile = aName; |
| } |
| else if( 't' == aFirstChar ) |
| { // Name der Info-Datei |
| // aCallingFile = aName; |
| } |
| else if( 'm' == aFirstChar ) |
| { // Name der Info-Datei |
| aTargetFile = aName; |
| } |
| else if( 'r' == aFirstChar ) |
| { // Name der Resource-Datei |
| // aSrcFile = aName; |
| } |
| else if( 'z' == aFirstChar ) |
| { // Name der HelpId-Datei |
| aHelpIdFile = aName; |
| } |
| else if( 'y' == aFirstChar ) |
| { // Name der CSV-Datei |
| aCSVFile = aName; |
| } |
| else if( 'x' == aFirstChar ) |
| { // Name der IDL-Datei fuer die CSV-Datei |
| aExportFile = aName; |
| } |
| else |
| { |
| printf( |
| "unknown switch: %s\n", |
| rtl::OUStringToOString( |
| aParam, RTL_TEXTENCODING_UTF8).getStr()); |
| exit( -1 ); |
| } |
| } |
| else if( aParam.EqualsIgnoreCaseAscii( "help" ) || aParam.EqualsIgnoreCaseAscii( "?" ) ) |
| { // Hilfe |
| printf( "%s", CommandLineSyntax ); |
| } |
| else if( aParam.EqualsIgnoreCaseAscii( "quiet" ) ) |
| { |
| nVerbosity = 0; |
| } |
| else if( aParam.EqualsIgnoreCaseAscii( "verbose" ) ) |
| { |
| nVerbosity = 2; |
| } |
| else if( aParam.EqualsIgnoreCaseAscii( "syntax" ) ) |
| { // Hilfe |
| int j = 0; |
| while(SyntaxStrings[j]) |
| printf("%s\n",SyntaxStrings[j++]); |
| } |
| else if( aParam.EqualsIgnoreCaseAscii( "i", 0, 1 ) ) |
| { // Include-Pfade definieren |
| String aName( aParam.Copy( 1 ) ); |
| if( aPath.Len() ) |
| aPath += DirEntry::GetSearchDelimiter(); |
| aPath += aName; |
| } |
| else if( aParam.EqualsIgnoreCaseAscii( "rsc", 0, 3 ) ) |
| { // erste Zeile im *.srs File |
| if( aList.GetObject( i +1 ) ) |
| { |
| aSrsLine = ByteString( *aList.GetObject( i +1 ), RTL_TEXTENCODING_UTF8 ); |
| i++; |
| } |
| } |
| else |
| { |
| // temporary compatibility hack |
| printf( |
| "unknown switch: %s\n", |
| rtl::OUStringToOString( |
| aParam, RTL_TEXTENCODING_UTF8).getStr()); |
| exit( -1 ); |
| } |
| } |
| else |
| { |
| aInFileList.Insert( new String( aParam ), LIST_APPEND ); |
| } |
| } |
| else |
| { |
| printf( "%s", CommandLineSyntax ); |
| } |
| |
| String * pStr = aList.First(); |
| while( pStr ) |
| { |
| delete pStr; |
| pStr = aList.Next(); |
| } |
| |
| ByteString aInc( getenv( "INCLUDE" ) ); |
| // Include Environmentvariable anhaengen |
| if( aInc.Len() ) |
| { |
| if( aPath.Len() ) |
| aPath += DirEntry::GetSearchDelimiter(); |
| aPath += String::CreateFromAscii( aInc.GetBuffer() ); |
| } |
| } |
| |
| /************************************************************************* |
| |* |
| |* SvCommand::~SvCommand() |
| |* |
| |* Beschreibung |
| |* |
| *************************************************************************/ |
| SvCommand::~SvCommand() |
| { |
| // ByteString Liste freigeben |
| String * pStr; |
| while( NULL != (pStr = aInFileList.Remove()) ) |
| delete pStr; |
| } |
| |