config_host.mk.in | 1 configure.in | 1 idlc/CustomTarget_scanner.mk | 39 -- idlc/Executable_idlc.mk | 5 idlc/Module_idlc.mk | 1 idlc/source/scanner.l | 536 +++++++++++++++++++++++++++++++++++++++ idlc/source/scanner.ll | 536 --------------------------------------- idlc/source/wrap_parser.cxx | 32 -- idlc/source/wrap_scanner.cxx | 38 -- solenv/gbuild/Executable.mk | 2 solenv/gbuild/Library.mk | 2 solenv/gbuild/LinkTarget.mk | 49 +++ solenv/gbuild/TargetLocations.mk | 5 13 files changed, 599 insertions(+), 648 deletions(-)
New commits: commit 1bec43481eb6cbe58b22b8c2ce3688e858f5f92f Author: David Ostrovsky <[email protected]> Date: Tue May 1 00:04:38 2012 +0200 build: cleaning up previously converted idlc module Change-Id: Ic90495f677dc42c0430492548deaa9f9b10e4d44 diff --git a/idlc/CustomTarget_scanner.mk b/idlc/CustomTarget_scanner.mk deleted file mode 100644 index e7e3c2f..0000000 --- a/idlc/CustomTarget_scanner.mk +++ /dev/null @@ -1,39 +0,0 @@ -# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- -# Version: MPL 1.1 / GPLv3+ / LGPLv3+ -# -# The contents of this file are subject to the Mozilla Public License Version -# 1.1 (the "License"); you may not use this file except in compliance with -# the License or as specified alternatively below. You may obtain a copy of -# the License at http://www.mozilla.org/MPL/ -# -# Software distributed under the License is distributed on an "AS IS" basis, -# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License -# for the specific language governing rights and limitations under the -# License. -# -# Major Contributor(s): -# Copyright (C) 2012 David Ostrovsky <[email protected]> (initial developer) -# -# All Rights Reserved. -# -# For minor contributions see the git repository. -# -# Alternatively, the contents of this file may be used under the terms of -# either the GNU General Public License Version 3 or later (the "GPLv3+"), or -# the GNU Lesser General Public License Version 3 or later (the "LGPLv3+"), -# in which case the provisions of the GPLv3+ or the LGPLv3+ are applicable -# instead of those above. - -$(eval $(call gb_CustomTarget_CustomTarget,idlc/scanner)) - -ICSC := $(call gb_CustomTarget_get_workdir,idlc/scanner) - -$(call gb_CustomTarget_get_target,idlc/scanner) : $(ICSC)/scanner.cxx - -$(ICSC)/scanner.cxx : $(ICSC)/stripped_scanner.ll - flex -o$@ $< - -$(ICSC)/stripped_scanner.ll : $(SRCDIR)/idlc/source/scanner.ll | $(ICSC)/.dir - tr -d "\015" < $< > $@ - -# vim:set shiftwidth=4 tabstop=4 noexpandtab: diff --git a/idlc/Executable_idlc.mk b/idlc/Executable_idlc.mk index 4319857..32ecda6 100644 --- a/idlc/Executable_idlc.mk +++ b/idlc/Executable_idlc.mk @@ -42,10 +42,11 @@ $(eval $(call gb_Executable_add_grammars,idlc,\ idlc/source/parser \ )) -$(eval $(call gb_Executable_use_custom_headers,idlc,idlc/scanner)) +$(eval $(call gb_Executable_add_scanners,idlc,\ + idlc/source/scanner \ +)) $(eval $(call gb_Executable_add_exception_objects,idlc,\ - idlc/source/wrap_scanner \ idlc/source/idlcmain \ idlc/source/idlc \ idlc/source/idlccompile \ diff --git a/idlc/Module_idlc.mk b/idlc/Module_idlc.mk index 3c96310..e1db3db 100644 --- a/idlc/Module_idlc.mk +++ b/idlc/Module_idlc.mk @@ -27,7 +27,6 @@ $(eval $(call gb_Module_Module,idlc)) $(eval $(call gb_Module_add_targets,idlc,\ - CustomTarget_scanner \ Executable_idlc \ Executable_idlcpp \ )) diff --git a/idlc/source/scanner.l b/idlc/source/scanner.l new file mode 100644 index 0000000..8d95322 --- /dev/null +++ b/idlc/source/scanner.l @@ -0,0 +1,536 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +%option yylineno + +%{ +/* + * scanner.ll - Lexical scanner for IDLC 1.0 + */ + +#include <ctype.h> +#include <stdlib.h> +#include <string.h> + +#ifndef _IDLC_IDLC_HXX_ +#include <idlc/idlc.hxx> +#endif +#ifndef _IDLC_ERRORHANDLER_HXX_ +#include <idlc/errorhandler.hxx> +#endif +#ifndef _IDLC_FEHELPER_HXX_ +#include <idlc/fehelper.hxx> +#endif + +#include "attributeexceptions.hxx" + + +class AstExpression; +class AstArray; +class AstMember; + +#include <parser.hxx> + +/* handle locations */ +int yycolumn = 1; + +#define YY_USER_ACTION idlc()->setOffset(yycolumn, yycolumn+yyleng-1); \ + yycolumn += yyleng; + +sal_Int32 beginLine = 0; +::rtl::OString docu; + +static int asciiToInteger(char const * s, sal_Int64 * sval, sal_uInt64 * uval) { + bool neg = false; + if (*s == '-') { + neg = true; + ++s; + } + unsigned int base = 10; + if (*s == '0') { + base = 8; + ++s; + if (*s == 'X' || *s == 'x') { + base = 16; + ++s; + } + } + sal_uInt64 val = 0; + for (; *s != 0; ++s) { + unsigned int n; + if (*s >= '0' && *s <= '9') { + n = *s - '0'; + } else { + switch (*s) { + case 'A': + case 'a': + n = 10; + break; + case 'B': + case 'b': + n = 11; + break; + case 'C': + case 'c': + n = 12; + break; + case 'D': + case 'd': + n = 13; + break; + case 'E': + case 'e': + n = 14; + break; + case 'F': + case 'f': + n = 15; + break; + default: + goto done; + } + } + // The following guarantees the invariant val <= SAL_MAX_UINT64 (because + // base and n are sufficiently small), *if* + // std::numeric_limits<sal_uInt64>::max() == SAL_MAX_UINT64: + sal_uInt64 nval = val * base + n; + if (nval < val) { + idlc()->error()->syntaxError( + PS_NoState, idlc()->getLineNumber(), + "integral constant too large"); + val = 0; + break; + } + val = nval; + } + done: + if (neg) { + if (val < SAL_CONST_UINT64(0x8000000000000000)) { + *sval = -static_cast< sal_Int64 >(val); + } else if (val == SAL_CONST_UINT64(0x8000000000000000)) { + *sval = SAL_MIN_INT64; + } else { + idlc()->error()->syntaxError( + PS_NoState, idlc()->getLineNumber(), + "negative integral constant too large"); + *sval = 0; + } + return IDL_INTEGER_LITERAL; + } else if (val <= static_cast< sal_uInt64 >(SAL_MAX_INT64)) { + *sval = static_cast< sal_Int64 >(val); + return IDL_INTEGER_LITERAL; + } else { + *uval = val; + return IDL_INTEGER_ULITERAL; + } +} + +static double asciiToFloat(const sal_Char *s) +{ + double d = 0.0; + double e, k; + sal_Int32 neg = 0, negexp = 0; + + if (*s == '-') + { + neg = 1; + s++; + } + while (*s >= '0' && *s <= '9') + { + d = (d * 10) + *s - '0'; + s++; + } + if (*s == '.') + { + s++; + e = 10; + while (*s >= '0' && *s <= '9') + { + d += (*s - '0') / (e * 1.0); + e *= 10; + s++; + } + } + if (*s == 'e' || *s == 'E') + { + s++; + if (*s == '-') + { + negexp = 1; + s++; + } else + { + if (*s == '+') + s++; + e = 0; + while (*s >= '0' && *s <= '9') + { + e = (e * 10) + *s - '0'; + s++; + } + if (e > 0) + { + for (k = 1; e > 0; k *= 10, e--) + ; + if (negexp) + d /= k; + else + d *= k; + } + } + } + if (neg) d *= -1.0; + return d; +} + +static void idlParsePragma(sal_Char* pPragma) +{ + ::rtl::OString pragma(pPragma); + sal_Int32 index = pragma.indexOf("include"); + sal_Char* begin = pPragma + index + 8; + sal_Char* offset = begin; + while (*offset != ',') offset++; + //::rtl::OString include = pragma.copy(index + 8, offset - begin); + //unused// idlc()->insertInclude(pragma.copy(index + 8, (sal_Int32)(offset - begin))); +} + +static void parseLineAndFile(sal_Char* pBuf) +{ + sal_Char *r = pBuf; + sal_Char *h; + sal_Bool bIsInMain = sal_False; + + /* Skip initial '#' */ + if (*r != '#') + return; + + /* Find line number */ + for (r++; *r == ' ' || *r == '\t' || isalpha(*r); r++) ; + h = r; + for (; *r != '\0' && *r != ' ' && *r != '\t'; r++) ; + *r++ = 0; + idlc()->setLineNumber((sal_uInt32)atol(h)); + yylineno = atol(h); + + /* Find file name, if present */ + for (; *r != '"'; r++) + { + if (*r == '\n' || *r == '\0') + return; + } + h = ++r; + for (; *r != '"'; r++) ; + *r = 0; + if (*h == '\0') + idlc()->setFileName(::rtl::OString("standard input")); + else + idlc()->setFileName(::rtl::OString(h)); + + bIsInMain = (idlc()->getFileName() == idlc()->getRealFileName()) ? sal_True : sal_False; + idlc()->setInMainfile(bIsInMain); +} + +// Suppress any warnings from generated code: +#if defined __GNUC__ +#pragma GCC diagnostic ignored "-Wunused-function" +#elif defined __SUNPRO_CC +#pragma disable_warn +#elif defined _MSC_VER +#pragma warning(push, 1) +/**/ +#ifdef yywrap +#undef yywrap +#define yywrap() 1 +#endif +/**/ +#endif +%} + +%option noyywrap +%option never-interactive + +%x DOCU +%x COMMENT + +DIGIT [0-9] +OCT_DIGIT [0-7] +HEX_DIGIT [a-fA-F0-9] +CAPITAL [A-Z] +ALPHA [a-zA-Z] +INT_LITERAL [1-9][0-9]* +OCT_LITERAL 0{OCT_DIGIT}* +HEX_LITERAL (0x|0X){HEX_DIGIT}* + +IDENTIFIER_NEW ({ALPHA}({ALPHA}|{DIGIT})*)|({CAPITAL}("_"?({ALPHA}|{DIGIT})+)*) +IDENTIFIER ("_"?({ALPHA}|{DIGIT})+)* + +%% + +[ \t\r]+ ; /* eat up whitespace */ +[\n] { + idlc()->incLineNumber(); + yycolumn = 1; + yylineno++; +} + +attribute return IDL_ATTRIBUTE; +bound return IDL_BOUND; +case return IDL_CASE; +const return IDL_CONST; +constants return IDL_CONSTANTS; +constrained return IDL_CONSTRAINED; +default return IDL_DEFAULT; +enum return IDL_ENUM; +exception return IDL_EXCEPTION; +interface return IDL_INTERFACE; +maybeambiguous return IDL_MAYBEAMBIGUOUS; +maybedefault return IDL_MAYBEDEFAULT; +maybevoid return IDL_MAYBEVOID; +module return IDL_MODULE; +needs return IDL_NEEDS; +observes return IDL_OBSERVES; +optional return IDL_OPTIONAL; +property return IDL_PROPERTY; +raises return IDL_RAISES; +readonly return IDL_READONLY; +removable return IDL_REMOVEABLE; +service return IDL_SERVICE; +sequence return IDL_SEQUENCE; +singleton return IDL_SINGLETON; +struct return IDL_STRUCT; +switch return IDL_SWITCH; +transient return IDL_TRANSIENT; +typedef return IDL_TYPEDEF; +union return IDL_UNION; + +any return IDL_ANY; +boolean return IDL_BOOLEAN; +byte return IDL_BYTE; +char return IDL_CHAR; +double return IDL_DOUBLE; +float return IDL_FLOAT; +hyper return IDL_HYPER; +long return IDL_LONG; +short return IDL_SHORT; +string return IDL_STRING; +type return IDL_TYPE; +unsigned return IDL_UNSIGNED; +void return IDL_VOID; + +TRUE return IDL_TRUE; +True return IDL_TRUE; +FALSE return IDL_FALSE; +False return IDL_FALSE; + +in return IDL_IN; +out return IDL_OUT; +inout return IDL_INOUT; +oneway return IDL_ONEWAY; + +get return IDL_GET; +set return IDL_SET; + +published return IDL_PUBLISHED; + +"..." return IDL_ELLIPSIS; + +("-")?{INT_LITERAL}+(l|L|u|U)? { + return asciiToInteger(yytext, &yylval.ival, &yylval.uval); + } + +("-")?{OCT_LITERAL}+(l|L|u|U)? { + return asciiToInteger(yytext, &yylval.ival, &yylval.uval); + } + +("-")?{HEX_LITERAL}+(l|L|u|U)? { + return asciiToInteger(yytext, &yylval.ival, &yylval.uval); + } + +("-")?{DIGIT}+(e|E){1}(("+"|"-")?{DIGIT}+)+(f|F)? | +("-")?"."{DIGIT}+((e|E)("+"|"-")?{DIGIT}+)?(f|F)? | +("-")?{DIGIT}*"."{DIGIT}+((e|E)("+"|"-")?{DIGIT}+)?(f|F)? { + yylval.dval = asciiToFloat( yytext ); + return IDL_FLOATING_PT_LITERAL; + } + +{IDENTIFIER} { + yylval.sval = new ::rtl::OString(yytext); + return IDL_IDENTIFIER; + } + +\<\< { + yylval.strval = yytext; + return IDL_LEFTSHIFT; + } +\>\> { + yylval.strval = yytext; + return IDL_RIGHTSHIFT; + } +\:\: { + yylval.strval = yytext; + return IDL_SCOPESEPARATOR; + } + +"/*" { + BEGIN( COMMENT ); + docu = ::rtl::OString(); + beginLine = idlc()->getLineNumber(); + } + +"/***" { + BEGIN( COMMENT ); + docu = ::rtl::OString(); + beginLine = idlc()->getLineNumber(); + } + +<COMMENT>[^*]+ { + docu += ::rtl::OString(yytext); + } + +<COMMENT>"*"[^*/]+ { + docu += ::rtl::OString(yytext); + } + +<COMMENT>"**" { + docu += ::rtl::OString(yytext); + } + +<COMMENT>[*]+"/" { + docu = docu.trim(); + sal_Int32 nIndex = 0; + int count = 0; + do { docu.getToken( 0, '\n', nIndex ); count++; } while( nIndex != -1 ); + idlc()->setLineNumber( beginLine + count - 1); + BEGIN( INITIAL ); + } + +"/**" { + BEGIN( DOCU ); + docu = ::rtl::OString(); + beginLine = idlc()->getLineNumber(); + } + +<DOCU>[^*\n]+ { + docu += ::rtl::OString(yytext); + } + +<DOCU>"\n"[ \t]*"*"{1} { + idlc()->setLineNumber( idlc()->getLineNumber() + 1); + docu += ::rtl::OString("\n"); + } + +<DOCU>"\n" { + idlc()->setLineNumber( idlc()->getLineNumber() + 1); + docu += ::rtl::OString(yytext); + } + +<DOCU>"*"[^*^/\n]* { + docu += ::rtl::OString(yytext); + } + +<DOCU>"\n"[ \t]*"*/" { + docu = docu.trim(); + sal_Int32 nIndex = 0; + int count = 0; + do { docu.getToken( 0, '\n', nIndex ); count++; } while( nIndex != -1 ); + idlc()->setLineNumber( beginLine + count - 1); + if ( (nIndex = docu.indexOf("/*")) >= 0 || (nIndex = docu.indexOf("///")) >= 0 ) + { + if ( 0 != nIndex && + (docu.getStr()[nIndex - 1] != '"' && docu.getStr()[nIndex - 1] != ':') ) + idlc()->error()->syntaxError(PS_NoState, idlc()->getLineNumber(), + "nested documentation strings are not allowed!"); + } + idlc()->setDocumentation(docu); + BEGIN( INITIAL ); + } + +<DOCU>"*/" { + docu = docu.trim(); + sal_Int32 nIndex = 0; + int count = 0; + do { docu.getToken( 0, '\n', nIndex ); count++; } while( nIndex != -1 ); + idlc()->setLineNumber( beginLine + count - 1); + if ( docu.indexOf("/*") >= 0 || docu.indexOf("//") >= 0 ) + { + if ( 0 != nIndex && + (docu.getStr()[nIndex - 1] != '"' && docu.getStr()[nIndex - 1] != ':') ) + idlc()->error()->syntaxError(PS_NoState, idlc()->getLineNumber(), + "nested documentation strings are not allowed!"); + } + idlc()->setDocumentation(docu); + BEGIN( INITIAL ); + } + +"//"[^/]{1}.*"\n" { + /* only a comment */ + ::rtl::OString docStr(yytext); + docStr = docStr.copy( 0, docStr.lastIndexOf('\n') ); + docStr = docStr.copy( docStr.lastIndexOf('/')+1 ); + docStr = docStr.trim(); + idlc()->incLineNumber(); + } + +"///".*"\n" { + ::rtl::OString docStr(yytext); + docStr = docStr.copy( 0, docStr.lastIndexOf('\n') ); + docStr = docStr.copy( docStr.lastIndexOf('/')+1 ); + docStr = docStr.trim(); + idlc()->incLineNumber(); + idlc()->setDocumentation(docStr); + } + +. return yytext[0]; + +^#[ \t]*line[ \t]*[0-9]*" ""\""[^\"]*"\""\n { + parseLineAndFile(yytext); +} + +^#[ \t]*[0-9]*" ""\""[^\"]*"\""" "[0-9]*\n { + parseLineAndFile(yytext); +} + +^#[ \t]*[0-9]*" ""\""[^\"]*"\""\n { + parseLineAndFile(yytext); +} + +^#[ \t]*[0-9]*\n { + parseLineAndFile(yytext); +} + +^#[ \t]*ident.*\n { + /* ignore cpp ident */ + idlc()->incLineNumber(); +} + +^#[ \t]*pragma[ \t].*\n { /* remember pragma */ + idlParsePragma(yytext); + idlc()->incLineNumber(); +} + +%% diff --git a/idlc/source/scanner.ll b/idlc/source/scanner.ll deleted file mode 100644 index 62ce288..0000000 --- a/idlc/source/scanner.ll +++ /dev/null @@ -1,536 +0,0 @@ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -%option yylineno - -%{ -/* - * scanner.ll - Lexical scanner for IDLC 1.0 - */ - -#include <ctype.h> -#include <stdlib.h> -#include <string.h> - -#ifndef _IDLC_IDLC_HXX_ -#include <idlc/idlc.hxx> -#endif -#ifndef _IDLC_ERRORHANDLER_HXX_ -#include <idlc/errorhandler.hxx> -#endif -#ifndef _IDLC_FEHELPER_HXX_ -#include <idlc/fehelper.hxx> -#endif - -#include "attributeexceptions.hxx" - - -class AstExpression; -class AstArray; -class AstMember; - -#include <parser.hxx> - -/* handle locations */ -int yycolumn = 1; - -#define YY_USER_ACTION idlc()->setOffset(yycolumn, yycolumn+yyleng-1); \ - yycolumn += yyleng; - -sal_Int32 beginLine = 0; -::rtl::OString docu; - -static int asciiToInteger(char const * s, sal_Int64 * sval, sal_uInt64 * uval) { - bool neg = false; - if (*s == '-') { - neg = true; - ++s; - } - unsigned int base = 10; - if (*s == '0') { - base = 8; - ++s; - if (*s == 'X' || *s == 'x') { - base = 16; - ++s; - } - } - sal_uInt64 val = 0; - for (; *s != 0; ++s) { - unsigned int n; - if (*s >= '0' && *s <= '9') { - n = *s - '0'; - } else { - switch (*s) { - case 'A': - case 'a': - n = 10; - break; - case 'B': - case 'b': - n = 11; - break; - case 'C': - case 'c': - n = 12; - break; - case 'D': - case 'd': - n = 13; - break; - case 'E': - case 'e': - n = 14; - break; - case 'F': - case 'f': - n = 15; - break; - default: - goto done; - } - } - // The following guarantees the invariant val <= SAL_MAX_UINT64 (because - // base and n are sufficiently small), *if* - // std::numeric_limits<sal_uInt64>::max() == SAL_MAX_UINT64: - sal_uInt64 nval = val * base + n; - if (nval < val) { - idlc()->error()->syntaxError( - PS_NoState, idlc()->getLineNumber(), - "integral constant too large"); - val = 0; - break; - } - val = nval; - } - done: - if (neg) { - if (val < SAL_CONST_UINT64(0x8000000000000000)) { - *sval = -static_cast< sal_Int64 >(val); - } else if (val == SAL_CONST_UINT64(0x8000000000000000)) { - *sval = SAL_MIN_INT64; - } else { - idlc()->error()->syntaxError( - PS_NoState, idlc()->getLineNumber(), - "negative integral constant too large"); - *sval = 0; - } - return IDL_INTEGER_LITERAL; - } else if (val <= static_cast< sal_uInt64 >(SAL_MAX_INT64)) { - *sval = static_cast< sal_Int64 >(val); - return IDL_INTEGER_LITERAL; - } else { - *uval = val; - return IDL_INTEGER_ULITERAL; - } -} - -static double asciiToFloat(const sal_Char *s) -{ - double d = 0.0; - double e, k; - sal_Int32 neg = 0, negexp = 0; - - if (*s == '-') - { - neg = 1; - s++; - } - while (*s >= '0' && *s <= '9') - { - d = (d * 10) + *s - '0'; - s++; - } - if (*s == '.') - { - s++; - e = 10; - while (*s >= '0' && *s <= '9') - { - d += (*s - '0') / (e * 1.0); - e *= 10; - s++; - } - } - if (*s == 'e' || *s == 'E') - { - s++; - if (*s == '-') - { - negexp = 1; - s++; - } else - { - if (*s == '+') - s++; - e = 0; - while (*s >= '0' && *s <= '9') - { - e = (e * 10) + *s - '0'; - s++; - } - if (e > 0) - { - for (k = 1; e > 0; k *= 10, e--) - ; - if (negexp) - d /= k; - else - d *= k; - } - } - } - if (neg) d *= -1.0; - return d; -} - -static void idlParsePragma(sal_Char* pPragma) -{ - ::rtl::OString pragma(pPragma); - sal_Int32 index = pragma.indexOf("include"); - sal_Char* begin = pPragma + index + 8; - sal_Char* offset = begin; - while (*offset != ',') offset++; - //::rtl::OString include = pragma.copy(index + 8, offset - begin); - //unused// idlc()->insertInclude(pragma.copy(index + 8, (sal_Int32)(offset - begin))); -} - -static void parseLineAndFile(sal_Char* pBuf) -{ - sal_Char *r = pBuf; - sal_Char *h; - sal_Bool bIsInMain = sal_False; - - /* Skip initial '#' */ - if (*r != '#') - return; - - /* Find line number */ - for (r++; *r == ' ' || *r == '\t' || isalpha(*r); r++) ; - h = r; - for (; *r != '\0' && *r != ' ' && *r != '\t'; r++) ; - *r++ = 0; - idlc()->setLineNumber((sal_uInt32)atol(h)); - yylineno = atol(h); - - /* Find file name, if present */ - for (; *r != '"'; r++) - { - if (*r == '\n' || *r == '\0') - return; - } - h = ++r; - for (; *r != '"'; r++) ; - *r = 0; - if (*h == '\0') - idlc()->setFileName(::rtl::OString("standard input")); - else - idlc()->setFileName(::rtl::OString(h)); - - bIsInMain = (idlc()->getFileName() == idlc()->getRealFileName()) ? sal_True : sal_False; - idlc()->setInMainfile(bIsInMain); -} - -// Suppress any warnings from generated code: -#if defined __GNUC__ -#pragma GCC system_header -#elif defined __SUNPRO_CC -#pragma disable_warn -#elif defined _MSC_VER -#pragma warning(push, 1) -/**/ -#ifdef yywrap -#undef yywrap -#define yywrap() 1 -#endif -/**/ -#endif -%} - -%option noyywrap -%option never-interactive - -%x DOCU -%x COMMENT - -DIGIT [0-9] -OCT_DIGIT [0-7] -HEX_DIGIT [a-fA-F0-9] -CAPITAL [A-Z] -ALPHA [a-zA-Z] -INT_LITERAL [1-9][0-9]* -OCT_LITERAL 0{OCT_DIGIT}* -HEX_LITERAL (0x|0X){HEX_DIGIT}* - -IDENTIFIER_NEW ({ALPHA}({ALPHA}|{DIGIT})*)|({CAPITAL}("_"?({ALPHA}|{DIGIT})+)*) -IDENTIFIER ("_"?({ALPHA}|{DIGIT})+)* - -%% - -[ \t\r]+ ; /* eat up whitespace */ -[\n] { - idlc()->incLineNumber(); - yycolumn = 1; - yylineno++; -} - -attribute return IDL_ATTRIBUTE; -bound return IDL_BOUND; -case return IDL_CASE; -const return IDL_CONST; -constants return IDL_CONSTANTS; -constrained return IDL_CONSTRAINED; -default return IDL_DEFAULT; -enum return IDL_ENUM; -exception return IDL_EXCEPTION; -interface return IDL_INTERFACE; -maybeambiguous return IDL_MAYBEAMBIGUOUS; -maybedefault return IDL_MAYBEDEFAULT; -maybevoid return IDL_MAYBEVOID; -module return IDL_MODULE; -needs return IDL_NEEDS; -observes return IDL_OBSERVES; -optional return IDL_OPTIONAL; -property return IDL_PROPERTY; -raises return IDL_RAISES; -readonly return IDL_READONLY; -removable return IDL_REMOVEABLE; -service return IDL_SERVICE; -sequence return IDL_SEQUENCE; -singleton return IDL_SINGLETON; -struct return IDL_STRUCT; -switch return IDL_SWITCH; -transient return IDL_TRANSIENT; -typedef return IDL_TYPEDEF; -union return IDL_UNION; - -any return IDL_ANY; -boolean return IDL_BOOLEAN; -byte return IDL_BYTE; -char return IDL_CHAR; -double return IDL_DOUBLE; -float return IDL_FLOAT; -hyper return IDL_HYPER; -long return IDL_LONG; -short return IDL_SHORT; -string return IDL_STRING; -type return IDL_TYPE; -unsigned return IDL_UNSIGNED; -void return IDL_VOID; - -TRUE return IDL_TRUE; -True return IDL_TRUE; -FALSE return IDL_FALSE; -False return IDL_FALSE; - -in return IDL_IN; -out return IDL_OUT; -inout return IDL_INOUT; -oneway return IDL_ONEWAY; - -get return IDL_GET; -set return IDL_SET; - -published return IDL_PUBLISHED; - -"..." return IDL_ELLIPSIS; - -("-")?{INT_LITERAL}+(l|L|u|U)? { - return asciiToInteger(yytext, &yylval.ival, &yylval.uval); - } - -("-")?{OCT_LITERAL}+(l|L|u|U)? { - return asciiToInteger(yytext, &yylval.ival, &yylval.uval); - } - -("-")?{HEX_LITERAL}+(l|L|u|U)? { - return asciiToInteger(yytext, &yylval.ival, &yylval.uval); - } - -("-")?{DIGIT}+(e|E){1}(("+"|"-")?{DIGIT}+)+(f|F)? | -("-")?"."{DIGIT}+((e|E)("+"|"-")?{DIGIT}+)?(f|F)? | -("-")?{DIGIT}*"."{DIGIT}+((e|E)("+"|"-")?{DIGIT}+)?(f|F)? { - yylval.dval = asciiToFloat( yytext ); - return IDL_FLOATING_PT_LITERAL; - } - -{IDENTIFIER} { - yylval.sval = new ::rtl::OString(yytext); - return IDL_IDENTIFIER; - } - -\<\< { - yylval.strval = yytext; - return IDL_LEFTSHIFT; - } -\>\> { - yylval.strval = yytext; - return IDL_RIGHTSHIFT; - } -\:\: { - yylval.strval = yytext; - return IDL_SCOPESEPARATOR; - } - -"/*" { - BEGIN( COMMENT ); - docu = ::rtl::OString(); - beginLine = idlc()->getLineNumber(); - } - -"/***" { - BEGIN( COMMENT ); - docu = ::rtl::OString(); - beginLine = idlc()->getLineNumber(); - } - -<COMMENT>[^*]+ { - docu += ::rtl::OString(yytext); - } - -<COMMENT>"*"[^*/]+ { - docu += ::rtl::OString(yytext); - } - -<COMMENT>"**" { - docu += ::rtl::OString(yytext); - } - -<COMMENT>[*]+"/" { - docu = docu.trim(); - sal_Int32 nIndex = 0; - int count = 0; - do { docu.getToken( 0, '\n', nIndex ); count++; } while( nIndex != -1 ); - idlc()->setLineNumber( beginLine + count - 1); - BEGIN( INITIAL ); - } - -"/**" { - BEGIN( DOCU ); - docu = ::rtl::OString(); - beginLine = idlc()->getLineNumber(); - } - -<DOCU>[^*\n]+ { - docu += ::rtl::OString(yytext); - } - -<DOCU>"\n"[ \t]*"*"{1} { - idlc()->setLineNumber( idlc()->getLineNumber() + 1); - docu += ::rtl::OString("\n"); - } - -<DOCU>"\n" { - idlc()->setLineNumber( idlc()->getLineNumber() + 1); - docu += ::rtl::OString(yytext); - } - -<DOCU>"*"[^*^/\n]* { - docu += ::rtl::OString(yytext); - } - -<DOCU>"\n"[ \t]*"*/" { - docu = docu.trim(); - sal_Int32 nIndex = 0; - int count = 0; - do { docu.getToken( 0, '\n', nIndex ); count++; } while( nIndex != -1 ); - idlc()->setLineNumber( beginLine + count - 1); - if ( (nIndex = docu.indexOf("/*")) >= 0 || (nIndex = docu.indexOf("///")) >= 0 ) - { - if ( 0 != nIndex && - (docu.getStr()[nIndex - 1] != '"' && docu.getStr()[nIndex - 1] != ':') ) - idlc()->error()->syntaxError(PS_NoState, idlc()->getLineNumber(), - "nested documentation strings are not allowed!"); - } - idlc()->setDocumentation(docu); - BEGIN( INITIAL ); - } - -<DOCU>"*/" { - docu = docu.trim(); - sal_Int32 nIndex = 0; - int count = 0; - do { docu.getToken( 0, '\n', nIndex ); count++; } while( nIndex != -1 ); - idlc()->setLineNumber( beginLine + count - 1); - if ( docu.indexOf("/*") >= 0 || docu.indexOf("//") >= 0 ) - { - if ( 0 != nIndex && - (docu.getStr()[nIndex - 1] != '"' && docu.getStr()[nIndex - 1] != ':') ) - idlc()->error()->syntaxError(PS_NoState, idlc()->getLineNumber(), - "nested documentation strings are not allowed!"); - } - idlc()->setDocumentation(docu); - BEGIN( INITIAL ); - } - -"//"[^/]{1}.*"\n" { - /* only a comment */ - ::rtl::OString docStr(yytext); - docStr = docStr.copy( 0, docStr.lastIndexOf('\n') ); - docStr = docStr.copy( docStr.lastIndexOf('/')+1 ); - docStr = docStr.trim(); - idlc()->incLineNumber(); - } - -"///".*"\n" { - ::rtl::OString docStr(yytext); - docStr = docStr.copy( 0, docStr.lastIndexOf('\n') ); - docStr = docStr.copy( docStr.lastIndexOf('/')+1 ); - docStr = docStr.trim(); - idlc()->incLineNumber(); - idlc()->setDocumentation(docStr); - } - -. return yytext[0]; - -^#[ \t]*line[ \t]*[0-9]*" ""\""[^\"]*"\""\n { - parseLineAndFile(yytext); -} - -^#[ \t]*[0-9]*" ""\""[^\"]*"\""" "[0-9]*\n { - parseLineAndFile(yytext); -} - -^#[ \t]*[0-9]*" ""\""[^\"]*"\""\n { - parseLineAndFile(yytext); -} - -^#[ \t]*[0-9]*\n { - parseLineAndFile(yytext); -} - -^#[ \t]*ident.*\n { - /* ignore cpp ident */ - idlc()->incLineNumber(); -} - -^#[ \t]*pragma[ \t].*\n { /* remember pragma */ - idlParsePragma(yytext); - idlc()->incLineNumber(); -} - -%% diff --git a/idlc/source/wrap_parser.cxx b/idlc/source/wrap_parser.cxx deleted file mode 100644 index 053713a..0000000 --- a/idlc/source/wrap_parser.cxx +++ /dev/null @@ -1,32 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - - -#include "parser.cxx" - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/idlc/source/wrap_scanner.cxx b/idlc/source/wrap_scanner.cxx deleted file mode 100644 index 94a068a..0000000 --- a/idlc/source/wrap_scanner.cxx +++ /dev/null @@ -1,38 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -#ifdef __clang__ -#pragma clang diagnostic ignored "-Wsign-compare" -#endif - -#include "scanner.cxx" - -void (*avoid_unused_yyunput_in_scanner_cxx)(int, char*) = yyunput; -int (*avoid_unused_yyinput_in_scanner_cxx)() = yyinput; - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/solenv/gbuild/Executable.mk b/solenv/gbuild/Executable.mk index 8d565b6..2cb23fc 100644 --- a/solenv/gbuild/Executable.mk +++ b/solenv/gbuild/Executable.mk @@ -85,6 +85,8 @@ $(eval $(foreach method,\ add_objcxxobjects \ add_grammar \ add_grammars \ + add_scanner \ + add_scanners \ add_exception_objects \ add_noexception_objects \ add_generated_cobjects \ diff --git a/solenv/gbuild/Library.mk b/solenv/gbuild/Library.mk index 4ba764e..2c74d6e 100644 --- a/solenv/gbuild/Library.mk +++ b/solenv/gbuild/Library.mk @@ -167,6 +167,8 @@ $(eval $(foreach method,\ use_library_objects \ add_grammar \ add_grammars \ + add_scanner \ + add_scanners \ add_cflags \ set_cflags \ add_cxxflags \ diff --git a/solenv/gbuild/LinkTarget.mk b/solenv/gbuild/LinkTarget.mk index aa279bf..4b48f67 100644 --- a/solenv/gbuild/LinkTarget.mk +++ b/solenv/gbuild/LinkTarget.mk @@ -28,6 +28,7 @@ #the following user-defined variables are supported: # YACCFLAGS +# LEXFLAGS # CPPFLAGS # CFLAGS # CXXFLAGS @@ -243,6 +244,34 @@ endef gb_YACC := bison +# LexTarget class + +gb_LexTarget_get_source = $(1)/$(2).l + +.PHONY : $(call gb_LexTarget_get_clean_target,%) +$(call gb_LexTarget_get_clean_target,%) : + $(call gb_Output_announce,$*,$(false),LEX,3) + $(call gb_Helper_abbreviate_dirs,\ + rm -f $(call gb_LexTarget_get_scanner_target,$*) $(call gb_LexTarget_get_target,$*)) + +$(call gb_LexTarget_get_target,%) : $(call gb_LexTarget_get_source,$(SRCDIR),%) + $(call gb_LexTarget__command,$<,$*,$@,$(call gb_LexTarget_get_scanner_target,$*)) + +# gb_LexTarget_LexTarget(scanner-file) +define gb_LexTarget_LexTarget +$(call gb_LexTarget_get_scanner_target,$(1)) :| $(call gb_LexTarget_get_target,$(1)) + +endef + +# gb_LexTarget__command(scanner-file, stem-for-message, done-pseudo-target, source-target) +define gb_LexTarget__command +$(call gb_Output_announce,$(2),$(true),LEX,3) +$(call gb_Helper_abbreviate_dirs,\ + mkdir -p $(dir $(3)) && \ + $(FLEX) $(T_LEXFLAGS) -o $(4) $(1) && touch $(3) ) +endef + + # ObjCxxObject class # @@ -453,6 +482,10 @@ $(call gb_LinkTarget_get_target,$(1)) : YACCOBJECT := $(call gb_LinkTarget_get_clean_target,$(1)) \ $(call gb_LinkTarget_get_target,$(1)) : T_YACCFLAGS := $$(gb_LinkTarget_YYACFLAGS) $(YACCFLAGS) $(call gb_LinkTarget_get_clean_target,$(1)) \ +$(call gb_LinkTarget_get_target,$(1)) : LEXOBJECT := +$(call gb_LinkTarget_get_clean_target,$(1)) \ +$(call gb_LinkTarget_get_target,$(1)) : T_LEXFLAGS := $$(gb_LinkTarget_LEXFLAGS) $(LEXFLAGS) +$(call gb_LinkTarget_get_clean_target,$(1)) \ $(call gb_LinkTarget_get_target,$(1)) : OBJCOBJECTS := $(call gb_LinkTarget_get_clean_target,$(1)) \ $(call gb_LinkTarget_get_target,$(1)) : OBJCXXOBJECTS := @@ -873,6 +906,22 @@ define gb_LinkTarget_add_grammars $(foreach grammar,$(2),$(call gb_LinkTarget_add_grammar,$(1),$(grammar),$(4))) endef +# Add a flex scanner to the build. +# gb_LinkTarget_add_scanner(<component>,<scanner file>) +define gb_LinkTarget_add_scanner +$(call gb_LexTarget_LexTarget,$(2)) +$(call gb_LinkTarget_add_generated_exception_object,$(1),LexTarget/$(2),$(3)) +$(call gb_LinkTarget_get_clean_target,$(1)) : $(call gb_LexTarget_get_clean_target,$(2)) + +endef + +# Add flex scanners to the build. +# gb_LinkTarget_add_scanners(<component>,<scanner file> [<scanner file>*]) +define gb_LinkTarget_add_scanners +$(foreach scanner,$(2),$(call gb_LinkTarget_add_scanner,$(1),$(scanner))) + +endef + define gb_LinkTarget_add_noexception_object $(call gb_LinkTarget_add_cxxobject,$(1),$(2),$(gb_LinkTarget_NOEXCEPTIONFLAGS) $(call gb_LinkTarget__get_cxxflags,$(3))) endef diff --git a/solenv/gbuild/TargetLocations.mk b/solenv/gbuild/TargetLocations.mk index df694b7..70ec351 100644 --- a/solenv/gbuild/TargetLocations.mk +++ b/solenv/gbuild/TargetLocations.mk @@ -141,6 +141,10 @@ gb_Configuration_get_target = $(WORKDIR)/Configuration/$(1).done gb_YaccTarget_get_grammar_target = $(WORKDIR)/YaccTarget/$(1).cxx gb_YaccTarget_get_header_target = $(WORKDIR)/YaccTarget/$(1).hxx gb_YaccTarget_get_target = $(WORKDIR)/YaccTarget/$(1).done + +gb_LexTarget_get_scanner_target = $(WORKDIR)/LexTarget/$(1).cxx +gb_LexTarget_get_target = $(WORKDIR)/LexTarget/$(1).done + gb_XcsTarget_get_target = $(WORKDIR)/XcsTarget/$(1) gb_XcuDataTarget_get_target = $(WORKDIR)/XcuDataTarget/$(1) gb_XcuLangpackTarget_get_target = $(WORKDIR)/XcuLangpackTarget/$(1) @@ -194,6 +198,7 @@ $(eval $(call gb_Helper_make_clean_targets,\ UnoApiTarget \ WinResTarget \ YaccTarget \ + LexTarget \ Zip \ XcsTarget \ XcuDataTarget \ commit b9d0e597a7bc328ca99a1bf338a609cac23a4284 Author: David Tardon <[email protected]> Date: Tue May 1 07:16:16 2012 +0200 export flex Change-Id: I7d5d8e380e12cc66255ddc3ac3f70bab7713f8b6 diff --git a/config_host.mk.in b/config_host.mk.in index 5e02107..c7b2075 100644 --- a/config_host.mk.in +++ b/config_host.mk.in @@ -144,6 +144,7 @@ export EPM_FLAGS=@EPM_FLAGS@ export EXTERNAL_WARNINGS_NOT_ERRORS=@EXTERNAL_WARNINGS_NOT_ERRORS@ @x_Cygwin@ export FIND=@WIN_FIND@ export FLAT_LOGO_SVG=@FLAT_LOGO_SVG@ +export FLEX=@FLEX@ export FLUTE_JAR=@FLUTE_JAR@ export FONTCONFIG_CFLAGS=@FONTCONFIG_CFLAGS@ export FONTCONFIG_LIBS=@FONTCONFIG_LIBS@ diff --git a/configure.in b/configure.in index f6466d8..1d67570 100644 --- a/configure.in +++ b/configure.in @@ -8371,6 +8371,7 @@ AC_PATH_PROG(FLEX, flex) if test -z "$FLEX"; then AC_MSG_ERROR([no flex found in \$PATH, install it]) fi +AC_SUBST([FLEX]) dnl *************************************** dnl Checking for patch dnl *************************************** _______________________________________________ Libreoffice-commits mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
