Browse Source

+ Objective-C category support (old and new ABI, both external and
implemented in Pascal). See
http://wiki.freepascal.org/FPC_PasCocoa#Category_declaration for syntax
details

git-svn-id: trunk@14196 -

Jonas Maebe 15 years ago
parent
commit
f8754d8fab

+ 11 - 0
.gitattributes

@@ -8963,6 +8963,13 @@ tests/test/tobjc20.pp svneol=native#text/plain
 tests/test/tobjc21.pp svneol=native#text/plain
 tests/test/tobjc21.pp svneol=native#text/plain
 tests/test/tobjc22.pp svneol=native#text/plain
 tests/test/tobjc22.pp svneol=native#text/plain
 tests/test/tobjc23.pp svneol=native#text/plain
 tests/test/tobjc23.pp svneol=native#text/plain
+tests/test/tobjc24.pp svneol=native#text/plain
+tests/test/tobjc25.pp svneol=native#text/plain
+tests/test/tobjc26.pp svneol=native#text/plain
+tests/test/tobjc26a.pp svneol=native#text/plain
+tests/test/tobjc27a.pp svneol=native#text/plain
+tests/test/tobjc27b.pp svneol=native#text/plain
+tests/test/tobjc28.pp svneol=native#text/plain
 tests/test/tobjc3.pp svneol=native#text/plain
 tests/test/tobjc3.pp svneol=native#text/plain
 tests/test/tobjc4.pp svneol=native#text/plain
 tests/test/tobjc4.pp svneol=native#text/plain
 tests/test/tobjc4a.pp svneol=native#text/plain
 tests/test/tobjc4a.pp svneol=native#text/plain
@@ -9300,6 +9307,10 @@ tests/test/units/sysutils/tfloattostr.pp svneol=native#text/plain
 tests/test/units/sysutils/tlocale.pp svneol=native#text/plain
 tests/test/units/sysutils/tlocale.pp svneol=native#text/plain
 tests/test/units/sysutils/tsscanf.pp svneol=native#text/plain
 tests/test/units/sysutils/tsscanf.pp svneol=native#text/plain
 tests/test/units/sysutils/tstrtobool.pp svneol=native#text/plain
 tests/test/units/sysutils/tstrtobool.pp svneol=native#text/plain
+tests/test/uobjc24.pp svneol=native#text/plain
+tests/test/uobjc26.pp svneol=native#text/plain
+tests/test/uobjc27a.pp svneol=native#text/plain
+tests/test/uobjc27b.pp svneol=native#text/plain
 tests/test/uobjc7.pp svneol=native#text/plain
 tests/test/uobjc7.pp svneol=native#text/plain
 tests/test/uobjcl1.pp svneol=native#text/plain
 tests/test/uobjcl1.pp svneol=native#text/plain
 tests/test/uprec6.pp svneol=native#text/plain
 tests/test/uprec6.pp svneol=native#text/plain

+ 29 - 14
compiler/msg/errore.msg

@@ -366,7 +366,7 @@ scan_w_multiple_main_name_overrides=02086_W_Overriding name of "main" procedure
 #
 #
 # Parser
 # Parser
 #
 #
-# 03275 is the last used one
+# 03280 is the last used one
 #
 #
 % \section{Parser messages}
 % \section{Parser messages}
 % This section lists all parser messages. The parser takes care of the
 % This section lists all parser messages. The parser takes care of the
@@ -913,11 +913,11 @@ parser_e_no_con_des_in_interfaces=03171_E_Con- and destructors aren't allowed in
 % be used to create a new interface.
 % be used to create a new interface.
 parser_e_no_access_specifier_in_interfaces=03172_E_Access specifiers can't be used in INTERFACEs and OBJCPROTOCOLs
 parser_e_no_access_specifier_in_interfaces=03172_E_Access specifiers can't be used in INTERFACEs and OBJCPROTOCOLs
 % The access specifiers \var{public}, \var{private}, \var{protected} and
 % The access specifiers \var{public}, \var{private}, \var{protected} and
-% \var{published} can't be used in interfaces and Objective-C protocols because all methods
-% of an interface/protocol must be public.
-parser_e_no_vars_in_interfaces=03173_E_An interface or Objective-C protocol cannot contain fields
-% Declarations of fields are not allowed in interfaces and Objective-C protocols. An interface/protocol
-% can contain only methods and properties with method read/write specifiers.
+% \var{published} can't be used in interfaces, Objective-C protocols and categories because all methods
+% of an interface/protocol/category must be public.
+parser_e_no_vars_in_interfaces=03173_E_An interface or Objective-C protocol or category cannot contain fields
+% Declarations of fields are not allowed in interfaces and Objective-C protocols and categories.
+% An interface/protocol/category can contain only methods and properties with method read/write specifiers.
 parser_e_no_local_proc_external=03174_E_Can't declare local procedure as EXTERNAL
 parser_e_no_local_proc_external=03174_E_Can't declare local procedure as EXTERNAL
 % Declaring local procedures as external is not possible. Local procedures
 % Declaring local procedures as external is not possible. Local procedures
 % get hidden parameters that will make the chance of errors very high.
 % get hidden parameters that will make the chance of errors very high.
@@ -992,7 +992,7 @@ parser_e_illegal_calling_convention=03195_W_Calling convention directive ignored
 % Some calling conventions are supported only by certain CPUs. I.e. most non-i386 ports support
 % Some calling conventions are supported only by certain CPUs. I.e. most non-i386 ports support
 % only the standard ABI calling convention of the CPU.
 % only the standard ABI calling convention of the CPU.
 parser_e_no_object_reintroduce=03196_E_REINTRODUCE can't be used in objects
 parser_e_no_object_reintroduce=03196_E_REINTRODUCE can't be used in objects
-% \var{reintroduce} is not supported for objects.
+% \var{reintroduce} is not supported for objects, Objective-C classes and Objective-C protocols.
 parser_e_paraloc_only_one_para=03197_E_Each argument must have its own location
 parser_e_paraloc_only_one_para=03197_E_Each argument must have its own location
 % If locations for arguments are specified explicitly as it is required by
 % If locations for arguments are specified explicitly as it is required by
 % some syscall conventions, each argument must have its own location. Things
 % some syscall conventions, each argument must have its own location. Things
@@ -1245,13 +1245,13 @@ parser_e_no_objc_published=03271_E_Objective-C classes cannot have published sec
 parser_f_need_objc=03272_F_This module requires an Objective-C mode switch to be compiled
 parser_f_need_objc=03272_F_This module requires an Objective-C mode switch to be compiled
 % This error indicates the use of Objective-C language features without an Objective-C mode switch
 % This error indicates the use of Objective-C language features without an Objective-C mode switch
 % active. Enable one via the -M command line switch, or the {\$modeswitch x} directive.
 % active. Enable one via the -M command line switch, or the {\$modeswitch x} directive.
-parser_e_must_use_override_objc=03273_E_Inherited methods can only be overridden in Objective-C, add ``override''.
-parser_h_should_use_override_objc=03274_H_Inherited methods can only be overridden in Objective-C, add ``override''.
-% It is not possible to ``reintroduce'' methods in Objective-C like in Object Pascal. Methods with the same
+parser_e_must_use_override_objc=03273_E_Inherited methods can only be overridden in Objective-C, add "override".
+parser_h_should_use_override_objc=03274_H_Inherited methods can only be overridden in Objective-C, add "override".
+% It is not possible to \var{reintroduce} methods in Objective-C like in Object Pascal. Methods with the same
 % name always map to the same virtual method entry. In order to make this clear in the source code,
 % name always map to the same virtual method entry. In order to make this clear in the source code,
-% the compiler always requires the ``override'' directive to be specified when implementing overriding
+% the compiler always requires the \var{override} directive to be specified when implementing overriding
 % Objective-C methods in Pascal. If the implementation is external, this rule is relaxed because Objective-C
 % Objective-C methods in Pascal. If the implementation is external, this rule is relaxed because Objective-C
-% does not have any ``override''-style keyword (since it's the default and only behaviour in that language),
+% does not have any \var{override}-style keyword (since it's the default and only behaviour in that language),
 % which makes it hard for automated header conversion tools to include it everywhere.
 % which makes it hard for automated header conversion tools to include it everywhere.
 parser_e_objc_message_name_changed=03275_E_Message name "$1" in inherited class is different from message name "$2" in current class.
 parser_e_objc_message_name_changed=03275_E_Message name "$1" in inherited class is different from message name "$2" in current class.
 % An overriding Objective-C method cannot have a different message name than an inherited method. The reason
 % An overriding Objective-C method cannot have a different message name than an inherited method. The reason
@@ -1260,11 +1260,24 @@ parser_e_objc_message_name_changed=03275_E_Message name "$1" in inherited class
 parser_e_no_objc_unique=03276_E_It is not yet possible to make unique copies of Objective-C types
 parser_e_no_objc_unique=03276_E_It is not yet possible to make unique copies of Objective-C types
 % Duplicating an Objective-C type using \var{type x = type y;} is not yet supported. You may be able to
 % Duplicating an Objective-C type using \var{type x = type y;} is not yet supported. You may be able to
 % obtain the desired effect using \var{type x = objcclass(y) end;} instead.
 % obtain the desired effect using \var{type x = objcclass(y) end;} instead.
+parser_e_no_category_as_types=03277_E_Objective-C categories cannot be used as types
+% It is not possible to declare a variable as an instance of an Objective-C category. A
+% category adds methods to the scope of an existing class, but does not define a type by itself.
+parser_e_no_category_override=03278_E_Categories do not override, but replace methods. Use "reintroduce" instead.
+parser_e_must_use_reintroduce_objc=03279_E_Replaced methods can only be reintroduced in Objective-C, add "reintroduce".
+parser_h_should_use_reintroduce_objc=03280_H_Replaced methods can only be reintroduced in Objective-C, add "reintroduce".
+% A category replaces an existing method in an Objective-C class, rather than that it overrides it.
+% Calling an inherited method from an category method will call that method in
+% the extended class' parent, not in the extended class itself. The
+% replaced method in the original class is basically lost, and can no longer be
+% called or referred to. This behaviour corresponds somewhat more closely to
+% \var{reintroduce} than to \var{override} (although in case of \var{reintroduce}
+% in Object Pascal, hidden methods are still reachable via inherited).
 % \end{description}
 % \end{description}
 #
 #
 # Type Checking
 # Type Checking
 #
 #
-# 04093 is the last used one
+# 04094 is the last used one
 #
 #
 % \section{Type checking errors}
 % \section{Type checking errors}
 % This section lists all errors that can occur when type checking is
 % This section lists all errors that can occur when type checking is
@@ -1578,7 +1591,9 @@ type_e_objc_type_unsupported=04092_E_The type "$1" is not supported for interact
 % interfaces) cannot be used as fields of Objective-C classes, cannot be
 % interfaces) cannot be used as fields of Objective-C classes, cannot be
 % directly passed to Objective-C methods, and cannot be encoded using \var{objc_encode}.
 % directly passed to Objective-C methods, and cannot be encoded using \var{objc_encode}.
 type_e_class_or_objcclass_type_expected=04093_E_Class or objcclass type expected, but got "$1"
 type_e_class_or_objcclass_type_expected=04093_E_Class or objcclass type expected, but got "$1"
-% It is only possible to create class reference types of \var{class} and
+% It is only possible to create class reference types of \var{class} and \var{objcclass}
+type_e_objcclass_type_expected=04094_E_Objcclass type expected
+% The compiler expected an Objc
 % \var{objcclass} types
 % \var{objcclass} types
 %
 %
 % \end{description}
 % \end{description}

+ 7 - 2
compiler/msgidx.inc

@@ -364,6 +364,10 @@ const
   parser_h_should_use_override_objc=03274;
   parser_h_should_use_override_objc=03274;
   parser_e_objc_message_name_changed=03275;
   parser_e_objc_message_name_changed=03275;
   parser_e_no_objc_unique=03276;
   parser_e_no_objc_unique=03276;
+  parser_e_no_category_as_types=03277;
+  parser_e_no_category_override=03278;
+  parser_e_must_use_reintroduce_objc=03279;
+  parser_h_should_use_reintroduce_objc=03280;
   type_e_mismatch=04000;
   type_e_mismatch=04000;
   type_e_incompatible_types=04001;
   type_e_incompatible_types=04001;
   type_e_not_equal_types=04002;
   type_e_not_equal_types=04002;
@@ -448,6 +452,7 @@ const
   type_e_protocol_type_expected=04091;
   type_e_protocol_type_expected=04091;
   type_e_objc_type_unsupported=04092;
   type_e_objc_type_unsupported=04092;
   type_e_class_or_objcclass_type_expected=04093;
   type_e_class_or_objcclass_type_expected=04093;
+  type_e_objcclass_type_expected=04094;
   sym_e_id_not_found=05000;
   sym_e_id_not_found=05000;
   sym_f_internal_error_in_symtablestack=05001;
   sym_f_internal_error_in_symtablestack=05001;
   sym_e_duplicate_id=05002;
   sym_e_duplicate_id=05002;
@@ -827,9 +832,9 @@ const
   option_info=11024;
   option_info=11024;
   option_help_pages=11025;
   option_help_pages=11025;
 
 
-  MsgTxtSize = 54197;
+  MsgTxtSize = 54546;
 
 
   MsgIdxMax : array[1..20] of longint=(
   MsgIdxMax : array[1..20] of longint=(
-    24,87,277,94,71,51,108,22,202,62,
+    24,87,281,95,71,51,108,22,202,62,
     48,20,1,1,1,1,1,1,1,1
     48,20,1,1,1,1,1,1,1,1
   );
   );

+ 398 - 388
compiler/msgtxt.inc

@@ -1,7 +1,7 @@
 {$ifdef Delphi}
 {$ifdef Delphi}
