From 3ccec3fbddb20c2013dddd903186c431363aab98 Mon Sep 17 00:00:00 2001
From: florian <florian@freepascal.org>
Date: Mon, 2 Jan 2006 21:07:15 +0000
Subject: [PATCH] * proper error if a directory is passed as configuration file

git-svn-id: trunk@2134 -
---
 compiler/globals.pas    |  18 +++++
 compiler/msg/errore.msg |   2 +
 compiler/msgidx.inc     |   5 +-
 compiler/msgtxt.inc     | 154 ++++++++++++++++++++--------------------
 compiler/options.pas    |   6 ++
 5 files changed, 107 insertions(+), 78 deletions(-)

diff --git a/compiler/globals.pas b/compiler/globals.pas
index 3123494566..233927b52c 100644
--- a/compiler/globals.pas
+++ b/compiler/globals.pas
@@ -304,6 +304,7 @@ interface
     function  path_absolute(const s : string) : boolean;
     Function  PathExists ( F : String) : Boolean;
     Function  FileExists ( Const F : String) : Boolean;
+    Function  DirectoryExists ( Const F : String) : Boolean;
     function  FileExistsNonCase(const path,fn:string;var foundfile:string):boolean;
     Function  RemoveFile(const f:string):boolean;
     Function  RemoveDir(d:string):boolean;
@@ -615,6 +616,23 @@ implementation
       end;
 
 
+    Function DirectoryExists ( Const F : String) : Boolean;
+{$IFDEF USE_SYSUTILS}
+{$ELSE USE_SYSUTILS}
+      var
+         Info : SearchRec;
+{$ENDIF USE_SYSUTILS}
+      begin
+{$IFDEF USE_SYSUTILS}
+        Result:=SysUtils.FileExists(f);
+{$ELSE USE_SYSUTILS}
+        findfirst(F,directory,info);
+        result:=(doserror=0);
+        findclose(Info);
+{$ENDIF USE_SYSUTILS}
+      end;
+
+
     function FileExistsNonCase(const path,fn:string;var foundfile:string):boolean;
       var
         fn2 : string;
diff --git a/compiler/msg/errore.msg b/compiler/msg/errore.msg
index a7e9a9ed93..1003f4f1f1 100644
--- a/compiler/msg/errore.msg
+++ b/compiler/msg/errore.msg
@@ -2136,6 +2136,8 @@ option_found_file=11035_D_found source file name "$1"
 % Additional infos about options, displayed
 % when you have debug option turned on.
 option_code_page_not_available=11039_E_Unknown code page
+option_config_is_dir=11040_F_Config file $1 is a directory
+% Directories can not be used as configuration files.
 %\end{description}
 # EndOfTeX
 
diff --git a/compiler/msgidx.inc b/compiler/msgidx.inc
index f2850cec38..0ceac964ac 100644
--- a/compiler/msgidx.inc
+++ b/compiler/msgidx.inc
@@ -662,13 +662,14 @@ const
   option_read_config_file=11034;
   option_found_file=11035;
   option_code_page_not_available=11039;
+  option_config_is_dir=11040;
   option_logo=11023;
   option_info=11024;
   option_help_pages=11025;
 
-  MsgTxtSize = 39463;
+  MsgTxtSize = 39501;
 
   MsgIdxMax : array[1..20] of longint=(
     19,74,218,59,61,47,100,20,135,60,
-    40,1,1,1,1,1,1,1,1,1
+    41,1,1,1,1,1,1,1,1,1
   );
diff --git a/compiler/msgtxt.inc b/compiler/msgtxt.inc
index 87e3a49793..133f8c5a34 100644
--- a/compiler/msgtxt.inc
+++ b/compiler/msgtxt.inc
@@ -715,7 +715,8 @@ const msgtxt : array[0..000164,1..240] of char=(
   '11034_D_Reading config file "$1"'#000+
   '11035_D_found source file name "$1"'#000+
   '11039_E_Unknown code page'#000+
-  '11023_Free Pascal Compiler version $FPCVERSION [$FPCDATE','] for $FPCCP'+
+  '11040_F_Config file $1 is a directory'#000+
+  '11023_Free Pascal ','Compiler version $FPCVERSION [$FPCDATE] for $FPCCP'+
   'U'#010+
   'Copyright (c) 1993-2005 by Florian Klaempfl'#000+
   '11024_Free Pascal Compiler version $FPCVERSION'#010+
@@ -726,8 +727,8 @@ const msgtxt : array[0..000164,1..240] of char=(
   'Supported targets:'#010+
   '  $OSTARGETS'#010+
   #010+
-  'Supported CPU instruction sets:'#010+
-  '  $INSTRU','CTIONSETS'#010+
+  'Sup','ported CPU instruction sets:'#010+
+  '  $INSTRUCTIONSETS'#010+
   #010+
   'Supported FPU instruction sets:'#010+
   '  $FPUINSTRUCTIONSETS'#010+
@@ -736,161 +737,161 @@ const msgtxt : array[0..000164,1..240] of char=(
   'For more information read COPYING.FPC'#010+
   #010+
   'Report bugs,suggestions etc to:'#010+
-  '                 bugrep@freepascal.org'#000+
-  '11025_**','0*_put + after a boolean switch option to enable it, - to di'+
-  'sable it'#010+
+  '         ','        bugrep@freepascal.org'#000+
+  '11025_**0*_put + after a boolean switch option to enable it, - to disa'+
+  'ble it'#010+
   '**1a_the compiler doesn'#039't delete the generated assembler file'#010+
   '**2al_list sourcecode lines in assembler file'#010+
-  '**2an_list node info in assembler file'#010+
-  '*L2ap_use pipes instead ','of creating temporary assembler files'#010+
+  '**2an_list node info in a','ssembler file'#010+
+  '*L2ap_use pipes instead of creating temporary assembler files'#010+
   '**2ar_list register allocation/release info in assembler file'#010+
   '**2at_list temp allocation/release info in assembler file'#010+
   '**1A<x>_output format:'#010+
-  '**2Adefault_use default assembler'#010+
-  '3*2Aas_assemble using GNU',' AS'#010+
+  '**2Adefault_use defau','lt assembler'#010+
+  '3*2Aas_assemble using GNU AS'#010+
   '3*2Anasmcoff_coff (Go32v2) file using Nasm'#010+
   '3*2Anasmelf_elf32 (Linux) file using Nasm'#010+
   '3*2Anasmwin32_Win32 object file using Nasm'#010+
   '3*2Anasmwdosx_Win32/WDOSX object file using Nasm'#010+
-  '3*2Awasm_obj file using Wasm (Watcom)'#010+
-  '3*2Anasmobj_obj file ','using Nasm'#010+
+  '3*2Awasm_obj file usi','ng Wasm (Watcom)'#010+
+  '3*2Anasmobj_obj file using Nasm'#010+
   '3*2Amasm_obj file using Masm (Microsoft)'#010+
   '3*2Atasm_obj file using Tasm (Borland)'#010+
   '3*2Aelf_elf32 (Linux) using internal writer'#010+
   '3*2Acoff_coff (Go32v2) using internal writer'#010+
-  '3*2Apecoff_pecoff (Win32) using internal writer'#010+
-  '4*2Aas_assem','ble using GNU AS'#010+
+  '3*2Apecoff_pecoff (Win','32) using internal writer'#010+
+  '4*2Aas_assemble using GNU AS'#010+
   '6*2Aas_Unix o-file using GNU AS'#010+
   '6*2Agas_GNU Motorola assembler'#010+
   '6*2Amit_MIT Syntax (old GAS)'#010+
   '6*2Amot_Standard Motorola assembler'#010+
   'A*2Aas_assemble using GNU AS'#010+
-  'P*2Aas_assemble using GNU AS'#010+
+  'P*2Aas_assemble using GNU AS',#010+
   'S*2Aas_assemble using GNU AS'#010+
-  '**1b_gen','erate browser info'#010+
+  '**1b_generate browser info'#010+
   '**2bl_generate local symbol info'#010+
   '**1B_build all modules'#010+
   '**1C<x>_code generation options:'#010+
   '**2Cc<x>_set default calling convention to <x>'#010+
-  '**2CD_create also dynamic library (not supported)'#010+
-  '**2Ce_Compilation with emulated flo','ating point opcodes'#010+
+  '**2CD_create also dynamic library (not supporte','d)'#010+
+  '**2Ce_Compilation with emulated floating point opcodes'#010+
   '**2Cf<x>_Select fpu instruction set to use, see fpc -i for possible va'+
   'lues'#010+
   '**2Cg_Generate PIC code'#010+
   '**2Ch<n>_<n> bytes heap (between 1023 and 67107840)'#010+
   '**2Ci_IO-checking'#010+
-  '**2Cn_omit linking stage'#010+
-  '**2Co_check overflow of in','teger operations'#010+
+  '**2Cn_omit li','nking stage'#010+
+  '**2Co_check overflow of integer operations'#010+
   '**2Cp<x>_select instruction set, see fpc -i for possible values'#010+
   '**2Cr_range checking'#010+
   '**2CR_verify object method call validity'#010+
   '**2Cs<n>_set stack size to <n>'#010+
   '**2Ct_stack checking'#010+
-  '**2CX_create also smartlinked library'#010+
-  '**1d<x>','_defines the symbol <x>'#010+
+  '**2CX_c','reate also smartlinked library'#010+
+  '**1d<x>_defines the symbol <x>'#010+
   '**1D_generate a DEF file'#010+
   '**2Dd<x>_set description to <x>'#010+
   '**2Dv<x>_set DLL version to <x>'#010+
   '*O2Dw_PM application'#010+
   '**1e<x>_set path to executable'#010+
   '**1E_same as -Cn'#010+
-  '**1F<x>_set file names and paths:'#010+
-  '**2Fa<x>[,y]_for a progr','am load first units <x> and [y] before uses '+
-  'is parsed'#010+
+  '**1F<x>_set file nam','es and paths:'#010+
+  '**2Fa<x>[,y]_for a program load first units <x> and [y] before uses is'+
+  ' parsed'#010+
   '**2Fc<x>_sets input codepage to <x>'#010+
   '**2FD<x>_sets the directory where to search for compiler utilities'#010+
   '**2Fe<x>_redirect error output to <x>'#010+
-  '**2FE<x>_set exe/unit output path to <x>'#010+
-  '**2F','i<x>_adds <x> to include path'#010+
+  '**2FE<x','>_set exe/unit output path to <x>'#010+
+  '**2Fi<x>_adds <x> to include path'#010+
   '**2Fl<x>_adds <x> to library path'#010+
   '**2FL<x>_uses <x> as dynamic linker'#010+
   '**2Fo<x>_adds <x> to object path'#010+
   '**2Fr<x>_load error message file <x>'#010+
   '**2Fu<x>_adds <x> to unit path'#010+
-  '**2FU<x>_set unit output path to <x>, o','verrides -FE'#010+
+  '*','*2FU<x>_set unit output path to <x>, overrides -FE'#010+
   '*g1g_generate debugger information:'#010+
   '*g2gc_generate checks for pointers'#010+
   '*g2gd_use dbx'#010+
   '*g2gg_use gsym'#010+
   '*g2gh_use heap trace unit (for memory leak debugging)'#010+
-  '*g2gl_use line info unit to show more info for backtraces'#010+
-  '*g2gv_generates',' programs traceable with valgrind'#010+
+  '*g2gl_use line info unit to show mo','re info for backtraces'#010+
+  '*g2gv_generates programs traceable with valgrind'#010+
   '*g2gw_generate dwarf debugging info'#010+
   '**1i_information'#010+
   '**2iD_return compiler date'#010+
   '**2iV_return compiler version'#010+
   '**2iSO_return compiler OS'#010+
-  '**2iSP_return compiler processor'#010+
+  '**2iSP_return compiler processor',#010+
   '**2iTO_return target OS'#010+
-  '**2iTP_return',' target processor'#010+
+  '**2iTP_return target processor'#010+
   '**1I<x>_adds <x> to include path'#010+
   '**1k<x>_Pass <x> to the linker'#010+
   '**1l_write logo'#010+
   '**1M<x>_set language mode to <x>'#010+
   '**2Mfpc_free pascal dialect (default)'#010+
-  '**2Mobjfpc_switch some Delphi 2 extensions on'#010+
-  '**2Mdelphi_tries to be De','lphi compatible'#010+
+  '**2Mobjfpc_switch some Delphi 2 e','xtensions on'#010+
+  '**2Mdelphi_tries to be Delphi compatible'#010+
   '**2Mtp_tries to be TP/BP 7.0 compatible'#010+
   '**2Mgpc_tries to be gpc compatible'#010+
   '**2Mmacpas_tries to be compatible to the macintosh pascal dialects'#010+
   '**1n_don'#039't read the default config file'#010+
-  '**1N<x>_node tree optimizations'#010+
-  '**2Nu_unro','ll loops'#010+
+  '**1N','<x>_node tree optimizations'#010+
+  '**2Nu_unroll loops'#010+
   '**1o<x>_change the name of the executable produced to <x>'#010+
   '**1O<x>_optimizations:'#010+
   '3*2Oa_<type>=<values> set alignment'#010+
   '3*2Og_generate smaller code'#010+
   '3*2OG_generate faster code (default)'#010+
-  '**2Or_keep certain variables in registers'#010+
-  '3*2Ou_e','nable uncertain optimizations (see docs)'#010+
+  '**2Or_keep ','certain variables in registers'#010+
+  '3*2Ou_enable uncertain optimizations (see docs)'#010+
   '3*2O1_level 1 optimizations (quick optimizations)'#010+
   '3*2O2_level 2 optimizations (-O1 + slower optimizations)'#010+
-  '3*2O3_level 3 optimizations (-O2 repeatedly, max 5 times)'#010+
+  '3*2O3_level 3 optimizations (-O2 repeatedly, max 5 tim','es)'#010+
   '3*2Op<x>_target processor:'#010+
-  '3*3Op1_','set target processor to 386/486'#010+
+  '3*3Op1_set target processor to 386/486'#010+
   '3*3Op2_set target processor to Pentium/PentiumMMX (tm)'#010+
   '3*3Op3_set target processor to PPro/PII/c6x86/K6 (tm)'#010+
   '6*2Og_generate smaller code'#010+
-  '6*2OG_generate faster code (default)'#010+
-  '6*2Ox_optimize maximum (still BUGG','Y!!!)'#010+
+  '6*2OG_generate faster code (defau','lt)'#010+
+  '6*2Ox_optimize maximum (still BUGGY!!!)'#010+
   '6*2O0_set target processor to a MC68000'#010+
   '6*2O2_set target processor to a MC68020+ (default)'#010+
   '**1pg_generate profile code for gprof (defines FPC_PROFILE)'#010+
   '**1R<x>_assembler reading style:'#010+
-  '**2Rdefault_use default assembler'#010+
-  '3*2Ratt_read AT&','T style assembler'#010+
+  '**2Rdefault_','use default assembler'#010+
+  '3*2Ratt_read AT&T style assembler'#010+
   '3*2Rintel_read Intel style assembler'#010+
   '6*2RMOT_read motorola style assembler'#010+
   '**1S<x>_syntax options:'#010+
   '**2S2_same as -Mobjfpc'#010+
   '**2Sc_supports operators like C (*=,+=,/= and -=)'#010+
-  '**2Sa_include assertion code.'#010+
-  '**2Sd_same as -Mdelp','hi'#010+
+  '**2Sa_includ','e assertion code.'#010+
+  '**2Sd_same as -Mdelphi'#010+
   '**2Se<x>_error options. <x> is a combination of the following:'#010+
   '**3*_<n> : compiler stops after the <n> errors (default is 1)'#010+
   '**3*_w : compiler stops also after warnings'#010+
-  '**3*_n : compiler stops also after notes'#010+
-  '**3*_h : compiler stops als','o after hints'#010+
+  '**3*_n : compiler stops also a','fter notes'#010+
+  '**3*_h : compiler stops also after hints'#010+
   '**2Sg_allow LABEL and GOTO'#010+
   '**2Sh_Use ansistrings'#010+
   '**2Si_support C++ styled INLINE'#010+
   '**2Sk_load fpcylix unit'#010+
   '**2SI<x>_set interface style to <x>'#010+
   '**3SIcom_COM compatible interface (default)'#010+
-  '**3SIcorba_CORBA compatible interface'#010+
-  '**2','Sm_support macros like C (global)'#010+
+  '**3','SIcorba_CORBA compatible interface'#010+
+  '**2Sm_support macros like C (global)'#010+
   '**2So_same as -Mtp'#010+
   '**2Sp_same as -Mgpc'#010+
   '**2Ss_constructor name must be init (destructor must be done)'#010+
   '**2St_allow static keyword in objects'#010+
-  '**1s_don'#039't call assembler and linker'#010+
-  '**2sh_Generate script to link ','on host'#010+
+  '**1s_don'#039't call assembler and',' linker'#010+
+  '**2sh_Generate script to link on host'#010+
   '**2st_Generate script to link on target'#010+
   '**2sr_Skip register allocation phase (use with -alr)'#010+
   '**1T<x>_Target operating system:'#010+
   '3*2Temx_OS/2 via EMX (including EMX/RSX extender)'#010+
-  '3*2Tfreebsd_FreeBSD'#010+
-  '3*2Tgo32v2_Version 2 of DJ Delorie D','OS extender'#010+
+  '3*2Tfreebsd_FreeBS','D'#010+
+  '3*2Tgo32v2_Version 2 of DJ Delorie DOS extender'#010+
   '3*2Tlinux_Linux'#010+
   '3*2Tnetbsd_NetBSD'#010+
   '3*2Tnetware_Novell Netware Module (clib)'#010+
@@ -898,7 +899,7 @@ const msgtxt : array[0..000164,1..240] of char=(
   '3*2Topenbsd_OpenBSD'#010+
   '3*2Tos2_OS/2 / eComStation'#010+
   '3*2Tsunos_SunOS/Solaris'#010+
-  '3*2Twatcom_Watcom compatible DOS extende','r'#010+
+  '3*','2Twatcom_Watcom compatible DOS extender'#010+
   '3*2Twdosx_WDOSX DOS extender'#010+
   '3*2Twin32_Windows 32 Bit'#010+
   '3*2Twince_Windows CE'#010+
@@ -906,9 +907,9 @@ const msgtxt : array[0..000164,1..240] of char=(
   '6*2Tamiga_Commodore Amiga'#010+
   '6*2Tatari_Atari ST/STe/TT'#010+
   '6*2Tlinux_Linux-68k'#010+
-  '6*2Tmacos_Macintosh m68k (not supported)'#010+
+  '6*2Tmacos_Macintosh m68k (not support','ed)'#010+
   '6*2Tpalmos_PalmOS'#010+
-  'A*2Tlinux_Linux'#010,
+  'A*2Tlinux_Linux'#010+
   'A*2Twince_Windows CE'#010+
   'P*2Tdarwin_Darwin and MacOS X on PowerPC'#010+
   'P*2Tlinux_Linux on PowerPC'#010+
@@ -916,49 +917,50 @@ const msgtxt : array[0..000164,1..240] of char=(
   'P*2Tmorphos_MorphOS'#010+
   'S*2Tlinux_Linux'#010+
   '**1u<x>_undefines the symbol <x>'#010+
-  '**1U_unit options:'#010+
-  '**2Un_don'#039't check the unit',' name'#010+
+  '**1U_un','it options:'#010+
+  '**2Un_don'#039't check the unit name'#010+
   '**2Ur_generate release unit files'#010+
   '**2Us_compile a system unit'#010+
   '**1v<x>_Be verbose. <x> is a combination of the following letters:'#010+
-  '**2*_e : Show errors (default)       0 : Show nothing (except errors)'#010+
-  '**2*_w : Show warnings             ','  u : Show unit info'#010+
+  '**2*_e : Show errors (default)       0 : Show nothing (except error','s'+
+  ')'#010+
+  '**2*_w : Show warnings               u : Show unit info'#010+
   '**2*_n : Show notes                  t : Show tried/used files'#010+
   '**2*_h : Show hints                  c : Show conditionals'#010+
   '**2*_i : Show general info           d : Show debug info'#010+
-  '**2*_l : Show linenumbers            r :',' Rhide/GCC compatibility mod'+
+  '**','2*_l : Show linenumbers            r : Rhide/GCC compatibility mod'+
   'e'#010+
   '**2*_a : Show everything             x : Executable info (Win32 only)'#010+
   '**2*_b : Write file names messages with full path'#010+
-  '**2*_v : write fpcdebug.txt with     p : Write tree.log with parse tre'+
-  'e'#010+
-  '**2*_    lots of d','ebugging info'#010+
+  '**2*_v : write fpcdebug.txt with     p : Write tree.','log with parse t'+
+  'ree'#010+
+  '**2*_    lots of debugging info'#010+
   '3*1W<x>_Win32-like target options'#010+
   '3*2WB_Create a relocatable image'#010+
   '3*2WB<x>_Set Image base to Hexadecimal <x> value'#010+
   '3*2WC_Specify console type application'#010+
-  '3*2WD_Use DEFFILE to export functions of DLL or EXE'#010+
-  '3*2WF_Specify full-','screen type application (OS/2 only)'#010+
+  '3*2WD_Use DEFFILE to export funct','ions of DLL or EXE'#010+
+  '3*2WF_Specify full-screen type application (OS/2 only)'#010+
   '3*2WG_Specify graphic type application'#010+
   '3*2WN_Do not generate relocation code (necessary for debugging)'#010+
   '3*2WR_Generate relocation code'#010+
-  'P*2WC_Specify console type application (MacOS only)'#010+
-  'P*2WG_Specify grap','hic type application (MacOS only)'#010+
+  'P*2WC_Specify console type appli','cation (MacOS only)'#010+
+  'P*2WG_Specify graphic type application (MacOS only)'#010+
   'P*2WT_Specify tool type application (MPW tool, MacOS only)'#010+
   '**1X_executable options:'#010+
   '**2Xc_pass --shared to the linker (Unix only)'#010+
-  '**2Xd_don'#039't use standard library search path (needed for cross com'+
-  'pile)'#010+
-  '**2X','D_try to link units dynamic          (defines FPC_LINK_DYNAMIC)'#010+
+  '**2Xd_don'#039't use standard library searc','h path (needed for cross c'+
+  'ompile)'#010+
+  '**2XD_try to link units dynamic          (defines FPC_LINK_DYNAMIC)'#010+
   '**2Xm_generate link map'#010+
   '**2XM<x>_set the name of the '#039'main'#039' program routine (default i'+
   's '#039'main'#039')'#010+
-  '**2XP<x>_prepend the binutils names with the prefix <x>'#010+
-  '**2Xr<x>_set library sea','rch path to <x> (needed for cross compile)'#010+
+  '**2XP<x>_prepend the binutils names with t','he prefix <x>'#010+
+  '**2Xr<x>_set library search path to <x> (needed for cross compile)'#010+
   '**2Xs_strip all symbols from executable'#010+
   '**2XS_try to link units static (default) (defines FPC_LINK_STATIC)'#010+
-  '**2Xt_link with static libraries (-static is passed to linker)'#010+
-  '**2XX_try to link units sma','rt            (defines FPC_LINK_SMART)'#010+
+  '**2Xt_link with static libraries (-static is passed ','to linker)'#010+
+  '**2XX_try to link units smart            (defines FPC_LINK_SMART)'#010+
   '**1*_'#010+
   '**1?_shows this help'#010+
   '**1h_shows this help without waiting'#000
diff --git a/compiler/options.pas b/compiler/options.pas
index e98a515b0f..ab7ff629e7 100644
--- a/compiler/options.pas
+++ b/compiler/options.pas
@@ -1292,6 +1292,12 @@ begin
   Option_read:=false;
   If FileLevel>MaxLevel then
    Message(option_too_many_cfg_files);
+{ Maybe It's Directory ?}   //Jaro Change:
+  if DirectoryExists(filename) then
+    begin
+       Message1(option_config_is_dir,filename);
+       exit;
+    end;
 { open file }
   Message1(option_using_file,filename);
 {$ifdef USE_SYSUTILS}