瀏覽代碼

+ -vq parameter to show message numbers
+ -vm<x>,<y> parameter to mask messages <x> and <y>
(both based on a patch submitted by Petr Kristan)
* alphabetically ordered -v<x> option processing code so it's easier
to see which characters are still free (not many anymore)
+ some tests for the -vm functionality

git-svn-id: trunk@11888 -

Jonas Maebe 17 年之前
父節點
當前提交
64ddae4eff
共有 11 個文件被更改,包括 232 次插入124 次删除
  1. 4 0
      .gitattributes
  2. 28 0
      compiler/cmsgs.pas
  3. 5 2
      compiler/comphook.pas
  4. 4 2
      compiler/msg/errore.msg
  5. 1 1
      compiler/msgidx.inc
  6. 69 67
      compiler/msgtxt.inc
  7. 90 52
      compiler/verbose.pas
  8. 7 0
      tests/test/tmsg1.pp
  9. 7 0
      tests/test/tmsg2.pp
  10. 7 0
      tests/test/tmsg3.pp
  11. 10 0
      tests/test/tmsg4.pp

+ 4 - 0
.gitattributes

@@ -7735,6 +7735,10 @@ tests/test/tmath1.pp svneol=native#text/plain
 tests/test/tmcbool2.pp svneol=native#text/plain
 tests/test/tmmx1.pp svneol=native#text/plain
 tests/test/tmove.pp svneol=native#text/plain
+tests/test/tmsg1.pp svneol=native#text/plain
+tests/test/tmsg2.pp svneol=native#text/plain
+tests/test/tmsg3.pp svneol=native#text/plain
+tests/test/tmsg4.pp svneol=native#text/plain
 tests/test/tmt1.pp svneol=native#text/plain
 tests/test/tobject1.pp svneol=native#text/plain
 tests/test/tobject2.pp svneol=native#text/plain

+ 28 - 0
compiler/cmsgs.pas

@@ -52,6 +52,7 @@ type
     procedure ClearIdx;
     procedure CreateIdx;
     function  GetPChar(nr:longint):pchar;
+    function  ClearVerbosity(nr:longint):boolean;
     function  Get(nr:longint;const args:array of string):ansistring;
   end;
 
@@ -374,6 +375,33 @@ begin
   GetPChar:=msgidx[nr div 1000]^[nr mod 1000];
 end;
 
+function TMessage.ClearVerbosity(nr:longint):boolean;
+var
+  hp: pchar;
+  i, txtbegin: longint;
+begin
+   result:=false;
+  if ((nr div 1000) < low(msgidx)) or
+     ((nr div 1000) > msgparts) then
+    exit;
+  hp := GetPChar(nr);
+  if (hp=nil) then
+    exit;
+  txtbegin:=-1;
+  for i:=0 to 4 do
+    begin
+      if hp[i]=#0 then
+        exit;
+      if hp[i]='_' then
+        begin
+          txtbegin:=i;
+          break;
+        end;
+    end;
+  for i:=0 to txtbegin-1 do
+    hp[i]:='_';
+  result:=true;
+end;
 
 function TMessage.Get(nr:longint;const args:array of string):ansistring;
 var

+ 5 - 2
compiler/comphook.pas

@@ -90,6 +90,7 @@ type
     ispackage,
     islibrary     : boolean;
   { Settings for the output }
+    showmsgnrs    : boolean;
     verbosity     : longint;
     maxerrorcount : longint;
     errorwarning,
@@ -337,7 +338,8 @@ begin
     end;
 
   { Display line }
-  if ((status.verbosity and (Level and V_LevelMask))=(Level and V_LevelMask)) then
+  if (Level<>V_None) and
+     ((status.verbosity and (Level and V_LevelMask))=(Level and V_LevelMask)) then
    begin
      if status.use_stderr then
       begin
@@ -375,7 +377,8 @@ end;
 function def_CheckVerbosity(v:longint):boolean;
 begin
   result:=status.use_bugreport or
-          ((status.verbosity and (v and V_LevelMask))=(v and V_LevelMask));
+          ((v<>V_None) and
+           ((status.verbosity and (v and V_LevelMask))=(v and V_LevelMask)));
 end;
 
 procedure def_initsymbolinfo;

+ 4 - 2
compiler/msg/errore.msg

@@ -39,6 +39,7 @@
 #   c_   conditional
 #   d_   debug message
 #   x_   executable informations
+#   o_   normal (e.g., "press enter to continue")
 #
 
 #
@@ -2459,7 +2460,7 @@ option_using_env=11027_T_Reading options from environment $1
 % Options are also read from this environment string.
 option_handling_option=11028_D_Handling option "$1"
 % Debug info that an option is found and will be handled.
-option_help_press_enter=11029__*** press enter ***
+option_help_press_enter=11029_O_*** press enter ***
 % Message shown when help is shown page per page. When pressing the ENTER
 % Key, the next page of help is shown. If you press q and then ENTER, the
 % compiler exits.
@@ -2753,7 +2754,8 @@ S*2Tlinux_Linux
 **2*_a : Show everything             x : Executable info (Win32 only)
 **2*_b : Write file names messages with full path
 **2*_v : Write fpcdebug.txt with     p : Write tree.log with parse tree
-**2*_    lots of debugging info
+**2*_    lots of debugging info      q : Show message numbers
+**2*_m<x>,<y> : Don't show messages numbered <x> and <y>
 3*1W<x>_Target-specific options (targets)
 A*1W<x>_Target-specific options (targets)
 P*1W<x>_Target-specific options (targets)

+ 1 - 1
compiler/msgidx.inc

@@ -754,7 +754,7 @@ const
   option_info=11024;
   option_help_pages=11025;
 
-  MsgTxtSize = 47219;
+  MsgTxtSize = 47307;
 
   MsgIdxMax : array[1..20] of longint=(
     24,87,248,84,65,50,108,22,201,61,

+ 69 - 67
compiler/msgtxt.inc

@@ -1,7 +1,7 @@
 {$ifdef Delphi}
-const msgtxt : array[0..000196] of string[240]=(
+const msgtxt : array[0..000197] of string[240]=(
 {$else Delphi}
-const msgtxt : array[0..000196,1..240] of char=(
+const msgtxt : array[0..000197,1..240] of char=(
 {$endif Delphi}
   '01000_T_Compiler: $1'#000+
   '01001_D_Compiler OS: $1'#000+
@@ -823,22 +823,22 @@ const msgtxt : array[0..000196,1..240] of char=(
   '11026_T_Reading options from file $1'#000+
   '11027_T_Reading options from environment $1'#000+
   '11028_D_Handling option "$1"'#000+
-  '11029__*** press enter ***'#000+
+  '11029_O_*** press enter ***'#000+
   '11030_H_Start of reading config file $1'#000+
   '11031_H_End of reading config file $1'#000+
-  '11032_D_interpreti','ng option "$1"'#000+
+  '11032_D_interpret','ing option "$1"'#000+
   '11036_D_interpreting firstpass option "$1"'#000+
   '11033_D_interpreting file option "$1"'#000+
   '11034_D_Reading config file "$1"'#000+
   '11035_D_found source file name "$1"'#000+
   '11039_E_Unknown code page'#000+
   '11040_F_Config file $1 is a directory'#000+
-  '11041_W_Ass','embler output selected "$1" cannot generate debug info, d'+
+  '11041_W_As','sembler output selected "$1" cannot generate debug info, d'+
   'ebugging disabled'#000+
   '11042_W_Use of ppc386.cfg is deprecated, please use fpc.cfg instead'#000+
   '11023_Free Pascal Compiler version $FPCFULLVERSION [$FPCDATE] for $FPC'+
   'CPU'#010+
-  'Copyright (c) 1993-2008',' by Florian Klaempfl'#000+
+  'Copyright (c) 1993-200','8 by Florian Klaempfl'#000+
   '11024_Free Pascal Compiler version $FPCVERSION'#010+
   #010+
   'Compiler Date      : $FPCDATE'#010+
@@ -850,7 +850,7 @@ const msgtxt : array[0..000196,1..240] of char=(
   'Supported CPU instruction sets:'#010+
   '  $INSTRUCTIONSETS'#010+
   #010+
-  'Supported FPU instruction ','sets:'#010+
+  'Supported FPU instruction',' sets:'#010+
   '  $FPUINSTRUCTIONSETS'#010+
   #010+
   'Supported ABI targets:'#010+
@@ -863,36 +863,36 @@ const msgtxt : array[0..000196,1..240] of char=(
   'For more information read COPYING.FPC'#010+
   #010+
   'Report bugs,suggestions etc to:'#010+
-  '   ','              [email protected]'#000+
+  '  ','               [email protected]'#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+
+  '**2an_List node info',' in assembler 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 d','efault assembler'#010+
+  '**2Adefault_Use ','default 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*2Awasm_Obj fil','e using 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_ELF (Linux) using internal writer'#010+
   '3*2Acoff_COFF (Go32v2) using internal writer'#010+
-  '3*2Apecoff_PE-COFF (','Win32) using internal writer'#010+
+  '3*2Apecoff_PE-COFF ','(Win32) 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 GN','U AS'#010+
   'S*2Aas_Assemble using GNU AS'#010+
   '**1b_Generate browser info'#010+
   '**2bl_Generate local symbol info'#010+
@@ -900,25 +900,25 @@ const msgtxt : array[0..000196,1..240] of char=(
   '**1C<x>_Code generation options:'#010+
   '**2Ca<x>_Select ABI, see fpc -i for possible values'#010+
   '**2Cb_Generate big-endian code'#010+
-  '**2Cc<x>','_Set default calling convention to <x>'#010+
+  '**2Cc<x','>_Set default calling convention to <x>'#010+
   '**2CD_Create also dynamic library (not supported)'#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+
-  '**2CF<x>_Minimal floa','ting point constant precision (default, 32, 64)'+
+  '**2CF<x>_Minimal flo','ating point constant precision (default, 32, 64)'+
   #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 integer operations'#010+
-  '**2CO_Check for possible overf','low of integer operations'#010+
+  '**2CO_Check for possible over','flow of integer operations'#010+
   '**2Cp<x>_Select instruction set, see fpc -i for possible values'#010+
   '**2CP<x>=<y>_ packing settings'#010+
   '**3CPPACKSET=<y>_ <y> set allocation: 0, 1 or DEFAULT or NORMAL, 2, 4 '+
   'and 8'#010+
   '**2Cr_Range checking'#010+
-  '**2CR_Verify object me','thod call validity'#010+
+  '**2CR_Verify object m','ethod call validity'#010+
   '**2Cs<n>_Set stack size to <n>'#010+
   '**2Ct_Stack checking'#010+
   '**2CX_Create also smartlinked library'#010+
@@ -926,7 +926,7 @@ const msgtxt : array[0..000196,1..240] of char=(
   '**1D_Generate a DEF file'#010+
   '**2Dd<x>_Set description to <x>'#010+
   '**2Dv<x>_Set DLL version to <x>'#010+
-  '*O2Dw_PM ap','plication'#010+
+  '*O2Dw_PM a','pplication'#010+
   '**1e<x>_Set path to executable'#010+
   '**1E_Same as -Cn'#010+
   '**1fPIC_Same as -Cg'#010+
@@ -934,41 +934,41 @@ const msgtxt : array[0..000196,1..240] of char=(
   '**2Fa<x>[,y]_(for a program) load units <x> and [y] before uses is par'+
   'sed'#010+
   '**2Fc<x>_Set input codepage to <x>'#010+
-  '**2FC<x>_Set RC com','piler binary name to <x>'#010+
+  '**2FC<x>_Set RC co','mpiler binary name to <x>'#010+
   '**2FD<x>_Set the directory where to search for compiler utilities'#010+
   '**2Fe<x>_Redirect error output to <x>'#010+
   '**2Ff<x>_Add <x> to framework path (Darwin only)'#010+
   '**2FE<x>_Set exe/unit output path to <x>'#010+
-  '**2Fi<x>_Add <x> to i','nclude path'#010+
+  '**2Fi<x>_Add <x> to ','include path'#010+
   '**2Fl<x>_Add <x> to library path'#010+
   '**2FL<x>_Use <x> as dynamic linker'#010+
   '**2Fm<x>_Load unicode conversion table from <x>.txt in the compiler di'+
   'r'#010+
   '**2Fo<x>_Add <x> to object path'#010+
   '**2Fr<x>_Load error message file <x>'#010+
-  '**2FR<x>_Set resour','ce (.res) linker to <x>'#010+
+  '**2FR<x>_Set resou','rce (.res) linker to <x>'#010+
   '**2Fu<x>_Add <x> to unit path'#010+
   '**2FU<x>_Set unit output path to <x>, overrides -FE'#010+
   '*g1g_Generate debug information (default format for target)'#010+
   '*g2gc_Generate checks for pointers'#010+
-  '*g2gh_Use heaptrace unit (for memory le','ak/corruption debugging)'#010+
+  '*g2gh_Use heaptrace unit (for memory l','eak/corruption debugging)'#010+
   '*g2gl_Use line info unit (show more info with backtraces)'#010+
   '*g2go<x>_Set debug information options'#010+
   '*g3godwarfsets_ Enable Dwarf set debug information (breaks gdb < 6.5)'#010+
   '*g2gp_Preserve case in stabs symbol names'#010+
-  '*g2gs_','Generate stabs debug information'#010+
+  '*g2gs','_Generate stabs debug information'#010+
   '*g2gt_Trash local variables (to detect uninitialized uses)'#010+
   '*g2gv_Generates programs traceable with valgrind'#010+
   '*g2gw_Generate dwarf-2 debug information (same as -gw2)'#010+
-  '*g2gw2_Generate dwarf-2 debug information'#010+
-  '*','g2gw3_Generate dwarf-3 debug information'#010+
+  '*g2gw2_Generate dwarf-2 debug information'#010,
+  '*g2gw3_Generate dwarf-3 debug information'#010+
   '**1i_Information'#010+
   '**2iD_Return compiler date'#010+
   '**2iV_Return short compiler version'#010+
   '**2iW_Return full compiler version'#010+
   '**2iSO_Return compiler OS'#010+
   '**2iSP_Return compiler host processor'#010+
-  '**2iTO_Return target',' OS'#010+
+  '**2iTO_Return targe','t OS'#010+
   '**2iTP_Return target processor'#010+
   '**1I<x>_Add <x> to include path'#010+
   '**1k<x>_Pass <x> to the linker'#010+
@@ -976,59 +976,59 @@ const msgtxt : array[0..000196,1..240] of char=(
   '**1M<x>_Set language mode to <x>'#010+
   '**2Mfpc_Free Pascal dialect (default)'#010+
   '**2Mobjfpc_FPC mode with Object Pascal support'#010+
-  '**2Mdelp','hi_Delphi 7 compatibility mode'#010+
+  '**2Mdel','phi_Delphi 7 compatibility mode'#010+
   '**2Mtp_TP/BP 7.0 compatibility mode'#010+
   '**2Mmacpas_Macintosh Pascal dialects compatibility mode'#010+
   '**1n_Do not read the default config files'#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>_Change the name',' of the executable produced to <x>'#010+
   '**1O<x>_Optimizations:'#010+
   '**2O-_Disable optimizations'#010+
   '**2O1_Level 1 optimizations (quick and debugger friendly)'#010+
   '**2O2_Level 2 optimizations (-O1 + quick optimizations)'#010+
-  '**2O3_Level 3 optimizations (-O2 + slow o','ptimizations)'#010+
+  '**2O3_Level 3 optimizations (-O2 + slow ','optimizations)'#010+
   '**2Oa<x>=<y>_Set alignment'#010+
   '**2Oo[NO]<x>_Enable or disable optimizations, see fpc -i for possible '+
   'values'#010+
   '**2Op<x>_Set target cpu for optimizing, see fpc -i for possible values'+
   #010+
   '**2Os_Optimize for size rather than speed'#010+
-  '**1pg_Gen','erate profile code for gprof (defines FPC_PROFILE)'#010+
+  '**1pg_Ge','nerate profile code for gprof (defines FPC_PROFILE)'#010+
   '**1R<x>_Assembler reading style:'#010+
   '**2Rdefault_Use default assembler for target'#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+
+  '*','*1S<x>_Syntax options:'#010+
   '**2S2_Same as -Mobjfpc'#010+
   '**2Sc_Support operators like C (*=,+=,/= and -=)'#010+
   '**2Sa_Turn on assertions'#010+
   '**2Sd_Same as -Mdelphi'#010+
   '**2Se<x>_Error options. <x> is a combination of the following:'#010+
-  '**3*_<n> : Compiler halts after the',' <n> errors (default is 1)'#010+
+  '**3*_<n> : Compiler halts after th','e <n> errors (default is 1)'#010+
   '**3*_w : Compiler also halts after warnings'#010+
   '**3*_n : Compiler also halts after notes'#010+
   '**3*_h : Compiler also halts after hints'#010+
   '**2Sg_Enable LABEL and GOTO (default in -Mtp and -Mdelphi)'#010+
-  '**2Sh_Use ansistrings by def','ault instead of shortstrings'#010+
+  '**2Sh_Use ansistrings by de','fault instead of shortstrings'#010+
   '**2Si_Turn on inlining of procedures/functions declared as "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+
-  '*','*2Sm_Support macros like C (global)'#010+
+  '**3SIcorba_CORBA compatible interface'#010,
+  '**2Sm_Support macros like C (global)'#010+
   '**2So_Same as -Mtp'#010+
   '**2Ss_Constructor name must be init (destructor must be done)'#010+
   '**2St_Allow static keyword in objects'#010+
   '**2Sx_Enable exception keywords (default in Delphi/ObjFPC modes)'#010+
-  '**1s_Do not call ass','embler and linker'#010+
+  '**1s_Do not call as','sembler 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*2Tfree','bsd_FreeBSD'#010+
+  '3*2Tfre','ebsd_FreeBSD'#010+
   '3*2Tgo32v2_Version 2 of DJ Delorie DOS extender'#010+
   '3*2Tlinux_Linux'#010+
   '3*2Tnetbsd_NetBSD'#010+
@@ -1036,7 +1036,7 @@ const msgtxt : array[0..000196,1..240] of char=(
   '3*2Tnetwlibc_Novell Netware Module (libc)'#010+
   '3*2Topenbsd_OpenBSD'#010+
   '3*2Tos2_OS/2 / eComStation'#010+
-  '3*2Tsunos_SunOS/','Solaris'#010+
+  '3*2Tsunos_SunOS','/Solaris'#010+
   '3*2Tsymbian_Symbian OS'#010+
   '3*2Twatcom_Watcom compatible DOS extender'#010+
   '3*2Twdosx_WDOSX DOS extender'#010+
@@ -1046,7 +1046,7 @@ const msgtxt : array[0..000196,1..240] of char=(
   '6*2Tamiga_Commodore Amiga'#010+
   '6*2Tatari_Atari ST/STe/TT'#010+
   '6*2Tlinux_Linux/m68k'#010+
-  '6*2','Tmacos_Macintosh m68k (not supported)'#010+
+  '6*','2Tmacos_Macintosh m68k (not supported)'#010+
   '6*2Tpalmos_PalmOS'#010+
   'A*2Tlinux_Linux'#010+
   'A*2Twince_Windows CE'#010+
@@ -1054,77 +1054,79 @@ const msgtxt : array[0..000196,1..240] of char=(
   'P*2Tdarwin_Darwin and Mac OS X on PowerPC'#010+
   'P*2Tlinux_Linux on PowerPC'#010+
   'P*2Tmacos_Mac OS (classic) on PowerPC'#010+
-  'P*2Tmorphos','_MorphOS'#010+
+  'P*2Tmorpho','s_MorphOS'#010+
   'S*2Tlinux_Linux'#010+
   '**1u<x>_Undefines the symbol <x>'#010+
   '**1U_Unit options:'#010+
   '**2Un_Do not check where the unit name matches the file name'#010+
   '**2Ur_Generate release unit files (never automatically recompiled)'#010+
   '**2Us_Compile a system unit'#010+
-  '**1v<x>','_Be verbose. <x> is a combination of the following letters:'#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*_n : Show notes                  t : Show tried/us','ed files'#010+
+  '**2*_n : Show notes                  t : Show tried/u','sed 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 mode'#010+
-  '**2*_a : Show everything             x : Exec','utable info (Win32 only'+
+  '**2*_a : Show everything             x : Exe','cutable 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 debugging info'#010+
+  '**2*_    lots of debugging info      q : Show message numbers'#010+
+  '**2*_m<x>,<y> : Don'#039't show mes','sages numbered <x> and <y>'#010+
   '3*1W<x>_Target-specific options (targets)'#010+
-  'A*1W<x>_Target-spec','ific options (targets)'#010+
+  'A*1W<x>_Target-specific options (targets)'#010+
   'P*1W<x>_Target-specific options (targets)'#010+
   '3*2Wb_Create a bundle instead of a library (Darwin)'#010+
-  'P*2Wb_Create a bundle instead of a library (Darwin)'#010+
+  'P*2Wb_Create a bundle instead of a ','library (Darwin)'#010+
   'p*2Wb_Create a bundle instead of a library (Darwin)'#010+
-  '3*2WB_Create a relo','catable image (Windows)'#010+
+  '3*2WB_Create a relocatable image (Windows)'#010+
   'A*2WB_Create a relocatable image (Windows, Symbian)'#010+
   '3*2WC_Specify console type application (EMX, OS/2, Windows)'#010+
-  'A*2WC_Specify console type application (Windows)'#010+
-  'P*2WC_Specify console type application (Classic Mac OS)',#010+
+  'A*2WC_Specify co','nsole type application (Windows)'#010+
+  'P*2WC_Specify console type application (Classic Mac OS)'#010+
   '3*2WD_Use DEFFILE to export functions of DLL or EXE (Windows)'#010+
   'A*2WD_Use DEFFILE to export functions of DLL or EXE (Windows)'#010+
-  '3*2We_Use external resources (Darwin)'#010+
+  '3*2We_Use external resource','s (Darwin)'#010+
   'P*2We_Use external resources (Darwin)'#010+
   'p*2We_Use external resources (Darwin)'#010+
-  '3','*2WF_Specify full-screen type application (EMX, OS/2)'#010+
+  '3*2WF_Specify full-screen type application (EMX, OS/2)'#010+
   '3*2WG_Specify graphic type application (EMX, OS/2, Windows)'#010+
-  'A*2WG_Specify graphic type application (Windows)'#010+
+  'A*2WG_Specify graphic type application',' (Windows)'#010+
   'P*2WG_Specify graphic type application (Classic Mac OS)'#010+
-  '3*2Wi_Use internal re','sources (Darwin)'#010+
+  '3*2Wi_Use internal resources (Darwin)'#010+
   'P*2Wi_Use internal resources (Darwin)'#010+
   'p*2Wi_Use internal resources (Darwin)'#010+
-  '3*2WN_Do not generate relocation code, needed for debugging (Windows)'#010+
+  '3*2WN_Do not generate relocation code, needed for debugging',' (Windows'+
+  ')'#010+
   'A*2WN_Do not generate relocation code, needed for debugging (Windows)'#010+
-  '3*2WR_G','enerate relocation code (Windows)'#010+
+  '3*2WR_Generate relocation code (Windows)'#010+
   'A*2WR_Generate relocation code (Windows)'#010+
   'P*2WT_Specify MPW tool type application (Classic Mac OS)'#010+
-  '**1X_Executable options:'#010+
+  '**1X_Executable opti','ons:'#010+
   '**2Xc_Pass --shared/-dynamic to the linker (BeOS, Darwin, FreeBSD, Lin'+
   'ux)'#010+
-  '**2Xd_Do ','not use standard library search path (needed for cross comp'+
-  'ile)'#010+
+  '**2Xd_Do not use standard library search path (needed for cross compil'+
+  'e)'#010+
   '**2Xe_Use external linker'#010+
-  '**2Xg_Create debuginfo in a separate file and add a debuglink section '+
-  'to executable'#010+
-  '**2XD_Try to link units dynamically      (defines FPC_LINK_DYNAMIC',')'#010+
+  '**2Xg_Create debuginfo in a separate file and add a debuglink ','sectio'+
+  'n to executable'#010+
+  '**2XD_Try to link units dynamically      (defines FPC_LINK_DYNAMIC)'#010+
   '**2Xi_Use internal linker'#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 search path to <x> (needed for cross co','mpile) ('+
-  'BeOS, Linux)'#010+
+  '**2XP<x>_Prepend the binutil','s names with the prefix <x>'#010+
+  '**2Xr<x>_Set library search path to <x> (needed for cross compile) (Be'+
+  'OS, Linux)'#010+
   '**2XR<x>_Prepend <x> to all linker search paths (BeOS, Darwin, FreeBSD'+
   ', Linux, Mac OS, Solaris)'#010+
-  '**2Xs_Strip all symbols from executable'#010+
+  '**2Xs_Strip all symbols from execut','able'#010+
   '**2XS_Try to link units statically (default, defines FPC_LINK_STATIC)'#010+
-  '**2Xt_Link wi','th static libraries (-static is passed to linker)'#010+
+  '**2Xt_Link with static libraries (-static is passed to linker)'#010+
   '**2XX_Try to smartlink units             (defines FPC_LINK_SMART)'#010+
   '**1*_'#010+
   '**1?_Show this help'#010+
-  '**1h_Shows this help without waiting'#000
+  '**1h_Shows',' this help without waiting'#000
 );

+ 90 - 52
compiler/verbose.pas

@@ -120,7 +120,6 @@ implementation
     uses
       comphook,fmodule,constexp,globals;
 
-
 {****************************************************************************
                        Extra Handlers for default compiler
 ****************************************************************************}
@@ -178,6 +177,31 @@ implementation
       end;
 
 
+    function ClearMessageVerbosity(s: string; var i: integer): boolean;
+      var
+        tok : string;
+        code : longint;
+        msgnr: longint;
+      begin
+        { delete everything up to and including 'm' }
+        delete(s,1,i);
+        { the rest of the string must be message numbers }
+        inc(i,length(s)+1);
+        result:=false;
+        repeat
+          tok:=GetToken(s,',');
+          if (tok='') then
+            break;
+          val(tok, msgnr, code);
+          if (code<>0) then
+            exit;
+          if not msg^.clearverbosity(msgnr) then
+            exit;
+        until false;
+        result:=true;
+      end;
+
+
     function CheckVerbosity(v:longint):boolean;
       begin
         result:=do_checkverbosity(v);
@@ -214,6 +238,7 @@ implementation
                 { handle switch }
                 case c of
                 { Special cases }
+                 '0' : status.verbosity:=V_Default;
                  'A' : status.verbosity:=V_All;
                  'B' : begin
                           if inverse then
@@ -221,13 +246,24 @@ implementation
                           else
                             status.print_source_path:=true;
                        end;
-                 '0' : status.verbosity:=V_Default;
+                 'M' : if inverse or
+                          not ClearMessageVerbosity(s, i) then
+                         begin
+                           result:=false;
+                           exit
+                         end;
                  'P' : begin
                          if inverse then
                           paraprintnodetree:=0
                          else
                           paraprintnodetree:=1;
                        end;
+                 'Q' : begin
+                          if inverse then
+                            status.showmsgnrs:=false
+                          else
+                            status.showmsgnrs:=true;
+                       end;
                  'R' : begin
                           if inverse then
                             begin
@@ -240,6 +276,7 @@ implementation
                                status.use_stderr:=true;
                             end;
                        end;
+                 'V' : PrepareReport;
                  'Z' : begin
                           if inverse then
                             status.use_stderr:=false
@@ -247,55 +284,54 @@ implementation
                             status.use_stderr:=true;
                        end;
                 { Normal cases - do an or }
+                 'C' : if inverse then
+                         status.verbosity:=status.verbosity and (not V_Conditional)
+                       else
+                         status.verbosity:=status.verbosity or V_Conditional;
+                 'D' : if inverse then
+                         status.verbosity:=status.verbosity and (not V_Debug)
+                       else
+                         status.verbosity:=status.verbosity or V_Debug;
                  'E' : if inverse then
                          status.verbosity:=status.verbosity and (not V_Error)
                        else
                          status.verbosity:=status.verbosity or V_Error;
+                 'H' : if inverse then
+                         status.verbosity:=status.verbosity and (not V_Hint)
+                       else
+                         status.verbosity:=status.verbosity or V_Hint;
                  'I' : if inverse then
                          status.verbosity:=status.verbosity and (not V_Info)
                        else
                          status.verbosity:=status.verbosity or V_Info;
-                 'W' : if inverse then
-                         status.verbosity:=status.verbosity and (not V_Warning)
+                 'L' : if inverse then
+                         status.verbosity:=status.verbosity and (not V_Status)
                        else
-                         status.verbosity:=status.verbosity or V_Warning;
+                         status.verbosity:=status.verbosity or V_Status;
                  'N' : if inverse then
                          status.verbosity:=status.verbosity and (not V_Note)
                        else
                          status.verbosity:=status.verbosity or V_Note;
-                 'H' : if inverse then
-                         status.verbosity:=status.verbosity and (not V_Hint)
-                       else
-                         status.verbosity:=status.verbosity or V_Hint;
-                 'L' : if inverse then
-                         status.verbosity:=status.verbosity and (not V_Status)
-                       else
-                         status.verbosity:=status.verbosity or V_Status;
-                 'U' : if inverse then
-                         status.verbosity:=status.verbosity and (not V_Used)
+                 'S' : if inverse then
+                         status.verbosity:=status.verbosity and (not V_TimeStamps)
                        else
-                         status.verbosity:=status.verbosity or V_Used;
+                         status.verbosity:=status.verbosity or V_TimeStamps;
                  'T' : if inverse then
                          status.verbosity:=status.verbosity and (not V_Tried)
                        else
                          status.verbosity:=status.verbosity or V_Tried;
-                 'C' : if inverse then
-                         status.verbosity:=status.verbosity and (not V_Conditional)
+                 'U' : if inverse then
+                         status.verbosity:=status.verbosity and (not V_Used)
                        else
-                         status.verbosity:=status.verbosity or V_Conditional;
-                 'D' : if inverse then
-                         status.verbosity:=status.verbosity and (not V_Debug)
+                         status.verbosity:=status.verbosity or V_Used;
+                 'W' : if inverse then
+                         status.verbosity:=status.verbosity and (not V_Warning)
                        else
-                         status.verbosity:=status.verbosity or V_Debug;
+                         status.verbosity:=status.verbosity or V_Warning;
                  'X' : if inverse then
                          status.verbosity:=status.verbosity and (not V_Executable)
                        else
                          status.verbosity:=status.verbosity or V_Executable;
-                 'S' : if inverse then
-                         status.verbosity:=status.verbosity and (not V_TimeStamps)
-                       else
-                         status.verbosity:=status.verbosity or V_TimeStamps;
-                 'V' : PrepareReport;
                  end;
                 inc(i);
              end;
@@ -520,7 +556,7 @@ implementation
       {Parse options}
         idx:=pos('_',s);
         if idx=0 then
-         v:=V_Normal
+         v:=V_None
         else
          if (idx >= 1) And (idx <= 5) then
           begin
@@ -587,31 +623,33 @@ implementation
         Delete(s,1,idx);
       { check verbosity level }
         if not CheckVerbosity(v) then
-        begin
-          doqueue := onqueue <> nil;
-          if not doqueue then
-            exit;
-        end;
+          begin
+            doqueue := onqueue <> nil;
+            if not doqueue then
+              exit;
+          end;
         if (v and V_LineInfoMask)<>0 then
           v:=v or V_LineInfo;
       { fix status }
         UpdateStatus;
       { Fix replacements }
         DefaultReplacements(s);
+        if status.showmsgnrs then
+          s:='('+tostr(w)+') '+s;
         if doqueue then
-        begin
-          onqueue(s,v,w);
-          exit;
-        end;
+          begin
+            onqueue(s,v,w);
+            exit;
+          end;
       { show comment }
         if do_comment(v,s) or dostop then
           raise ECompilerAbort.Create;
         if (status.errorcount>=status.maxerrorcount) and not status.skip_error then
-         begin
-           Message1(unit_f_errors_in_unit,tostr(status.errorcount));
-           status.skip_error:=true;
-           raise ECompilerAbort.Create;
-         end;
+          begin
+            Message1(unit_f_errors_in_unit,tostr(status.errorcount));
+            status.skip_error:=true;
+            raise ECompilerAbort.Create;
+          end;
       end;
 
 
@@ -820,16 +858,16 @@ implementation
       end;
 
 
-procedure FlushOutput;
-begin
-  if not (Status.Use_StdErr) then (* StdErr is flushed after every line *)
-    begin
-      if Status.Use_Redir then
-        Flush(Status.RedirFile)
-      else
-        Flush(Output);
-    end;
-end;
+    procedure FlushOutput;
+      begin
+        if not (Status.Use_StdErr) then (* StdErr is flushed after every line *)
+          begin
+            if Status.Use_Redir then
+              Flush(Status.RedirFile)
+            else
+              Flush(Output);
+          end;
+      end;
 
 
 {*****************************************************************************

+ 7 - 0
tests/test/tmsg1.pp

@@ -0,0 +1,7 @@
+{ %fail }
+{ %opt=-vm20999999 }
+
+{ illegal message number }
+
+begin
+end.

+ 7 - 0
tests/test/tmsg2.pp

@@ -0,0 +1,7 @@
+{ %fail }
+{ %opt=-vm123 }
+
+{ non-existent message }
+
+begin
+end.

+ 7 - 0
tests/test/tmsg3.pp

@@ -0,0 +1,7 @@
+{ %fail }
+{ %opt=-vm5024,a,05027 }
+
+{ invalid characted amidst message numbers }
+
+begin
+end.

+ 10 - 0
tests/test/tmsg4.pp

@@ -0,0 +1,10 @@
+{ %opt=-vh -vm05024 -Seh }
+
+procedure test(l: longint);
+begin
+  writeln('l is unused, but that hint has been suppressed');
+end;
+
+begin
+  test(5);
+end.