-const msgtxt : array[0..000225] of string[240]=(
+const msgtxt : array[0..000227] of string[240]=(
 {$else Delphi}
 {$else Delphi}
-const msgtxt : array[0..000225,1..240] of char=(
+const msgtxt : array[0..000227,1..240] of char=(
 {$endif Delphi}
 {$endif Delphi}
   '01000_T_Compiler: $1'#000+
   '01000_T_Compiler: $1'#000+
   '01001_D_Compiler OS: $1'#000+
   '01001_D_Compiler OS: $1'#000+
@@ -295,672 +295,685 @@ const msgtxt : array[0..000225,1..240] of char=(
   '03171_E_Con- and destructors aren'#039't allowed in interfaces'#000+
   '03171_E_Con- and destructors aren'#039't allowed in interfaces'#000+
   '03172_E_Access spec','ifiers can'#039't be used in INTERFACEs and OBJCPR'+
   '03172_E_Access spec','ifiers can'#039't be used in INTERFACEs and OBJCPR'+
   'OTOCOLs'#000+
   'OTOCOLs'#000+
-  '03173_E_An interface or Objective-C protocol cannot contain fields'#000+
+  '03173_E_An interface or Objective-C protocol or category cannot contai'+
+  'n fields'#000+
   '03174_E_Can'#039't declare local procedure as EXTERNAL'#000+
   '03174_E_Can'#039't declare local procedure as EXTERNAL'#000+
-  '03175_W_Some fields coming before "$1" weren'#039't initialized'#000+
-  '03176_E_Som','e fields coming before "$1" weren'#039't initialized'#000+
+  '03175_W_Some fields coming before "$1" weren'#039't initialized',#000+
+  '03176_E_Some fields coming before "$1" weren'#039't initialized'#000+
   '03177_W_Some fields coming after "$1" weren'#039't initialized'#000+
   '03177_W_Some fields coming after "$1" weren'#039't initialized'#000+
   '03178_E_VarArgs directive (or '#039'...'#039' in MacPas) without CDecl/C'+
   '03178_E_VarArgs directive (or '#039'...'#039' in MacPas) without CDecl/C'+
   'PPDecl/MWPascal and External'#000+
   'PPDecl/MWPascal and External'#000+
-  '03179_E_Self must be a normal (call-by-valu','e) parameter'#000+
+  '03179_E_Self must be a normal (','call-by-value) parameter'#000+
   '03180_E_Interface "$1" has no interface identification'#000+
   '03180_E_Interface "$1" has no interface identification'#000+
   '03181_E_Unknown class field or method identifier "$1"'#000+
   '03181_E_Unknown class field or method identifier "$1"'#000+
   '03182_W_Overriding calling convention "$1" with "$2"'#000+
   '03182_W_Overriding calling convention "$1" with "$2"'#000+
-  '03183_E_Typed constants of the type "procedure of object" can onl','y b'+
+  '03183_E_Typed constants of the type "procedure of obj','ect" can only b'+
   'e initialized with NIL'#000+
   'e initialized with NIL'#000+
   '03184_E_Default value can only be assigned to one parameter'#000+
   '03184_E_Default value can only be assigned to one parameter'#000+
   '03185_E_Default parameter required for "$1"'#000+
   '03185_E_Default parameter required for "$1"'#000+
   '03186_W_Use of unsupported feature!'#000+
   '03186_W_Use of unsupported feature!'#000+
   '03187_H_C arrays are passed by reference'#000+
   '03187_H_C arrays are passed by reference'#000+
-  '03188_E_C array of const must be ','the last argument'#000+
+  '03188_E_C array of co','nst must be the last argument'#000+
   '03189_H_Type "$1" redefinition'#000+
   '03189_H_Type "$1" redefinition'#000+
   '03190_W_cdecl'#039'ared functions have no high parameter'#000+
   '03190_W_cdecl'#039'ared functions have no high parameter'#000+
   '03191_W_cdecl'#039'ared functions do not support open strings'#000+
   '03191_W_cdecl'#039'ared functions do not support open strings'#000+
   '03192_E_Cannot initialize variables declared as threadvar'#000+
   '03192_E_Cannot initialize variables declared as threadvar'#000+
-  '03193_E_Message directiv','e is only allowed in Classes'#000+
+  '03193_E_Mess','age directive is only allowed in Classes'#000+
   '03194_E_Procedure or Function expected'#000+
   '03194_E_Procedure or Function expected'#000+
   '03195_W_Calling convention directive ignored: "$1"'#000+
   '03195_W_Calling convention directive ignored: "$1"'#000+
   '03196_E_REINTRODUCE can'#039't be used in objects'#000+
   '03196_E_REINTRODUCE can'#039't be used in objects'#000+
   '03197_E_Each argument must have its own location'#000+
   '03197_E_Each argument must have its own location'#000+
-  '03198_E_Each argument must ','have an explicit location'#000+
+  '03198_E_Each ar','gument must have an explicit location'#000+
   '03199_E_Unknown argument location'#000+
   '03199_E_Unknown argument location'#000+
   '03200_E_32 Bit-Integer or pointer variable expected'#000+
   '03200_E_32 Bit-Integer or pointer variable expected'#000+
   '03201_E_Goto statements aren'#039't allowed between different procedure'+
   '03201_E_Goto statements aren'#039't allowed between different procedure'+
   's'#000+
   's'#000+
-  '03202_F_Procedure too complex, it requires too many register','s'#000+
+  '03202_F_Procedure too complex, it requires too m','any registers'#000+
   '03203_E_Illegal expression'#000+
   '03203_E_Illegal expression'#000+
   '03204_E_Invalid integer expression'#000+
   '03204_E_Invalid integer expression'#000+
   '03205_E_Illegal qualifier'#000+
   '03205_E_Illegal qualifier'#000+
   '03206_E_High range limit < low range limit'#000+
   '03206_E_High range limit < low range limit'#000+
   '03207_E_Exit'#039's parameter must be the name of the procedure it is u'+
   '03207_E_Exit'#039's parameter must be the name of the procedure it is u'+
   'sed in'#000+
   'sed in'#000+
-  '03208_E_Illegal assignment to for-','loop variable "$1"'#000+
+  '03208_E_Illegal assign','ment to for-loop variable "$1"'#000+
   '03209_E_Can'#039't declare local variable as EXTERNAL'#000+
   '03209_E_Can'#039't declare local variable as EXTERNAL'#000+
   '03210_E_Procedure is already declared EXTERNAL'#000+
   '03210_E_Procedure is already declared EXTERNAL'#000+
   '03211_W_Implicit uses of Variants unit'#000+
   '03211_W_Implicit uses of Variants unit'#000+
   '03212_E_Class and static methods can'#039't be used in INTERFACES'#000+
   '03212_E_Class and static methods can'#039't be used in INTERFACES'#000+
-  '03213_E_Overflow in arith','metic operation'#000+
+  '03213_E_Overf','low in arithmetic operation'#000+
   '03214_E_Protected or private expected'#000+
   '03214_E_Protected or private expected'#000+
   '03215_E_SLICE can'#039't be used outside of parameter list'#000+
   '03215_E_SLICE can'#039't be used outside of parameter list'#000+
   '03216_E_A DISPINTERFACE can'#039't have a parent class'#000+
   '03216_E_A DISPINTERFACE can'#039't have a parent class'#000+
   '03217_E_A DISPINTERFACE needs a guid'#000+
   '03217_E_A DISPINTERFACE needs a guid'#000+
-  '03218_W_Overridden methods must have a relate','d return type. This cod'+
+  '03218_W_Overridden methods must h','ave a related return type. This cod'+
   'e may crash, it depends on a Delphi parser bug ("$2" is overridden by '+
   'e may crash, it depends on a Delphi parser bug ("$2" is overridden by '+
   '"$1" which has another return type)'#000+
   '"$1" which has another return type)'#000+
   '03219_E_Dispatch IDs must be ordinal constants'#000+
   '03219_E_Dispatch IDs must be ordinal constants'#000+
   '03220_E_The range of the array is too large'#000+
   '03220_E_The range of the array is too large'#000+
-  '03221_E_The address ','cannot be taken of bit packed array elements and'+
+  '03221_E_','The address cannot be taken of bit packed array elements and'+
   ' record fields'#000+
   ' record fields'#000+
   '03222_E_Dynamic arrays cannot be packed'#000+
   '03222_E_Dynamic arrays cannot be packed'#000+
   '03223_E_Bit packed array elements and record fields cannot be used as '+
   '03223_E_Bit packed array elements and record fields cannot be used as '+
   'loop variables'#000+
   'loop variables'#000+
-  '03224_E_VAR and TYPE are allowed only in generics'#000+
-  '03','225_E_This type can'#039't be a generic'#000+
+  '03224_E_VAR and TYPE are allowed only in',' generics'#000+
+  '03225_E_This type can'#039't be a generic'#000+
   '03226_W_Don'#039't load LINEINFO unit manually, Use the -gl compiler sw'+
   '03226_W_Don'#039't load LINEINFO unit manually, Use the -gl compiler sw'+
   'itch instead'#000+
   'itch instead'#000+
   '03227_E_No function result type specified for function "$1"'#000+
   '03227_E_No function result type specified for function "$1"'#000+
-  '03228_E_Specialization is only supported for generic types'#000+
-  '03229_E','_Generics can'#039't be used as parameters when specializing g'+
-  'enerics'#000+
+  '03228_E_Specialization is only supported for generic t','ypes'#000+
+  '03229_E_Generics can'#039't be used as parameters when specializing gen'+
+  'erics'#000+
   '03230_E_Constants of objects containing a VMT aren'#039't allowed'#000+
   '03230_E_Constants of objects containing a VMT aren'#039't allowed'#000+
   '03231_E_Taking the address of labels defined outside the current scope'+
   '03231_E_Taking the address of labels defined outside the current scope'+
   ' isn'#039't allowed'#000+
   ' isn'#039't allowed'#000+
-  '03233_E_Cannot initialize var','iables declared as external'#000+
+  '03233_E_Cannot in','itialize variables declared as external'#000+
   '03234_E_Illegal function result type'#000+
   '03234_E_Illegal function result type'#000+
   '03235_E_No common type possible between "$1" and "$2"'#000+
   '03235_E_No common type possible between "$1" and "$2"'#000+
   '03236_E_Generics without specialization can not be used as a type for '+
   '03236_E_Generics without specialization can not be used as a type for '+
   'a variable'#000+
   'a variable'#000+
-  '03237_W_Register list is ignored for pur','e assembler routines'#000+
+  '03237_W_Register list is ign','ored for pure assembler routines'#000+
   '03238_E_Implements property must have class or interface type'#000+
   '03238_E_Implements property must have class or interface type'#000+
   '03239_E_Implements-property must implement interface of correct type, '+
   '03239_E_Implements-property must implement interface of correct type, '+
   'found "$1" expected "$2"'#000+
   'found "$1" expected "$2"'#000+
-  '03240_E_Implements-property must have read specifier'#000+
-  '03241_E_I','mplements-property must not have write-specifier'#000+
+  '03240_E_Implements-property must have read specifi','er'#000+
+  '03241_E_Implements-property must not have write-specifier'#000+
   '03242_E_Implements-property must not have stored-specifier'#000+
   '03242_E_Implements-property must not have stored-specifier'#000+
   '03243_E_Implements-property used on unimplemented interface: "$1"'#000+
   '03243_E_Implements-property used on unimplemented interface: "$1"'#000+
   '03244_E_Floating point not supported for this target'#000+
   '03244_E_Floating point not supported for this target'#000+
-  '03245_E_Class',' "$1" does not implement interface "$2"'#000+
+  '0','3245_E_Class "$1" does not implement interface "$2"'#000+
   '03246_E_Type used by implements must be an interface'#000+
   '03246_E_Type used by implements must be an interface'#000+
   '03247_E_Variables cannot be exported with a different name on this tar'+
   '03247_E_Variables cannot be exported with a different name on this tar'+
-  'get, add the name to the declaration using the "export" directive (var'+
-  'iable n','ame: $1, declared export name: $2)'#000+
+  'get, add the name to the declaration using the "export" directive',' (v'+
+  'ariable name: $1, declared export name: $2)'#000+
   '03248_E_Weak external symbols are not supported for the current target'+
   '03248_E_Weak external symbols are not supported for the current target'+
   #000+
   #000+
   '03249_E_Forward type definition does not match'#000+
   '03249_E_Forward type definition does not match'#000+
   '03250_N_Virtual method "$1" has a lower visibility ($2) than parent cl'+
   '03250_N_Virtual method "$1" has a lower visibility ($2) than parent cl'+
-  'ass $3 ($4)'#000+
-  '03251','_E_Fields cannot appear after a method or property definition, '+
-  'start a new visibility section first'#000+
+  'ass $','3 ($4)'#000+
+  '03251_E_Fields cannot appear after a method or property definition, st'+
+  'art a new visibility section first'#000+
   '03252_E_Parameters cannot contain local type definitions. Use a separa'+
   '03252_E_Parameters cannot contain local type definitions. Use a separa'+
   'te type definition in a type block.'#000+
   'te type definition in a type block.'#000+
-  '03253_E_ABSTRACT and SEALED confli','ct'#000+
+  '03253_E_ABSTRACT and S','EALED conflict'#000+
   '03254_E_Can not create a descendant of the sealed class "$1"'#000+
   '03254_E_Can not create a descendant of the sealed class "$1"'#000+
   '03255_E_SEALED class can not have an ABSTRACT method'#000+
   '03255_E_SEALED class can not have an ABSTRACT method'#000+
   '03256_E_Only virtual methods can be final'#000+
   '03256_E_Only virtual methods can be final'#000+
   '03257_E_Final method can not be overridden: "$1"'#000+
   '03257_E_Final method can not be overridden: "$1"'#000+
-  '03258_E_Only one message can be ','used per method.'#000+
+  '03258_E_Only one mes','sage can be used per method.'#000+
   '03259_E_Invalid enumerator identifier: "$1"'#000+
   '03259_E_Invalid enumerator identifier: "$1"'#000+
   '03260_E_Enumerator identifier required'#000+
   '03260_E_Enumerator identifier required'#000+
   '03261_E_Enumerator MoveNext pattern method is not valid. Method must b'+
   '03261_E_Enumerator MoveNext pattern method is not valid. Method must b'+
-  'e a function with the Boolean return type and no required arguments.'#000+
-  '0','3262_E_Enumerator Current pattern property is not valid. Property m'+
-  'ust have a getter.'#000+
+  'e a function with the Boolean return type and no required ','arguments.'+
+  #000+
+  '03262_E_Enumerator Current pattern property is not valid. Property mus'+
+  't have a getter.'#000+
   '03263_E_Only one enumerator MoveNext method is allowed per class/objec'+
   '03263_E_Only one enumerator MoveNext method is allowed per class/objec'+
   't'#000+
   't'#000+
-  '03264_E_Only one enumerator Current property is allowed per class/obje'+
+  '03264_E_Only one enumerator Current property is allowed per class/obje',
   'ct'#000+
   'ct'#000+
-  '03265_E_F','or in loop can not be used for the type "$1"'#000+
+  '03265_E_For in loop can not be used for the type "$1"'#000+
   '03266_E_Objective-C messages require their Objective-C selector name t'+
   '03266_E_Objective-C messages require their Objective-C selector name t'+
   'o be specified using the "message" directive.'#000+
   'o be specified using the "message" directive.'#000+
-  '03267_E_Objective-C does not have formal constructors nor destructors.'+
-  ' Use the ','alloc, initXXX and dealloc messages.'#000+
+  '03267_E_Objective-C does not have formal constructors nor destructo','r'+
+  's. Use the alloc, initXXX and dealloc messages.'#000+
   '03268_E_Message name is too long (max. 255 characters)'#000+
   '03268_E_Message name is too long (max. 255 characters)'#000+
   '03269_E_Objective-C message symbol name for "$1" is too long'#000+
   '03269_E_Objective-C message symbol name for "$1" is too long'#000+
   '03270_H_Defining a new Objective-C root class. To derive from another '+
   '03270_H_Defining a new Objective-C root class. To derive from another '+
-  'root class (e.g.,',' NSObject), specify it as the parent class.'#000+
+  'root ','class (e.g., NSObject), specify it as the parent class.'#000+
   '03271_E_Objective-C classes cannot have published sections.'#000+
   '03271_E_Objective-C classes cannot have published sections.'#000+
   '03272_F_This module requires an Objective-C mode switch to be compiled'+
   '03272_F_This module requires an Objective-C mode switch to be compiled'+
   #000+
   #000+
-  '03273_E_Inherited methods can only be overridden in Objective-C, ','add'+
-  ' ``override'#039#039'.'#000+
-  '03274_H_Inherited methods can only be overridden in Objective-C, add `'+
-  '`override'#039#039'.'#000+
+  '03273_E_Inherited methods can only be overridden in O','bjective-C, add'+
+  ' "override".'#000+
+  '03274_H_Inherited methods can only be overridden in Objective-C, add "'+
+  'override".'#000+
   '03275_E_Message name "$1" in inherited class is different from message'+
   '03275_E_Message name "$1" in inherited class is different from message'+
   ' name "$2" in current class.'#000+
   ' name "$2" in current class.'#000+
-  '03276_E_It is not yet possible to make u','nique copies of Objective-C '+
+  '03276_E_It is not yet possible t','o make unique copies of Objective-C '+
   'types'#000+
   'types'#000+
+  '03277_E_Objective-C categories cannot be used as types'#000+
+  '03278_E_Categories do not override, but replace methods. Use "reintrod'+
+  'uce" instead.'#000+
+  '03279_E_Replaced methods can only be reintroduced in Object','ive-C, ad'+
+  'd "reintroduce".'#000+
+  '03280_H_Replaced methods can only be reintroduced in Objective-C, add '+
+  '"reintroduce".'#000+
   '04000_E_Type mismatch'#000+
   '04000_E_Type mismatch'#000+
   '04001_E_Incompatible types: got "$1" expected "$2"'#000+
   '04001_E_Incompatible types: got "$1" expected "$2"'#000+
   '04002_E_Type mismatch between "$1" and "$2"'#000+
   '04002_E_Type mismatch between "$1" and "$2"'#000+
-  '04003_E_Type identifier expected'#000+
+  '04003_E_Type',' identifier expected'#000+
   '04004_E_Variable identifier expected'#000+
   '04004_E_Variable identifier expected'#000+
-  '04005_E_Integer exp','ression expected, but got "$1"'#000+
+  '04005_E_Integer expression expected, but got "$1"'#000+
   '04006_E_Boolean expression expected, but got "$1"'#000+
   '04006_E_Boolean expression expected, but got "$1"'#000+
   '04007_E_Ordinal expression expected'#000+
   '04007_E_Ordinal expression expected'#000+
   '04008_E_pointer type expected, but got "$1"'#000+
   '04008_E_pointer type expected, but got "$1"'#000+
-  '04009_E_class type expected, but got "$1"'#000+
-  '04011_E_Can'#039't evaluate constant expre','ssion'#000+
+  '04','009_E_class type expected, but got "$1"'#000+
+  '04011_E_Can'#039't evaluate constant expression'#000+
   '04012_E_Set elements are not compatible'#000+
   '04012_E_Set elements are not compatible'#000+
   '04013_E_Operation not implemented for sets'#000+
   '04013_E_Operation not implemented for sets'#000+
   '04014_W_Automatic type conversion from floating type to COMP which is '+
   '04014_W_Automatic type conversion from floating type to COMP which is '+
-  'an integer type'#000+
+  'an i','nteger type'#000+
   '04015_H_use DIV instead to get an integer result'#000+
   '04015_H_use DIV instead to get an integer result'#000+
-  '04016_E_String t','ypes have to match exactly in $V+ mode'#000+
+  '04016_E_String types have to match exactly in $V+ mode'#000+
   '04017_E_succ or pred on enums with assignments not possible'#000+
   '04017_E_succ or pred on enums with assignments not possible'#000+
   '04018_E_Can'#039't read or write variables of this type'#000+
   '04018_E_Can'#039't read or write variables of this type'#000+
-  '04019_E_Can'#039't use readln or writeln on typed file'#000+
-  '04020_E_Can'#039't use read or write on untyp','ed file.'#000+
+  '04019_E_Can'#039't',' use readln or writeln on typed file'#000+
+  '04020_E_Can'#039't use read or write on untyped file.'#000+
   '04021_E_Type conflict between set elements'#000+
   '04021_E_Type conflict between set elements'#000+
   '04022_W_lo/hi(dword/qword) returns the upper/lower word/dword'#000+
   '04022_W_lo/hi(dword/qword) returns the upper/lower word/dword'#000+
   '04023_E_Integer or real expression expected'#000+
   '04023_E_Integer or real expression expected'#000+
-  '04024_E_Wrong type "$1" in array constructor'#000+
-  '04025_E_Incompatible type for arg no.',' $1: Got "$2", expected "$3"'#000+
+  '04024','_E_Wrong type "$1" in array constructor'#000+
+  '04025_E_Incompatible type for arg no. $1: Got "$2", expected "$3"'#000+
   '04026_E_Method (variable) and Procedure (variable) are not compatible'#000+
   '04026_E_Method (variable) and Procedure (variable) are not compatible'#000+
   '04027_E_Illegal constant passed to internal math function'#000+
   '04027_E_Illegal constant passed to internal math function'#000+
-  '04028_E_Can'#039't take the address of constant expressions'#000+
-  '04029_E_Argument can'#039't be as','signed to'#000+
+  '04028_','E_Can'#039't take the address of constant expressions'#000+
+  '04029_E_Argument can'#039't be assigned to'#000+
   '04030_E_Can'#039't assign local procedure/function to procedure variabl'+
   '04030_E_Can'#039't assign local procedure/function to procedure variabl'+
   'e'#000+
   'e'#000+
   '04031_E_Can'#039't assign values to an address'#000+
   '04031_E_Can'#039't assign values to an address'#000+
-  '04032_E_Can'#039't assign values to const variable'#000+
+  '04032_E_Can'#039't assign values to const variab','le'#000+
   '04033_E_Array type required'#000+
   '04033_E_Array type required'#000+
-  '04034_E_interface type expected, but got "$1"'#000,
+  '04034_E_interface type expected, but got "$1"'#000+
   '04035_H_Mixing signed expressions and longwords gives a 64bit result'#000+
   '04035_H_Mixing signed expressions and longwords gives a 64bit result'#000+
   '04036_W_Mixing signed expressions and cardinals here may cause a range'+
   '04036_W_Mixing signed expressions and cardinals here may cause a range'+
   ' check error'#000+
   ' check error'#000+
-  '04037_E_Typecast has different size ($1 -> $2) in assignment'#000+
-  '04038_E_enums with assignme','nts can'#039't be used as array index'#000+
+  '04037_E_Typ','ecast has different size ($1 -> $2) in assignment'#000+
+  '04038_E_enums with assignments can'#039't be used as array index'#000+
   '04039_E_Class or Object types "$1" and "$2" are not related'#000+
   '04039_E_Class or Object types "$1" and "$2" are not related'#000+
   '04040_W_Class types "$1" and "$2" are not related'#000+
   '04040_W_Class types "$1" and "$2" are not related'#000+
-  '04041_E_Class or interface type expected, but got "$1"'#000+
-  '04042_E_Type "$1" is not completely define','d'#000+
+  '04041_E_Class or int','erface type expected, but got "$1"'#000+
+  '04042_E_Type "$1" is not completely defined'#000+
   '04043_W_String literal has more characters than short string length'#000+
   '04043_W_String literal has more characters than short string length'#000+
   '04044_W_Comparison is always false due to range of values'#000+
   '04044_W_Comparison is always false due to range of values'#000+
-  '04045_W_Comparison is always true due to range of values'#000+
-  '04046_W_Constructing a class "$1" with abstract method ','"$2"'#000+
+  '04045_W_Comparison is always true d','ue to range of values'#000+
+  '04046_W_Constructing a class "$1" with abstract method "$2"'#000+
   '04047_H_The left operand of the IN operator should be byte sized'#000+
   '04047_H_The left operand of the IN operator should be byte sized'#000+
   '04048_W_Type size mismatch, possible loss of data / range check error'#000+
   '04048_W_Type size mismatch, possible loss of data / range check error'#000+
-  '04049_H_Type size mismatch, possible loss of data / range check error'#000+
-  '04050_E_The address of an abst','ract method can'#039't be taken'#000+
+  '04049_H_Type size misma','tch, possible loss of data / range check erro'+
+  'r'#000+
+  '04050_E_The address of an abstract method can'#039't be taken'#000+
   '04051_E_Assignments to formal parameters and open arrays are not possi'+
   '04051_E_Assignments to formal parameters and open arrays are not possi'+
   'ble'#000+
   'ble'#000+
   '04052_E_Constant Expression expected'#000+
   '04052_E_Constant Expression expected'#000+
-  '04053_E_Operation "$1" not supported for types "$2" and "$3"'#000+
-  '04054_E_Illegal type conversion: "$1" to ','"$2"'#000+
+  '04053_E_Operation "$1" no','t supported for types "$2" and "$3"'#000+
+  '04054_E_Illegal type conversion: "$1" to "$2"'#000+
   '04055_H_Conversion between ordinals and pointers is not portable'#000+
   '04055_H_Conversion between ordinals and pointers is not portable'#000+
   '04056_W_Conversion between ordinals and pointers is not portable'#000+
   '04056_W_Conversion between ordinals and pointers is not portable'#000+
-  '04057_E_Can'#039't determine which overloaded function to call'#000+
+  '04057_E_Can'#039't determine whic','h overloaded function to call'#000+
   '04058_E_Illegal counter variable'#000+
   '04058_E_Illegal counter variable'#000+
-  '04059_W_Conver','ting constant real value to double for C variable argu'+
-  'ment, add explicit typecast to prevent this.'#000+
+  '04059_W_Converting constant real value to double for C variable argume'+
+  'nt, add explicit typecast to prevent this.'#000+
   '04060_E_Class or COM interface type expected, but got "$1"'#000+
   '04060_E_Class or COM interface type expected, but got "$1"'#000+
-  '04061_E_Constant packed arrays are not yet supported'#000+
-  '04062_E_Incompatible type for',' arg no. $1: Got "$2" expected "(Bit)Pa'+
-  'cked Array"'#000+
+  '04061','_E_Constant packed arrays are not yet supported'#000+
+  '04062_E_Incompatible type for arg no. $1: Got "$2" expected "(Bit)Pack'+
+  'ed Array"'#000+
   '04063_E_Incompatible type for arg no. $1: Got "$2" expected "(not pack'+
   '04063_E_Incompatible type for arg no. $1: Got "$2" expected "(not pack'+
   'ed) Array"'#000+
   'ed) Array"'#000+
-  '04064_E_Elements of packed arrays cannot be of a type which need to be'+
-  ' initialised'#000+
-  '04065_E_Constant packed r','ecords and objects are not yet supported'#000+
+  '04064_E_Elements of packed arra','ys cannot be of a type which need to '+
+  'be initialised'#000+
+  '04065_E_Constant packed records and objects are not yet supported'#000+
   '04066_W_Arithmetic "$1" on untyped pointer is unportable to {$T+}, sug'+
   '04066_W_Arithmetic "$1" on untyped pointer is unportable to {$T+}, sug'+
   'gest typecast'#000+
   'gest typecast'#000+
-  '04076_E_Can'#039't take address of a subroutine marked as local'#000+
-  '04077_E_Can'#039't export subroutine marked as local from a u','nit'#000+
+  '04076_E_Can'#039't take address of a subrou','tine marked as local'#000+
+  '04077_E_Can'#039't export subroutine marked as local from a unit'#000+
   '04078_E_Type is not automatable: "$1"'#000+
   '04078_E_Type is not automatable: "$1"'#000+
   '04079_H_Converting the operands to "$1" before doing the add could pre'+
   '04079_H_Converting the operands to "$1" before doing the add could pre'+
   'vent overflow errors.'#000+
   'vent overflow errors.'#000+
-  '04080_H_Converting the operands to "$1" before doing the subtract coul'+
-  'd prevent overflow errors.'#000+
-  '04081_H_C','onverting the operands to "$1" before doing the multiply co'+
+  '04080_H_Converting the operan','ds to "$1" before doing the subtract co'+
   'uld prevent overflow errors.'#000+
   'uld prevent overflow errors.'#000+
+  '04081_H_Converting the operands to "$1" before doing the multiply coul'+
+  'd prevent overflow errors.'#000+
   '04082_W_Converting pointers to signed integers may result in wrong com'+
   '04082_W_Converting pointers to signed integers may result in wrong com'+
-  'parison results and range errors, use an unsigned type instead.'#000+
-  '04083_E_Interface ','type $1 has no valid GUID'#000+
+  'paris','on results and range errors, use an unsigned type instead.'#000+
+  '04083_E_Interface type $1 has no valid GUID'#000+
   '04084_E_Invalid selector name "$1"'#000+
   '04084_E_Invalid selector name "$1"'#000+
   '04085_E_Expected Objective-C method, but got $1'#000+
   '04085_E_Expected Objective-C method, but got $1'#000+
-  '04086_E_Expected Objective-C method or constant method name'#000+
+  '04086_E_Expected Objective-C method or constant method',' name'#000+
   '04087_E_No type info available for this type'#000+
   '04087_E_No type info available for this type'#000+
-  '04088_E_Ordinal or string ','expression expected'#000+
+  '04088_E_Ordinal or string expression expected'#000+
   '04089_E_String expression expected'#000+
   '04089_E_String expression expected'#000+
   '04090_W_Converting 0 to NIL'#000+
   '04090_W_Converting 0 to NIL'#000+
   '04091_E_Objective-C protocol type expected, but got "$1"'#000+
   '04091_E_Objective-C protocol type expected, but got "$1"'#000+
-  '04092_E_The type "$1" is not supported for interaction with the Object'+
-  'ive-C runtime.'#000+
-  '04093_E_Class o','r objcclass type expected, but got "$1"'#000+
+  '04092_E_The type "$1" i','s not supported for interaction with the Obje'+
+  'ctive-C runtime.'#000+
+  '04093_E_Class or objcclass type expected, but got "$1"'#000+
+  '04094_E_Objcclass type expected'#000+
   '05000_E_Identifier not found "$1"'#000+
   '05000_E_Identifier not found "$1"'#000+
   '05001_F_Internal Error in SymTableStack()'#000+
   '05001_F_Internal Error in SymTableStack()'#000+
-  '05002_E_Duplicate identifier "$1"'#000+
+  '05002_E_Duplica','te identifier "$1"'#000+
   '05003_H_Identifier already defined in $1 at line $2'#000+
   '05003_H_Identifier already defined in $1 at line $2'#000+
   '05004_E_Unknown identifier "$1"'#000+
   '05004_E_Unknown identifier "$1"'#000+
-  '05005_','E_Forward declaration not solved "$1"'#000+
+  '05005_E_Forward declaration not solved "$1"'#000+
   '05007_E_Error in type definition'#000+
   '05007_E_Error in type definition'#000+
   '05009_E_Forward type not resolved "$1"'#000+
   '05009_E_Forward type not resolved "$1"'#000+
-  '05010_E_Only static variables can be used in static methods or outside'+
-  ' methods'#000+
+  '05010_E_Only static v','ariables can be used in static methods or outsi'+
+  'de methods'#000+
   '05012_F_record or class type expected'#000+
   '05012_F_record or class type expected'#000+
-  '05013_E_Insta','nces of classes or objects with an abstract method are '+
-  'not allowed'#000+
+  '05013_E_Instances of classes or objects with an abstract method are no'+
+  't allowed'#000+
   '05014_W_Label not defined "$1"'#000+
   '05014_W_Label not defined "$1"'#000+
-  '05015_E_Label used but not defined "$1"'#000+
+  '05015_E_Label used but not define','d "$1"'#000+
   '05016_E_Illegal label declaration'#000+
   '05016_E_Illegal label declaration'#000+
   '05017_E_GOTO and LABEL are not supported (use switch -Sg)'#000+
   '05017_E_GOTO and LABEL are not supported (use switch -Sg)'#000+
-  '05018_E_La','bel not found'#000+
+  '05018_E_Label not found'#000+
   '05019_E_identifier isn'#039't a label'#000+
   '05019_E_identifier isn'#039't a label'#000+
   '05020_E_label already defined'#000+
   '05020_E_label already defined'#000+
   '05021_E_illegal type declaration of set elements'#000+
   '05021_E_illegal type declaration of set elements'#000+
-  '05022_E_Forward class definition not resolved "$1"'#000+
+  '05022','_E_Forward class definition not resolved "$1"'#000+
   '05023_H_Unit "$1" not used in $2'#000+
   '05023_H_Unit "$1" not used in $2'#000+
-  '05024_H_Parameter "$1" not use','d'#000+
+  '05024_H_Parameter "$1" not used'#000+
   '05025_N_Local variable "$1" not used'#000+
   '05025_N_Local variable "$1" not used'#000+
   '05026_H_Value parameter "$1" is assigned but never used'#000+
   '05026_H_Value parameter "$1" is assigned but never used'#000+
-  '05027_N_Local variable "$1" is assigned but never used'#000+
+  '05027_N_Local variable "$1" is assig','ned but never used'#000+
   '05028_H_Local $1 "$2" is not used'#000+
   '05028_H_Local $1 "$2" is not used'#000+
   '05029_N_Private field "$1.$2" is never used'#000+
   '05029_N_Private field "$1.$2" is never used'#000+
-  '05030_N_Priv','ate field "$1.$2" is assigned but never used'#000+
+  '05030_N_Private field "$1.$2" is assigned but never used'#000+
   '05031_N_Private method "$1.$2" never used'#000+
   '05031_N_Private method "$1.$2" never used'#000+
   '05032_E_Set type expected'#000+
   '05032_E_Set type expected'#000+
-  '05033_W_Function result does not seem to be set'#000+
+  '05033_W_Function r','esult does not seem to be set'#000+
   '05034_W_Type "$1" is not aligned correctly in current record for C'#000+
   '05034_W_Type "$1" is not aligned correctly in current record for C'#000+
-  '05035_E_Unkn','own record field identifier "$1"'#000+
+  '05035_E_Unknown record field identifier "$1"'#000+
   '05036_W_Local variable "$1" does not seem to be initialized'#000+
   '05036_W_Local variable "$1" does not seem to be initialized'#000+
-  '05037_W_Variable "$1" does not seem to be initialized'#000+
+  '05037_W_Variable "$1" does not seem to',' be initialized'#000+
   '05038_E_identifier idents no member "$1"'#000+
   '05038_E_identifier idents no member "$1"'#000+
   '05039_H_Found declaration: $1'#000+
   '05039_H_Found declaration: $1'#000+
-  '05040_E_Data element t','oo large'#000+
+  '05040_E_Data element too large'#000+
   '05042_E_No matching implementation for interface method "$1" found'#000+
   '05042_E_No matching implementation for interface method "$1" found'#000+
   '05043_W_Symbol "$1" is deprecated'#000+
   '05043_W_Symbol "$1" is deprecated'#000+
-  '05044_W_Symbol "$1" is not portable'#000+
+  '05044_W_Symbol "$1" i','s not portable'#000+
   '05055_W_Symbol "$1" is not implemented'#000+
   '05055_W_Symbol "$1" is not implemented'#000+
   '05056_E_Can'#039't create unique type from this type'#000+
   '05056_E_Can'#039't create unique type from this type'#000+
-  '05057_H','_Local variable "$1" does not seem to be initialized'#000+
+  '05057_H_Local variable "$1" does not seem to be initialized'#000+
   '05058_H_Variable "$1" does not seem to be initialized'#000+
   '05058_H_Variable "$1" does not seem to be initialized'#000+
-  '05059_W_Function result variable does not seem to initialized'#000+
+  '05059_W_Function result ','variable does not seem to initialized'#000+
   '05060_H_Function result variable does not seem to be initialized'#000+
   '05060_H_Function result variable does not seem to be initialized'#000+
-  '05061_','W_Variable "$1" read but nowhere assigned'#000+
+  '05061_W_Variable "$1" read but nowhere assigned'#000+
   '05062_H_Found abstract method: $1'#000+
   '05062_H_Found abstract method: $1'#000+
   '05063_W_Symbol "$1" is experimental'#000+
   '05063_W_Symbol "$1" is experimental'#000+
-  '05064_W_Forward declaration "$1" not resolved, assumed external'#000+
+  '05064_W_Forward dec','laration "$1" not resolved, assumed external'#000+
   '05065_W_Symbol "$1" is belongs to a library'#000+
   '05065_W_Symbol "$1" is belongs to a library'#000+
-  '05066_W_Symbol "$1" ','is deprecated: "$2"'#000+
+  '05066_W_Symbol "$1" is deprecated: "$2"'#000+
   '05067_E_Can not find an enumerator for the type "$1"'#000+
   '05067_E_Can not find an enumerator for the type "$1"'#000+
-  '05068_E_Can not find a "MoveNext" method in enumerator "$1"'#000+
+  '05068_E_Can not find a "MoveNext" method in enumerator "$1','"'#000+
   '05069_E_Can not find a "Current" property in enumerator "$1"'#000+
   '05069_E_Can not find a "Current" property in enumerator "$1"'#000+
-  '05070_E_Mismatch between number of declared pa','rameters and number of'+
-  ' colons in message string.'#000+
+  '05070_E_Mismatch between number of declared parameters and number of c'+
+  'olons in message string.'#000+
   '06009_E_Parameter list size exceeds 65535 bytes'#000+
   '06009_E_Parameter list size exceeds 65535 bytes'#000+
-  '06012_E_File types must be var parameters'#000+
+  '06012_E_File types must be var par','ameters'#000+
   '06013_E_The use of a far pointer isn'#039't allowed there'#000+
   '06013_E_The use of a far pointer isn'#039't allowed there'#000+
-  '06015_E_EXPORT declared functions can'#039't be calle','d'#000+
+  '06015_E_EXPORT declared functions can'#039't be called'#000+
   '06016_W_Possible illegal call of constructor or destructor'#000+
   '06016_W_Possible illegal call of constructor or destructor'#000+
   '06017_N_Inefficient code'#000+
   '06017_N_Inefficient code'#000+
   '06018_W_unreachable code'#000+
   '06018_W_unreachable code'#000+
-  '06020_E_Abstract methods can'#039't be called directly'#000+
+  '06020_E_Abstract met','hods can'#039't be called directly'#000+
   '06027_DL_Register $1 weight $2 $3'#000+
   '06027_DL_Register $1 weight $2 $3'#000+
   '06029_DL_Stack frame is omitted'#000+
   '06029_DL_Stack frame is omitted'#000+
-  '06031_E_Objec','t or class methods can'#039't be inline.'#000+
+  '06031_E_Object or class methods can'#039't be inline.'#000+
   '06032_E_Procvar calls cannot be inline.'#000+
   '06032_E_Procvar calls cannot be inline.'#000+
   '06033_E_No code for inline procedure stored'#000+
   '06033_E_No code for inline procedure stored'#000+
-  '06035_E_Element zero of an ansi/wide- or longstring can'#039't be acces'+
-  'sed, use (set)length instead'#000+
-  '06037_E_Constructors or d','estructors can not be called inside a '#039'w'+
-  'ith'#039' clause'#000+
+  '06035_E_Ele','ment zero of an ansi/wide- or longstring can'#039't be acc'+
+  'essed, use (set)length instead'#000+
+  '06037_E_Constructors or destructors can not be called inside a '#039'wi'+
+  'th'#039' clause'#000+
   '06038_E_Cannot call message handler methods directly'#000+
   '06038_E_Cannot call message handler methods directly'#000+
-  '06039_E_Jump in or outside of an exception block'#000+
+  '06039_E_Jump in or outside',' of an exception block'#000+
   '06040_E_Control flow statements aren'#039't allowed in a finally block'#000+
   '06040_E_Control flow statements aren'#039't allowed in a finally block'#000+
-  '06041_W_Parameters s','ize exceeds limit for certain cpu'#039's'#000+
+  '06041_W_Parameters size exceeds limit for certain cpu'#039's'#000+
   '06042_W_Local variable size exceed limit for certain cpu'#039's'#000+
   '06042_W_Local variable size exceed limit for certain cpu'#039's'#000+
-  '06043_E_Local variables size exceeds supported limit'#000+
+  '06043_E_Local variables size exceeds',' supported limit'#000+
   '06044_E_BREAK not allowed'#000+
   '06044_E_BREAK not allowed'#000+
   '06045_E_CONTINUE not allowed'#000+
   '06045_E_CONTINUE not allowed'#000+
-  '06046_F_Unknown compilerproc "$1". Ch','eck if you use the correct run '+
-  'time library.'#000+
+  '06046_F_Unknown compilerproc "$1". Check if you use the correct run ti'+
+  'me library.'#000+
   '06047_F_Cannot find system type "$1". Check if you use the correct run'+
   '06047_F_Cannot find system type "$1". Check if you use the correct run'+
   ' time library.'#000+
   ' time library.'#000+
-  '06048_H_Inherited call to abstract method ignored'#000+
+  '0','6048_H_Inherited call to abstract method ignored'#000+
   '06049_E_Goto label "$1" not defined or optimized away'#000+
   '06049_E_Goto label "$1" not defined or optimized away'#000+
-  '06050_','F_Cannot find type "$1" in unit "$2". Check if you use the cor'+
-  'rect run time library.'#000+
-  '07000_DL_Starting $1 styled assembler parsing'#000+
+  '06050_F_Cannot find type "$1" in unit "$2". Check if you use the corre'+
+  'ct run time library.'#000+
+  '07000_DL_Starting $1 styled assembler parsing'#000,
   '07001_DL_Finished $1 styled assembler parsing'#000+
   '07001_DL_Finished $1 styled assembler parsing'#000+
   '07002_E_Non-label pattern contains @'#000+
   '07002_E_Non-label pattern contains @'#000+
-  '07004_E_Error building rec','ord offset'#000+
+  '07004_E_Error building record offset'#000+
   '07005_E_OFFSET used without identifier'#000+
   '07005_E_OFFSET used without identifier'#000+
   '07006_E_TYPE used without identifier'#000+
   '07006_E_TYPE used without identifier'#000+
-  '07007_E_Cannot use local variable or parameters here'#000+
+  '07007_E_Cannot use local variable or paramet','ers here'#000+
   '07008_E_need to use OFFSET here'#000+
   '07008_E_need to use OFFSET here'#000+
   '07009_E_need to use $ here'#000+
   '07009_E_need to use $ here'#000+
-  '07010_E_Cannot use multiple relocatable s','ymbols'#000+
+  '07010_E_Cannot use multiple relocatable symbols'#000+
   '07011_E_Relocatable symbol can only be added'#000+
   '07011_E_Relocatable symbol can only be added'#000+
   '07012_E_Invalid constant expression'#000+
   '07012_E_Invalid constant expression'#000+
   '07013_E_Relocatable symbol is not allowed'#000+
   '07013_E_Relocatable symbol is not allowed'#000+
-  '07014_E_Invalid reference syntax'#000+
+  '0','7014_E_Invalid reference syntax'#000+
   '07015_E_You can not reach $1 from that code'#000+
   '07015_E_You can not reach $1 from that code'#000+
-  '07016_E_Local symbols/labels aren',#039't allowed as references'#000+
+  '07016_E_Local symbols/labels aren'#039't allowed as references'#000+
   '07017_E_Invalid base and index register usage'#000+
   '07017_E_Invalid base and index register usage'#000+
   '07018_W_Possible error in object field handling'#000+
   '07018_W_Possible error in object field handling'#000+
-  '07019_E_Wrong scale factor specified'#000+
+  '07019_E_Wron','g scale factor specified'#000+
   '07020_E_Multiple index register usage'#000+
   '07020_E_Multiple index register usage'#000+
   '07021_E_Invalid operand type'#000+
   '07021_E_Invalid operand type'#000+
-  '07022_E_Invalid s','tring as opcode operand: $1'#000+
+  '07022_E_Invalid string as opcode operand: $1'#000+
   '07023_W_@CODE and @DATA not supported'#000+
   '07023_W_@CODE and @DATA not supported'#000+
   '07024_E_Null label references are not allowed'#000+
   '07024_E_Null label references are not allowed'#000+
-  '07025_E_Divide by zero in asm evaluator'#000+
+  '07025_E_Divide by z','ero in asm evaluator'#000+
   '07026_E_Illegal expression'#000+
   '07026_E_Illegal expression'#000+
   '07027_E_escape sequence ignored: $1'#000+
   '07027_E_escape sequence ignored: $1'#000+
-  '07028_E_Invalid symbol re','ference'#000+
+  '07028_E_Invalid symbol reference'#000+
   '07029_W_Fwait can cause emulation problems with emu387'#000+
   '07029_W_Fwait can cause emulation problems with emu387'#000+
   '07030_W_$1 without operand translated into $1P'#000+
   '07030_W_$1 without operand translated into $1P'#000+
-  '07031_W_ENTER instruction is not supported by Linux kernel'#000+
+  '07031_W_ENTER instruc','tion is not supported by Linux kernel'#000+
   '07032_W_Calling an overload function in assembler'#000+
   '07032_W_Calling an overload function in assembler'#000+
-  '07033_E_Unsupported s','ymbol type for operand'#000+
+  '07033_E_Unsupported symbol type for operand'#000+
   '07034_E_Constant value out of bounds'#000+
   '07034_E_Constant value out of bounds'#000+
   '07035_E_Error converting decimal $1'#000+
   '07035_E_Error converting decimal $1'#000+
   '07036_E_Error converting octal $1'#000+
   '07036_E_Error converting octal $1'#000+
-  '07037_E_Error converting binary $1'#000+
+  '0','7037_E_Error converting binary $1'#000+
   '07038_E_Error converting hexadecimal $1'#000+
   '07038_E_Error converting hexadecimal $1'#000+
   '07039_H_$1 translated to $2'#000+
   '07039_H_$1 translated to $2'#000+
-  '07040_W','_$1 is associated to an overloaded function'#000+
+  '07040_W_$1 is associated to an overloaded function'#000+
   '07041_E_Cannot use SELF outside a method'#000+
   '07041_E_Cannot use SELF outside a method'#000+
-  '07042_E_Cannot use OLDEBP outside a nested procedure'#000+
+  '07042_E_Cannot use OLDEBP outside a nested pro','cedure'#000+
   '07043_W_Procedures can'#039't return any value in asm code'#000+
   '07043_W_Procedures can'#039't return any value in asm code'#000+
   '07044_E_SEG not supported'#000+
   '07044_E_SEG not supported'#000+
-  '07045_E_Size suffix an','d destination or source size do not match'#000+
+  '07045_E_Size suffix and destination or source size do not match'#000+
   '07046_W_Size suffix and destination or source size do not match'#000+
   '07046_W_Size suffix and destination or source size do not match'#000+
-  '07047_E_Assembler syntax error'#000+
+  '07047_E_Assembler syntax ','error'#000+
   '07048_E_Invalid combination of opcode and operands'#000+
   '07048_E_Invalid combination of opcode and operands'#000+
   '07049_E_Assembler syntax error in operand'#000+
   '07049_E_Assembler syntax error in operand'#000+
-  '07050_E_As','sembler syntax error in constant'#000+
+  '07050_E_Assembler syntax error in constant'#000+
   '07051_E_Invalid String expression'#000+
   '07051_E_Invalid String expression'#000+
-  '07052_W_constant with symbol $1 for address which is not on a pointer'#000+
+  '07052_W_constant with symbol $1 for address which is not on a po','inte'+
+  'r'#000+
   '07053_E_Unrecognized opcode $1'#000+
   '07053_E_Unrecognized opcode $1'#000+
   '07054_E_Invalid or missing opcode'#000+
   '07054_E_Invalid or missing opcode'#000+
-  '07055_E_Invalid combination of prefix ','and opcode: $1'#000+
+  '07055_E_Invalid combination of prefix and opcode: $1'#000+
   '07056_E_Invalid combination of override and opcode: $1'#000+
   '07056_E_Invalid combination of override and opcode: $1'#000+
   '07057_E_Too many operands on line'#000+
   '07057_E_Too many operands on line'#000+
   '07058_W_NEAR ignored'#000+
   '07058_W_NEAR ignored'#000+
-  '07059_W_FAR ignored'#000+
+  '07059_','W_FAR ignored'#000+
   '07060_E_Duplicate local symbol $1'#000+
   '07060_E_Duplicate local symbol $1'#000+
   '07061_E_Undefined local symbol $1'#000+
   '07061_E_Undefined local symbol $1'#000+
-  '07062_E_Unknown label ident','ifier $1'#000+
+  '07062_E_Unknown label identifier $1'#000+
   '07063_E_Invalid register name'#000+
   '07063_E_Invalid register name'#000+
   '07064_E_Invalid floating point register name'#000+
   '07064_E_Invalid floating point register name'#000+
   '07066_W_Modulo not supported'#000+
   '07066_W_Modulo not supported'#000+
-  '07067_E_Invalid floating point constant $1'#000+
+  '07067_E_Invalid fl','oating point constant $1'#000+
   '07068_E_Invalid floating point expression'#000+
   '07068_E_Invalid floating point expression'#000+
   '07069_E_Wrong symbol type'#000+
   '07069_E_Wrong symbol type'#000+
-  '07070_E_Cannot i','ndex a local var or parameter with a register'#000+
+  '07070_E_Cannot index a local var or parameter with a register'#000+
   '07071_E_Invalid segment override expression'#000+
   '07071_E_Invalid segment override expression'#000+
   '07072_W_Identifier $1 supposed external'#000+
   '07072_W_Identifier $1 supposed external'#000+
-  '07073_E_Strings not allowed as constants'#000+
+  '0','7073_E_Strings not allowed as constants'#000+
   '07074_No type of variable specified'#000+
   '07074_No type of variable specified'#000+
-  '07075_E_assembler code not return','ed to text section'#000+
+  '07075_E_assembler code not returned to text section'#000+
   '07076_E_Not a directive or local symbol $1'#000+
   '07076_E_Not a directive or local symbol $1'#000+
   '07077_E_Using a defined name as a local label'#000+
   '07077_E_Using a defined name as a local label'#000+
-  '07078_E_Dollar token is used without an identifier'#000+
+  '07078_E_Dollar token is',' used without an identifier'#000+
   '07079_W_32bit constant created for address'#000+
   '07079_W_32bit constant created for address'#000+
-  '07080_N_.align is target specific, use',' .balign or .p2align'#000+
+  '07080_N_.align is target specific, use .balign or .p2align'#000+
   '07081_E_Can'#039't access fields directly for parameters'#000+
   '07081_E_Can'#039't access fields directly for parameters'#000+
   '07082_E_Can'#039't access fields of objects/classes directly'#000+
   '07082_E_Can'#039't access fields of objects/classes directly'#000+
-  '07083_E_No size specified and unable to determine the size of the oper'+
-  'ands'#000+
-  '07084_E_Cannot use RESULT in this fu','nction'#000+
+  '07','083_E_No size specified and unable to determine the size of the op'+
+  'erands'#000+
+  '07084_E_Cannot use RESULT in this function'#000+
   '07086_W_"$1" without operand translated into "$1 %st,%st(1)"'#000+
   '07086_W_"$1" without operand translated into "$1 %st,%st(1)"'#000+
   '07087_W_"$1 %st(n)" translated into "$1 %st,%st(n)"'#000+
   '07087_W_"$1 %st(n)" translated into "$1 %st,%st(n)"'#000+
-  '07088_W_"$1 %st(n)" translated into "$1 %st(n),%st"'#000+
+  '07088_W_"$1',' %st(n)" translated into "$1 %st(n),%st"'#000+
   '07089_E_Char < not allowed here'#000+
   '07089_E_Char < not allowed here'#000+
   '07090_E_Char > not allowed here'#000+
   '07090_E_Char > not allowed here'#000+
-  '0709','3_W_ALIGN not supported'#000+
+  '07093_W_ALIGN not supported'#000+
   '07094_E_Inc and Dec cannot be together'#000+
   '07094_E_Inc and Dec cannot be together'#000+
   '07095_E_Invalid reglist for movem'#000+
   '07095_E_Invalid reglist for movem'#000+
-  '07096_E_Reglist invalid for opcode'#000+
+  '07096_E_Reglist invalid for opcode',#000+
   '07097_E_Higher cpu mode required ($1)'#000+
   '07097_E_Higher cpu mode required ($1)'#000+
-  '07098_W_No size specified and unable to determine the size of the oper',
+  '07098_W_No size specified and unable to determine the size of the oper'+
   'ands, using DWORD as default'#000+
   'ands, using DWORD as default'#000+
   '07099_E_Syntax error while trying to parse a shifter operand'#000+
   '07099_E_Syntax error while trying to parse a shifter operand'#000+
-  '07100_E_Address of packed component is not at a byte boundary'#000+
+  '07100_E_Address of packed component is no','t at a byte boundary'#000+
   '07101_W_No size specified and unable to determine the size of the oper'+
   '07101_W_No size specified and unable to determine the size of the oper'+
-  'ands, using BYTE a','s default'#000+
+  'ands, using BYTE as default'#000+
   '07102_W_Use of +offset(%ebp) for parameters invalid here'#000+
   '07102_W_Use of +offset(%ebp) for parameters invalid here'#000+
-  '07103_W_Use of +offset(%ebp) is not compatible with regcall convention'+
-  #000+
+  '07103_W_Use of +offset(%ebp) is not compatible with regcall conv','enti'+
+  'on'#000+
   '07104_W_Use of -offset(%ebp) is not recommended for local variable acc'+
   '07104_W_Use of -offset(%ebp) is not recommended for local variable acc'+
   'ess'#000+
   'ess'#000+
-  '07105_W_Use of -offset(%esp)',', access may cause a crash or value may '+
-  'be lost'#000+
+  '07105_W_Use of -offset(%esp), access may cause a crash or value may be'+
+  ' lost'#000+
   '07106_E_VMTOffset must be used in combination with a virtual method, a'+
   '07106_E_VMTOffset must be used in combination with a virtual method, a'+
-  'nd "$1" is not virtual'#000+
+  'nd "$1" is no','t virtual'#000+
   '07107_E_Generating PIC, but reference is not PIC-safe'#000+
   '07107_E_Generating PIC, but reference is not PIC-safe'#000+
   '08000_F_Too many assembler files'#000+
   '08000_F_Too many assembler files'#000+
-  '08001_F_Sele','cted assembler output not supported'#000+
+  '08001_F_Selected assembler output not supported'#000+
   '08002_F_Comp not supported'#000+
   '08002_F_Comp not supported'#000+
   '08003_F_Direct not support for binary writers'#000+
   '08003_F_Direct not support for binary writers'#000+
-  '08004_E_Allocating of data is only allowed in bss section'#000+
+  '08004_E_Allocating of ','data is only allowed in bss section'#000+
   '08005_F_No binary writer selected'#000+
   '08005_F_No binary writer selected'#000+
   '08006_E_Asm: Opcode $1 not in table'#000+
   '08006_E_Asm: Opcode $1 not in table'#000+
-  '080','07_E_Asm: $1 invalid combination of opcode and operands'#000+
+  '08007_E_Asm: $1 invalid combination of opcode and operands'#000+
   '08008_E_Asm: 16 Bit references not supported'#000+
   '08008_E_Asm: 16 Bit references not supported'#000+
-  '08009_E_Asm: Invalid effective address'#000+
+  '08009_E_Asm: Invalid effective',' address'#000+
   '08010_E_Asm: Immediate or reference expected'#000+
   '08010_E_Asm: Immediate or reference expected'#000+
   '08011_E_Asm: $1 value exceeds bounds $2'#000+
   '08011_E_Asm: $1 value exceeds bounds $2'#000+
-  '08012_E_Asm: Sh','ort jump is out of range $1'#000+
+  '08012_E_Asm: Short jump is out of range $1'#000+
   '08013_E_Asm: Undefined label $1'#000+
   '08013_E_Asm: Undefined label $1'#000+
   '08014_E_Asm: Comp type not supported for this target'#000+
   '08014_E_Asm: Comp type not supported for this target'#000+
-  '08015_E_Asm: Extended type not supported for this target'#000+
+  '08015_E_Asm: Exten','ded type not supported for this target'#000+
   '08016_E_Asm: Duplicate label $1'#000+
   '08016_E_Asm: Duplicate label $1'#000+
   '08017_E_Asm: Redefined label $1'#000+
   '08017_E_Asm: Redefined label $1'#000+
-  '08018_','E_Asm: First defined here'#000+
+  '08018_E_Asm: First defined here'#000+
   '08019_E_Asm: Invalid register $1'#000+
   '08019_E_Asm: Invalid register $1'#000+
   '08020_E_Asm: 16 or 32 Bit references not supported'#000+
   '08020_E_Asm: 16 or 32 Bit references not supported'#000+
-  '08021_E_Asm: 64 Bit operands not supported'#000+
+  '08021_E_Asm: 64 Bit o','perands not supported'#000+
   '09000_W_Source operating system redefined'#000+
   '09000_W_Source operating system redefined'#000+
   '09001_I_Assembling (pipe) $1'#000+
   '09001_I_Assembling (pipe) $1'#000+
-  '09002_E_Can'#039't cr','eate assembler file: $1'#000+
+  '09002_E_Can'#039't create assembler file: $1'#000+
   '09003_E_Can'#039't create object file: $1'#000+
   '09003_E_Can'#039't create object file: $1'#000+
   '09004_E_Can'#039't create archive file: $1'#000+
   '09004_E_Can'#039't create archive file: $1'#000+
-  '09005_E_Assembler $1 not found, switching to external assembling'#000+
+  '09005_E_Assembler $1 not found, ','switching to external assembling'#000+
   '09006_T_Using assembler: $1'#000+
   '09006_T_Using assembler: $1'#000+
   '09007_E_Error while assembling exitcode $1'#000+
   '09007_E_Error while assembling exitcode $1'#000+
-  '09008','_E_Can'#039't call the assembler, error $1 switching to external'+
-  ' assembling'#000+
+  '09008_E_Can'#039't call the assembler, error $1 switching to external a'+
+  'ssembling'#000+
   '09009_I_Assembling $1'#000+
   '09009_I_Assembling $1'#000+
-  '09010_I_Assembling with smartlinking $1'#000+
+  '09010_I_Assembling with smartlinking $','1'#000+
   '09011_W_Object $1 not found, Linking may fail !'#000+
   '09011_W_Object $1 not found, Linking may fail !'#000+
   '09012_W_Library $1 not found, Linking may fail !'#000+
   '09012_W_Library $1 not found, Linking may fail !'#000+
-  '09013_E_Er','ror while linking'#000+
+  '09013_E_Error while linking'#000+
   '09014_E_Can'#039't call the linker, switching to external linking'#000+
   '09014_E_Can'#039't call the linker, switching to external linking'#000+
   '09015_I_Linking $1'#000+
   '09015_I_Linking $1'#000+
-  '09016_E_Util $1 not found, switching to external linking'#000+
+  '09016_E_Util $1 not found, switch','ing to external linking'#000+
   '09017_T_Using util $1'#000+
   '09017_T_Using util $1'#000+
   '09018_E_Creation of Executables not supported'#000+
   '09018_E_Creation of Executables not supported'#000+
-  '09019_E_Creation ','of Dynamic/Shared Libraries not supported'#000+
+  '09019_E_Creation of Dynamic/Shared Libraries not supported'#000+
   '09020_I_Closing script $1'#000+
   '09020_I_Closing script $1'#000+
-  '09021_E_resource compiler "$1" not found, switching to external mode'#000+
+  '09021_E_resource compiler "$1" not found, switching to external',' mode'+
+  #000+
   '09022_I_Compiling resource $1'#000+
   '09022_I_Compiling resource $1'#000+
   '09023_T_unit $1 can'#039't be statically linked, switching to smart lin'+
   '09023_T_unit $1 can'#039't be statically linked, switching to smart lin'+
   'king'#000+
   'king'#000+
-  '09','024_T_unit $1 can'#039't be smart linked, switching to static linki'+
-  'ng'#000+
-  '09025_T_unit $1 can'#039't be shared linked, switching to static linkin'+
+  '09024_T_unit $1 can'#039't be smart linked, switching to static linking'+
+  #000+
+  '09025_T_unit $1 can'#039't be shared linked, switching to static linkin',
   'g'#000+
   'g'#000+
   '09026_E_unit $1 can'#039't be smart or static linked'#000+
   '09026_E_unit $1 can'#039't be smart or static linked'#000+
   '09027_E_unit $1 can'#039't be shared or static linked'#000+
   '09027_E_unit $1 can'#039't be shared or static linked'#000+
-  '09028_D_Ca','lling resource compiler "$1" with "$2" as command line'#000+
+  '09028_D_Calling resource compiler "$1" with "$2" as command line'#000+
   '09029_E_Error while compiling resources'#000+
   '09029_E_Error while compiling resources'#000+
-  '09030_E_Can'#039't call the resource compiler "$1", switching to extern'+
-  'al mode'#000+
+  '09030_E_Can'#039't call the resource comp','iler "$1", switching to exte'+
+  'rnal mode'#000+
   '09031_E_Can'#039't open resource file "$1"'#000+
   '09031_E_Can'#039't open resource file "$1"'#000+
-  '09032_E_Can'#039't write resource file',' "$1"'#000+
+  '09032_E_Can'#039't write resource file "$1"'#000+
   '09128_F_Can'#039't post process executable $1'#000+
   '09128_F_Can'#039't post process executable $1'#000+
   '09129_F_Can'#039't open executable $1'#000+
   '09129_F_Can'#039't open executable $1'#000+
   '09130_X_Size of Code: $1 bytes'#000+
   '09130_X_Size of Code: $1 bytes'#000+
-  '09131_X_Size of initialized data: $1 bytes'#000+
+  '09131_X_Size of init','ialized data: $1 bytes'#000+
   '09132_X_Size of uninitialized data: $1 bytes'#000+
   '09132_X_Size of uninitialized data: $1 bytes'#000+
   '09133_X_Stack space reserved: $1 bytes'#000+
   '09133_X_Stack space reserved: $1 bytes'#000+
-  '09','134_X_Stack space committed: $1 bytes'#000+
+  '09134_X_Stack space committed: $1 bytes'#000+
   '09200_F_Executable image size is too big for $1 target.'#000+
   '09200_F_Executable image size is too big for $1 target.'#000+
-  '09201_W_Object file "$1" contains 32-bit absolute relocation to symbol'+
-  ' "$2".'#000+
+  '09201_W_Object file "$1" contains 32-','bit absolute relocation to symb'+
+  'ol "$2".'#000+
   '10000_T_Unitsearch: $1'#000+
   '10000_T_Unitsearch: $1'#000+
   '10001_T_PPU Loading $1'#000+
   '10001_T_PPU Loading $1'#000+
   '10002_U_PPU Name: $1'#000+
   '10002_U_PPU Name: $1'#000+
-  '10','003_U_PPU Flags: $1'#000+
+  '10003_U_PPU Flags: $1'#000+
   '10004_U_PPU Crc: $1'#000+
   '10004_U_PPU Crc: $1'#000+
   '10005_U_PPU Time: $1'#000+
   '10005_U_PPU Time: $1'#000+
   '10006_U_PPU File too short'#000+
   '10006_U_PPU File too short'#000+
-  '10007_U_PPU Invalid Header (no PPU at the begin)'#000+
+  '10007_U_PPU Invalid Header (no PPU at the b','egin)'#000+
   '10008_U_PPU Invalid Version $1'#000+
   '10008_U_PPU Invalid Version $1'#000+
   '10009_U_PPU is compiled for another processor'#000+
   '10009_U_PPU is compiled for another processor'#000+
-  '10010_U_PPU is compiled fo','r an other target'#000+
+  '10010_U_PPU is compiled for an other target'#000+
   '10011_U_PPU Source: $1'#000+
   '10011_U_PPU Source: $1'#000+
   '10012_U_Writing $1'#000+
   '10012_U_Writing $1'#000+
   '10013_F_Can'#039't Write PPU-File'#000+
   '10013_F_Can'#039't Write PPU-File'#000+
   '10014_F_Error reading PPU-File'#000+
   '10014_F_Error reading PPU-File'#000+
-  '10015_F_unexpected end of PPU-File'#000+
+  '10015_F_une','xpected end of PPU-File'#000+
   '10016_F_Invalid PPU-File entry: $1'#000+
   '10016_F_Invalid PPU-File entry: $1'#000+
   '10017_F_PPU Dbx count problem'#000+
   '10017_F_PPU Dbx count problem'#000+
-  '10018_E_Illegal unit',' name: $1'#000+
+  '10018_E_Illegal unit name: $1'#000+
   '10019_F_Too much units'#000+
   '10019_F_Too much units'#000+
   '10020_F_Circular unit reference between $1 and $2'#000+
   '10020_F_Circular unit reference between $1 and $2'#000+
-  '10021_F_Can'#039't compile unit $1, no sources available'#000+
+  '10021_F_Can'#039't compile unit $1, no sources availa','ble'#000+
   '10022_F_Can'#039't find unit $1 used by $2'#000+
   '10022_F_Can'#039't find unit $1 used by $2'#000+
   '10023_W_Unit $1 was not found but $2 exists'#000+
   '10023_W_Unit $1 was not found but $2 exists'#000+
-  '10024_F_Unit $1 searche','d but $2 found'#000+
+  '10024_F_Unit $1 searched but $2 found'#000+
   '10025_W_Compiling the system unit requires the -Us switch'#000+
   '10025_W_Compiling the system unit requires the -Us switch'#000+
   '10026_F_There were $1 errors compiling module, stopping'#000+
   '10026_F_There were $1 errors compiling module, stopping'#000+
-  '10027_U_Load from $1 ($2) unit $3'#000+
+  '10','027_U_Load from $1 ($2) unit $3'#000+
   '10028_U_Recompiling $1, checksum changed for $2'#000+
   '10028_U_Recompiling $1, checksum changed for $2'#000+
-  '10029_U_Recompiling $1, sourc','e found only'#000+
+  '10029_U_Recompiling $1, source found only'#000+
   '10030_U_Recompiling unit, static lib is older than ppufile'#000+
   '10030_U_Recompiling unit, static lib is older than ppufile'#000+
-  '10031_U_Recompiling unit, shared lib is older than ppufile'#000+
+  '10031_U_Recompiling unit, shared lib is older than ppufile'#000,
   '10032_U_Recompiling unit, obj and asm are older than ppufile'#000+
   '10032_U_Recompiling unit, obj and asm are older than ppufile'#000+
-  '10033_U_Recompiling unit, obj is older than asm'#000,
+  '10033_U_Recompiling unit, obj is older than asm'#000+
   '10034_U_Parsing interface of $1'#000+
   '10034_U_Parsing interface of $1'#000+
   '10035_U_Parsing implementation of $1'#000+
   '10035_U_Parsing implementation of $1'#000+
   '10036_U_Second load for unit $1'#000+
   '10036_U_Second load for unit $1'#000+
-  '10037_U_PPU Check file $1 time $2'#000+
+  '10037_U_PPU Check file $1 time',' $2'#000+
   '10040_W_Can'#039't recompile unit $1, but found modifed include files'#000+
   '10040_W_Can'#039't recompile unit $1, but found modifed include files'#000+
-  '10041_U_File $1 is newer than PPU file $','2'#000+
+  '10041_U_File $1 is newer than PPU file $2'#000+
   '10042_U_Trying to use a unit which was compiled with a different FPU m'+
   '10042_U_Trying to use a unit which was compiled with a different FPU m'+
   'ode'#000+
   'ode'#000+
   '10043_U_Loading interface units from $1'#000+
   '10043_U_Loading interface units from $1'#000+
-  '10044_U_Loading implementation units from $1'#000+
+  '10044_U_Loading',' implementation units from $1'#000+
   '10045_U_Interface CRC changed for unit $1'#000+
   '10045_U_Interface CRC changed for unit $1'#000+
-  '10046_U_Implementation CRC changed fo','r unit $1'#000+
+  '10046_U_Implementation CRC changed for unit $1'#000+
   '10047_U_Finished compiling unit $1'#000+
   '10047_U_Finished compiling unit $1'#000+
   '10048_U_Add dependency of $1 to $2'#000+
   '10048_U_Add dependency of $1 to $2'#000+
   '10049_U_No reload, is caller: $1'#000+
   '10049_U_No reload, is caller: $1'#000+
-  '10050_U_No reload, already in second compile: $1'#000+
+  '10050_U_No reload,',' already in second compile: $1'#000+
   '10051_U_Flag for reload: $1'#000+
   '10051_U_Flag for reload: $1'#000+
   '10052_U_Forced reloading'#000+
   '10052_U_Forced reloading'#000+
-  '10053_U_Previous state of',' $1: $2'#000+
+  '10053_U_Previous state of $1: $2'#000+
   '10054_U_Already compiling $1, setting second compile'#000+
   '10054_U_Already compiling $1, setting second compile'#000+
   '10055_U_Loading unit $1'#000+
   '10055_U_Loading unit $1'#000+
   '10056_U_Finished loading unit $1'#000+
   '10056_U_Finished loading unit $1'#000+
-  '10057_U_Registering new unit $1'#000+
+  '10057_U_Regis','tering new unit $1'#000+
   '10058_U_Re-resolving unit $1'#000+
   '10058_U_Re-resolving unit $1'#000+
-  '10059_U_Skipping re-resolving unit $1, still loading used uni','ts'#000+
+  '10059_U_Skipping re-resolving unit $1, still loading used units'#000+
   '10060_U_Unloading resource unit $1 (not needed)'#000+
   '10060_U_Unloading resource unit $1 (not needed)'#000+
   '10061_E_Unit $1 was compiled using a different whole program optimizat'+
   '10061_E_Unit $1 was compiled using a different whole program optimizat'+
-  'ion feedback input ($2, $3); recompile it without wpo or use the same '+
-  'wpo feedback input file for this compilation invo','cation'#000+
+  'ion feedba','ck input ($2, $3); recompile it without wpo or use the sam'+
+  'e wpo feedback input file for this compilation invocation'#000+
   '11000_O_$1 [options] <inputfile> [options]'#000+
   '11000_O_$1 [options] <inputfile> [options]'#000+
   '11001_W_Only one source file supported, changing source file to compil'+
   '11001_W_Only one source file supported, changing source file to compil'+
-  'e from "$1" into "$2"'#000+
+  'e from "$1"',' into "$2"'#000+
   '11002_W_DEF file can be created only for OS/2'#000+
   '11002_W_DEF file can be created only for OS/2'#000+
   '11003_E_nested response files are not supported'#000+
   '11003_E_nested response files are not supported'#000+
-  '1100','4_F_No source file name in command line'#000+
+  '11004_F_No source file name in command line'#000+
   '11005_N_No option inside $1 config file'#000+
   '11005_N_No option inside $1 config file'#000+
   '11006_E_Illegal parameter: $1'#000+
   '11006_E_Illegal parameter: $1'#000+
-  '11007_H_-? writes help pages'#000+
+  '11007_H_-? writes hel','p pages'#000+
   '11008_F_Too many config files nested'#000+
   '11008_F_Too many config files nested'#000+
   '11009_F_Unable to open file $1'#000+
   '11009_F_Unable to open file $1'#000+
-  '11010_D_Reading further options f','rom $1'#000+
+  '11010_D_Reading further options from $1'#000+
   '11011_W_Target is already set to: $1'#000+
   '11011_W_Target is already set to: $1'#000+
   '11012_W_Shared libs not supported on DOS platform, reverting to static'+
   '11012_W_Shared libs not supported on DOS platform, reverting to static'+
   #000+
   #000+
-  '11013_F_In options file $1 at line $2 too many \var{\#IF(N)DEFs} encou'+
-  'ntered'#000+
-  '11014_F_In options file $1 at line $2 unexpected',' \var{\#ENDIFs} enco'+
-  'untered'#000+
+  '11013_F_In optio','ns file $1 at line $2 too many \var{\#IF(N)DEFs} enc'+
+  'ountered'#000+
+  '11014_F_In options file $1 at line $2 unexpected \var{\#ENDIFs} encoun'+
+  'tered'#000+
   '11015_F_Open conditional at the end of the options file'#000+
   '11015_F_Open conditional at the end of the options file'#000+
-  '11016_W_Debug information generation is not supported by this executab'+
-  'le'#000+
+  '11016_W_Debug information generation is not sup','ported by this execut'+
+  'able'#000+
   '11017_H_Try recompiling with -dGDB'#000+
   '11017_H_Try recompiling with -dGDB'#000+
   '11018_W_You are using the obsolete switch $1'#000+
   '11018_W_You are using the obsolete switch $1'#000+
-  '110','19_W_You are using the obsolete switch $1, please use $2'#000+
+  '11019_W_You are using the obsolete switch $1, please use $2'#000+
   '11020_N_Switching assembler to default source writing assembler'#000+
   '11020_N_Switching assembler to default source writing assembler'#000+
-  '11021_W_Assembler output selected "$1" is not compatible with "$2"'#000+
+  '11021_W_As','sembler output selected "$1" is not compatible with "$2"'#000+
   '11022_W_"$1" assembler use forced'#000+
   '11022_W_"$1" assembler use forced'#000+
-  '11026_T_Reading op','tions from file $1'#000+
+  '11026_T_Reading options from file $1'#000+
   '11027_T_Reading options from environment $1'#000+
   '11027_T_Reading options from environment $1'#000+
   '11028_D_Handling option "$1"'#000+
   '11028_D_Handling option "$1"'#000+
   '11029_O_*** press enter ***'#000+
   '11029_O_*** press enter ***'#000+
-  '11030_H_Start of reading config file $1'#000+
+  '11030_H_Sta','rt of reading config file $1'#000+
   '11031_H_End of reading config file $1'#000+
   '11031_H_End of reading config file $1'#000+
   '11032_D_interpreting option "$1"'#000+
   '11032_D_interpreting option "$1"'#000+
-  '11036_D_i','nterpreting firstpass option "$1"'#000+
+  '11036_D_interpreting firstpass option "$1"'#000+
   '11033_D_interpreting file option "$1"'#000+
   '11033_D_interpreting file option "$1"'#000+
   '11034_D_Reading config file "$1"'#000+
   '11034_D_Reading config file "$1"'#000+
-  '11035_D_found source file name "$1"'#000+
+  '11035_D_found source file ','name "$1"'#000+
   '11039_E_Unknown code page'#000+
   '11039_E_Unknown code page'#000+
   '11040_F_Config file $1 is a directory'#000+
   '11040_F_Config file $1 is a directory'#000+
-  '11041_W_Assembler output selected "','$1" cannot generate debug info, d'+
-  'ebugging disabled'#000+
+  '11041_W_Assembler output selected "$1" cannot generate debug info, deb'+
+  'ugging disabled'#000+
   '11042_W_Use of ppc386.cfg is deprecated, please use fpc.cfg instead'#000+
   '11042_W_Use of ppc386.cfg is deprecated, please use fpc.cfg instead'#000+
-  '11043_F_In options file $1 at line $2 \var{\#ELSE} directive without \'+
-  'var{\#IF(N)DEF} found'#000+
-  '11044_F_Option "$1" is not, o','r not yet, supported on the current tar'+
-  'get platform'#000+
+  '11043_F_In o','ptions file $1 at line $2 \var{\#ELSE} directive without'+
+  ' \var{\#IF(N)DEF} found'#000+
+  '11044_F_Option "$1" is not, or not yet, supported on the current targe'+
+  't platform'#000+
   '11045_F_The feature "$1" is not, or not yet, supported on the selected'+
   '11045_F_The feature "$1" is not, or not yet, supported on the selected'+
-  ' target platform'#000+
+  ' target p','latform'#000+
   '11046_N_DWARF debug information cannot be used with smart linking on t'+
   '11046_N_DWARF debug information cannot be used with smart linking on t'+
-  'his target, switching to static',' linking'#000+
+  'his target, switching to static linking'#000+
   '11047_W_Option "$1" is ignored for the current target platform.'#000+
   '11047_W_Option "$1" is ignored for the current target platform.'#000+
-  '12000_F_Cannot open whole program optimization feedback file "$1"'#000+
+  '12000_F_Cannot open whole program optimization feedback fi','le "$1"'#000+
   '12001_D_Processing whole program optimization information in wpo feedb'+
   '12001_D_Processing whole program optimization information in wpo feedb'+
   'ack file "$1"'#000+
   'ack file "$1"'#000+
-  '12002_D_Finished ','processing the whole program optimization informati'+
-  'on in wpo feedback file "$1"'#000+
-  '12003_E_Expected section header, but got "$2" at line $1 of wpo feedba'+
-  'ck file'#000+
+  '12002_D_Finished processing the whole program optimization information'+
+  ' in wpo feedback file "$1"'#000+
+  '12003_E_Expected section header, but got "$2" at li','ne $1 of wpo feed'+
+  'back file'#000+
   '12004_W_No handler registered for whole program optimization section "'+
   '12004_W_No handler registered for whole program optimization section "'+
-  '$2" at line ','$1 of wpo feedback file, ignoring'#000+
+  '$2" at line $1 of wpo feedback file, ignoring'#000+
   '12005_D_Found whole program optimization section "$1" with information'+
   '12005_D_Found whole program optimization section "$1" with information'+
   ' about "$2"'#000+
   ' about "$2"'#000+
-  '12006_F_The selected whole program optimizations require a previously '+
-  'generated feedback file (use -Fw to specify)'#000+
-  '12007_E_N','o collected information necessary to perform "$1" whole pro'+
-  'gram optimization found'#000+
-  '12008_F_Specify a whole program optimization feedback file to store th'+
-  'e generated info in (using -FW)'#000+
-  '12009_E_Not generating any whole program optimization i','nformation, y'+
-  'et a feedback file was specified (using -FW)'#000+
+  '12006_F_The sel','ected whole program optimizations require a previousl'+
+  'y generated feedback file (use -Fw to specify)'#000+
+  '12007_E_No collected information necessary to perform "$1" whole progr'+
+  'am optimization found'#000+
+  '12008_F_Specify a whole program optimization fee','dback file to store '+
+  'the generated info in (using -FW)'#000+
+  '12009_E_Not generating any whole program optimization information, yet'+
+  ' a feedback file was specified (using -FW)'#000+
   '12010_E_Not performing any whole program optimizations, yet an input f'+
   '12010_E_Not performing any whole program optimizations, yet an input f'+
-  'eedback file was specified (using -Fw)'#000+
+  'eed','back file was specified (using -Fw)'#000+
   '12011_D_Skipping whole program optimization section "$1", because not '+
   '12011_D_Skipping whole program optimization section "$1", because not '+
-  'nee','ded by the requested optimizations'#000+
+  'needed by the requested optimizations'#000+
   '12012_W_Overriding previously read information for "$1" from feedback '+
   '12012_W_Overriding previously read information for "$1" from feedback '+
-  'input file using information in section "$2"'#000+
+  'input file using informati','on in section "$2"'#000+
   '12013_E_Cannot extract symbol liveness information from program when s'+
   '12013_E_Cannot extract symbol liveness information from program when s'+
-  'tripping symbols, us','e -Xs-'#000+
+  'tripping symbols, use -Xs-'#000+
   '12014_E_Cannot extract symbol liveness information from program when w'+
   '12014_E_Cannot extract symbol liveness information from program when w'+
   'hen not linking'#000+
   'hen not linking'#000+
-  '12015_F_Cannot find "$1" or "$2" to extract symbol liveness informatio'+
-  'n from linked program'#000+
-  '12016_E_Error during reading symbol liveness informatio','n produced by'+
-  ' "$1"'#000+
+  '12015_F_Cannot find "$1" or "$2" to ex','tract symbol liveness informat'+
+  'ion from linked program'#000+
+  '12016_E_Error during reading symbol liveness information produced by "'+
+  '$1"'#000+
   '12017_F_Error executing "$1" (exitcode: $2) to extract symbol informat'+
   '12017_F_Error executing "$1" (exitcode: $2) to extract symbol informat'+
   'ion from linked program'#000+
   'ion from linked program'#000+
-  '12018_E_Collection of symbol liveness information can only help when u'+
-  'sing smart linking, use -CX -XX'#000+
-  '12019_E_Cannot create spe','cified whole program optimisation feedback '+
-  'file "$1"'#000+
+  '12018_E_Collection',' of symbol liveness information can only help when'+
+  ' using smart linking, use -CX -XX'#000+
+  '12019_E_Cannot create specified whole program optimisation feedback fi'+
+  'le "$1"'#000+
   '11023_Free Pascal Compiler version $FPCFULLVERSION [$FPCDATE] for $FPC'+
   '11023_Free Pascal Compiler version $FPCFULLVERSION [$FPCDATE] for $FPC'+
   'CPU'#010+
   'CPU'#010+
-  'Copyright (c) 1993-2009 by Florian Klaempfl'#000+
+  'Copy','right (c) 1993-2009 by Florian Klaempfl'#000+
   '11024_Free Pascal Compiler version $FPCVERSION'#010+
   '11024_Free Pascal Compiler version $FPCVERSION'#010+
   #010+
   #010+
-  'Compiler Date      : ','$FPCDATE'#010+
+  'Compiler Date      : $FPCDATE'#010+
   'Compiler CPU Target: $FPCCPU'#010+
   'Compiler CPU Target: $FPCCPU'#010+
   #010+
   #010+
   'Supported targets:'#010+
   'Supported targets:'#010+
@@ -969,13 +982,13 @@ const msgtxt : array[0..000225,1..240] of char=(
   'Supported CPU instruction sets:'#010+
   'Supported CPU instruction sets:'#010+
   '  $INSTRUCTIONSETS'#010+
   '  $INSTRUCTIONSETS'#010+
   #010+
   #010+
-  'Supported FPU instruction sets:'#010+
+  'Support','ed FPU instruction sets:'#010+
   '  $FPUINSTRUCTIONSETS'#010+
   '  $FPUINSTRUCTIONSETS'#010+
   #010+
   #010+
   'Supported ABI targets:'#010+
   'Supported ABI targets:'#010+
   '  $ABITARGETS'#010+
   '  $ABITARGETS'#010+
   #010+
   #010+
-  'Supported Optimizations',':'#010+
+  'Supported Optimizations:'#010+
   '  $OPTIMIZATIONS'#010+
   '  $OPTIMIZATIONS'#010+
   #010+
   #010+
   'Supported Whole Program Optimizations:'#010+
   'Supported Whole Program Optimizations:'#010+
@@ -983,294 +996,291 @@ const msgtxt : array[0..000225,1..240] of char=(
   '  $WPOPTIMIZATIONS'#010+
   '  $WPOPTIMIZATIONS'#010+
   #010+
   #010+
   'Supported Microcontroller types:'#010+
   'Supported Microcontroller types:'#010+
-  '  $CONTROLLERTYPES'#010+
+  '  $CONTROLLER','TYPES'#010+
   #010+
   #010+
   'This program comes under the GNU General Public Licence'#010+
   'This program comes under the GNU General Public Licence'#010+
   'For more information read COPYING.FPC'#010+
   'For more information read COPYING.FPC'#010+
   #010+
   #010+
-  'Report ','bugs, suggestions, etc. to:'#010+
+  'Report bugs, suggestions, etc. to:'#010+
   '                 http://bugs.freepascal.org'#010+
   '                 http://bugs.freepascal.org'#010+
   'or'#010+
   'or'#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 asse','mbler file'#010+
+  '11025_**0*_Put + af','ter a boolean switch option to enable it, - to di'+
+  'sable it'#010+
+  '**1a_The compiler doesn'#039't delete the generated assembler file'#010+
   '**2al_List sourcecode lines in 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+
+  '*L2ap_Use pipes instead of creating',' temporary assembler files'#010+
   '**2ar_List register allocation/release info in assembler file'#010+
   '**2ar_List register allocation/release info in assembler file'#010+
-  '**2at_List temp allo','cation/release info in assembler file'#010+
+  '**2at_List temp allocation/release info in assembler file'#010+
   '**1A<x>_Output format:'#010+
   '**1A<x>_Output format:'#010+
   '**2Adefault_Use default assembler'#010+
   '**2Adefault_Use default assembler'#010+
   '3*2Aas_Assemble using GNU AS'#010+
   '3*2Aas_Assemble using GNU AS'#010+
-  '3*2Anasmcoff_COFF (Go32v2) file using Nasm'#010+
+  '3*2Anas','mcoff_COFF (Go32v2) file using Nasm'#010+
   '3*2Anasmelf_ELF32 (Linux) file using Nasm'#010+
   '3*2Anasmelf_ELF32 (Linux) file using Nasm'#010+
-  '3*2Anasmwin32_Win32 object file',' using Nasm'#010+
+  '3*2Anasmwin32_Win32 object file using Nasm'#010+
   '3*2Anasmwdosx_Win32/WDOSX 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 file using Wasm (Watcom)'#010+
-  '3*2Anasmobj_Obj file using Nasm'#010+
+  '3*2Anasmobj_Obj file using Nasm'#010,
   '3*2Amasm_Obj file using Masm (Microsoft)'#010+
   '3*2Amasm_Obj file using Masm (Microsoft)'#010+
   '3*2Atasm_Obj file using Tasm (Borland)'#010+
   '3*2Atasm_Obj file using Tasm (Borland)'#010+
-  '3*2Aelf_ELF (Linux) using int','ernal writer'#010+
+  '3*2Aelf_ELF (Linux) using internal writer'#010+
   '3*2Acoff_COFF (Go32v2) 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+
+  '4*2Aas_Assemble using GN','U AS'#010+
   '6*2Aas_Unix o-file using GNU AS'#010+
   '6*2Aas_Unix o-file using GNU AS'#010+
   '6*2Agas_GNU Motorola assembler'#010+
   '6*2Agas_GNU Motorola assembler'#010+
   '6*2Amit_MIT Syntax (old GAS)'#010+
   '6*2Amit_MIT Syntax (old GAS)'#010+
-  '6*2Amot_Stan','dard Motorola assembler'#010+
+  '6*2Amot_Standard Motorola assembler'#010+
   'A*2Aas_Assemble using GNU AS'#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+
   'S*2Aas_Assemble using GNU AS'#010+
-  '**1b_Generate browser info'#010+
+  '**1b_Generate browse','r info'#010+
   '**2bl_Generate local symbol info'#010+
   '**2bl_Generate local symbol info'#010+
   '**1B_Build all modules'#010+
   '**1B_Build all modules'#010+
   '**1C<x>_Code generation options:'#010+
   '**1C<x>_Code generation options:'#010+
-  '**2Ca<x>_Sele','ct ABI, see fpc -i for possible values'#010+
+  '**2Ca<x>_Select ABI, see fpc -i for possible values'#010+
   '**2Cb_Generate big-endian code'#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+
+  '**2CD_Create a','lso dynamic library (not supported)'#010+
   '**2Ce_Compilation with emulated floating point opcodes'#010+
   '**2Ce_Compilation with emulated floating point opcodes'#010+
-  '**2Cf<x>_Select fp','u instruction set to use, see fpc -i for possible '+
-  'values'#010+
+  '**2Cf<x>_Select fpu instruction set to use, see fpc -i for possible va'+
+  'lues'#010+
   '**2CF<x>_Minimal floating point constant precision (default, 32, 64)'#010+
   '**2CF<x>_Minimal floating point constant precision (default, 32, 64)'#010+
-  '**2Cg_Generate PIC code'#010+
+  '**2Cg','_Generate PIC code'#010+
   '**2Ch<n>_<n> bytes heap (between 1023 and 67107840)'#010+
   '**2Ch<n>_<n> bytes heap (between 1023 and 67107840)'#010+
   '**2Ci_IO-checking'#010+
   '**2Ci_IO-checking'#010+
-  '**2Cn_Omit linking s','tage'#010+
+  '**2Cn_Omit linking stage'#010+
   '**2Co_Check overflow of integer operations'#010+
   '**2Co_Check overflow of integer operations'#010+
   '**2CO_Check for possible overflow of integer operations'#010+
   '**2CO_Check for possible overflow of integer operations'#010+
-  '**2Cp<x>_Select instruction set, see fpc -i for possible values'#010+
+  '**2Cp<x>_Select instruction',' set, see fpc -i for possible values'#010+
   '**2CP<x>=<y>_ packing settings'#010+
   '**2CP<x>=<y>_ packing settings'#010+
-  '**3CPPACKSET=<y>_ <y> set allocation: 0, ','1 or DEFAULT or NORMAL, 2, '+
-  '4 and 8'#010+
+  '**3CPPACKSET=<y>_ <y> set allocation: 0, 1 or DEFAULT or NORMAL, 2, 4 '+
+  'and 8'#010+
   '**2Cr_Range checking'#010+
   '**2Cr_Range checking'#010+
   '**2CR_Verify object method call validity'#010+
   '**2CR_Verify object method call validity'#010+
-  '**2Cs<n>_Set stack checking size to <n>'#010+
+  '**2Cs<n>_Set stack checking size t','o <n>'#010+
   '**2Ct_Stack checking (for testing only, see manual)'#010+
   '**2Ct_Stack checking (for testing only, see manual)'#010+
   '**2CX_Create also smartlinked library'#010+
   '**2CX_Create also smartlinked library'#010+
-  '**1d<x>_Defin','es the symbol <x>'#010+
+  '**1d<x>_Defines the symbol <x>'#010+
   '**1D_Generate a DEF file'#010+
   '**1D_Generate a DEF file'#010+
   '**2Dd<x>_Set description to <x>'#010+
   '**2Dd<x>_Set description to <x>'#010+
   '**2Dv<x>_Set DLL version to <x>'#010+
   '**2Dv<x>_Set DLL version to <x>'#010+
   '*O2Dw_PM application'#010+
   '*O2Dw_PM application'#010+
-  '**1e<x>_Set path to executable'#010+
+  '**1','e<x>_Set path to executable'#010+
   '**1E_Same as -Cn'#010+
   '**1E_Same as -Cn'#010+
   '**1fPIC_Same as -Cg'#010+
   '**1fPIC_Same as -Cg'#010+
   '**1F<x>_Set file names and paths:'#010+
   '**1F<x>_Set file names and paths:'#010+
-  '**2Fa<x>[,','y]_(for a program) load units <x> and [y] before uses is p'+
-  'arsed'#010+
+  '**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 input codepage to <x>'#010+
-  '**2FC<x>_Set RC compiler binary name to <x>'#010+
+  '**2FC<x>_Set RC compiler binary ','name to <x>'#010+
   '**2Fd_Disable the compiler'#039's internal directory cache'#010+
   '**2Fd_Disable the compiler'#039's internal directory cache'#010+
-  '**2FD<x>_Set the directory where to search ','for compiler utilities'#010+
+  '**2FD<x>_Set the directory where to search for compiler utilities'#010+
   '**2Fe<x>_Redirect error output to <x>'#010+
   '**2Fe<x>_Redirect error output to <x>'#010+
   '**2Ff<x>_Add <x> to framework path (Darwin only)'#010+
   '**2Ff<x>_Add <x> to framework path (Darwin only)'#010+
-  '**2FE<x>_Set exe/unit output path to <x>'#010+
+  '**2FE<x>_Set exe/unit',' output path to <x>'#010+
   '**2Fi<x>_Add <x> to include path'#010+
   '**2Fi<x>_Add <x> to include path'#010+
   '**2Fl<x>_Add <x> to library path'#010+
   '**2Fl<x>_Add <x> to library path'#010+
-  '**2FL<x>_Use <x> as dyn','amic linker'#010+
+  '**2FL<x>_Use <x> as dynamic linker'#010+
   '**2Fm<x>_Load unicode conversion table from <x>.txt in the compiler di'+
   '**2Fm<x>_Load unicode conversion table from <x>.txt in the compiler di'+
   'r'#010+
   'r'#010+
   '**2Fo<x>_Add <x> to object path'#010+
   '**2Fo<x>_Add <x> to object path'#010+
-  '**2Fr<x>_Load error message file <x>'#010+
+  '**2Fr<x>_Load e','rror message file <x>'#010+
   '**2FR<x>_Set resource (.res) linker to <x>'#010+
   '**2FR<x>_Set resource (.res) linker to <x>'#010+
   '**2Fu<x>_Add <x> to unit path'#010+
   '**2Fu<x>_Add <x> to unit path'#010+
-  '**2FU<x>_Set u','nit output path to <x>, overrides -FE'#010+
+  '**2FU<x>_Set unit output path to <x>, overrides -FE'#010+
   '**2FW<x>_Store generated whole-program optimization feedback in <x>'#010+
   '**2FW<x>_Store generated whole-program optimization feedback in <x>'#010+
-  '**2Fw<x>_Load previously stored whole-program optimization feedback fr'+
-  'om <x>'#010+
-  '*g1g_Generate debug information (default format for targe','t)'#010+
+  '**2Fw<x>_Load previously ','stored whole-program optimization feedback '+
+  'from <x>'#010+
+  '*g1g_Generate debug information (default format for target)'#010+
   '*g2gc_Generate checks for pointers'#010+
   '*g2gc_Generate checks for pointers'#010+
   '*g2gh_Use heaptrace unit (for memory leak/corruption debugging)'#010+
   '*g2gh_Use heaptrace unit (for memory leak/corruption debugging)'#010+
-  '*g2gl_Use line info unit (show more info with backtraces)'#010+
+  '*g2gl_Use line info unit (sho','w more info with backtraces)'#010+
   '*g2go<x>_Set debug information options'#010+
   '*g2go<x>_Set debug information options'#010+
-  '*g3godwarfsets_ Enable DWARF set debug in','formation (breaks gdb < 6.5'+
-  ')'#010+
+  '*g3godwarfsets_ Enable DWARF set debug information (breaks gdb < 6.5)'#010+
   '*g3gostabsabsincludes_ Store absolute/full include file paths in Stabs'+
   '*g3gostabsabsincludes_ Store absolute/full include file paths in Stabs'+
   #010+
   #010+
-  '*g2gp_Preserve case in stabs symbol names'#010+
+  '*g2gp_Preserve case in stabs sy','mbol names'#010+
   '*g2gs_Generate Stabs debug information'#010+
   '*g2gs_Generate Stabs debug information'#010+
-  '*g2gt_Trash local variables (to detect uninitialized uses)'#010,
+  '*g2gt_Trash local variables (to detect uninitialized uses)'#010+
   '*g2gv_Generates programs traceable with Valgrind'#010+
   '*g2gv_Generates programs traceable with Valgrind'#010+
   '*g2gw_Generate DWARFv2 debug information (same as -gw2)'#010+
   '*g2gw_Generate DWARFv2 debug information (same as -gw2)'#010+
-  '*g2gw2_Generate DWARFv2 debug information'#010+
+  '*g2gw2_Generate DWARFv2 de','bug information'#010+
   '*g2gw3_Generate DWARFv3 debug information'#010+
   '*g2gw3_Generate DWARFv3 debug information'#010+
   '**1i_Information'#010+
   '**1i_Information'#010+
   '**2iD_Return compiler date'#010+
   '**2iD_Return compiler date'#010+
-  '**2iV_R','eturn short compiler version'#010+
+  '**2iV_Return short compiler version'#010+
   '**2iW_Return full compiler version'#010+
   '**2iW_Return full compiler version'#010+
   '**2iSO_Return compiler OS'#010+
   '**2iSO_Return compiler OS'#010+
   '**2iSP_Return compiler host processor'#010+
   '**2iSP_Return compiler host processor'#010+
-  '**2iTO_Return target OS'#010+
+  '**2','iTO_Return target OS'#010+
   '**2iTP_Return target processor'#010+
   '**2iTP_Return target processor'#010+
   '**1I<x>_Add <x> to include path'#010+
   '**1I<x>_Add <x> to include path'#010+
-  '**1k<x>_Pass <x> to the l','inker'#010+
+  '**1k<x>_Pass <x> to the linker'#010+
   '**1l_Write logo'#010+
   '**1l_Write logo'#010+
   '**1M<x>_Set language mode to <x>'#010+
   '**1M<x>_Set language mode to <x>'#010+
   '**2Mfpc_Free Pascal dialect (default)'#010+
   '**2Mfpc_Free Pascal dialect (default)'#010+
-  '**2Mobjfpc_FPC mode with Object Pascal support'#010+
+  '**2Mobjfpc_FPC mode with Object Pascal',' support'#010+
   '**2Mdelphi_Delphi 7 compatibility mode'#010+
   '**2Mdelphi_Delphi 7 compatibility mode'#010+
   '**2Mtp_TP/BP 7.0 compatibility mode'#010+
   '**2Mtp_TP/BP 7.0 compatibility mode'#010+
-  '**2Mmacpas_Macintosh Pasc','al dialects compatibility mode'#010+
+  '**2Mmacpas_Macintosh Pascal dialects compatibility mode'#010+
   '**1n_Do not read the default config files'#010+
   '**1n_Do not read the default config files'#010+
   '**1N<x>_Node tree optimizations'#010+
   '**1N<x>_Node tree optimizations'#010+
   '**2Nu_Unroll loops'#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+
   '**1O<x>_Optimizations:'#010+
   '**2O-_Disable optimizations'#010+
   '**2O-_Disable optimizations'#010+
-  '**2O1_L','evel 1 optimizations (quick and debugger friendly)'#010+
+  '**2O1_Level 1 optimizations (quick and debugger friendly)'#010+
   '**2O2_Level 2 optimizations (-O1 + quick optimizations)'#010+
   '**2O2_Level 2 optimizations (-O1 + quick optimizations)'#010+
-  '**2O3_Level 3 optimizations (-O2 + slow optimizations)'#010+
+  '**2O3_Level 3 optimizati','ons (-O2 + slow optimizations)'#010+
   '**2Oa<x>=<y>_Set alignment'#010+
   '**2Oa<x>=<y>_Set alignment'#010+
-  '**2Oo[NO]<x>_Enable or disable optimizations, see f','pc -i for possibl'+
-  'e values'#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'+
   '**2Op<x>_Set target cpu for optimizing, see fpc -i for possible values'+
   #010+
   #010+
-  '**2OW<x>_Generate whole-program optimization feedback for optimization'+
-  ' <x>, see fpc -i for possible values'#010+
-  '**2Ow<x>_Perform whole-program optim','ization <x>, see fpc -i for poss'+
-  'ible values'#010+
+  '**2OW<x>_Generate whole-program op','timization feedback for optimizati'+
+  'on <x>, see fpc -i for possible values'#010+
+  '**2Ow<x>_Perform whole-program optimization <x>, see fpc -i for possib'+
+  'le values'#010+
   '**2Os_Optimize for size rather than speed'#010+
   '**2Os_Optimize for size rather than speed'#010+
-  '**1pg_Generate profile code for gprof (defines FPC_PROFILE)'#010+
+  '**1pg_Generate profile code for gprof (define','s FPC_PROFILE)'#010+
   '**1R<x>_Assembler reading style:'#010+
   '**1R<x>_Assembler reading style:'#010+
   '**2Rdefault_Use default assembler for target'#010+
   '**2Rdefault_Use default assembler for target'#010+
-  '3*2Ratt_Read AT&','T style assembler'#010+
+  '3*2Ratt_Read AT&T style assembler'#010+
   '3*2Rintel_Read Intel style assembler'#010+
   '3*2Rintel_Read Intel style assembler'#010+
   '6*2RMOT_Read motorola 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+
+  '**2S2_Same as ','-Mobjfpc'#010+
   '**2Sc_Support operators like C (*=,+=,/= and -=)'#010+
   '**2Sc_Support operators like C (*=,+=,/= and -=)'#010+
   '**2Sa_Turn on assertions'#010+
   '**2Sa_Turn on assertions'#010+
   '**2Sd_Same as -Mdelphi'#010+
   '**2Sd_Same as -Mdelphi'#010+
-  '**2','Se<x>_Error options. <x> is a combination of the following:'#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 the <n> errors (default is 1)'#010+
-  '**3*_w : Compiler also halts after warnings'#010+
+  '**3*_w : ','Compiler also halts after warnings'#010+
   '**3*_n : Compiler also halts after notes'#010+
   '**3*_n : Compiler also halts after notes'#010+
-  '**3*_h : Compiler also halts afte','r hints'#010+
+  '**3*_h : Compiler also halts after hints'#010+
   '**2Sg_Enable LABEL and GOTO (default in -Mtp and -Mdelphi)'#010+
   '**2Sg_Enable LABEL and GOTO (default in -Mtp and -Mdelphi)'#010+
   '**2Sh_Use ansistrings by default instead of shortstrings'#010+
   '**2Sh_Use ansistrings by default instead of shortstrings'#010+
-  '**2Si_Turn on inlining of procedures/functions declared as "inline"'#010+
+  '**2Si_T','urn on inlining of procedures/functions declared as "inline"'#010+
   '**2Sk_Load fpcylix unit'#010+
   '**2Sk_Load fpcylix unit'#010+
-  '**2SI<x>_Set interface s','tyle to <x>'#010+
+  '**2SI<x>_Set interface style to <x>'#010+
   '**3SIcom_COM compatible interface (default)'#010+
   '**3SIcom_COM compatible interface (default)'#010+
   '**3SIcorba_CORBA compatible interface'#010+
   '**3SIcorba_CORBA compatible interface'#010+
-  '**2Sm_Support macros like C (global)'#010+
+  '**2Sm_Support macros like C (global)'#010,
   '**2So_Same as -Mtp'#010+
   '**2So_Same as -Mtp'#010+
   '**2Ss_Constructor name must be init (destructor must be done)'#010+
   '**2Ss_Constructor name must be init (destructor must be done)'#010+
-  '**2St_Allow static keyword i','n objects'#010+
+  '**2St_Allow static keyword in objects'#010+
   '**2Sx_Enable exception keywords (default in Delphi/ObjFPC modes)'#010+
   '**2Sx_Enable exception keywords (default in Delphi/ObjFPC modes)'#010+
   '**1s_Do not call assembler and linker'#010+
   '**1s_Do not call assembler and linker'#010+
-  '**2sh_Generate script to link on host'#010+
+  '**2sh_Generate scr','ipt to link on host'#010+
   '**2st_Generate script to link on target'#010+
   '**2st_Generate script to link on target'#010+
-  '**2sr_Skip register allocation phase (use with -a','lr)'#010+
+  '**2sr_Skip register allocation phase (use with -alr)'#010+
   '**1T<x>_Target operating system:'#010+
   '**1T<x>_Target operating system:'#010+
   '3*2Temx_OS/2 via EMX (including EMX/RSX extender)'#010+
   '3*2Temx_OS/2 via EMX (including EMX/RSX extender)'#010+
   '3*2Tfreebsd_FreeBSD'#010+
   '3*2Tfreebsd_FreeBSD'#010+
-  '3*2Tgo32v2_Version 2 of DJ Delorie DOS extender'#010+
+  '3*2Tgo32v2_Version 2 of ','DJ Delorie DOS extender'#010+
   '3*2Tlinux_Linux'#010+
   '3*2Tlinux_Linux'#010+
   '3*2Tnetbsd_NetBSD'#010+
   '3*2Tnetbsd_NetBSD'#010+
   '3*2Tnetware_Novell Netware Module (clib)'#010+
   '3*2Tnetware_Novell Netware Module (clib)'#010+
-  '3*2Tnetwli','bc_Novell Netware Module (libc)'#010+
+  '3*2Tnetwlibc_Novell Netware Module (libc)'#010+
   '3*2Topenbsd_OpenBSD'#010+
   '3*2Topenbsd_OpenBSD'#010+
   '3*2Tos2_OS/2 / eComStation'#010+
   '3*2Tos2_OS/2 / eComStation'#010+
   '3*2Tsunos_SunOS/Solaris'#010+
   '3*2Tsunos_SunOS/Solaris'#010+
   '3*2Tsymbian_Symbian OS'#010+
   '3*2Tsymbian_Symbian OS'#010+
-  '3*2Twatcom_Watcom compatible DOS extender'#010+
+  '3*2Tw','atcom_Watcom compatible DOS extender'#010+
   '3*2Twdosx_WDOSX DOS extender'#010+
   '3*2Twdosx_WDOSX DOS extender'#010+
   '3*2Twin32_Windows 32 Bit'#010+
   '3*2Twin32_Windows 32 Bit'#010+
-  '3*2Twince_Windows ','CE'#010+
+  '3*2Twince_Windows CE'#010+
   '4*2Tlinux_Linux'#010+
   '4*2Tlinux_Linux'#010+
   '6*2Tamiga_Commodore Amiga'#010+
   '6*2Tamiga_Commodore Amiga'#010+
   '6*2Tatari_Atari ST/STe/TT'#010+
   '6*2Tatari_Atari ST/STe/TT'#010+
   '6*2Tlinux_Linux/m68k'#010+
   '6*2Tlinux_Linux/m68k'#010+
-  '6*2Tmacos_Macintosh m68k (not supported)'#010+
+  '6*2Tmacos_Macintosh m68k (not supported',')'#010+
   '6*2Tpalmos_PalmOS'#010+
   '6*2Tpalmos_PalmOS'#010+
   'A*2Tlinux_Linux'#010+
   'A*2Tlinux_Linux'#010+
   'A*2Twince_Windows CE'#010+
   'A*2Twince_Windows CE'#010+
   'P*2Tamiga_AmigaOS on PowerPC'#010+
   'P*2Tamiga_AmigaOS on PowerPC'#010+
-  'P*2Tdarwin_Darwin and M','ac OS X on PowerPC'#010+
+  'P*2Tdarwin_Darwin and Mac OS X on PowerPC'#010+
   'P*2Tlinux_Linux on PowerPC'#010+
   'P*2Tlinux_Linux on PowerPC'#010+
   'P*2Tmacos_Mac OS (classic) on PowerPC'#010+
   'P*2Tmacos_Mac OS (classic) on PowerPC'#010+
   'P*2Tmorphos_MorphOS'#010+
   'P*2Tmorphos_MorphOS'#010+
   'S*2Tlinux_Linux'#010+
   'S*2Tlinux_Linux'#010+
-  '**1u<x>_Undefines the symbol <x>'#010+
+  '**1u<x>_Und','efines the symbol <x>'#010+
   '**1U_Unit options:'#010+
   '**1U_Unit options:'#010+
   '**2Un_Do not check where the unit name matches the file name'#010+
   '**2Un_Do not check where the unit name matches the file name'#010+
-  '**2Ur_G','enerate release unit files (never automatically recompiled)'#010+
+  '**2Ur_Generate release unit files (never automatically recompiled)'#010+
   '**2Us_Compile a system unit'#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*_e : Show errors (default)       0 : Show nothing (except errors)'#010+
-  '**2*_w : Show w','arnings               u : Show unit info'#010+
+  '**2*_w : Show warnings               u : Show unit info'#010+
   '**2*_n : Show notes                  t : Show tried/used files'#010+
   '**2*_n : Show notes                  t : Show tried/used files'#010+
-  '**2*_h : Show hints                  c : Show conditionals'#010+
+  '**2*_h : Show hints        ','          c : Show conditionals'#010+
   '**2*_i : Show general info           d : Show debug info'#010+
   '**2*_i : Show general info           d : Show debug info'#010+
-  '**2*_l : Show linenu','mbers            r : Rhide/GCC compatibility mod'+
-  'e'#010+
+  '**2*_l : Show linenumbers            r : Rhide/GCC compatibility mode'#010+
   '**2*_s : Show time stamps            q : Show message numbers'#010+
   '**2*_s : Show time stamps            q : Show message numbers'#010+
-  '**2*_a : Show everything             x : Executable info (Win32 only)'#010+
-  '**2*_b : Write file names messages   p : Write tree.log wi','th parse t'+
-  'ree'#010+
+  '**2*_a : Show every','thing             x : Executable info (Win32 only'+
+  ')'#010+
+  '**2*_b : Write file names messages   p : Write tree.log with parse tre'+
+  'e'#010+
   '**2*_    with full path              v : Write fpcdebug.txt with'#010+
   '**2*_    with full path              v : Write fpcdebug.txt with'#010+
-  '**2*_                                    lots of debugging info'#010+
+  '**2*_                                    lots of deb','ugging info'#010+
   '**2*_m<x>,<y> : Don'#039't show messages numbered <x> and <y>'#010+
   '**2*_m<x>,<y> : Don'#039't show messages numbered <x> and <y>'#010+
-  '3*1W<x>_Target-specific options (targets',')'#010+
+  '3*1W<x>_Target-specific options (targets)'#010+
   'A*1W<x>_Target-specific options (targets)'#010+
   'A*1W<x>_Target-specific options (targets)'#010+
   'P*1W<x>_Target-specific options (targets)'#010+
   'P*1W<x>_Target-specific options (targets)'#010+
   'p*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+
+  '3*2','Wb_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_Cr','eate a bundle instead of a library (Darwin)'#010+
+  'p*2Wb_Create a bundle instead of a library (Darwin)'#010+
   '3*2WB_Create a relocatable image (Windows)'#010+
   '3*2WB_Create a relocatable image (Windows)'#010+
-  'A*2WB_Create a relocatable image (Windows, Symbian)'#010+
+  'A*2WB_Create a relocatable image (Windows, S','ymbian)'#010+
   '3*2WC_Specify console type application (EMX, OS/2, Windows)'#010+
   '3*2WC_Specify console type application (EMX, OS/2, Windows)'#010+
-  'A*2WC_Specify console type application (W','indows)'#010+
+  'A*2WC_Specify console type application (Windows)'#010+
   'P*2WC_Specify console type application (Classic Mac OS)'#010+
   'P*2WC_Specify console type application (Classic Mac OS)'#010+
   '3*2WD_Use DEFFILE to export functions of DLL or EXE (Windows)'#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+
+  'A*2WD','_Use DEFFILE to export functions of DLL or EXE (Windows)'#010+
   '3*2We_Use external resources (Darwin)'#010+
   '3*2We_Use external resources (Darwin)'#010+
-  'P*2We_Use exte','rnal resources (Darwin)'#010+
+  'P*2We_Use external resources (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+
+  '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+
+  'P*2WG_Specify graphic type application (Classic Mac OS)'#010+
   '3*2Wi_Use internal resources (Darwin)'#010+
   '3*2Wi_Use internal resources (Darwin)'#010+
   'P*2Wi_Use internal resources (Darwin)'#010+
   'P*2Wi_Use internal resources (Darwin)'#010+
-  'p*2Wi_Use internal resources (Darwin)'#010+
+  'p*2Wi_Use int','ernal 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 g','enerate relocation code, needed for debugging (Windows'+
-  ')'#010+
+  'A*2WN_Do not generate relocation code, needed for debugging (Windows)'#010+
   '3*2WR_Generate relocation code (Windows)'#010+
   '3*2WR_Generate relocation code (Windows)'#010+
-  'A*2WR_Generate relocation code (Windows)'#010+
+  'A*2WR_Generate relocation code (Wi','ndows)'#010+
   'P*2WT_Specify MPW tool type application (Classic Mac OS)'#010+
   'P*2WT_Specify MPW tool type application (Classic Mac OS)'#010+
   '3*2WX_Enable executable stack (Linux)'#010+
   '3*2WX_Enable executable stack (Linux)'#010+
-  'A*2WX_E','nable executable stack (Linux)'#010+
+  'A*2WX_Enable executable stack (Linux)'#010+
   'p*2WX_Enable executable stack (Linux)'#010+
   'p*2WX_Enable executable stack (Linux)'#010+
   'P*2WX_Enable executable stack (Linux)'#010+
   'P*2WX_Enable executable stack (Linux)'#010+
-  '**1X_Executable options:'#010+
+  '**1X_Executable options:',#010+
   '**2Xc_Pass --shared/-dynamic to the linker (BeOS, Darwin, FreeBSD, Lin'+
   '**2Xc_Pass --shared/-dynamic to the linker (BeOS, Darwin, FreeBSD, Lin'+
   'ux)'#010+
   '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+
   '**2Xe_Use external linker'#010+
-  '**2Xg_Create debuginfo in a separate file and add a debuglink section '+
-  'to executable'#010+
+  '**2Xg_Create debuginfo in a separate file and add a debuglink sect','io'+
+  'n to executable'#010+
   '**2XD_Try to link units dynamically      (defines FPC_LINK_DYNAMIC)'#010+
   '**2XD_Try to link units dynamically      (defines FPC_LINK_DYNAMIC)'#010+
-  '**2Xi_Use internal link','er'#010+
+  '**2Xi_Use internal linker'#010+
   '**2Xm_Generate link map'#010+
   '**2Xm_Generate link map'#010+
   '**2XM<x>_Set the name of the '#039'main'#039' program routine (default i'+
   '**2XM<x>_Set the name of the '#039'main'#039' program routine (default i'+
   's '#039'main'#039')'#010+
   's '#039'main'#039')'#010+
-  '**2XP<x>_Prepend the binutils names with the prefix <x>'#010+
+  '**2XP<x>_Prepend the binutils na','mes with the prefix <x>'#010+
   '**2Xr<x>_Set the linker'#039's rlink-path to <x> (needed for cross comp'+
   '**2Xr<x>_Set the linker'#039's rlink-path to <x> (needed for cross comp'+
-  'ile, see the ld man','ual for more information) (BeOS, Linux)'#010+
+  'ile, see the ld manual for more information) (BeOS, Linux)'#010+
   '**2XR<x>_Prepend <x> to all linker search paths (BeOS, Darwin, FreeBSD'+
   '**2XR<x>_Prepend <x> to all linker search paths (BeOS, Darwin, FreeBSD'+
-  ', Linux, Mac OS, Solaris)'#010+
+  ', Linux, Mac OS, Sola','ris)'#010+
   '**2Xs_Strip all symbols from executable'#010+
   '**2Xs_Strip all symbols from executable'#010+
-  '**2XS_Try to link units statically (default, defines FPC_LINK_ST','ATIC'+
-  ')'#010+
+  '**2XS_Try to link units statically (default, defines FPC_LINK_STATIC)'#010+
   '**2Xt_Link with 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+
+  '**2XX_Try to smartlink units             (defines FPC_LINK_SMA','RT)'#010+
   '**1*_'#010+
   '**1*_'#010+
   '**1?_Show this help'#010+
   '**1?_Show this help'#010+
   '**1h_Shows this help without waiting'
   '**1h_Shows this help without waiting'

+ 14 - 4
compiler/nobj.pas

@@ -281,8 +281,12 @@ implementation
             if (po_virtualmethod in vmtpd.procoptions) and
             if (po_virtualmethod in vmtpd.procoptions) and
                (
                (
                 not(po_virtualmethod in pd.procoptions) or
                 not(po_virtualmethod in pd.procoptions) or
-                { new one has not override }
-                (is_class_or_interface_or_objc(_class) and not(po_overridingmethod in pd.procoptions))
+                (
+                 { new one does not have reintroduce in case of an objccategory }
+                 (is_objccategory(_class) and not(po_reintroduce in pd.procoptions)) or
+                 { new one does not have override in case of objpas/objc class/intf/proto }
+                 (is_class_or_interface_or_objc(_class) and not is_objccategory(_class) and not(po_overridingmethod in pd.procoptions))
+                )
                ) then
                ) then
               begin
               begin
                 if (
                 if (
@@ -305,12 +309,18 @@ implementation
                             because requiring override everywhere may make
                             because requiring override everywhere may make
                             automated header translation tools too complex.  }
                             automated header translation tools too complex.  }
                           if not(oo_is_external in _class.objectoptions) then
                           if not(oo_is_external in _class.objectoptions) then
-                            MessagePos1(pd.fileinfo,parser_e_must_use_override_objc,pd.fullprocname(false))
+                            if not is_objccategory(_class) then
+                              MessagePos1(pd.fileinfo,parser_e_must_use_override_objc,pd.fullprocname(false))
+                            else
+                              MessagePos1(pd.fileinfo,parser_e_must_use_reintroduce_objc,pd.fullprocname(false))
                           { there may be a lot of these in auto-translated
                           { there may be a lot of these in auto-translated
                             heaeders, so only calculate the fullprocname if
                             heaeders, so only calculate the fullprocname if
                             the hint will be shown  }
                             the hint will be shown  }
                           else if CheckVerbosity(V_Hint) then
                           else if CheckVerbosity(V_Hint) then
-                            MessagePos1(pd.fileinfo,parser_h_should_use_override_objc,pd.fullprocname(false));
+                            if not is_objccategory(_class) then
+                              MessagePos1(pd.fileinfo,parser_h_should_use_override_objc,pd.fullprocname(false))
+                            else
+                              MessagePos1(pd.fileinfo,parser_h_should_use_reintroduce_objc,pd.fullprocname(false));
                           { no new entry, but copy the message name if any from
                           { no new entry, but copy the message name if any from
                             the procdef in the parent class }
                             the procdef in the parent class }
                           check_msg_str(vmtpd,pd);
                           check_msg_str(vmtpd,pd);

+ 198 - 43
compiler/objcgutl.pas

@@ -56,13 +56,16 @@ implementation
     tobjcrttiwriter = class
     tobjcrttiwriter = class
      protected
      protected
       fabi: tobjcabi;
       fabi: tobjcabi;
-      classdefs: tfpobjectlist;
-      classsyms: tfpobjectlist;
+      classdefs,
+      catdefs: tfpobjectlist;
+      classsyms,
+      catsyms: tfpobjectlist;
       procedure gen_objc_methods(list: tasmlist; objccls: tobjectdef; out methodslabel: tasmlabel; classmethods, iscategory: Boolean);
       procedure gen_objc_methods(list: tasmlist; objccls: tobjectdef; out methodslabel: tasmlabel; classmethods, iscategory: Boolean);
       procedure gen_objc_protocol_list(list:TAsmList; protolist: TFPObjectList; out protolistsym: TAsmLabel);
       procedure gen_objc_protocol_list(list:TAsmList; protolist: TFPObjectList; out protolistsym: TAsmLabel);
       procedure gen_objc_cat_methods(list:TAsmList; items: TFPObjectList; section: tasmsectiontype;const sectname: string; out listsym: TAsmLabel);
       procedure gen_objc_cat_methods(list:TAsmList; items: TFPObjectList; section: tasmsectiontype;const sectname: string; out listsym: TAsmLabel);
 
 
       procedure gen_objc_protocol(list:TAsmList; protocol: tobjectdef; out protocollabel: TAsmSymbol);virtual;abstract;
       procedure gen_objc_protocol(list:TAsmList; protocol: tobjectdef; out protocollabel: TAsmSymbol);virtual;abstract;
+      procedure gen_objc_category_sections(list:TAsmList; objccat: tobjectdef; out catlabel: TAsmSymbol);virtual;abstract;
       procedure gen_objc_classes_sections(list:TAsmList; objclss: tobjectdef; out classlabel: TAsmSymbol);virtual;abstract;
       procedure gen_objc_classes_sections(list:TAsmList; objclss: tobjectdef; out classlabel: TAsmSymbol);virtual;abstract;
       procedure gen_objc_info_sections(list: tasmlist);virtual;abstract;
       procedure gen_objc_info_sections(list: tasmlist);virtual;abstract;
      public
      public
@@ -78,6 +81,7 @@ implementation
      protected
      protected
       procedure gen_objc_ivars(list: TAsmList; objccls: tobjectdef; out ivarslabel: TAsmLabel);
       procedure gen_objc_ivars(list: TAsmList; objccls: tobjectdef; out ivarslabel: TAsmLabel);
       procedure gen_objc_protocol(list:TAsmList; protocol: tobjectdef; out protocollabel: TAsmSymbol);override;
       procedure gen_objc_protocol(list:TAsmList; protocol: tobjectdef; out protocollabel: TAsmSymbol);override;
+      procedure gen_objc_category_sections(list:TAsmList; objccat: tobjectdef; out catlabel: TAsmSymbol);override;
       procedure gen_objc_classes_sections(list:TAsmList; objclss: tobjectdef; out classlabel: TAsmSymbol);override;
       procedure gen_objc_classes_sections(list:TAsmList; objclss: tobjectdef; out classlabel: TAsmSymbol);override;
       procedure gen_objc_info_sections(list: tasmlist);override;
       procedure gen_objc_info_sections(list: tasmlist);override;
      public
      public
@@ -96,6 +100,7 @@ implementation
 
 
       procedure gen_objc_ivars(list: TAsmList; objccls: tobjectdef; out ivarslabel: TAsmLabel);
       procedure gen_objc_ivars(list: TAsmList; objccls: tobjectdef; out ivarslabel: TAsmLabel);
       procedure gen_objc_protocol(list:TAsmList; protocol: tobjectdef; out protocollabel: TAsmSymbol);override;
       procedure gen_objc_protocol(list:TAsmList; protocol: tobjectdef; out protocollabel: TAsmSymbol);override;
+      procedure gen_objc_category_sections(list:TAsmList; objccat: tobjectdef; out catlabel: TAsmSymbol);override;
       procedure gen_objc_classes_sections(list:TAsmList; objclss: tobjectdef; out classlabel: TAsmSymbol);override;
       procedure gen_objc_classes_sections(list:TAsmList; objclss: tobjectdef; out classlabel: TAsmSymbol);override;
       procedure gen_objc_info_sections(list: tasmlist);override;
       procedure gen_objc_info_sections(list: tasmlist);override;
      public
      public
@@ -277,7 +282,7 @@ procedure tobjcrttiwriter.gen_objc_methods(list: tasmlist; objccls: tobjectdef;
     for i:=0 to objccls.vmtentries.count-1 do
     for i:=0 to objccls.vmtentries.count-1 do
       begin
       begin
         def:=pvmtentry(objccls.vmtentries[i])^.procdef;
         def:=pvmtentry(objccls.vmtentries[i])^.procdef;
-        if Assigned(def.procstarttai) and
+        if (def.owner.defowner=objccls) and
            (classmethods = (po_classmethod in def.procoptions)) then
            (classmethods = (po_classmethod in def.procoptions)) then
           begin
           begin
             defs[mcnt].def:=def;
             defs[mcnt].def:=def;
@@ -290,9 +295,9 @@ procedure tobjcrttiwriter.gen_objc_methods(list: tasmlist; objccls: tobjectdef;
       exit;
       exit;
 
 
     if iscategory then
     if iscategory then
-      new_section(list,clsSectType[classmethods],clsSectName[classmethods],sizeof(ptrint))
+      new_section(list,catSectType[classmethods],catSectName[classmethods],sizeof(ptrint))
     else
     else
-      new_section(list,catSectType[classmethods],catSectName[classmethods],sizeof(ptrint));
+      new_section(list,clsSectType[classmethods],clsSectName[classmethods],sizeof(ptrint));
 
 
     current_asmdata.getlabel(methodslabel,alt_data);
     current_asmdata.getlabel(methodslabel,alt_data);
     list.Concat(tai_label.Create(methodslabel));
     list.Concat(tai_label.Create(methodslabel));
@@ -441,9 +446,18 @@ procedure tobjcrttiwriter.gen_objc_rtti_sections(list:TAsmList; st:TSymtable);
         if is_objcclass(def) and
         if is_objcclass(def) and
            not(oo_is_external in tobjectdef(def).objectoptions) then
            not(oo_is_external in tobjectdef(def).objectoptions) then
           begin
           begin
-            gen_objc_classes_sections(list,tobjectdef(def),sym);
-            classsyms.add(sym);
-            classdefs.add(def);
+            if not(oo_is_classhelper in tobjectdef(def).objectoptions) then
+              begin
+                gen_objc_classes_sections(list,tobjectdef(def),sym);
+                classsyms.add(sym);
+                classdefs.add(def);
+              end
+            else
+              begin
+                gen_objc_category_sections(list,tobjectdef(def),sym);
+                catsyms.add(sym);
+                catdefs.add(def);
+              end
           end;
           end;
       end;
       end;
   end;
   end;
@@ -454,6 +468,8 @@ constructor tobjcrttiwriter.create(_abi: tobjcabi);
     fabi:=_abi;
     fabi:=_abi;
     classdefs:=tfpobjectlist.create(false);
     classdefs:=tfpobjectlist.create(false);
     classsyms:=tfpobjectlist.create(false);
     classsyms:=tfpobjectlist.create(false);
+    catdefs:=tfpobjectlist.create(false);
+    catsyms:=tfpobjectlist.create(false);
   end;
   end;
 
 
 
 
@@ -461,6 +477,8 @@ destructor tobjcrttiwriter.destroy;
   begin
   begin
     classdefs.free;
     classdefs.free;
     classsyms.free;
     classsyms.free;
+    catdefs.free;
+    catsyms.free;
     inherited destroy;
     inherited destroy;
   end;
   end;
 
 
@@ -584,6 +602,61 @@ procedure tobjcrttiwriter_fragile.gen_objc_protocol(list:TAsmList; protocol: tob
   end;
   end;
 
 
 
 
+(*
+From Clang:
+
+  struct _objc_category {
+  char *category_name;
+  char *class_name;
+  struct _objc_method_list *instance_methods;
+  struct _objc_method_list *class_methods;
+  struct _objc_protocol_list *protocols;
+  uint32_t size; // <rdar://4585769>
+  struct _objc_property_list *instance_properties;
+  };
+*)
+
+{ Generate rtti for an Objective-C class and its meta-class. }
+procedure tobjcrttiwriter_fragile.gen_objc_category_sections(list:TAsmList; objccat: tobjectdef; out catlabel: TAsmSymbol);
+  var
+    instmthdlist,
+    clsmthdlist,
+    protolistsym  : TAsmLabel;
+    catstrsym,
+    clsstrsym,
+    catsym        : TAsmSymbol;
+  begin
+    { the category name }
+    catstrsym:=objcreatestringpoolentry(objccat.objextname^,sp_objcclassnames,sec_objc_class_names);
+
+    { the name of the class it extends }
+    clsstrsym:=objcreatestringpoolentry(objccat.childof.objextname^,sp_objcclassnames,sec_objc_class_names);
+
+    { generate the methods lists }
+    gen_objc_methods(list,objccat,instmthdlist,false,true);
+    gen_objc_methods(list,objccat,clsmthdlist,true,true);
+
+    { generate implemented protocols list }
+    gen_objc_protocol_list(list,objccat.ImplementedInterfaces,protolistsym);
+
+    { category declaration section }
+    new_section(list,sec_objc_category,'_OBJC_CATEGORY',sizeof(pint));
+    catsym:=current_asmdata.DefineAsmSymbol(objccat.rtti_mangledname(objcclassrtti),AB_LOCAL,AT_DATA);
+    list.Concat(tai_symbol.Create(catsym,0));
+
+    list.Concat(Tai_const.Create_sym(catstrsym));
+    list.Concat(Tai_const.Create_sym(clsstrsym));
+    ConcatSymOrNil(list,instmthdlist);
+    ConcatSymOrNil(list,clsmthdlist);
+    ConcatSymOrNil(list,protolistsym);
+    { size of this structure }
+    list.Concat(Tai_const.Create_32bit(28));
+    { properties, not yet supported }
+    list.Concat(Tai_const.Create_32bit(0));
+
+    catlabel:=catsym;
+  end;
+
 (*
 (*
 From Clang:
 From Clang:
 
 
@@ -604,6 +677,8 @@ From Clang:
   };
   };
 *)
 *)
 
 
+
+
 { Generate rtti for an Objective-C class and its meta-class. }
 { Generate rtti for an Objective-C class and its meta-class. }
 procedure tobjcrttiwriter_fragile.gen_objc_classes_sections(list:TAsmList; objclss: tobjectdef; out classlabel: TAsmSymbol);
 procedure tobjcrttiwriter_fragile.gen_objc_classes_sections(list:TAsmList; objclss: tobjectdef; out classlabel: TAsmSymbol);
   const
   const
@@ -705,7 +780,7 @@ procedure tobjcrttiwriter_fragile.gen_objc_classes_sections(list:TAsmList; objcl
     clssym:=current_asmdata.DefineAsmSymbol(objclss.rtti_mangledname(objcclassrtti),AB_LOCAL,AT_DATA);
     clssym:=current_asmdata.DefineAsmSymbol(objclss.rtti_mangledname(objcclassrtti),AB_LOCAL,AT_DATA);
     list.Concat(tai_symbol.Create(clssym,0));
     list.Concat(tai_symbol.Create(clssym,0));
 
 
-    { for class declaration: the is points to the meta-class declaration }
+    { for class declaration: the isa points to the meta-class declaration }
     list.Concat(Tai_const.Create_sym(metasym));
     list.Concat(Tai_const.Create_sym(metasym));
     { pointer to the super_class name if any, nil otherwise }
     { pointer to the super_class name if any, nil otherwise }
     if assigned(superStrSym) then
     if assigned(superStrSym) then
@@ -752,7 +827,8 @@ procedure tobjcrttiwriter_fragile.gen_objc_info_sections(list: tasmlist);
     parent: tobjectdef;
     parent: tobjectdef;
     superclasses: tfpobjectlist;
     superclasses: tfpobjectlist;
   begin
   begin
-    if (classsyms.count<>0) then
+    if (classsyms.count<>0) or
+       (catsyms.count<>0) then
       begin
       begin
         new_section(list,sec_objc_symbols,'_OBJC_SYMBOLS',sizeof(pint));
         new_section(list,sec_objc_symbols,'_OBJC_SYMBOLS',sizeof(pint));
         sym := current_asmdata.DefineAsmSymbol(target_asm.labelprefix+'_OBJC_SYMBOLS_$',AB_LOCAL,AT_DATA);
         sym := current_asmdata.DefineAsmSymbol(target_asm.labelprefix+'_OBJC_SYMBOLS_$',AB_LOCAL,AT_DATA);
@@ -766,11 +842,13 @@ procedure tobjcrttiwriter_fragile.gen_objc_info_sections(list: tasmlist);
         { From Clang: number of defined classes }
         { From Clang: number of defined classes }
         list.Concat(Tai_const.Create_16bit(classsyms.count));
         list.Concat(Tai_const.Create_16bit(classsyms.count));
         { From Clang: number of defined categories }
         { From Clang: number of defined categories }
-        list.Concat(Tai_const.Create_16bit(0));
+        list.Concat(Tai_const.Create_16bit(catsyms.count));
         { first all classes }
         { first all classes }
         for i:=0 to classsyms.count-1 do
         for i:=0 to classsyms.count-1 do
           list.Concat(Tai_const.Create_sym(tasmsymbol(classsyms[i])));
           list.Concat(Tai_const.Create_sym(tasmsymbol(classsyms[i])));
         { then all categories }
         { then all categories }
+        for i:=0 to catsyms.count-1 do
+          list.Concat(Tai_const.Create_sym(tasmsymbol(catsyms[i])));
      end
      end
     else
     else
       sym:=nil;
       sym:=nil;
@@ -801,10 +879,25 @@ procedure tobjcrttiwriter_fragile.gen_objc_info_sections(list: tasmlist);
             superclasses.add(parent);
             superclasses.add(parent);
           end;
           end;
       end;
       end;
+    for i:=0 to catdefs.count-1 do
+      begin
+        parent:=tobjectdef(catdefs[i]).childof;
+        { warning: linear search, performance hazard if large number of subclasses }
+        if assigned(parent) and
+           (superclasses.indexof(parent)=-1) then
+          begin
+            list.concat(tai_directive.create(asd_lazy_reference,'.objc_class_name_'+parent.objextname^));
+            superclasses.add(parent);
+          end;
+      end;
     superclasses.free;
     superclasses.free;
-    { reference symbols for all classes defined in this unit }
+    { reference symbols for all classes and categories defined in this unit }
     for i:=0 to classdefs.count-1 do
     for i:=0 to classdefs.count-1 do
       list.concat(tai_symbol.Createname_global_value('.objc_class_name_'+tobjectdef(classdefs[i]).objextname^,AT_DATA,0,0));
       list.concat(tai_symbol.Createname_global_value('.objc_class_name_'+tobjectdef(classdefs[i]).objextname^,AT_DATA,0,0));
+    for i:=0 to catdefs.count-1 do
+      list.concat(tai_symbol.Createname_global_value('.objc_category_name_'+
+        tobjectdef(catdefs[i]).childof.objextname^+'_'+
+        tobjectdef(catdefs[i]).objextname^,AT_DATA,0,0));
   end;
   end;
 
 
 
 
@@ -1043,6 +1136,55 @@ procedure tobjcrttiwriter_nonfragile.gen_objc_protocol(list: tasmlist; protocol:
     list.Concat(tai_directive.Create(asd_weak_definition,listsym.name));
     list.Concat(tai_directive.Create(asd_weak_definition,listsym.name));
   end;
   end;
 
 
+(*
+From Clang:
+/// struct _category_t {
+///   const char * const name;
+///   struct _class_t *const cls;
+///   const struct _method_list_t * const instance_methods;
+///   const struct _method_list_t * const class_methods;
+///   const struct _protocol_list_t * const protocols;
+///   const struct _prop_list_t * const properties;
+/// }
+*)
+procedure tobjcrttiwriter_nonfragile.gen_objc_category_sections(list:TAsmList; objccat: tobjectdef; out catlabel: TAsmSymbol);
+  var
+    instmthdlist,
+    clsmthdlist,
+    protolistsym  : TAsmLabel;
+    catstrsym,
+    clssym,
+    catsym        : TAsmSymbol;
+  begin
+    { the category name }
+    catstrsym:=objcreatestringpoolentry(objccat.objextname^,sp_objcclassnames,sec_objc_class_names);
+
+    { the class it extends }
+    clssym:=current_asmdata.RefAsmSymbol(objccat.childof.rtti_mangledname(objcclassrtti));
+
+    { generate the methods lists }
+    gen_objc_methods(list,objccat,instmthdlist,false,true);
+    gen_objc_methods(list,objccat,clsmthdlist,true,true);
+
+    { generate implemented protocols list }
+    gen_objc_protocol_list(list,objccat.ImplementedInterfaces,protolistsym);
+
+    { category declaration section }
+    new_section(list,sec_objc_const,'_OBJC_CATEGORY',sizeof(pint));
+    catsym:=current_asmdata.DefineAsmSymbol(objccat.rtti_mangledname(objcclassrtti),AB_LOCAL,AT_DATA);
+    list.Concat(tai_symbol.Create(catsym,0));
+
+    list.Concat(Tai_const.Create_sym(catstrsym));
+    list.Concat(Tai_const.Create_sym(clssym));
+    ConcatSymOrNil(list,instmthdlist);
+    ConcatSymOrNil(list,clsmthdlist);
+    ConcatSymOrNil(list,protolistsym);
+    { properties, not yet supported }
+    list.Concat(Tai_const.Create_pint(0));
+
+    catlabel:=catsym;
+  end;
+
 
 
 (*
 (*
 From Clang:
 From Clang:
@@ -1363,45 +1505,58 @@ procedure tobjcrttiwriter_nonfragile.addclasslist(list: tasmlist; section: tasms
 
 
 procedure tobjcrttiwriter_nonfragile.gen_objc_info_sections(list: tasmlist);
 procedure tobjcrttiwriter_nonfragile.gen_objc_info_sections(list: tasmlist);
 
 
+  function collectnonlazyclasses(classes: tfpobjectlist): tfpobjectlist;
+    var
+      symentry : tsym;
+      procdef  : tprocdef;
+      i,j      : longint;
+    begin
+      { non-lazy classes are all classes that define a class method with the
+        selector called "load" (simply inheriting this class method is not enough,
+        they have to implement it themselves)
+
+        -- TODO: this currently only works if the Pascal identifier is also 'load'! }
+      result:=tfpobjectlist.create(false);
+      for i:=0 to classes.count-1 do
+        begin
+          symentry:=tsym(tobjectsymtable(tobjectdef(classes[i]).symtable).find('LOAD'));
+          if assigned(symentry) and
+             (symentry.typ=procsym) then
+            begin
+              for j:=0 to tprocsym(symentry).ProcdefList.count do
+                begin
+                  procdef:=tprocdef(tprocsym(symentry).ProcdefList[0]);
+                  if ((po_classmethod in procdef.procoptions) and
+                      (procdef.messageinf.str^='load')) then
+                    begin
+                      result.add(classes[i]);
+                      break;
+                    end;
+                end;
+            end;
+        end;
+    end;
+
   var
   var
-    i,j            : longint;
-    symentry       : tsym;
-    procdef        : tprocdef;
-    nonlazyclasses : tfpobjectlist;
+    nonlazyclasses,
+    nonlazycategories : tfpobjectlist;
   begin
   begin
-    if (classsyms.count=0) then
+    if (classdefs.count=0) and
+       (catdefs.count=0) then
       exit;
       exit;
 
 
-    { non-lazy classes are all classes that define a class method with the
-      selector called "load" (simply inheriting this class method is not enough,
-      they have to implement it themselves)
-
-      -- TODO: this currently only works if the Pascal identifier is also 'load'! }
-    nonlazyclasses:=tfpobjectlist.create(false);
-    for i:=0 to classdefs.count-1 do
-      begin
-        symentry:=tsym(tobjectsymtable(tobjectdef(classdefs[i]).symtable).find('LOAD'));
-        if assigned(symentry) and
-           (symentry.typ=procsym) then
-          begin
-            for j:=0 to tprocsym(symentry).ProcdefList.count do
-              begin
-                procdef:=tprocdef(tprocsym(symentry).ProcdefList[0]);
-                if ((po_classmethod in procdef.procoptions) and
-                    (procdef.messageinf.str^='load')) then
-                  begin
-                    nonlazyclasses.add(classdefs[i]);
-                    break;
-                  end;
-              end;
-          end;
-      end;
+    nonlazyclasses:=collectnonlazyclasses(classdefs);
+    nonlazycategories:=collectnonlazyclasses(catdefs);
 
 
     { this list has to include all classes, also the non-lazy ones }
     { this list has to include all classes, also the non-lazy ones }
     addclasslist(list,sec_objc_classlist,target_asm.labelprefix+'_OBJC_LABEL_CLASS_$',classdefs);
     addclasslist(list,sec_objc_classlist,target_asm.labelprefix+'_OBJC_LABEL_CLASS_$',classdefs);
     addclasslist(list,sec_objc_nlclasslist,target_asm.labelprefix+'_OBJC_LABEL_NONLAZY_CLASS_$',nonlazyclasses);
     addclasslist(list,sec_objc_nlclasslist,target_asm.labelprefix+'_OBJC_LABEL_NONLAZY_CLASS_$',nonlazyclasses);
-    { TODO: category and non-lazy category lists }
+    { category and non-lazy category lists }
+    addclasslist(list,sec_objc_catlist,target_asm.labelprefix+'_OBJC_LABEL_CATEGORY_$',catdefs);
+    addclasslist(list,sec_objc_nlcatlist,target_asm.labelprefix+'_OBJC_LABEL_NONLAZY_CATEGORY_$',nonlazycategories);
 
 
+    nonlazyclasses.free;
+    nonlazycategories.free;
     { the non-fragile abi doesn't have any module info, nor lazy references
     { the non-fragile abi doesn't have any module info, nor lazy references
       to used classes or to parent classes }
       to used classes or to parent classes }
   end;
   end;
@@ -1431,7 +1586,7 @@ procedure MaybeGenerateObjectiveCImageInfo(globalst, localst: tsymtable);
         current_asmdata.asmlists[al_objc_data].concat(Tai_symbol.Createname(target_asm.labelprefix+'_OBJC_IMAGE_INFO',AT_LABEL,sizeof(pint)));
         current_asmdata.asmlists[al_objc_data].concat(Tai_symbol.Createname(target_asm.labelprefix+'_OBJC_IMAGE_INFO',AT_LABEL,sizeof(pint)));
         current_asmdata.asmlists[al_objc_data].concat(Tai_const.Create_64bit(0));
         current_asmdata.asmlists[al_objc_data].concat(Tai_const.Create_64bit(0));
 
 
-        { generate rtti for all obj-c classes, protocols and categories (todo)
+        { generate rtti for all obj-c classes, protocols and categories
           defined in this module. }
           defined in this module. }
         if not(target_info.system in system_objc_nfabi) then
         if not(target_info.system in system_objc_nfabi) then
           objcrttiwriter:=tobjcrttiwriter_fragile.create
           objcrttiwriter:=tobjcrttiwriter_fragile.create

+ 36 - 14
compiler/objcutil.pas

@@ -117,11 +117,22 @@ end;
                        objcsuperclassnode
                        objcsuperclassnode
 *******************************************************************}
 *******************************************************************}
 
 
+    function objcloadbasefield(n: tnode; const fieldname: string): tnode;
+      var
+        vs         : tsym;
+      begin
+        result:=ctypeconvnode.create_internal(cderefnode.create(ctypeconvnode.create_internal(n,voidpointertype)),objc_objecttype);
+        vs:=tsym(tabstractrecorddef(objc_objecttype).symtable.Find(fieldname));
+        if not assigned(vs) or
+           (vs.typ<>fieldvarsym) then
+          internalerror(200911301);
+        result:=csubscriptnode.create(vs,result);
+      end;
+
+
     function objcsuperclassnode(def: tdef): tnode;
     function objcsuperclassnode(def: tdef): tnode;
       var
       var
         para       : tcallparanode;
         para       : tcallparanode;
-        class_type : tdef;
-        vs         : tsym;
       begin
       begin
         { only valid for Objective-C classes and classrefs }
         { only valid for Objective-C classes and classrefs }
         if not is_objcclass(def) and
         if not is_objcclass(def) and
@@ -131,11 +142,30 @@ end;
           requires extra node types. Maybe later. }
           requires extra node types. Maybe later. }
         if is_objcclassref(def) then
         if is_objcclassref(def) then
           begin
           begin
-            para:=ccallparanode.create(cstringconstnode.createstr(tobjectdef(tclassrefdef(def).pointeddef).objextname^),nil);
-            result:=ccallnode.createinternfromunit('OBJC','OBJC_GETMETACLASS',para);
+            if (oo_is_classhelper in tobjectdef(tclassrefdef(def).pointeddef).objectoptions) then
+              begin
+                { in case we are in a category method, we need the metaclass of the
+                  superclass class extended by this category (= metaclass of superclass of superclass) }
+                result:=cloadvmtaddrnode.create(ctypenode.create(tobjectdef(tclassrefdef(def).pointeddef).childof.childof));
+                result:=objcloadbasefield(result,'ISA');
+                typecheckpass(result);
+                { we're done }
+                exit;
+              end
+            else
+              begin
+                { otherwise we need the superclass of the metaclass }
+                para:=ccallparanode.create(cstringconstnode.createstr(tobjectdef(tclassrefdef(def).pointeddef).objextname^),nil);
+                result:=ccallnode.createinternfromunit('OBJC','OBJC_GETMETACLASS',para);
+              end
           end
           end
         else
         else
-          result:=cloadvmtaddrnode.create(ctypenode.create(def));
+          begin
+            if not(oo_is_classhelper in tobjectdef(def).objectoptions) then
+              result:=cloadvmtaddrnode.create(ctypenode.create(def))
+            else
+              result:=cloadvmtaddrnode.create(ctypenode.create(tobjectdef(def).childof))
+          end;
 
 
 {$if defined(onlymacosx10_6) or defined(arm) }
 {$if defined(onlymacosx10_6) or defined(arm) }
         { For the non-fragile ABI, the superclass send2 method itself loads the
         { For the non-fragile ABI, the superclass send2 method itself loads the
@@ -145,15 +175,7 @@ end;
             (but also on all iPhone SDK revisions we support) }
             (but also on all iPhone SDK revisions we support) }
         if not(target_info.system in system_objc_nfabi) then
         if not(target_info.system in system_objc_nfabi) then
 {$endif onlymacosx10_6 or arm}
 {$endif onlymacosx10_6 or arm}
-          begin
-            class_type:=search_named_unit_globaltype('OBJC','OBJC_OBJECT').typedef;
-            result:=ctypeconvnode.create_internal(cderefnode.create(ctypeconvnode.create_internal(result,voidpointertype)),class_type);
-            vs:=tsym(tabstractrecorddef(class_type).symtable.Find('SUPERCLASS'));
-            if not assigned(vs) or
-               (vs.typ<>fieldvarsym) then
-              internalerror(200909301);
-            result:=csubscriptnode.create(vs,result);
-          end;
+          result:=objcloadbasefield(result,'SUPERCLASS');
         typecheckpass(result);
         typecheckpass(result);
       end;
       end;
 
 

+ 4 - 2
compiler/pdecl.pas

@@ -440,7 +440,8 @@ implementation
                      (token=_INTERFACE) or
                      (token=_INTERFACE) or
                      (token=_DISPINTERFACE) or
                      (token=_DISPINTERFACE) or
                      (token=_OBJCCLASS) or
                      (token=_OBJCCLASS) or
-                     (token=_OBJCPROTOCOL)) and
+                     (token=_OBJCPROTOCOL) or
+                     (token=_OBJCCATEGORY)) and
                     (assigned(ttypesym(sym).typedef)) and
                     (assigned(ttypesym(sym).typedef)) and
                     is_class_or_interface_or_dispinterface_or_objc(ttypesym(sym).typedef) and
                     is_class_or_interface_or_dispinterface_or_objc(ttypesym(sym).typedef) and
                     (oo_is_forward in tobjectdef(ttypesym(sym).typedef).objectoptions) then
                     (oo_is_forward in tobjectdef(ttypesym(sym).typedef).objectoptions) then
@@ -455,7 +456,8 @@ implementation
                           objecttype:=odt_interfacecorba;
                           objecttype:=odt_interfacecorba;
                       _DISPINTERFACE :
                       _DISPINTERFACE :
                         objecttype:=odt_dispinterface;
                         objecttype:=odt_dispinterface;
-                      _OBJCCLASS :
+                      _OBJCCLASS,
+                      _OBJCCATEGORY :
                         objecttype:=odt_objcclass;
                         objecttype:=odt_objcclass;
                       _OBJCPROTOCOL :
                       _OBJCPROTOCOL :
                         objecttype:=odt_objcprotocol;
                         objecttype:=odt_objcprotocol;

+ 31 - 13
compiler/pdecobj.pas

@@ -313,15 +313,20 @@ implementation
         hasparentdefined:=false;
         hasparentdefined:=false;
 
 
         { reads the parent class }
         { reads the parent class }
-        if try_to_consume(_LKLAMMER) then
+        if (token=_LKLAMMER) or
+           is_objccategory(current_objectdef) then
           begin
           begin
+            consume(_LKLAMMER);
             { use single_type instead of id_type for specialize support }
             { use single_type instead of id_type for specialize support }
             single_type(hdef,false,false);
             single_type(hdef,false,false);
             if (not assigned(hdef)) or
             if (not assigned(hdef)) or
                (hdef.typ<>objectdef) then
                (hdef.typ<>objectdef) then
               begin
               begin
                 if assigned(hdef) then
                 if assigned(hdef) then
-                  Message1(type_e_class_type_expected,hdef.typename);
+                  Message1(type_e_class_type_expected,hdef.typename)
+                else if is_objccategory(current_objectdef) then
+                  { a category must specify the class to extend }
+                  Message(type_e_objcclass_type_expected);
               end
               end
             else
             else
               begin
               begin
@@ -358,13 +363,20 @@ implementation
                      if not(is_cppclass(childof)) then
                      if not(is_cppclass(childof)) then
                        Message(parser_e_mix_of_classes_and_objects);
                        Message(parser_e_mix_of_classes_and_objects);
                    odt_objcclass:
                    odt_objcclass:
-                     if not(is_objcclass(childof)) then
+                     if not(is_objcclass(childof) or
+                        is_objccategory(childof)) then
                        begin
                        begin
                          if is_objcprotocol(childof) then
                          if is_objcprotocol(childof) then
                            begin
                            begin
-                             intfchildof:=childof;
-                             childof:=nil;
-                             CGMessage(parser_h_no_objc_parent);
+                             if not(oo_is_classhelper in current_objectdef.objectoptions) then
+                               begin
+                                 intfchildof:=childof;
+                                 childof:=nil;
+                                 CGMessage(parser_h_no_objc_parent);
+                               end
+                             else
+                               { a category must specify the class to extend }
+                               CGMessage(type_e_objcclass_type_expected);
                            end
                            end
                          else
                          else
                            Message(parser_e_mix_of_classes_and_objects);
                            Message(parser_e_mix_of_classes_and_objects);
@@ -562,7 +574,7 @@ implementation
                   _PRIVATE :
                   _PRIVATE :
                     begin
                     begin
                       if is_interface(current_objectdef) or
                       if is_interface(current_objectdef) or
-                         is_objcprotocol(current_objectdef) then
+                         is_objc_protocol_or_category(current_objectdef) then
                         Message(parser_e_no_access_specifier_in_interfaces);
                         Message(parser_e_no_access_specifier_in_interfaces);
                        consume(_PRIVATE);
                        consume(_PRIVATE);
                        current_objectdef.symtable.currentvisibility:=vis_private;
                        current_objectdef.symtable.currentvisibility:=vis_private;
@@ -572,7 +584,7 @@ implementation
                    _PROTECTED :
                    _PROTECTED :
                      begin
                      begin
                        if is_interface(current_objectdef) or
                        if is_interface(current_objectdef) or
-                          is_objcprotocol(current_objectdef) then
+                          is_objc_protocol_or_category(current_objectdef) then
                          Message(parser_e_no_access_specifier_in_interfaces);
                          Message(parser_e_no_access_specifier_in_interfaces);
                        consume(_PROTECTED);
                        consume(_PROTECTED);
                        current_objectdef.symtable.currentvisibility:=vis_protected;
                        current_objectdef.symtable.currentvisibility:=vis_protected;
@@ -582,7 +594,7 @@ implementation
                    _PUBLIC :
                    _PUBLIC :
                      begin
                      begin
                        if is_interface(current_objectdef) or
                        if is_interface(current_objectdef) or
-                          is_objcprotocol(current_objectdef) then
+                          is_objc_protocol_or_category(current_objectdef) then
                          Message(parser_e_no_access_specifier_in_interfaces);
                          Message(parser_e_no_access_specifier_in_interfaces);
                        consume(_PUBLIC);
                        consume(_PUBLIC);
                        current_objectdef.symtable.currentvisibility:=vis_public;
                        current_objectdef.symtable.currentvisibility:=vis_public;
@@ -593,8 +605,7 @@ implementation
                        { we've to check for a pushlished section in non-  }
                        { we've to check for a pushlished section in non-  }
                        { publishable classes later, if a real declaration }
                        { publishable classes later, if a real declaration }
                        { this is the way, delphi does it                  }
                        { this is the way, delphi does it                  }
-                       if is_interface(current_objectdef) or
-                          is_objcprotocol(current_objectdef) then
+                       if is_interface(current_objectdef) then
                          Message(parser_e_no_access_specifier_in_interfaces);
                          Message(parser_e_no_access_specifier_in_interfaces);
                        { Objective-C classes do not support "published",
                        { Objective-C classes do not support "published",
                          as basically everything is published.  }
                          as basically everything is published.  }
@@ -607,7 +618,7 @@ implementation
                    _STRICT :
                    _STRICT :
                      begin
                      begin
                        if is_interface(current_objectdef) or
                        if is_interface(current_objectdef) or
-                          is_objcprotocol(current_objectdef) then
+                          is_objc_protocol_or_category(current_objectdef) then
                           Message(parser_e_no_access_specifier_in_interfaces);
                           Message(parser_e_no_access_specifier_in_interfaces);
                         consume(_STRICT);
                         consume(_STRICT);
                         if token=_ID then
                         if token=_ID then
@@ -638,7 +649,7 @@ implementation
                         if object_member_blocktype=bt_general then
                         if object_member_blocktype=bt_general then
                           begin
                           begin
                             if is_interface(current_objectdef) or
                             if is_interface(current_objectdef) or
-                               is_objcprotocol(current_objectdef) then
+                               is_objc_protocol_or_category(current_objectdef) then
                               Message(parser_e_no_vars_in_interfaces);
                               Message(parser_e_no_vars_in_interfaces);
 
 
                             if (current_objectdef.symtable.currentvisibility=vis_published) and
                             if (current_objectdef.symtable.currentvisibility=vis_published) and
@@ -871,6 +882,13 @@ implementation
           end
           end
         else
         else
           begin
           begin
+            { change objccategories into objcclass helpers }
+            if (objecttype=odt_objccategory) then
+              begin
+                current_objectdef.objecttype:=odt_objcclass;
+                include(current_objectdef.objectoptions,oo_is_classhelper);
+              end;
+
             { parse list of options (abstract / sealed) }
             { parse list of options (abstract / sealed) }
             parse_object_options;
             parse_object_options;
 
 

+ 6 - 3
compiler/pdecsub.pas

@@ -1413,7 +1413,9 @@ begin
   if pd.typ<>procdef then
   if pd.typ<>procdef then
     internalerror(2003042611);
     internalerror(2003042611);
   if not(is_class_or_interface_or_objc(tprocdef(pd)._class)) then
   if not(is_class_or_interface_or_objc(tprocdef(pd)._class)) then
-    Message(parser_e_no_object_override);
+    Message(parser_e_no_object_override)
+  else if is_objccategory(tprocdef(pd)._class) then
+    Message(parser_e_no_category_override);
 end;
 end;
 
 
 procedure pd_overload(pd:tabstractprocdef);
 procedure pd_overload(pd:tabstractprocdef);
@@ -1483,7 +1485,8 @@ procedure pd_reintroduce(pd:tabstractprocdef);
 begin
 begin
   if pd.typ<>procdef then
   if pd.typ<>procdef then
     internalerror(200401211);
     internalerror(200401211);
-  if not(is_class_or_interface_or_object(tprocdef(pd)._class)) then
+  if not(is_class_or_interface_or_object(tprocdef(pd)._class)) and
+     not(is_objccategory(tprocdef(pd)._class)) then
     Message(parser_e_no_object_reintroduce);
     Message(parser_e_no_object_reintroduce);
 end;
 end;
 
 
@@ -2036,7 +2039,7 @@ const
       mutexclpo     : [po_external]
       mutexclpo     : [po_external]
     ),(
     ),(
       idtok:_REINTRODUCE;
       idtok:_REINTRODUCE;
-      pd_flags : [pd_interface,pd_object,pd_notobjintf];
+      pd_flags : [pd_interface,pd_object,pd_notobjintf,pd_objcclass];
       handler  : @pd_reintroduce;
       handler  : @pd_reintroduce;
       pocall   : pocall_none;
       pocall   : pocall_none;
       pooption : [po_reintroduce];
       pooption : [po_reintroduce];

+ 20 - 2
compiler/ptype.pas

@@ -493,7 +493,12 @@ implementation
               begin
               begin
                 Message(parser_e_no_generics_as_types);
                 Message(parser_e_no_generics_as_types);
                 def:=generrordef;
                 def:=generrordef;
-              end;
+              end
+            else if is_objccategory(def) then
+              begin
+                Message(parser_e_no_category_as_types);
+                def:=generrordef
+              end
           end;
           end;
       end;
       end;
 
 
@@ -622,7 +627,12 @@ implementation
                          begin
                          begin
                            Message(parser_e_no_generics_as_types);
                            Message(parser_e_no_generics_as_types);
                            def:=generrordef;
                            def:=generrordef;
-                         end;
+                         end
+                       else if is_objccategory(def) then
+                         begin
+                           Message(parser_e_no_category_as_types);
+                           def:=generrordef
+                         end
                      end;
                      end;
                  end
                  end
                else
                else
@@ -1023,6 +1033,14 @@ implementation
                 consume(token);
                 consume(token);
                 def:=object_dec(odt_objcprotocol,name,genericdef,genericlist,nil);
                 def:=object_dec(odt_objcprotocol,name,genericdef,genericlist,nil);
                end;
                end;
+            _OBJCCATEGORY :
+               begin
+                if not(m_objectivec1 in current_settings.modeswitches) then
+                  Message(parser_f_need_objc);
+
+                consume(token);
+                def:=object_dec(odt_objccategory,name,genericdef,genericlist,nil);
+               end;
             _OBJECT :
             _OBJECT :
               begin
               begin
                 consume(token);
                 consume(token);

+ 7 - 2
compiler/symconst.pas

@@ -117,6 +117,9 @@ const
   paranr_syscall_legacy   = high(word)-2;
   paranr_syscall_legacy   = high(word)-2;
   paranr_result_leftright = high(word)-1;
   paranr_result_leftright = high(word)-1;
 
 
+  { prefix for names of class helper procsyms added to regular symtables }
+  class_helper_prefix = 'CH$';
+
 
 
 type
 type
   { keep this in sync with TIntfFlag in rtl/objpas/typinfo.pp }
   { keep this in sync with TIntfFlag in rtl/objpas/typinfo.pp }
@@ -302,7 +305,8 @@ type
     odt_cppclass,
     odt_cppclass,
     odt_dispinterface,
     odt_dispinterface,
     odt_objcclass,
     odt_objcclass,
-    odt_objcprotocol
+    odt_objcprotocol,
+    odt_objccategory { note that these are changed into odt_class afterwards }
   );
   );
 
 
   { Variations in interfaces implementation }
   { Variations in interfaces implementation }
@@ -335,7 +339,8 @@ type
     oo_has_enumerator_movenext,
     oo_has_enumerator_movenext,
     oo_has_enumerator_current,
     oo_has_enumerator_current,
     oo_is_external,       { the class is externally implemented (objcclass, cppclass) }
     oo_is_external,       { the class is externally implemented (objcclass, cppclass) }
-    oo_is_anonymous       { the class is only formally defined in this module (objcclass x = class; external;) }
+    oo_is_anonymous,      { the class is only formally defined in this module (objcclass x = class; external;) }
+    oo_is_classhelper     { objcclasses that represent categories, and Delpi-style class helpers, are marked like this }
   );
   );
   tobjectoptions=set of tobjectoption;
   tobjectoptions=set of tobjectoption;
 
 

+ 122 - 31
compiler/symdef.pas

@@ -685,6 +685,7 @@ interface
        objc_superclasstype,
        objc_superclasstype,
        objc_idtype,
        objc_idtype,
        objc_seltype         : tpointerdef;
        objc_seltype         : tpointerdef;
+       objc_objecttype      : trecorddef;
        { base type of @protocol(protocolname) Objective-C statements }
        { base type of @protocol(protocolname) Objective-C statements }
        objc_protocoltype    : tobjectdef;
        objc_protocoltype    : tobjectdef;
 
 
@@ -739,7 +740,9 @@ interface
     function is_objcclass(def: tdef): boolean;
     function is_objcclass(def: tdef): boolean;
     function is_objcclassref(def: tdef): boolean;
     function is_objcclassref(def: tdef): boolean;
     function is_objcprotocol(def: tdef): boolean;
     function is_objcprotocol(def: tdef): boolean;
+    function is_objccategory(def: tdef): boolean;
     function is_objc_class_or_protocol(def: tdef): boolean;
     function is_objc_class_or_protocol(def: tdef): boolean;
+    function is_objc_protocol_or_category(def: tdef): boolean;
     function is_class_or_interface(def: tdef): boolean;
     function is_class_or_interface(def: tdef): boolean;
     function is_class_or_interface_or_objc(def: tdef): boolean;
     function is_class_or_interface_or_objc(def: tdef): boolean;
     function is_class_or_interface_or_object(def: tdef): boolean;
     function is_class_or_interface_or_object(def: tdef): boolean;
@@ -3582,12 +3585,19 @@ implementation
 
 
 
 
     function  tprocdef.objcmangledname : string;
     function  tprocdef.objcmangledname : string;
+      var
+        manglednamelen: longint;
+        iscatmethod   : boolean;
       begin
       begin
         if not (po_msgstr in procoptions) then
         if not (po_msgstr in procoptions) then
           internalerror(2009030901);
           internalerror(2009030901);
         { we may very well need longer strings to handle these... }
         { we may very well need longer strings to handle these... }
-        if ((255-length(tobjectdef(procsym.owner.defowner).objextname^)
-             -length('+"[ ]"')-length(messageinf.str^)) < 0) then
+        manglednamelen:=length(tobjectdef(procsym.owner.defowner).objextname^)+
+          length('+"[ ]"')+length(messageinf.str^);
+        iscatmethod:=oo_is_classhelper in tobjectdef(procsym.owner.defowner).objectoptions;
+        if (iscatmethod) then
+          inc(manglednamelen,length(tobjectdef(procsym.owner.defowner).childof.objextname^)+length('()'));
+        if manglednamelen>255 then
           Message1(parser_e_objc_message_name_too_long,messageinf.str^);
           Message1(parser_e_objc_message_name_too_long,messageinf.str^);
         if not(po_classmethod in procoptions) then
         if not(po_classmethod in procoptions) then
           result:='"-['
           result:='"-['
@@ -3596,9 +3606,12 @@ implementation
         { quotes are necessary because the +/- otherwise confuse the assembler
         { quotes are necessary because the +/- otherwise confuse the assembler
           into expecting a number
           into expecting a number
         }
         }
-        result:=
-          result+tobjectdef(procsym.owner.defowner).objextname^+' '+
-          messageinf.str^+']"';
+        if iscatmethod then
+          result:=result+tobjectdef(procsym.owner.defowner).childof.objextname^+'(';
+        result:=result+tobjectdef(procsym.owner.defowner).objextname^;
+        if iscatmethod then
+          result:=result+')';
+        result:=result+' '+messageinf.str^+']"';
       end;
       end;
 
 
 
 
@@ -4082,6 +4095,36 @@ implementation
       end;
       end;
 
 
 
 
+    procedure create_class_helper_for_procdef(def: tobject; arg: pointer);
+      var
+        pd: tprocdef absolute def;
+        st: tsymtable;
+        psym: tsym;
+        nname: TIDString;
+      begin
+        if (tdef(def).typ<>procdef) then
+          exit;
+        { pd.owner = objcclass symtable -> defowner = objcclassdef ->
+          owner = symtable in which objcclassdef is defined
+        }
+        st:=pd.owner.defowner.owner;
+        nname:=class_helper_prefix+tprocsym(pd.procsym).name;
+        { check for an existing procsym with our special name }
+        psym:=tsym(st.find(nname));
+        if not assigned(psym) then
+          begin
+            psym:=tprocsym.create(nname);
+            { avoid warning about this symbol being unused }
+            psym.IncRefCount;
+            st.insert(psym,true);
+          end
+        else if (psym.typ<>procsym) then
+          internalerror(2009111501);
+        { add ourselves to this special procsym }
+        tprocsym(psym).procdeflist.add(def);
+      end;
+
+
     procedure tobjectdef.buildderefimpl;
     procedure tobjectdef.buildderefimpl;
       begin
       begin
          inherited buildderefimpl;
          inherited buildderefimpl;
@@ -4095,6 +4138,10 @@ implementation
          inherited derefimpl;
          inherited derefimpl;
          if not (df_copied_def in defoptions) then
          if not (df_copied_def in defoptions) then
            tstoredsymtable(symtable).derefimpl;
            tstoredsymtable(symtable).derefimpl;
+         { the procdefs are not owned by the class helper procsyms, so they
+           are not stored/restored either -> re-add them here }
+         if (oo_is_classhelper in objectoptions) then
+           symtable.DefList.ForEachCall(@create_class_helper_for_procdef,nil);
       end;
       end;
 
 
 
 
@@ -4385,9 +4432,15 @@ implementation
                     begin
                     begin
                       case rt of
                       case rt of
                         objcclassrtti:
                         objcclassrtti:
-                          result:=result+'_OBJC_CLASS_';
+                          if not(oo_is_classhelper in objectoptions) then
+                            result:=result+'_OBJC_CLASS_'
+                          else
+                            result:=result+'_OBJC_CATEGORY_';
                         objcmetartti:
                         objcmetartti:
-                          result:=result+'_OBJC_METACLASS_';
+                          if not(oo_is_classhelper in objectoptions) then
+                            result:=result+'_OBJC_METACLASS_'
+                          else
+                            internalerror(2009111511);
                         else
                         else
                          internalerror(2009092302);
                          internalerror(2009092302);
                       end;
                       end;
@@ -4401,9 +4454,15 @@ implementation
                 case objecttype of
                 case objecttype of
                   odt_objcclass:
                   odt_objcclass:
                     begin
                     begin
+                      if (oo_is_classhelper in objectoptions) and
+                         (rt<>objcclassrtti) then
+                        internalerror(2009111512);
                       case rt of
                       case rt of
                         objcclassrtti:
                         objcclassrtti:
-                          result:='_OBJC_CLASS_$_';
+                          if not(oo_is_classhelper in objectoptions) then
+                            result:='_OBJC_CLASS_$_'
+                          else
+                            result:='_OBJC_$_CATEGORY_';
                         objcmetartti:
                         objcmetartti:
                           result:='_OBJC_METACLASS_$_';
                           result:='_OBJC_METACLASS_$_';
                         objcclassrortti:
                         objcclassrortti:
@@ -4656,35 +4715,43 @@ implementation
       begin
       begin
         if (def.typ=procdef) then
         if (def.typ=procdef) then
           begin
           begin
+            { add all messages also under a dummy name to the symtable in
+              which the objcclass/protocol/category is declared, so they can
+              be called via id.<name>
+            }
+            create_class_helper_for_procdef(pd,nil);
+
             { we have to wait until now to set the mangled name because it
             { we have to wait until now to set the mangled name because it
               depends on the (possibly external) class name, which is defined
               depends on the (possibly external) class name, which is defined
               at the very end.  }
               at the very end.  }
-            if (po_msgstr in pd.procoptions) then
+            if not(po_msgstr in pd.procoptions) then
               begin
               begin
-                { Mangled name is already set in case this is a copy of
-                  another type.  }
-                if not(po_has_mangledname in pd.procoptions) then
-                  begin
-                    { check whether the number of formal parameters is correct }
-                    paracount:=0;
-                    for i:=1 to length(pd.messageinf.str^) do
-                      if pd.messageinf.str^[i]=':' then
-                        inc(paracount);
-                    for i:=0 to pd.paras.count-1 do
-                      if not(vo_is_hidden_para in tparavarsym(pd.paras[i]).varoptions) and
-                         not is_array_of_const(tparavarsym(pd.paras[i]).vardef) then
-                        dec(paracount);
-                    if (paracount<>0) then
-                      MessagePos(pd.fileinfo,sym_e_objc_para_mismatch);
-
-                    pd.setmangledname(pd.objcmangledname);
-                  end
-                else
-                  { all checks already done }
-                  exit;
+                CGMessagePos(pd.fileinfo,parser_e_objc_requires_msgstr);
+                { recover to avoid internalerror later on }
+                include(pd.procoptions,po_msgstr);
+                pd.messageinf.str:=stringdup('MissingDeclaration');
+              end;
+            { Mangled name is already set in case this is a copy of
+              another type.  }
+            if not(po_has_mangledname in pd.procoptions) then
+              begin
+                { check whether the number of formal parameters is correct }
+                paracount:=0;
+                for i:=1 to length(pd.messageinf.str^) do
+                  if pd.messageinf.str^[i]=':' then
+                    inc(paracount);
+                for i:=0 to pd.paras.count-1 do
+                  if not(vo_is_hidden_para in tparavarsym(pd.paras[i]).varoptions) and
+                     not is_array_of_const(tparavarsym(pd.paras[i]).vardef) then
+                    dec(paracount);
+                if (paracount<>0) then
+                  MessagePos(pd.fileinfo,sym_e_objc_para_mismatch);
+
+                pd.setmangledname(pd.objcmangledname);
               end
               end
             else
             else
-              MessagePos(pd.fileinfo,parser_e_objc_requires_msgstr);
+              { all checks already done }
+              exit;
             if not(oo_is_external in pd._class.objectoptions) then
             if not(oo_is_external in pd._class.objectoptions) then
               begin
               begin
                 if (po_varargs in pd.procoptions) then
                 if (po_varargs in pd.procoptions) then
@@ -5065,6 +5132,18 @@ implementation
       end;
       end;
 
 
 
 
+    function is_objccategory(def: tdef): boolean;
+      begin
+        result:=
+          assigned(def) and
+          (def.typ=objectdef) and
+          { if used as a forward type }
+          ((tobjectdef(def).objecttype=odt_objccategory) or
+          { if used as after it has been resolved }
+           ((tobjectdef(def).objecttype=odt_objcclass) and
+            (oo_is_classhelper in tobjectdef(def).objectoptions)));
+      end;
+
     function is_objc_class_or_protocol(def: tdef): boolean;
     function is_objc_class_or_protocol(def: tdef): boolean;
       begin
       begin
          result:=
          result:=
@@ -5074,6 +5153,17 @@ implementation
       end;
       end;
 
 
 
 
+    function is_objc_protocol_or_category(def: tdef): boolean;
+      begin
+         result:=
+           assigned(def) and
+           (def.typ=objectdef) and
+           ((tobjectdef(def).objecttype = odt_objcprotocol) or
+            ((tobjectdef(def).objecttype = odt_objcclass) and
+             (oo_is_classhelper in tobjectdef(def).objectoptions)));
+      end;
+
+
     function is_class_or_interface(def: tdef): boolean;
     function is_class_or_interface(def: tdef): boolean;
       begin
       begin
         result:=
         result:=
@@ -5125,6 +5215,7 @@ implementation
         objc_superclasstype:=tpointerdef(search_named_unit_globaltype('OBJC','POBJC_SUPER').typedef);
         objc_superclasstype:=tpointerdef(search_named_unit_globaltype('OBJC','POBJC_SUPER').typedef);
         objc_idtype:=tpointerdef(search_named_unit_globaltype('OBJC','ID').typedef);
         objc_idtype:=tpointerdef(search_named_unit_globaltype('OBJC','ID').typedef);
         objc_seltype:=tpointerdef(search_named_unit_globaltype('OBJC','SEL').typedef);
         objc_seltype:=tpointerdef(search_named_unit_globaltype('OBJC','SEL').typedef);
+        objc_objecttype:=trecorddef(search_named_unit_globaltype('OBJC','OBJC_OBJECT').typedef);
       end;
       end;
 
 
 
 

+ 85 - 6
compiler/symtable.pas

@@ -204,6 +204,7 @@ interface
     function  search_class_member(pd : tobjectdef;const s : string):tsym;
     function  search_class_member(pd : tobjectdef;const s : string):tsym;
     function  search_assignment_operator(from_def,to_def:Tdef):Tprocdef;
     function  search_assignment_operator(from_def,to_def:Tdef):Tprocdef;
     function  search_enumerator_operator(type_def:Tdef):Tprocdef;
     function  search_enumerator_operator(type_def:Tdef):Tprocdef;
+    function  search_class_helper(pd : tobjectdef;const s : string; out srsym: tsym; out srsymtable: tsymtable):boolean;
     {Looks for macro s (must be given in upper case) in the macrosymbolstack, }
     {Looks for macro s (must be given in upper case) in the macrosymbolstack, }
     {and returns it if found. Returns nil otherwise.}
     {and returns it if found. Returns nil otherwise.}
     function  search_macro(const s : string):tsym;
     function  search_macro(const s : string):tsym;
@@ -1674,6 +1675,16 @@ implementation
                     exit;
                     exit;
                   end;
                   end;
               end;
               end;
+            { also search for class helpers }
+            if (srsymtable.symtabletype=objectsymtable) and
+               is_objcclass(tdef(srsymtable.defowner)) then
+              begin
+                if search_class_helper(tobjectdef(srsymtable.defowner),s,srsym,srsymtable) then
+                  begin
+                    result:=true;
+                    exit;
+                  end;
+              end;
             stackitem:=stackitem^.next;
             stackitem:=stackitem^.next;
           end;
           end;
         srsym:=nil;
         srsym:=nil;
@@ -1810,7 +1821,9 @@ implementation
     function searchsym_in_class(classh,contextclassh:tobjectdef;const s : TIDString;out srsym:tsym;out srsymtable:TSymtable):boolean;
     function searchsym_in_class(classh,contextclassh:tobjectdef;const s : TIDString;out srsym:tsym;out srsymtable:TSymtable):boolean;
       var
       var
         hashedid : THashedIDString;
         hashedid : THashedIDString;
+        orgclass : tobjectdef;
       begin
       begin
+        orgclass:=classh;
         { The contextclassh is used for visibility. The classh must be equal to
         { The contextclassh is used for visibility. The classh must be equal to
           or be a parent of contextclassh. E.g. for inherited searches the classh is the
           or be a parent of contextclassh. E.g. for inherited searches the classh is the
           parent. }
           parent. }
@@ -1832,8 +1845,13 @@ implementation
               end;
               end;
             classh:=classh.childof;
             classh:=classh.childof;
           end;
           end;
-        srsym:=nil;
-        srsymtable:=nil;
+        if is_objcclass(orgclass) then
+          result:=search_class_helper(orgclass,s,srsym,srsymtable)
+        else
+          begin
+            srsym:=nil;
+            srsymtable:=nil;
+          end;
       end;
       end;
 
 
 
 
@@ -1993,8 +2011,6 @@ implementation
 
 
     function search_named_unit_globaltype(const unitname, typename: TIDString): ttypesym;
     function search_named_unit_globaltype(const unitname, typename: TIDString): ttypesym;
       var
       var
-        contextobjdef : tobjectdef;
-        stackitem  : psymtablestackitem;
         srsymtable: tsymtable;
         srsymtable: tsymtable;
         sym: tsym;
         sym: tsym;
       begin
       begin
@@ -2012,14 +2028,71 @@ implementation
       end;
       end;
 
 
 
 
+    function search_class_helper(pd : tobjectdef;const s : string; out srsym: tsym; out srsymtable: tsymtable):boolean;
+      var
+        hashedid   : THashedIDString;
+        stackitem  : psymtablestackitem;
+        i          : longint;
+      begin
+        hashedid.id:=class_helper_prefix+s;
+        stackitem:=symtablestack.stack;
+        while assigned(stackitem) do
+          begin
+            srsymtable:=stackitem^.symtable;
+            srsym:=tsym(srsymtable.FindWithHash(hashedid));
+            if assigned(srsym) then
+              begin
+                if not(srsymtable.symtabletype in [globalsymtable,staticsymtable]) or
+                   not(srsym.owner.symtabletype in [globalsymtable,staticsymtable]) or
+                   (srsym.typ<>procsym) then
+                  internalerror(2009111505);
+                { check whether this procsym includes a helper for this particular class }
+                for i:=0 to tprocsym(srsym).procdeflist.count-1 do
+                  begin
+                    { does pd inherit from (or is the same as) the class
+                      that this method's category extended?
+                    }
+                    if pd.is_related(tobjectdef(tprocdef(tprocsym(srsym).procdeflist[i]).owner.defowner).childof) then
+                      begin
+                        { no need to keep looking. There might be other
+                          categories that extend this, a parent or child
+                          class with a method with the same name (either
+                          overriding this one, or overridden by this one),
+                          but that doesn't matter as far as the basic
+                          procsym is concerned.
+                        }
+                        srsym:=tprocdef(tprocsym(srsym).procdeflist[i]).procsym;
+                        srsymtable:=srsym.owner;
+                        { we need to know if a procedure references symbols
+                          in the static symtable, because then it can't be
+                          inlined from outside this unit }
+                        if assigned(current_procinfo) and
+                           (srsym.owner.symtabletype=staticsymtable) then
+                          include(current_procinfo.flags,pi_uses_static_symtable);
+                        addsymref(srsym);
+                        result:=true;
+                        exit;
+                      end;
+                  end;
+              end;
+            stackitem:=stackitem^.next;
+          end;
+        srsym:=nil;
+        srsymtable:=nil;
+        result:=false;
+      end;
+
 
 
     function search_class_member(pd : tobjectdef;const s : string):tsym;
     function search_class_member(pd : tobjectdef;const s : string):tsym;
     { searches n in symtable of pd and all anchestors }
     { searches n in symtable of pd and all anchestors }
       var
       var
-        hashedid : THashedIDString;
+        hashedid   : THashedIDString;
         srsym      : tsym;
         srsym      : tsym;
+        orgpd      : tobjectdef;
+        srsymtable : tsymtable;
       begin
       begin
         hashedid.id:=s;
         hashedid.id:=s;
+        orgpd:=pd;
         while assigned(pd) do
         while assigned(pd) do
          begin
          begin
            srsym:=tsym(pd.symtable.FindWithHash(hashedid));
            srsym:=tsym(pd.symtable.FindWithHash(hashedid));
@@ -2030,9 +2103,15 @@ implementation
             end;
             end;
            pd:=pd.childof;
            pd:=pd.childof;
          end;
          end;
-        search_class_member:=nil;
+
+        { not found, now look for class helpers }
+        if is_objcclass(pd) then
+          search_class_helper(orgpd,s,result,srsymtable)
+        else
+          result:=nil;
       end;
       end;
 
 
+
     function search_macro(const s : string):tsym;
     function search_macro(const s : string):tsym;
       var
       var
         stackitem  : psymtablestackitem;
         stackitem  : psymtablestackitem;

+ 2 - 0
compiler/tokens.pas

@@ -250,6 +250,7 @@ type
     _EXPERIMENTAL,
     _EXPERIMENTAL,
     _FINALIZATION,
     _FINALIZATION,
     _NOSTACKFRAME,
     _NOSTACKFRAME,
+    _OBJCCATEGORY,
     _OBJCPROTOCOL,
     _OBJCPROTOCOL,
     _WEAKEXTERNAL,
     _WEAKEXTERNAL,
     _DISPINTERFACE,
     _DISPINTERFACE,
@@ -510,6 +511,7 @@ const
       (str:'EXPERIMENTAL'  ;special:false;keyword:m_all;op:NOTOKEN),
       (str:'EXPERIMENTAL'  ;special:false;keyword:m_all;op:NOTOKEN),
       (str:'FINALIZATION'  ;special:false;keyword:m_initfinal;op:NOTOKEN),
       (str:'FINALIZATION'  ;special:false;keyword:m_initfinal;op:NOTOKEN),
       (str:'NOSTACKFRAME'  ;special:false;keyword:m_none;op:NOTOKEN),
       (str:'NOSTACKFRAME'  ;special:false;keyword:m_none;op:NOTOKEN),
+      (str:'OBJCCATEGORY'  ;special:false;keyword:m_objectivec1;op:NOTOKEN), { Objective-C category }
       (str:'OBJCPROTOCOL'  ;special:false;keyword:m_objectivec1;op:NOTOKEN), { Objective-C protocol }
       (str:'OBJCPROTOCOL'  ;special:false;keyword:m_objectivec1;op:NOTOKEN), { Objective-C protocol }
       (str:'WEAKEXTERNAL'  ;special:false;keyword:m_none;op:NOTOKEN),
       (str:'WEAKEXTERNAL'  ;special:false;keyword:m_none;op:NOTOKEN),
       (str:'DISPINTERFACE' ;special:false;keyword:m_class;op:NOTOKEN),
       (str:'DISPINTERFACE' ;special:false;keyword:m_class;op:NOTOKEN),

+ 4 - 2
compiler/utils/ppudump.pp

@@ -1390,7 +1390,8 @@ type
     oo_has_enumerator_movenext,
     oo_has_enumerator_movenext,
     oo_has_enumerator_current,
     oo_has_enumerator_current,
     oo_is_external,       { the class is externally implemented (objcclass, cppclass) }
     oo_is_external,       { the class is externally implemented (objcclass, cppclass) }
-    oo_is_anonymous       { the class is only formally defined in this module (objcclass x = class; external;) }
+    oo_is_anonymous,      { the class is only formally defined in this module (objcclass x = class; external;) }
+    oo_is_classhelper     { objcclasses that represent categories, and Delpi-style class helpers, are marked like this }
   );
   );
   tobjectoptions=set of tobjectoption;
   tobjectoptions=set of tobjectoption;
   tsymopt=record
   tsymopt=record
@@ -1418,7 +1419,8 @@ const
      (mask:oo_has_enumerator_movenext; str:'HasEnumeratorMoveNext'),
      (mask:oo_has_enumerator_movenext; str:'HasEnumeratorMoveNext'),
      (mask:oo_has_enumerator_current;  str:'HasEnumeratorCurrent'),
      (mask:oo_has_enumerator_current;  str:'HasEnumeratorCurrent'),
      (mask:oo_is_external;        str:'External'),
      (mask:oo_is_external;        str:'External'),
-     (mask:oo_is_anonymous;       str:'Anonymous'));
+     (mask:oo_is_anonymous;       str:'Anonymous'),
+     (mask:oo_is_classhelper;     str:'Class Helper/Category'));
 var
 var
   symoptions : tobjectoptions;
   symoptions : tobjectoptions;
   i      : longint;
   i      : longint;

+ 16 - 0
tests/test/tobjc24.pp

@@ -0,0 +1,16 @@
+{ %fail }
+{ %target=darwin }
+{ %cpu=powerpc,powerpc64,i386,x86_64,arm }
+
+{$modeswitch objectivec1}
+
+uses
+  uobjc24;
+
+var
+  a: ta;
+
+begin
+  { category is in implementation -> should not be visible here }
+  ta.implementationcategorymethod;
+end.

+ 122 - 0
tests/test/tobjc25.pp

@@ -0,0 +1,122 @@
+{ %target=darwin }
+{ %cpu=powerpc,powerpc64,i386,x86_64,arm }
+
+{$mode objfpc}
+{$modeswitch objectivec1}
+
+type
+  tbaseclass = objccategory(NSObject)
+    function tabaseproc(cp: longint): double; message 'tabaseproc:';
+    class function taclassproc: longint; message 'taclassproc';
+  end;
+
+  ta = objcclass(NSObject)
+    a: longint;
+    procedure taproc; message 'taproc';
+    function tabaseproc(cp: longint): double; message 'tabaseproc:'; //override; -- override doesn't work, the compiler doesn't treat the category as part of NSObject
+    class function taclassproc: longint; message 'taclassproc'; //override; -- idem
+  end;
+
+  ca = objccategory(ta)
+    procedure categorymethod; message 'categorymethod';
+    function tabaseproc(cp: longint): double; reintroduce;
+  end;
+
+  da = objccategory(ta)
+    procedure anothercategorymethod; message 'anothercategorymethod';
+    class function taclassproc: longint; reintroduce;
+  end;
+
+class function tbaseclass.taclassproc: longint;
+begin
+  writeln('tbaseclass.taclassproc');
+  result:=654321;
+end;
+
+function tbaseclass.tabaseproc(cp: longint): double;
+begin
+  writeln('tbaseclass.tabaseproc');
+  if (cp<>98765) then
+    halt(12);
+  result:=1234.875;
+end;
+
+procedure ta.taproc;
+begin
+  a:=0;
+  categorymethod;
+  if (a<>1) then
+    halt(1);
+  anothercategorymethod;
+  if (a<>2) then
+    halt(2);
+  if taclassproc<>123456 then
+    halt(5);
+end;
+
+function ta.tabaseproc(cp: longint): double;
+begin
+  { should be replaced/hidden by ca.tabaseproc }
+  halt(9);
+  result:=-1.0;
+end;
+
+class function ta.taclassproc: longint;
+begin
+  { should be replaced/hidden by da.taclassproc }
+  halt(3);
+  result:=0;
+end;
+
+procedure ca.categorymethod;
+begin
+  a:=1;
+  if tabaseproc(555) <> 1.0 then
+    halt(16);
+end;
+
+function ca.tabaseproc(cp: longint): double;
+begin
+  writeln('start ca.tabaseproc');
+  if (cp<>555) then
+    halt(13);
+  if inherited tabaseproc(98765)<>1234.875 then
+    halt(11);
+  writeln('end ca.tabaseproc');
+  result:=1.0;
+end;
+
+procedure da.anothercategorymethod;
+begin
+  a:=2;
+  if tabaseproc(555)<>1.0 then
+    halt(15);
+end;
+
+class function da.taclassproc: longint;
+begin
+  writeln('start da.taclassproc, calling inherited');
+  if inherited taclassproc<>654321 then
+    halt(4);
+  writeln('end da.taclassproc');
+  result:=123456;
+end;
+
+var
+  a: ta;
+begin
+  a:=ta(ta.alloc).init;
+  a.taproc;
+  a.a:=0;
+  a.categorymethod;
+  if (a.a<>1) then
+    halt(6);
+  a.anothercategorymethod;
+  if (a.a<>2) then
+    halt(7);
+  if a.taclassproc<>123456 then
+    halt(8);
+  if (a.tabaseproc(555)<>1.0) then
+    halt(14);
+  a.release;
+end.

+ 18 - 0
tests/test/tobjc26.pp

@@ -0,0 +1,18 @@
+{ %fail }
+{ %target=darwin }
+{ %cpu=powerpc,powerpc64,i386,x86_64,arm }
+
+{$modeswitch objectivec1}
+
+uses
+  uobjc26;
+
+var
+  a: ta;
+
+begin
+  a:=ta(ta.alloc).init;
+  // should not be visible
+  a.implementationcategorymethod;
+  a.release
+end.

+ 16 - 0
tests/test/tobjc26a.pp

@@ -0,0 +1,16 @@
+{ %target=darwin }
+{ %cpu=powerpc,powerpc64,i386,x86_64,arm }
+
+{$modeswitch objectivec1}
+
+uses
+  uobjc26;
+
+var
+  a: ta;
+
+begin
+  a:=ta(ta.alloc).init;
+  a.taproc;
+  a.release
+end.

+ 26 - 0
tests/test/tobjc27a.pp

@@ -0,0 +1,26 @@
+{ %target=darwin }
+{ %cpu=powerpc,powerpc64,i386,x86_64,arm }
+{ %recompile }
+
+{$modeswitch objectivec1}
+
+uses
+  uobjc27a,uobjc27b;
+
+var
+  a: ta;
+  c: tachild;
+
+begin
+  a:=ta(ta.alloc).init;
+  if a.da_categorymethod<>2 then
+    halt(1);
+  a.release;
+
+  c:=tachild(tachild.alloc).init;
+  if c.da_categorymethod<>2 then
+    halt(2);
+  if c.eachild_categorymethod<>3 then
+    halt(3);
+  c.release;
+end.

+ 17 - 0
tests/test/tobjc27b.pp

@@ -0,0 +1,17 @@
+{ %target=darwin }
+{ %cpu=powerpc,powerpc64,i386,x86_64,arm }
+{ %fail }
+
+{$modeswitch objectivec1}
+
+uses
+  uobjc27a;
+
+var
+  a: ta;
+
+begin
+  { da_category method is declared in uobjc27a, which is used in the
+    implementation of uobjc27b -> should not be visible here }
+  a.da_categorymethod;
+end.

+ 25 - 0
tests/test/tobjc28.pp

@@ -0,0 +1,25 @@
+{ %target=darwin }
+{ %cpu=powerpc,powerpc64,i386,x86_64,arm }
+{ %fail }
+
+{$modeswitch objectivec1}
+
+type
+  ta = objcclass(NSObject)
+  end;
+
+  ca = objccategory(ta)
+    procedure categorymethod; message 'categorymethod';
+  end;
+
+procedure ca.categorymethod;
+begin
+end;
+
+var
+  a: NSObject;
+begin
+  a:=ta(ta.alloc).init;
+  { should fail because the category is for ta, not for nsobject }
+  a.categorymethod;
+end.

+ 22 - 0
tests/test/uobjc24.pp

@@ -0,0 +1,22 @@
+{$modeswitch objectivec1}
+
+unit uobjc24;
+
+interface
+
+type
+  ta = objcclass(NSObject)
+  end;
+
+implementation
+
+type
+  ca = objccategory(ta)
+    procedure implementationcategorymethod;
+  end;
+
+procedure ca.implementationcategorymethod;
+begin
+end;
+
+end.

+ 33 - 0
tests/test/uobjc26.pp

@@ -0,0 +1,33 @@
+{$modeswitch objectivec1}
+
+unit uobjc26;
+
+interface
+
+type
+  ta = objcclass(NSObject)
+    l: longint;
+    procedure taproc; message 'taproc';
+  end;
+
+implementation
+
+type
+  ca = objccategory(ta)
+    procedure implementationcategorymethod; message 'implementationcategorymethod';
+  end;
+
+procedure ca.implementationcategorymethod;
+begin
+  l:=1;
+end;
+
+procedure ta.taproc;
+begin
+  l:=0;
+  implementationcategorymethod;
+  if l<>1 then
+    halt(1);
+end;
+
+end.

+ 27 - 0
tests/test/uobjc27a.pp

@@ -0,0 +1,27 @@
+{$mode objfpc}
+{$modeswitch objectivec1}
+
+unit uobjc27a;
+
+interface
+
+type
+  ta = objcclass(NSObject)
+  end;
+
+type
+  ca = objccategory(ta)
+    function ca_categorymethod: longint; message 'ca_categorymethod';
+  end;
+
+implementation
+
+uses
+  uobjc27b;
+
+function ca.ca_categorymethod: longint;
+begin
+  result:=da_categorymethod-1;
+end;
+
+end.

+ 35 - 0
tests/test/uobjc27b.pp

@@ -0,0 +1,35 @@
+{$mode objfpc}
+{$modeswitch objectivec1}
+
+unit uobjc27b;
+
+interface
+
+uses uobjc27a;
+
+type
+  tachild = objcclass(ta)
+  end;
+
+type
+  eachild = objccategory(tachild)
+    function eachild_categorymethod: longint; message 'eachild_categorymethod';
+  end;
+
+  da = objccategory(ta)
+    function da_categorymethod: longint; message 'da_categorymethod';
+  end;
+
+implementation
+
+function eachild.eachild_categorymethod: longint;
+begin
+  result:=ca_categorymethod+2;
+end;
+
+function da.da_categorymethod: longint;
+begin
+  result:=2;
+end;
+
+end.