Files
libreoffice/idl/source/prj/svidl.cxx

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

216 lines
7.2 KiB
C++
Raw Normal View History

/* -*- 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 .
*/
2000-09-18 15:33:13 +00:00
2000-09-18 15:33:13 +00:00
#include <stdlib.h>
#include <stdio.h>
#include <database.hxx>
#include <globals.hxx>
#include <command.hxx>
#include <rtl/ustring.hxx>
#include <osl/file.hxx>
#include <memory>
2000-09-18 15:33:13 +00:00
#define BR 0x8000
static bool FileMove_Impl( const OUString & rFile1, const OUString & rFile2, bool bMoveAlways )
2000-09-18 15:33:13 +00:00
{
//printf( "Move from %s to %s\n", rFile2.GetStr(), rFile1.GetStr() );
sal_uLong nC1 = 0;
sal_uLong nC2 = 1;
if( !bMoveAlways )
2000-09-18 15:33:13 +00:00
{
SvFileStream aOutStm1( rFile1, StreamMode::STD_READ );
SvFileStream aOutStm2( rFile2, StreamMode::STD_READ );
if( aOutStm1.GetError() == ERRCODE_NONE )
2000-09-18 15:33:13 +00:00
{
std::unique_ptr<sal_uInt8[]> pBuf1(new sal_uInt8[ BR ]);
std::unique_ptr<sal_uInt8[]> pBuf2(new sal_uInt8[ BR ]);
nC1 = aOutStm1.ReadBytes(pBuf1.get(), BR);
nC2 = aOutStm2.ReadBytes(pBuf2.get(), BR);
2000-09-18 15:33:13 +00:00
while( nC1 == nC2 )
{
if( memcmp( pBuf1.get(), pBuf2.get(), nC1 ) )
2000-09-18 15:33:13 +00:00
{
nC1++;
break;
}
else
{
if( 0x8000 != nC1 )
break;
nC1 = aOutStm1.ReadBytes(pBuf1.get(), BR);
nC2 = aOutStm2.ReadBytes(pBuf2.get(), BR);
2000-09-18 15:33:13 +00:00
}
}
}
}
OUString fileURL2;
osl::FileBase::getFileURLFromSystemPath( rFile2, fileURL2 );
2000-09-18 15:33:13 +00:00
if( nC1 != nC2 )
{// something has changed
OUString fileURL1;
osl::FileBase::getFileURLFromSystemPath( rFile1, fileURL1 );
// move file
if( osl::FileBase::E_None != osl::File::move( fileURL2, fileURL1 ) )
2000-09-18 15:33:13 +00:00
{
// delete both files
osl::File::remove( fileURL1 );
osl::File::remove( fileURL2 );
return false;
2000-09-18 15:33:13 +00:00
}
return true;
2000-09-18 15:33:13 +00:00
}
return osl::FileBase::E_None == osl::File::remove( fileURL2 );
}
//This function gets a system path to a file [fname], creates a temp file in
//the same folder as [fname] and returns the system path of the temp file.
static OUString tempFileHelper(OUString const & fname)
{
OUString aTmpFile;
sal_Int32 delimIndex = fname.lastIndexOf( '/' );
if( delimIndex > 0 )
{
OUString aTmpDir( fname.copy( 0, delimIndex ) );
osl::FileBase::getFileURLFromSystemPath( aTmpDir, aTmpDir );
osl::FileBase::createTempFile( &aTmpDir, nullptr, &aTmpFile );
osl::FileBase::getSystemPathFromFileURL( aTmpFile, aTmpFile );
}
else
{
OString aStr = "invalid filename: " +
OUStringToOString(fname, RTL_TEXTENCODING_UTF8);
fprintf(stderr, "%s\n", aStr.getStr());
}
return aTmpFile;
2000-09-18 15:33:13 +00:00
}
int main ( int argc, char ** argv)
{
OUString aTmpSlotMapFile;
OUString aTmpDepFile;
2000-09-18 15:33:13 +00:00
SvCommand aCommand( argc, argv );
CWS-TOOLING: integrate CWS buildverbosity 2009-10-13 15:51:48 +0200 fs r276867 : allow building with 'nodep'=='' 2009-10-11 22:39:56 +0200 fs r276820 : silence a compiler warning in a file only used when VERBOSE!="" 2009-10-09 14:37:43 +0200 fs r276807 : let not override the non-presence of $VERBOSE the given command line arguments 2009-10-09 14:36:25 +0200 fs r276806 : also deliver spirit/home/classic/debug/impl 2009-10-08 13:38:07 +0200 fs r276789 : not that many line feeds in --show mode 2009-10-08 13:13:01 +0200 fs r276788 : minor adjustments requested by hjs: - replaced space/tab mixes at beginning of lines with mere tab - made "nothing to update" message for the ZIPALLTARGET target more prominent - removed useless "echo > /dev/nul" statements 2009-10-07 13:32:12 +0200 fs r276753 : #i105585# 2009-10-07 11:31:59 +0200 fs r276742 : #i10000# missing dependency between stoc/security and stoc/util 2009-10-06 22:59:59 +0200 fs r276729 : CWS-TOOLING: rebase CWS buildverbosity to trunk@276699 (milestone: DEV300:m61) 2009-09-29 12:04:58 +0200 fs r276518 : #i10000# 2009-09-29 12:04:25 +0200 fs r276517 : oops 2009-09-29 12:01:07 +0200 fs r276516 : #i84497# removed some more (non-diagnostic) 'echo ------' directives 2009-09-29 11:59:29 +0200 fs r276515 : #i84497# removed some more (non-diagnostic) 'echo ------' directives 2009-09-29 11:52:32 +0200 fs r276514 : #i84497# removed the various 'echo ------------' directives from verbose mode, as per hjs' request 2009-09-29 11:44:16 +0200 fs r276513 : do not duplicate IDLC call commands with different verbosity switches 2009-09-28 21:43:50 +0200 thb r276502 : #i84497# fixed potential recursive macro def + extra ls * solenv/inc/settings.mk: now setting via VERBOSE!:=, removes warning and my spurious "recursive macro definition" error * solenv/inc/tg_app.mk: one extra ls silenced for app target (and quiet mode, that goes without saying) 2009-09-23 08:57:01 +0200 fs r276366 : use ULFEX_VERBOSITY instead of duplicating the ULFEX call 2009-09-21 11:42:26 +0200 fs r276320 : ignore output paths 2009-09-21 11:04:27 +0200 fs r276318 : silence another compiler warning, which only hits us when actually using this (debug) file, which is the case only when slideshow is compiled with a env variable VERBOSE, thus came up in CWS buildverbosity 2009-09-21 10:30:14 +0200 fs r276313 : make some output depend on VERBOSE==TRUE, not COMMAND_ECHO="" While both are equivalent at the moment, COMMAND_ECHO finally is an implementation default of the VERBOSE flag only, so better rely on VERBOSE as the primary verbosity flag 2009-09-21 09:56:57 +0200 fs r276311 : forgot to re-generate from tg_zip before committing 2009-09-21 09:52:11 +0200 fs r276310 : #i84497# even less verbosity 2009-09-17 11:02:47 +0200 fs r276232 : #i84497# verbose implies VERBOSE nowadays, and VERBOSE==FALSE should not lead to -DVERBOSE 2009-09-15 22:59:37 +0200 fs r276189 : #i105022# copy fix for this P1 into this CWS 2009-09-15 11:56:35 +0200 fs r276165 : CWS-TOOLING: rebase CWS buildverbosity to trunk@276043 (milestone: DEV300:m58) 2009-09-14 17:45:10 +0200 fs r276137 : #i84497# don't duplicate zip lines w/ and w/o -q switch, use a variable instead (maintenance) 2009-09-14 15:01:33 +0200 fs r276124 : #i10000# 2009-09-11 23:58:46 +0200 thb r276083 : #i84497#: More quiet-build fine tuning - silenced rsc for real (properly filtering options for cpp, and a pretty brutal amputation of the tool blurp, which would have needed cmd opt parser duplication) - silenced deliver.pl - silenced checkdll.sh - silenced zip via -q (in quiet mode) - silenced various idl, resource, transex whatever tool, passing appropriate options down to them '-QQ' sometimes - silenced dmake, pointless blurb that something does *not* need update removed - silenced the old starview idl compiler, to not output tool's name & progress chars in quiet mode 2009-09-11 21:13:59 +0200 thb r276081 : #i84497#: More bits on the quiet mode of the build. The bulk of the changes is disabling those annoying "echo ------------------" lines for the quiet build, which has the stretch goal of outputting *exactly* one line per file compiled/linked/processed. Apart from that, silenced a few especialy annoying module-specific makefiles (basically adding $(COMMAND_ECHO) in front of a gazillion rules). Additionally, slightly tweaked what idlc regards verbose, normal, and quiet mode; this was to have it echo exactly one line per idl file processed (the fact that quiet mode did not echo *anything* for idl files was a bit too much for my taste) 2009-09-04 09:14:35 +0200 fs r275777 : don't emit the link parameters if VERBOSE!=TRUE 2009-09-02 10:31:15 +0200 fs r275700 : #i10000# 2009-09-02 08:44:14 +0200 fs r275697 : update svn:ignore to ignore the output paths 2009-09-02 08:40:54 +0200 fs r275695 : #i84497# less verbose output during build, unless a dedicated '-verbose' switch is given 2009-09-02 08:40:28 +0200 fs r275694 : GRAPHITE is missing in the BUILD_TYPE 2009-09-02 08:40:05 +0200 fs r275693 : #i84497# less verbose output during build, unless a dedicated '-verbose' switch is given 2009-09-02 08:39:25 +0200 fs r275692 : #i84497# less verbose output during build, unless a dedicated '-verbose' switch is given 2009-09-02 08:39:02 +0200 fs r275691 : #i84497# less verbose output during build, unless a dedicated '-verbose' switch is given 2009-09-02 08:38:09 +0200 fs r275690 : #i84497# less verbose output during build 2009-09-02 08:37:06 +0200 fs r275689 : #i84497# don't emit that much noise, unless a '-verbose' switch is given
2009-10-21 10:43:22 +00:00
if( aCommand.nVerbosity != 0 )
printf( "StarView Interface Definition Language (IDL) Compiler 3.0\n" );
Init();
std::unique_ptr<SvIdlWorkingBase> pDataBase( new SvIdlWorkingBase(aCommand));
2000-09-18 15:33:13 +00:00
int nExit = 0;
if( !aCommand.aExportFile.isEmpty() )
2000-09-18 15:33:13 +00:00
{
osl::DirectoryItem aDI;
osl::FileStatus fileStatus( osl_FileStatus_Mask_FileName );
(void)osl::DirectoryItem::get( aCommand.aExportFile, aDI );
(void)aDI.getFileStatus(fileStatus);
pDataBase->SetExportFile( fileStatus.getFileName() );
2000-09-18 15:33:13 +00:00
}
if( ReadIdl( pDataBase.get(), aCommand ) )
2000-09-18 15:33:13 +00:00
{
if( nExit == 0 && !aCommand.aSlotMapFile.isEmpty() )
2000-09-18 15:33:13 +00:00
{
aTmpSlotMapFile = tempFileHelper(aCommand.aSlotMapFile);
SvFileStream aOutStm( aTmpSlotMapFile, StreamMode::READWRITE | StreamMode::TRUNC );
2000-09-18 15:33:13 +00:00
if( !pDataBase->WriteSfx( aOutStm ) )
{
nExit = -1;
OString aStr = "cannot write slotmap file: " +
OUStringToOString(aCommand.aSlotMapFile, RTL_TEXTENCODING_UTF8);
2011-11-27 08:21:00 +00:00
fprintf(stderr, "%s\n", aStr.getStr());
2000-09-18 15:33:13 +00:00
}
}
if (nExit == 0 && !aCommand.m_DepFile.isEmpty())
{
aTmpDepFile = tempFileHelper(aCommand.m_DepFile);
SvFileStream aOutStm( aTmpDepFile, StreamMode::READWRITE | StreamMode::TRUNC );
pDataBase->WriteDepFile(aOutStm, aCommand.aTargetFile);
if( aOutStm.GetError() != ERRCODE_NONE )
{
nExit = -1;
fprintf( stderr, "cannot write dependency file: %s\n",
OUStringToOString( aCommand.m_DepFile,
RTL_TEXTENCODING_UTF8 ).getStr() );
}
}
2000-09-18 15:33:13 +00:00
}
else
nExit = -1;
if( nExit == 0 )
{
bool bErr = false;
bool bDoMove = aCommand.aTargetFile.isEmpty();
OUString aErrFile, aErrFile2;
if (!aCommand.aSlotMapFile.isEmpty())
2000-09-18 15:33:13 +00:00
{
bErr = !FileMove_Impl( aCommand.aSlotMapFile, aTmpSlotMapFile, bDoMove );
if( bErr ) {
2000-09-18 15:33:13 +00:00
aErrFile = aCommand.aSlotMapFile;
aErrFile2 = aTmpSlotMapFile;
}
2000-09-18 15:33:13 +00:00
}
if (!bErr && !aCommand.m_DepFile.isEmpty())
{
bErr |= !FileMove_Impl( aCommand.m_DepFile, aTmpDepFile, bDoMove );
if (bErr) {
aErrFile = aCommand.m_DepFile;
aErrFile2 = aTmpDepFile;
}
}
2000-09-18 15:33:13 +00:00
if( bErr )
{
nExit = -1;
OString aStr = "cannot move file from: " +
OUStringToOString(aErrFile2, RTL_TEXTENCODING_UTF8) +
"\n to file: " +
OUStringToOString(aErrFile, RTL_TEXTENCODING_UTF8);
2011-11-27 08:21:00 +00:00
fprintf( stderr, "%s\n", aStr.getStr() );
2000-09-18 15:33:13 +00:00
}
else
{
if( !aCommand.aTargetFile.isEmpty() )
2000-09-18 15:33:13 +00:00
{
// stamp file, because idl passed through correctly
2000-09-18 15:33:13 +00:00
SvFileStream aOutStm( aCommand.aTargetFile,
StreamMode::READWRITE | StreamMode::TRUNC );
2000-09-18 15:33:13 +00:00
}
}
}
if( nExit != 0 )
{
if( !aCommand.aSlotMapFile.isEmpty() )
{
osl::FileBase::getSystemPathFromFileURL( aTmpSlotMapFile, aTmpSlotMapFile );
osl::File::remove( aTmpSlotMapFile );
}
2000-09-18 15:33:13 +00:00
}
if( nExit != 0 )
fprintf( stderr, "svidl terminated with errors\n" );
return nExit;
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */