1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_rsc.hxx" 26 #include <stdlib.h> 27 #include <stdio.h> 28 29 #include <tools/rcid.h> 30 #include <rschash.hxx> 31 #include <rscerror.h> 32 #include <rscall.h> 33 #include <rscdb.hxx> 34 #include <rscpar.hxx> 35 36 #include "rsclex.hxx" 37 38 /************************************************************************* 39 |* 40 |* ERRTYPE::operator = ; 41 |* 42 |* Beschreibung 43 |* Ersterstellung MM 25.09.91 44 |* Letzte Aenderung MM 25.09.91 45 |* 46 *************************************************************************/ 47 ERRTYPE& ERRTYPE::operator = ( const ERRTYPE & rError ) 48 { 49 if( !IsError() ){ 50 if( rError.IsError() || !IsWarning() ) 51 nError = rError.nError; 52 } 53 return *this; 54 } 55 56 /************************************************************************* 57 |* 58 |* RscError::StdOut(); 59 |* 60 |* Beschreibung 61 |* Ersterstellung MM 06.05.91 62 |* Letzte Aenderung MM 06.05.91 63 |* 64 *************************************************************************/ 65 void RscError::StdOut( const char * pStr, const RscVerbosity _verbosityLevel ) 66 { 67 if ( m_verbosity >= _verbosityLevel ) 68 { 69 if( pStr ){ 70 printf( "%s", pStr ); 71 fflush( stdout ); 72 } 73 } 74 } 75 76 /************************************************************************* 77 |* 78 |* RscError::StdErr(); 79 |* 80 |* Beschreibung 81 |* Ersterstellung PL 11/07/2001 82 |* Letzte Aenderung PL 11/07/2001 83 |* 84 *************************************************************************/ 85 void RscError::StdErr( const char * pStr ) 86 { 87 if( pStr ) 88 fprintf( stderr, "%s", pStr ); 89 } 90 91 /************************************************************************* 92 |* 93 |* RscError::LstOut(); 94 |* 95 |* Beschreibung 96 |* Ersterstellung MM 06.05.91 97 |* Letzte Aenderung MM 06.05.91 98 |* 99 *************************************************************************/ 100 void RscError::LstOut( const char * pStr ){ 101 if( fListing && pStr ) 102 fprintf( fListing, "%s", pStr ); 103 } 104 105 /************************************************************************* 106 |* 107 |* RscError::StdLstOut(); 108 |* 109 |* Beschreibung 110 |* Ersterstellung MM 06.05.91 111 |* Letzte Aenderung MM 06.05.91 112 |* 113 *************************************************************************/ 114 void RscError::StdLstOut( const char * pStr ){ 115 StdOut( pStr ); 116 LstOut( pStr ); 117 } 118 119 /************************************************************************* 120 |* 121 |* RscError::StdLstErr(); 122 |* 123 |* Beschreibung 124 |* Ersterstellung PL 11/07/2001 125 |* Letzte Aenderung PL 11/07/2001 126 |* 127 *************************************************************************/ 128 void RscError::StdLstErr( const char * pStr ){ 129 StdErr( pStr ); 130 LstOut( pStr ); 131 } 132 133 /************************************************************************* 134 |* 135 |* RscError::WriteError(); 136 |* 137 |* Beschreibung 138 |* Ersterstellung MM 06.05.91 139 |* Letzte Aenderung MM 06.05.91 140 |* 141 *************************************************************************/ 142 void RscError::WriteError( const ERRTYPE& rError, const char * pMessage ) 143 { 144 switch( rError ) 145 { 146 case ERR_ERROR: { 147 StdLstErr( "!! " ); 148 if( 1 == nErrors ) 149 StdLstErr( ByteString::CreateFromInt32( nErrors ).GetBuffer() ); 150 else 151 StdLstErr( ByteString::CreateFromInt32( (nErrors -1) ).GetBuffer() ); 152 StdLstErr( " Error" ); 153 StdLstErr( " found!!" ); 154 } 155 break; 156 157 case ERR_UNKNOWN_METHOD: 158 StdLstErr( "The used type is not allowed." ); 159 break; 160 161 case ERR_OPENFILE: 162 StdLstErr( "This file <" ); 163 StdLstErr( pMessage ); 164 StdLstErr( "> cannot be opened." ); 165 break; 166 167 case ERR_RENAMEFILE: 168 StdLstErr( "rename <" ); 169 StdLstErr( pMessage ); 170 StdLstErr( "> s not possible." ); 171 break; 172 173 case ERR_FILESIZE: 174 StdLstErr( "Wrong file <" ); 175 StdLstErr( pMessage ); 176 StdLstErr( "> length." ); 177 break; 178 179 case ERR_FILEFORMAT: 180 StdLstErr( "Wrong file type <" ); 181 StdLstErr( pMessage ); 182 StdLstErr( ">." ); 183 break; 184 185 case ERR_NOCHAR: 186 StdLstErr( "Character: '\\xxx'; The value xxx is greater than 255."); 187 break; 188 189 case ERR_NORSCINST: 190 StdLstErr( "Internal error, instance invalid."); 191 break; 192 193 194 case ERR_NOINPUT: 195 StdLstErr( "Input file was not specified.\n"); 196 case ERR_USAGE: 197 StdLstOut( "Copyright (C) 2000, 2010 Oracle and/or its affiliates.\n" ); 198 { 199 char buf[40]; 200 201 StdLstOut( "DataVersion: " ); 202 sprintf( buf, "%d.%d\n\n", 203 RSCVERSION_ID / 100, RSCVERSION_ID % 100 ); 204 StdLstOut( buf ); 205 }; 206 207 StdLstOut( "Command line: rsc [Switches] <Source File(s)>\n" ); 208 StdLstOut( "Command line: rsc @<Command File>\n" ); 209 StdLstOut( "-h shows this help.\n" ); 210 StdLstOut( "-p No Preprocessor.\n" ); 211 StdLstOut( "-s Syntax analysis, creates .srs file\n"); 212 StdLstOut( "-l Linker, links files created with rsc -s,\n" ); 213 StdLstOut( " creates .rc file and .res file.\n" ); 214 StdLstOut( "-r Prevents .res file.\n" ); 215 StdLstOut( "-d Symbol definitions for the Preprocessor.\n" ); 216 StdLstOut( "-i Include directives for the Preprocessor.\n" ); 217 StdLstOut( "-presponse Use response file for Preprocessor.\n" ); 218 StdLstOut( "-lg<language> Use a different language.\n" ); 219 StdLstOut( "-pp=<filename> Use a different Preprocessor.\n" ); 220 StdLstOut( "-rsc2=<filename> Specify the location for rsc2.\n" ); 221 StdLstOut( "No longer existent: -rc<filename> Use a different system resource compiler.\n" ); 222 StdLstOut( "-fs=<filename> Name of the .res file.\n" ); 223 StdLstOut( "-lip=<path> additional search path for system dependant files\n" ); 224 StdLstOut( "-fp=<filename> Renaming of the .srs file.\n" ); 225 StdLstOut( "-fl=<filename> Listing file.\n" ); 226 StdLstOut( "-fh=<filename> Header file.\n" ); 227 StdLstOut( "-fc=<filename> Code file.\n" ); 228 StdLstOut( "-ft=<filename> Touch a file when done in rsc2 (for dependencies)\n" ); 229 StdLstOut( "-fr=<filename> Ressource constructor .cxx-file.\n" ); 230 StdLstOut( "-fx=<filename> Name of .src-file.\n" ); 231 StdLstOut( "-oil=<dir> Output directory for image list files\n" ); 232 StdLstOut( "-r<ENV>=<path> replace <path> by <ENV> in image list files\n" ); 233 StdLstOut( "-CHARSET_... Convert to this character set.\n" ); 234 StdLstOut( "-BIGENDIAN Format of number values.\n" ); 235 StdLstOut( "-LITTLEENDIAN Format of number values.\n" ); 236 StdLstOut( "-SMART Generate smart names (cxx, hxx).\n" ); 237 StdLstOut( "-SrsDefault Only write one language to srs file.\n" ); 238 StdLstOut( "\nwhen creating multiple .res files in one pass, please give these\n" ); 239 StdLstOut( "options in consecutive blocks:\n" ); 240 StdLstOut( "-lg<language> -fs<filename> [-lip<path> [-lip<path>] ]\n" ); 241 StdLstOut( "a new block begins when either -lg or -fs is used again.\n" ); 242 break; 243 244 case ERR_UNKNOWNSW: 245 StdLstErr( "Unknown switch <" ); 246 StdLstErr( pMessage ); 247 StdLstErr( ">." ); 248 break; 249 250 case ERR_REFTODEEP: 251 StdLstErr( "Too many reference levels have been used (see Switch -RefDeep)." ); 252 break; 253 254 case ERR_CONT_INVALIDPOS: 255 StdLstErr( "Internal error, Container class: invalid position." ); 256 break; 257 258 case ERR_CONT_INVALIDTYPE: 259 StdLstErr( "Invalid type <" ); 260 StdLstErr( pMessage ); 261 StdLstErr( ">." ); 262 break; 263 264 case ERR_ARRAY_INVALIDINDEX: 265 StdLstErr( "Internal error, Array class: invalid index." ); 266 break; 267 268 case ERR_RSCINST_NOVARNAME: 269 StdLstErr( "Internal error, invalid name of variable." ); 270 break; 271 272 case ERR_YACC: 273 StdLstErr( pMessage ); 274 break; 275 276 case ERR_DOUBLEID: 277 StdLstErr( "Two global resources have the same identifier." ); 278 break; 279 280 case ERR_FALSETYPE: 281 StdLstErr( "Wrong type <" ); 282 StdLstErr( pMessage ); 283 StdLstErr( ">." ); 284 break; 285 286 case ERR_NOVARIABLENAME: 287 StdLstErr( "The variable <" ); 288 StdLstErr( pMessage ); 289 StdLstErr( "> must not be used here." ); 290 break; 291 292 case ERR_RSCRANGE_OUTDEFSET: 293 StdLstErr( "The used value is not in the expected domain." ); 294 break; 295 296 case ERR_USHORTRANGE: 297 StdLstErr( "Value is <" ); 298 StdLstErr( pMessage ); 299 StdLstErr( "> the allowed domain is from 0 up to 65535." ); 300 break; 301 302 case ERR_IDRANGE: 303 StdLstErr( "Value is <" ); 304 StdLstErr( pMessage ); 305 StdLstErr( "> the allowed domain is from 1 up to 32767." ); 306 break; 307 308 case ERR_NOCOPYOBJ: 309 StdLstErr( "Default resource <" ); 310 StdLstErr( pMessage ); 311 StdLstErr( "> not found." ); 312 break; 313 314 case ERR_REFNOTALLOWED: 315 StdLstErr( "The use of a reference is not allowed." ); 316 break; 317 318 case ERR_COPYNOTALLOWED: 319 StdLstErr( "The use of a default resource is not allowed." ); 320 break; 321 322 case ERR_IDEXPECTED: 323 StdLstErr( "An identifier needs to be specified." ); 324 break; 325 326 case ERR_DOUBLEDEFINE: 327 StdLstErr( "The symbol <" ); 328 StdLstErr( pMessage ); 329 StdLstErr( "> is defined twice." ); 330 break; 331 332 case ERR_RSCINST_RESERVEDNAME: 333 StdLstErr( "The symbol <" ); 334 StdLstErr( pMessage ); 335 StdLstErr( "> is a reserved name." ); 336 break; 337 338 case ERR_ZERODIVISION: 339 StdLstErr( "Attempt to divide by zero." ); 340 break; 341 342 case ERR_PRAGMA: 343 StdLstErr( "Error in a #pragma statement." ); 344 break; 345 346 case ERR_DECLAREDEFINE: 347 StdLstErr( "Error in the declaration part of the macro." ); 348 break; 349 350 case ERR_NOTYPE: 351 StdLstErr( "type expected." ); 352 break; 353 354 case ERR_NOIMAGE: 355 StdLstErr( "The image(s) <" ); 356 StdLstErr( pMessage ); 357 StdLstErr( "> could not be found." ); 358 break; 359 360 /****************** W A R N I N G S **************************************/ 361 case WRN_LOCALID: 362 StdLstErr( "Sub resources should have an identifier < 256." ); 363 break; 364 365 case WRN_GLOBALID: 366 StdLstErr( "Global resources should have an identifier >= 256." ); 367 break; 368 369 case WRN_SUBINMEMBER: 370 StdLstErr( "Sub resources are ignored." ); 371 break; 372 373 case WRN_CONT_NOID: 374 StdLstErr( "Resources without name are ignored." ); 375 break; 376 377 case WRN_CONT_DOUBLEID: 378 StdLstErr( "Two local resources have the same identifier." ); 379 break; 380 381 case WRN_STR_REFNOTFOUND: 382 StdLstErr( "String reference <" ); 383 StdLstErr( pMessage ); 384 StdLstErr( " > could not be resolved." ); 385 break; 386 387 case WRN_MGR_REFNOTFOUND: 388 StdLstErr( "Reference <" ); 389 StdLstErr( pMessage ); 390 StdLstErr( " > could not be resolved." ); 391 break; 392 393 default: 394 if( pMessage ){ 395 StdLstErr( "\nMessage: " ); 396 StdLstErr( pMessage ); 397 }; 398 break; 399 } 400 } 401 402 /************************************************************************* 403 |* 404 |* RscErrorFormat() 405 |* 406 |* Beschreibung 407 |* Ersterstellung MM 06.05.91 408 |* Letzte Aenderung MM 06.05.91 409 |* 410 *************************************************************************/ 411 void RscError::ErrorFormat( const ERRTYPE& rError, RscTop * pClass, 412 const RscId & aId ){ 413 char buf[ 10 ]; 414 sal_uInt32 i; 415 416 if( pFI ) 417 { 418 pFI->SetError( rError ); 419 StdErr( "\n" ); 420 StdErr( pFI->GetLine() ); 421 StdErr( "\n" ); 422 // Fehlerposition anzeigen 423 for( i = 0; (i +1) < pFI->GetScanPos(); i++ ) 424 StdLstErr( " " ); 425 LstOut( " ^" ); //Zeilennummern beachten 426 StdErr( "^" ); 427 StdLstErr( "\n" ); 428 } 429 StdLstErr( "f" ); 430 sprintf( buf, "%u", (unsigned int)rError ); 431 StdLstErr( buf ); 432 433 if( pFI && pTC ){ 434 StdLstErr( ": \"" ); 435 StdLstErr( pTC->aFileTab.Get( pFI->GetFileIndex() )->aFileName.GetBuffer() ); 436 StdLstErr( "\", line " ); 437 sprintf( buf, "%u", (unsigned int)pFI->GetLineNo() ); 438 StdLstErr( buf ); 439 } 440 441 if( rError.IsError() ) 442 StdLstErr( ": Error" ); 443 else 444 StdLstErr( ": Warning" ); 445 446 if( pClass || aId.IsId() ) 447 { 448 StdLstErr( " in the object (" ); 449 if( pClass ) 450 { 451 StdLstErr( "Type: " ); 452 StdLstErr( pHS->getString( pClass->GetId() ).getStr() ); 453 if( aId.IsId() ) 454 StdLstErr( ", " ); 455 } 456 if( aId.IsId() ) 457 StdLstErr( aId.GetName().GetBuffer() ); 458 StdLstErr( "):\n" ); 459 } 460 else 461 StdLstErr( ": " ); 462 } 463 464 /************************************************************************* 465 |* 466 |* RscError::Error() 467 |* 468 |* Beschreibung 469 |* Ersterstellung MM 06.05.91 470 |* Letzte Aenderung MM 06.05.91 471 |* 472 *************************************************************************/ 473 void RscError::Error( const ERRTYPE& rError, RscTop * pClass, 474 const RscId & aId, const char * pMessage ) 475 { 476 if( WRN_LOCALID == rError ) // Keine Warning erzeugen 477 return; 478 if( rError.IsError() ) 479 nErrors++; 480 if( rError.IsError() || rError.IsWarning() ){ 481 ErrorFormat( rError, pClass, aId ); 482 WriteError( rError, pMessage ); 483 StdLstErr( "\n" ); 484 }; 485 } 486 487 /************************************************************************* 488 |* 489 |* RscError::FatalError(); 490 |* 491 |* Beschreibung 492 |* Ersterstellung MM 06.05.91 493 |* Letzte Aenderung MM 06.05.91 494 |* 495 *************************************************************************/ 496 void RscError::FatalError( const ERRTYPE& rError, const RscId &aId, 497 const char * pMessage ) 498 { 499 if( ERR_USAGE != rError ){ 500 nErrors++; 501 ErrorFormat( rError, NULL, aId ); 502 WriteError( rError, pMessage ); 503 StdLstErr( "\nTerminating compiler\n" ); 504 } 505 else 506 WriteError( rError, pMessage ); 507 508 exit( 1 ); 509 } 510 511